rev |
line source |
pankso@1
|
1 #!/bin/sh
|
pankso@70
|
2 #
|
al@274
|
3 # Tazdev - SliTaz developers and build host tool. System-wide config file
|
al@274
|
4 # is located at /etc/slitaz/tazdev.conf. Please, keep the code clear and
|
al@274
|
5 # well commented. Also keep in mind: configuration variables are $UPPERCASE
|
al@274
|
6 # and variables initialized by tazdev itself are $lowercase.
|
pankso@1
|
7 #
|
al@274
|
8 # (c) 2014-2017 SliTaz GNU/Linux - GNU GPL v3
|
pankso@1
|
9 #
|
pankso@70
|
10 # AUTHORS
|
pankso@70
|
11 # Christophe Lincoln <pankso@slitaz.org>
|
pankso@70
|
12 # Pascal Bellard <bellard@slitaz.org>
|
pankso@208
|
13 # Eric Joseph-Alexandre <erjo@slitaz.org>
|
pankso@1
|
14 #
|
erjo@190
|
15
|
pankso@273
|
16 VERSION=2.1
|
erjo@190
|
17
|
pankso@174
|
18 . /lib/libtaz.sh
|
pankso@1
|
19
|
pankso@77
|
20 [ -f /etc/slitaz/tazdev.conf ] && . /etc/slitaz/tazdev.conf
|
pankso@273
|
21 [ -f ~/.config/slitaz/tazdev.conf ] && . ~/.config/slitaz/tazdev.conf
|
pankso@81
|
22 [ -f tazdev.conf ] && . ./tazdev.conf
|
pankso@77
|
23
|
al@274
|
24 [ -n "$SLITAZ_HOME" ] || die "No config file found"
|
al@274
|
25
|
al@274
|
26
|
al@274
|
27 # Remove all --parameters from cmdline
|
al@274
|
28 IFS=$'\n'
|
al@274
|
29 set -- $(echo "$*" | sed '/^--/d')
|
al@274
|
30 unset IFS
|
al@274
|
31
|
pankso@1
|
32
|
pankso@180
|
33 usage() {
|
al@274
|
34 cat <<EOT
|
pankso@183
|
35
|
al@274
|
36 $(boldify "Usage:") $(basename $0) <command> [<options>] [--options]
|
pankso@183
|
37
|
erjo@190
|
38 SliTaz developers and build host tool v$VERSION
|
pankso@183
|
39
|
pankso@174
|
40 $(boldify "Commands:")
|
al@274
|
41 usage Print this short usage and command list
|
al@274
|
42 help <tool> Give help on a SliTaz tool or library
|
al@274
|
43 -s stats Display statistics for your projects
|
al@274
|
44 -c chroot [<ver>|<rootfs>] Mount virtual FS and chroot into the build env
|
al@274
|
45 -gc gen-chroot [<ver>] Generate a chroot using packages from config
|
al@274
|
46 file
|
al@274
|
47 -uc umchroot [<rootfs>] Unmount chroot specified on cmdline
|
al@274
|
48 -cc clean-chroot [<ver>] Clean a chroot environment (skip root/ and
|
al@274
|
49 home/)
|
al@274
|
50 -p push [<user> [<ver>]] Upload new packages to the main mirror
|
al@274
|
51 -dp dry-push [<user> [<ver>]] Show what will be uploaded to the mirror
|
al@274
|
52 pull [<user> [<ver>]] Download new packages from the main mirror
|
al@274
|
53 dry-pull [<user> [<ver>]] Show what will be downloaded from the mirror
|
al@274
|
54 -ur up-repos Update all your SliTaz projects repos in one
|
al@274
|
55 command
|
al@274
|
56 -rp relpkg <pkg> [<version>] Archive and upload new package/project version
|
al@274
|
57 -sc setup-cgi Setup your CGI environment
|
pankso@183
|
58
|
pankso@183
|
59 $(boldify "Options:")
|
al@274
|
60 --rootfs= Path to the chroot to generate or clean
|
al@274
|
61 --arch= Specify the architecture type for cross-chroot, push/pull
|
paul@275
|
62 --clean or --forced Clean chroot before generating a new one
|
pankso@183
|
63
|
al@274
|
64 $(boldify "Examples:")
|
pankso@183
|
65 $(basename $0) gen-chroot undigest --clean
|
pankso@183
|
66 $(basename $0) -c --arch=arm
|
pankso@183
|
67
|
pankso@183
|
68 EOT
|
pankso@1
|
69 }
|
pankso@1
|
70
|
pankso@180
|
71 get_version() {
|
pankso@180
|
72 # Stable, undigest or custom.
|
al@274
|
73 version=${2:-cooking}
|
al@274
|
74 slitaz="$SLITAZ_HOME/$version"
|
al@274
|
75 if [ -n "$arch" ]; then
|
al@274
|
76 rootfs="$slitaz/$arch/chroot"
|
pankso@1
|
77 else
|
al@274
|
78 rootfs="$slitaz/chroot"
|
pankso@180
|
79 fi
|
pankso@1
|
80 }
|
pankso@1
|
81
|
pankso@180
|
82 check_mirror() {
|
al@274
|
83 [ -n "$2" ] && user="$2"
|
al@274
|
84 local repo="$3"
|
al@274
|
85 case $repo in
|
al@274
|
86 stable|backports|undigest)
|
al@274
|
87 remote="$MIRROR_PKGS/$repo/"
|
al@274
|
88 local="$SLITAZ_HOME/$repo/packages/"
|
al@274
|
89 ;;
|
al@274
|
90 rpi)
|
al@274
|
91 remote="$MIRROR_PKGS/cross/rpi/"
|
al@274
|
92 local="$SLITAZ_HOME/cooking/arm/packages/"
|
al@274
|
93 ;;
|
al@274
|
94 *)
|
al@274
|
95 remote="$MIRROR_PKGS/cooking/"
|
al@274
|
96 local="$SLITAZ_HOME/cooking/packages/"
|
al@274
|
97 ;;
|
al@274
|
98 esac
|
al@274
|
99
|
al@274
|
100 if [ -n "$arch" ]; then
|
al@274
|
101 remote="$remote$arch/"
|
al@274
|
102 local="$local$arch/"
|
pankso@189
|
103 fi
|
pankso@1
|
104 }
|
pankso@1
|
105
|
pascal@142
|
106 # Bind a directory into the chroot
|
pascal@142
|
107 bind_chroot_dir()
|
pascal@142
|
108 {
|
pascal@142
|
109 mkdir -p $1 $2
|
pascal@142
|
110 mount -o bind $1 $2
|
pascal@142
|
111 }
|
pascal@142
|
112
|
al@274
|
113 # Mount virtual Kernel file systems and chroot, but check that nobody
|
pankso@1
|
114 # else has done mounts
|
pankso@1
|
115 mount_chroot()
|
pankso@1
|
116 {
|
al@274
|
117 if [ ! -d "$rootfs/proc/1" ]; then
|
al@274
|
118 newline
|
al@274
|
119 action 'Mounting virtual filesystems...'
|
al@306
|
120 mount -n -t tmpfs none $rootfs/dev
|
al@306
|
121 mknod -m 622 $rootfs/dev/console c 5 1
|
al@306
|
122 mknod -m 666 $rootfs/dev/null c 1 3
|
al@306
|
123 mknod -m 666 $rootfs/dev/zero c 1 5
|
al@306
|
124 mknod -m 666 $rootfs/dev/ptmx c 5 2
|
al@306
|
125 mknod -m 666 $rootfs/dev/tty c 5 0
|
al@306
|
126 mknod -m 444 $rootfs/dev/random c 1 8
|
al@306
|
127 mknod -m 444 $rootfs/dev/urandom c 1 9
|
al@306
|
128 chown root:tty $rootfs/dev/console
|
al@306
|
129 chown root:tty $rootfs/dev/ptmx
|
al@306
|
130 chown root:tty $rootfs/dev/tty
|
al@306
|
131
|
al@306
|
132 ln -s /proc/self/fd $rootfs/dev/fd
|
al@306
|
133 ln -s /proc/self/fd/0 $rootfs/dev/stdin
|
al@306
|
134 ln -s /proc/self/fd/1 $rootfs/dev/stdout
|
al@306
|
135 ln -s /proc/self/fd/2 $rootfs/dev/stderr
|
al@306
|
136 ln -s /proc/kcore $rootfs/dev/core
|
al@306
|
137 mkdir $rootfs/dev/pts
|
al@306
|
138 mkdir $rootfs/dev/shm
|
al@306
|
139
|
al@306
|
140 mount -t devpts -o gid=4,mode=620 none $rootfs/dev/pts
|
al@306
|
141 mount -t tmpfs none $rootfs/dev/shm
|
al@306
|
142
|
al@306
|
143 mount -t proc proc $rootfs/proc
|
al@306
|
144 mount -t sysfs sysfs $rootfs/sys
|
pankso@1
|
145 status
|
pankso@1
|
146 fi
|
al@274
|
147 # Mount source, so they can be shared between cooking/stable/undigest.
|
al@274
|
148 # But do it only if it's a SliTaz development chroot.
|
al@274
|
149 fs="$rootfs/home/slitaz"
|
pankso@81
|
150 if [ -d "$slitaz" ]; then
|
pankso@174
|
151 bind_chroot_dir $SLITAZ_HOME/src $fs/src
|
al@274
|
152 # Now mount package dir, so they are in /home/slitaz/$version
|
al@274
|
153 # We may not mount cache wok or others: it has no point and if
|
paul@275
|
154 # one wants to use a shared wok, one can bind it manually.
|
al@274
|
155 [ -n "$arch" ] && slitaz="$slitaz/$arch"
|
al@274
|
156 mkdir -p "$fs/packages" "$slitaz/packages"
|
al@274
|
157 bind_chroot_dir "$slitaz/packages" "$fs/packages"
|
pankso@80
|
158 fi
|
pankso@1
|
159 }
|
pankso@1
|
160
|
pankso@180
|
161 # Unmount virtual Kernel file systems.
|
pankso@180
|
162 umount_chroot() {
|
al@274
|
163 [ -n "$1" ] && rootfs="$1"
|
al@274
|
164 fs="$rootfs/home/slitaz"
|
al@274
|
165 newline
|
al@274
|
166 action 'Unmounting virtual filesystems...'
|
pankso@81
|
167 umount $rootfs/dev/shm
|
pankso@81
|
168 umount $rootfs/dev/pts
|
al@306
|
169 umount $rootfs/dev
|
pankso@81
|
170 umount $rootfs/sys
|
pankso@81
|
171 umount $rootfs/proc
|
pankso@180
|
172 if mount | fgrep -q $fs/src; then
|
pankso@180
|
173 umount $fs/src
|
pankso@180
|
174 umount $fs/packages
|
pankso@180
|
175 fi
|
al@274
|
176 status
|
al@274
|
177 newline
|
pankso@1
|
178 }
|
pankso@1
|
179
|
pankso@1
|
180 # Get the last cooking base rootfs, extract and configure.
|
pankso@180
|
181 gen_chroot() {
|
al@274
|
182 title "Generating new chroot in $rootfs"
|
al@274
|
183
|
slaxemulator@85
|
184 mkdir -p $rootfs
|
al@274
|
185 # We may gen cooking chroot from a stable version or vice versa
|
pankso@183
|
186 case "$version" in
|
al@274
|
187 stable*|4.0*|backports)
|
al@274
|
188 url="http://$MIRROR/packages/stable/" ;;
|
al@274
|
189 *)
|
al@274
|
190 url="http://$MIRROR/packages/cooking/" ;;
|
pankso@183
|
191 esac
|
al@274
|
192
|
pankso@183
|
193 # --mirror=
|
al@274
|
194 [ -n "$mirror" ] && url="$mirror"
|
al@274
|
195 mpath="/var/lib/tazpkg/mirror"
|
pascal@205
|
196 mkdir -p $(dirname $rootfs$mpath)
|
pascal@205
|
197 echo "$url" > $rootfs$mpath
|
al@274
|
198
|
al@274
|
199 action "Mirror URL: ${url#http://}"
|
al@274
|
200 tazpkg recharge --root="$rootfs" --quiet >/dev/null
|
pankso@183
|
201 status
|
al@274
|
202
|
al@274
|
203 for pkg in $CHROOT_PKGS; do
|
al@274
|
204 action "Installing: $pkg $vers"
|
al@274
|
205 tazpkg -gi $pkg --root="$rootfs" --quiet
|
pankso@183
|
206 status
|
pankso@180
|
207 done
|
al@274
|
208
|
al@274
|
209 action "Creating resolv.conf..."
|
pankso@81
|
210 cat /etc/resolv.conf > $rootfs/etc/resolv.conf
|
pankso@1
|
211 status
|
al@274
|
212
|
al@274
|
213 action "Creating TZ..."
|
pascal@198
|
214 cat /etc/TZ > $rootfs/etc/TZ
|
pascal@198
|
215 status
|
al@274
|
216
|
pankso@183
|
217 case "$version" in
|
pankso@183
|
218 cooking) version="" ;;
|
pankso@183
|
219 esac
|
pankso@183
|
220 [ "$arch" ] && version="$version --arch=$arch"
|
al@274
|
221 footer "Ready to chroot with: $(colorize 34 "tazdev -c $version")"
|
pankso@1
|
222 }
|
pankso@1
|
223
|
pankso@208
|
224 #
|
pankso@208
|
225 # Commands
|
pankso@208
|
226 #
|
pankso@1
|
227
|
pankso@1
|
228 case "$1" in
|
pankso@183
|
229 stats|-s)
|
al@274
|
230 title "Statistics for $PROJECTS"
|
al@274
|
231 printf "%-23s %-13s %-15s %s\n" 'Project' 'Revision' 'Version' 'Files'
|
al@274
|
232 separator '-'
|
al@274
|
233 cd $PROJECTS
|
al@274
|
234 for proj in *; do
|
pankso@1
|
235 rev=""
|
al@274
|
236 if [ -d "$PROJECTS/$proj/.hg" ]; then
|
al@274
|
237 cd $PROJECTS/$proj
|
al@274
|
238 rev=$(hg head --template '{rev};' | sed 's|;$||') # we have multiple heads in some projects
|
al@274
|
239 vers=$(hg tags | grep -v tip | head -n1 | cut -d" " -f1) # some projects don't have any version tags
|
pankso@273
|
240 files=$(find . -type f | wc -l)
|
al@274
|
241 printf "%-23s %-13s %-15s %s\n" "$proj" "$rev" "${vers:--}" "$files"
|
pankso@1
|
242 fi
|
pankso@1
|
243 done
|
al@274
|
244 footer
|
al@274
|
245 ;;
|
al@274
|
246
|
pankso@180
|
247 chroot|-c)
|
pankso@82
|
248 # Chroot into a build env. Default to cooking configured in tazdev.conf
|
al@274
|
249 check_root $1
|
pankso@1
|
250 get_version $@
|
al@274
|
251 [ -d "$2" ] && rootfs="$2"
|
pankso@1
|
252 mount_chroot
|
pankso@82
|
253 echo -e "Chrooting to: $rootfs\n"
|
pankso@81
|
254 chroot $rootfs /bin/sh --login
|
al@274
|
255 umount_chroot
|
al@274
|
256 ;;
|
al@274
|
257
|
pankso@273
|
258 umchroot|-uc)
|
al@274
|
259 check_root $1
|
pankso@80
|
260 get_version $@
|
al@274
|
261 [ -d "$2" ] && rootfs="$2"
|
al@274
|
262 umount_chroot $rootfs
|
al@274
|
263 ;;
|
al@274
|
264
|
pankso@77
|
265 gen-chroot|-gc)
|
al@274
|
266 check_root $1
|
pankso@180
|
267 # We can use: --rootfs=/path/to/chroot
|
al@274
|
268 [ -n "$rootfs" ] || get_version $@
|
al@274
|
269
|
al@274
|
270 # If --clean or --forced option given
|
al@274
|
271 [ -n "$clean$forced" ] && $0 -cc --rootfs=$rootfs
|
al@274
|
272
|
al@274
|
273 # Don't break another env.
|
al@274
|
274 [ -d "$rootfs/bin" ] &&
|
al@274
|
275 die "A chroot environment already exists in $rootfs.\nUse --clean or --forced to clean this chroot."
|
al@274
|
276
|
al@274
|
277 gen_chroot
|
al@274
|
278 ;;
|
al@274
|
279
|
pankso@183
|
280 clean-chroot|-cc)
|
al@274
|
281 check_root $1
|
pankso@183
|
282 # We can use: --rootfs=/path/to/chroot
|
al@274
|
283 [ -n "$rootfs" ] || get_version $@
|
al@274
|
284
|
al@274
|
285 [ ! -d "$rootfs" ] && die "Chroot '$rootfs' doesn't exist"
|
al@274
|
286
|
al@274
|
287 [ -d "$rootfs/proc/1" ] && die "WARNING: $rootfs/proc mounted!"
|
al@274
|
288
|
pankso@81
|
289 cd $rootfs || exit 1
|
al@274
|
290
|
al@274
|
291 title "Cleaning chroot $rootfs"
|
pankso@183
|
292 # Keep root/ and /home they may have a build wok, custom scripts, etc.
|
al@274
|
293 for i in boot bin dev etc lib media mnt proc sbin sys tmp usr var run; do
|
pankso@181
|
294 if [ -d "$i" ]; then
|
al@274
|
295 action "Removing: $i ($(du -sh $i | awk '{ print $1 }'))..."
|
al@274
|
296 rm -rf $i
|
al@274
|
297 status
|
pankso@181
|
298 fi
|
pankso@1
|
299 done
|
pankso@181
|
300 rm -f init
|
al@274
|
301 footer
|
al@274
|
302 ;;
|
al@274
|
303
|
pankso@70
|
304 push|-p)
|
pankso@1
|
305 check_mirror $@
|
pankso@113
|
306 rsync -r -t -O -l -v -z --delete \
|
al@274
|
307 $local -e ssh $user@$MIRROR:$remote
|
al@274
|
308 ;;
|
al@274
|
309
|
pankso@70
|
310 dry-push|-dp)
|
pankso@1
|
311 check_mirror $@
|
pankso@113
|
312 rsync -r -t -O -l -v -z --delete --dry-run \
|
al@274
|
313 $local -e ssh $user@$MIRROR:$remote
|
al@274
|
314 ;;
|
al@274
|
315
|
pankso@1
|
316 pull)
|
pankso@1
|
317 check_mirror $@
|
pankso@1
|
318 rsync -r -t -l -v -z --delete \
|
al@274
|
319 -e ssh $user@$MIRROR:$remote $local
|
al@274
|
320 ;;
|
al@274
|
321
|
pankso@1
|
322 dry-pull)
|
pankso@1
|
323 check_mirror $@
|
pankso@1
|
324 rsync -r -t -l -v -z --delete --dry-run \
|
al@274
|
325 -e ssh $user@$MIRROR:$remote $local
|
al@274
|
326 ;;
|
al@274
|
327
|
pankso@273
|
328 up-repos|-ur)
|
pankso@210
|
329 # Update all at once.
|
al@274
|
330 title "Update all SliTaz Hg repos"
|
al@274
|
331 for p in $(ls $PROJECTS); do
|
al@274
|
332 title "Project $p"
|
al@274
|
333 cd $PROJECTS/$p
|
pankso@210
|
334 hg pull -u
|
pankso@210
|
335 done
|
al@274
|
336 footer
|
al@274
|
337 ;;
|
al@274
|
338
|
pankso@70
|
339 relpkg|-rp)
|
pankso@82
|
340 # Release a slitaz sub-project and upload tarball to mirror
|
pankso@1
|
341 [ -z "$MIRROR_SOURCES" ] && MIRROR_SOURCES="/var/www/slitaz/mirror/sources"
|
al@274
|
342 [ -z "$2" ] && die "Usage: $0 relpkg package [version]"
|
al@274
|
343
|
pankso@81
|
344 pkg=$2
|
al@274
|
345 version="$3"
|
al@274
|
346
|
erjo@191
|
347 # We can get the last found version in .hgtags
|
al@274
|
348 [ -n "$version" ] ||
|
al@274
|
349 version=$(awk 'END{print $2}' $PROJECTS/$pkg/.hgtags)
|
erjo@191
|
350
|
al@274
|
351 newline
|
al@274
|
352 cd $PROJECTS/$pkg
|
pankso@177
|
353
|
pankso@1
|
354 # Sanity check
|
al@274
|
355 grep -q $version$ .hgtags ||
|
al@274
|
356 die "Missing Hg tag for version $version\nYou may want to: hg tag $version; hg push\n"
|
pankso@177
|
357
|
pankso@1
|
358 # Archive
|
al@274
|
359 action "Creating tarball and md5sum for $pkg-$version..."
|
erjo@191
|
360 hg archive -t tgz $SOURCE/$pkg-$version.tar.gz
|
erjo@191
|
361 ( cd $SOURCE; md5sum $pkg-$version.tar.gz > $pkg-$version.md5 )
|
al@274
|
362 status
|
pankso@177
|
363
|
pankso@1
|
364 # Upload
|
al@274
|
365 confirm 'Do you wish to upload tarball to the mirror?' 'n' &&
|
al@274
|
366 {
|
al@274
|
367 cd $SOURCE
|
al@274
|
368 echo "Uploading to $MIRROR/sources/${pkg#slitaz-}"
|
al@274
|
369 scp "$pkg-$version.tar.gz" "$pkg-$version.md5" \
|
erjo@191
|
370 $MIRROR:$MIRROR_SOURCES/${pkg#slitaz-}
|
al@274
|
371 }
|
pankso@177
|
372
|
pankso@147
|
373 # Update pkg in wok
|
al@274
|
374 confirm "Do you wish to update $pkg in wok?" 'n' &&
|
al@274
|
375 {
|
al@274
|
376 action "Updating $pkg: $version"
|
pankso@147
|
377 cd $PROJECTS/wok
|
pankso@147
|
378 sed -i s"/VERSION=.*/VERSION=\"$version\"/" $pkg*/receipt
|
pankso@174
|
379 status
|
al@274
|
380 }
|
al@274
|
381 ;;
|
al@274
|
382
|
pankso@273
|
383 setup-cgi|-sc)
|
pankso@273
|
384 . /etc/slitaz/slitaz.conf
|
al@274
|
385 echo "$(boldify 'Public:') $PUBLIC"
|
al@274
|
386 mkdir -p $PUBLIC/cgi-bin
|
al@274
|
387 cd $PUBLIC/cgi-bin
|
pankso@273
|
388 for proj in tazbug tinycm mediabox; do
|
al@274
|
389 [ -d "$proj" ] || hg clone http://hg.slitaz.org/$proj
|
pankso@273
|
390 done
|
al@274
|
391 [ -d "$INSTALLED/lighttpd" ] || sudo tazpkg -gi lighttpd
|
al@274
|
392
|
pankso@273
|
393 echo
|
paul@275
|
394 echo "TODO: setup SCN (tinycm install + plugins from slitaz-forge)"
|
pankso@273
|
395 echo
|
al@274
|
396 echo "$(boldify 'URL :') http://localhost/~$USER/cgi-bin/"
|
al@274
|
397 ;;
|
al@274
|
398
|
pankso@174
|
399 help)
|
al@274
|
400 doc='/usr/share/doc/slitaz/'
|
al@274
|
401 topics="Available help topics: $(cd $doc; ls *.txt | sed 's|.txt$||' | tr '\n' ' ')"
|
al@274
|
402 [ -n "$2" ] ||
|
al@274
|
403 die "Missing tool/library name\nExample: tazdev help httphelper\n\n$topics"
|
al@274
|
404
|
al@274
|
405 if [ -f "$doc$2.txt" ]; then
|
al@274
|
406 {
|
al@274
|
407 output='raw' title "Help for $2"
|
al@274
|
408 cat $doc$2.txt
|
al@274
|
409 footer
|
al@274
|
410 } | less -M
|
al@274
|
411 else
|
al@274
|
412 echo "No help found for '$2'"
|
al@274
|
413 longline "$topics"
|
pankso@273
|
414 fi
|
al@274
|
415 ;;
|
al@274
|
416
|
al@274
|
417 usage|*)
|
al@274
|
418 usage
|
al@274
|
419 ;;
|
al@274
|
420
|
pankso@1
|
421 esac
|
pankso@1
|
422
|
pankso@1
|
423 exit 0
|