slitaz-dev-tools view mirror-tools/rootfs/usr/bin/mkpkgiso @ rev 220

mirror-tools/mkpkgiso: update /packages/get
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sun Feb 16 13:09:39 2014 +0000 (2014-02-16)
parents a49102a73eff
children 722ee04ad91e
line source
1 #!/bin/sh
2 # mkpkgiso, build packages ISO image.
3 # (C) 2007-TODAY SliTaz - GNU General Public License v3.
4 #
5 # Authors : Eric Joseph-Alexandre <erjo@slitaz.org>
6 # Pascal Bellard <pascal.bellard@slitaz.org>
8 VERSION=0.9
10 PKG_VER=$1
11 ROOT=/home/slitaz/iso
12 REPOS=/var/www/slitaz/mirror/packages/$PKG_VER
13 SOURCES=/var/www/slitaz/mirror/sources/packages
14 IFMEM_C32=/var/www/slitaz/mirror/pxe/ifmem.c32
15 ISO_DIR=/var/www/slitaz/mirror/iso/$PKG_VER
17 [ -s /etc/slitaz/mkpkgiso.conf ] && . /etc/slitaz/mkpkgiso.conf
18 [ -s ./mkpkgiso.conf ] && . ./mkpkgiso.conf
20 SORT_DIR=${ROOT}/_iso.$$
21 TEMP_DIR=${ROOT}/_iso.$$
22 SORT_FILE=${ROOT}/_sort.$$
23 shift
24 OPTIONS=$@
25 PKG_DIR=$TEMP_DIR/packages/$PKG_VER
26 SRC_DIR=$TEMP_DIR/src
27 LOG=$PWD/$(basename $0).log
29 #
30 VOLUME_ID="packages-${PKG_VER}"
31 PUBLISHER="SliTaz http://www.slitaz.org/"
32 IMAGE="packages-${PKG_VER}.iso"
33 case " $@ " in
34 *\ --sources\ *)
35 IMAGE="sources-${PKG_VER}.iso" ;;
36 esac
37 OUTPUT="$ROOT/$IMAGE"
39 # Check command line option.
40 if [ -z $PKG_VER ]; then
41 cat <<EOT
42 Usage: $(basename $0) <Version>
43 [--boot [--auto-install] [--loram-detect]]|--webboot] [--filter]
44 [--wok] [--wok-stable] [--website] [--sources] [--dry-run]
45 $(basename $0) update-hg <dir>
46 Example:
47 $(basename $0) cooking --boot --auto-install --loram-detect --filter --wok --website --sources
48 EOT
49 exit 1
50 fi
52 # Update hg repos
53 if [ "$PKG_VER" == "update-hg" ]; then
54 for repos in $@ ; do
55 for i in $repos/* ; do
56 grep -qs '\[paths]' $i/.hg/hgrc || continue
57 cd $i
58 hg pull
59 hg update
60 cd - > /dev/null
61 case "$i" in
62 */get-scripts) cp $i/* /var/www/slitaz/mirror/packages/get
63 esac
64 done
65 done
66 exit 1
67 fi
69 # Check if we provide a valid version
70 if [ ! -d $REPOS ]; then
71 echo "Boooh! $PKG_VER is not a valid version."
72 exit 1
73 fi
75 # Status function.
76 status()
77 {
78 local CHECK=$?
79 echo -en "\\033[70G[ "
80 if [ $CHECK = 0 ]; then
81 echo -en "\\033[1;33mOK"
82 else
83 echo -en "\\033[1;31mFailed"
84 fi
85 echo -e "\\033[0;39m ]"
86 }
88 need()
89 {
90 found=1
91 for i in $@ ; do
92 [ -s $i ] && continue
93 echo "Missing: $i "
94 found=0
95 done
96 [ $found -ne 0 ] && return
97 status
98 rm -rf $TEMP_DIR $SORT_FILE
99 exit 1
100 }
102 # Create temp directory
103 mkdir -p $TEMP_DIR/packages/$PKG_VER
104 which genisoimage > /dev/null || need /usr/bin/genisoimage
106 # Prepare evrything for ISO
108 echo ""
109 echo "Building ISO for packages $PKG_VER"
110 echo "==============================================================================="
111 echo -n "Creating working dir $(basename $TEMP_DIR)"
112 status
113 echo -n "Creating symlink"
114 status
116 # Link every packages to temp dir
117 cd $PKG_DIR
118 for i in $REPOS/*
119 do
120 ln -s $i >> $LOG 2>&1
121 done
123 echo -n "Creating install script"
124 # Create install script as suggested by Pascal.
125 cat >$TEMP_DIR/install.sh<<EOF
126 #!/bin/sh
127 #
129 DIR=\$(cd \$(busybox dirname \$0); pwd)
131 # Handle --auto-install case
132 if [ "\$DIR" == "/etc/init.d" ]; then
133 DIR=/cdrom
134 if [ ! -f /cdrom/install.sh ]; then
135 mkdir /cdrom 2> /dev/null
136 mount --bind /mnt /cdrom
137 fi
138 # Handle loram on hybrid hard disk / usb key case
139 if [ ! -d /usr/bin ]; then
140 echo ""
141 if [ -d /.usr.rw ]; then
142 echo -n "Mounting /usr read-write... "
143 usr=.usr.ro
144 else
145 echo -n "Mounting /usr read-only... "
146 usr=usr
147 fi
148 FS=\$DIR/usr.cromfs
149 if [ -f \$FS ]; then
150 /bin/cromfs-driver \$FS /\$usr -o ro,dev,suid,allow_other
151 elif [ -f \$DIR/usr.sqfs ]; then
152 FS=\$DIR/usr.sqfs
153 mount -o loop,ro -t squashfs \$FS /\$usr
154 elif [ -L /\$usr ]; then
155 FS=\$DIR/usr
156 fi
157 status
158 if [ -d /.usr.rw ]; then
159 if [ -x /bin/funionfs ]; then
160 /bin/funionfs -o dirs=/.usr.ro=RO:/.usr.rw -o allow_other -o suid,dev NONE /usr
161 else
162 /bin/mount -t aufs -o br:/.usr.rw:/.usr.ro none /usr
163 fi
164 fi
165 fi
166 fi
168 [ -d /var/cache/tazpkg ] || mkdir -p /var/cache/tazpkg
169 ls -d \$DIR/packages/* > /var/lib/tazpkg/mirror
170 ln -fs \$DIR/packages/*/*.tazpkg /var/cache/tazpkg/
171 ln -fs \$DIR/packages/*/packages.* /var/lib/tazpkg
172 echo ""
173 echo "=> all $PKG_VER packages are available for tazpkg/tazpkgbox"
174 EOF
175 [ -e files.list.lzma ] && cat >>$TEMP_DIR/install.sh<<EOF
176 ln -fs \$DIR/packages/*/files.list.lzma /var/lib/tazpkg
177 EOF
179 status
180 cat > $SORT_FILE <<EOT
181 $SORT_DIR/install.sh -4000
182 $SORT_DIR/README -4000
183 $SORT_DIR/index.html -4000
184 $SORT_DIR/md5sum -4000
185 $SORT_DIR/style.css -4000
186 $SORT_DIR/images/header.png -4000
187 $SORT_DIR/boot/bzImage 2
188 $SORT_DIR/boot/rootfs.gz 1
189 $SORT_DIR/packages -9000
190 EOT
191 ( cd $ROOT; ls $SORT_DIR/packages/*/packages* $SORT_DIR/packages/*/files.list.lzma ) | \
192 awk '{ printf "%s -7000\n",$0 }' >> $SORT_FILE
193 chmod 755 $TEMP_DIR/install.sh
195 case " $OPTIONS " in
196 *\ --filter\ *)
197 SIZE=0
198 for i in *.tazpkg; do
199 while read f; do
200 case "$i" in
201 $f*) continue 2;;
202 esac
203 done < packages.list
204 echo -n "Filtering out $i ($(du -hs $(readlink $i) | awk '{ print $1 }'))..."
205 SIZE=$(( $SIZE + $(stat -c %s $(readlink $i)) ))
206 rm $i
207 status
208 done
209 UNIT=" bytes"
210 if [ $SIZE -gt 10240 ]; then
211 SIZE=$(( $SIZE / 1024 ))
212 UNIT="K"
213 fi
214 if [ $SIZE -gt 10240 ]; then
215 SIZE=$(( $SIZE / 1024 ))
216 UNIT="M"
217 fi
218 echo "$SIZE$UNIT removed.";;
219 esac
221 # Copy hg subtree
222 get_from_hg()
223 {
224 echo -n "Adding $2"
225 if [ -s /home/slitaz/$1/.hg/hgrc ]; then
226 cp -a /home/slitaz/$1 $TEMP_DIR
227 else
228 wget -q -O - http://hg.slitaz.org/$1/archive/tip.tar.bz2 | tar xjf - -C $TEMP_DIR
229 mv $TEMP_DIR/$1-* $TEMP_DIR/$1
230 fi
231 status
232 echo "$(du -hs $TEMP_DIR/$1 | awk '{ print $1 }') used by $2."
233 }
235 for i in $OPTIONS ; do
236 case "$i" in
237 --wok)
238 cat >>$TEMP_DIR/install.sh<<EOF
239 mkdir -p /home/slitaz
240 ln -s \$DIR/wok /home/slitaz
241 echo "=> Wok (cooking) is in /home/slitaz/wok"
242 EOF
243 if get_from_hg wok "wok (cooking)"; then
244 echo "$SORT_DIR/wok -8000" >> $SORT_FILE
245 fi;;
246 --wok-stable)
247 cat >>$TEMP_DIR/install.sh<<EOF
248 mkdir -p /home/slitaz
249 ln -s \$DIR/wok /home/slitaz
250 echo "=> Wok (stable) is in /home/slitaz/wok"
251 EOF
252 if get_from_hg wok-stable "wok (stable)"; then
253 mv $TEMP_DIR/wok-stable $TEMP_DIR/wok
254 echo "$SORT_DIR/wok -8000" >> $SORT_FILE
255 fi;;
256 --website)
257 if get_from_hg website "web site"; then
258 echo "$SORT_DIR/website -6000" >> $SORT_FILE
259 cat >>$TEMP_DIR/install.sh<<EOF
260 if [ -s \$DIR/website/index.html ]; then
261 echo "=> slitaz web site installed in file://\$DIR/website/index.html"
262 elif [ -s \$DIR/website/index.php ]; then
263 yes y | tazpkg get-install php
264 ln -s /\$DIR/website /var/www
265 echo "=> slitaz web site installed in http://127.0.0.1/website/index.php"
266 else
267 echo "=> slitaz web site is not installed. How can I do it ?"
268 fi
269 EOF
270 fi;;
271 --sources)
272 echo -n "Removing previous ISO..."
273 rm -f $OUTPUT
274 status
275 cat >>$TEMP_DIR/install.sh<<EOF
276 mkdir -p /home/slitaz
277 ln -s \$DIR/src /home/slitaz
278 echo "=> sources are in /home/slitaz/src"
279 EOF
280 mkdir -p $SRC_DIR
281 cd $SRC_DIR
282 for i in $SOURCES/*/*
283 do
284 case "$i" in
285 */md5sum) continue;;
286 esac
287 ln -s $i >> $LOG 2>&1
288 done
289 find * -not -type d | grep -v md5sum | xargs md5sum > md5sum
290 echo "$(du -hs $SOURCES | awk '{ print $1 }') used by sources." ;;
291 esac
292 done
294 # Extract boot package function
295 extract_boot()
296 {
297 f=$(ls $REPOS/$1-[0-9]*.tazpkg 2> /dev/null)
298 [ -f "$f" ] || return 1
299 [ -d $TEMP_DIR/boot ] || mkdir $TEMP_DIR/boot
300 ( cd $TEMP_DIR/boot ; cpio -i fs.cpio.gz fs.cpio.lzma < $f 2> /dev/null )
301 ( cd $TEMP_DIR/boot ; { zcat fs.cpio.gz || unlzma -c fs.cpio.lzma ; } | cpio -id 2> /dev/null )
302 mv $TEMP_DIR/boot/fs/boot/* $TEMP_DIR/boot
303 rm -rf $TEMP_DIR/boot/fs.cpio.* $TEMP_DIR/boot/fs
304 return 0
305 }
307 # Gen boot part
308 BOOT_OPT=""
309 iso=$ISO_DIR/slitaz-$PKG_VER.iso
310 for i in slitaz-loram-cdrom-sqfs slitaz-$PKG_VER-loram-cdrom ; do
311 isoloram=$ISO_DIR/flavors/$i.iso
312 [ -s $isoloram ] && break
313 done
314 case " $OPTIONS " in
315 *\ --boot\ *)
316 echo -n "Creating boot tree"
317 need $iso
318 which isoinfo > /dev/null || need /usr/bin/isoinfo
319 isoinfo -R -l -i $iso | awk '/^Directory/ { path=$4 } /^-/ { print path$12 }' | while read file; do
320 [ "$(basename $file)" == ".." ] && continue
321 [ "$file" = "/boot/isolinux/boot.cat" ] && continue
322 [ -d "$(dirname $TEMP_DIR/$file)" ] ||
323 mkdir -p "$(dirname $TEMP_DIR/$file)"
324 isoinfo -R -x "$file" -i $iso > "$TEMP_DIR/$file"
325 done
326 if [ -f "$(echo $TEMP_DIR/boot/vmlinuz*)" ]; then
327 rm -f $TEMP_DIR/boot/bzImage
328 ln $TEMP_DIR/boot/vmlinuz* $TEMP_DIR/boot/bzImage
329 fi
330 status
331 BOOT_OPT="-sort $SORT_FILE -b boot/isolinux/isolinux.bin \
332 -c boot/isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table"
333 case " $OPTIONS " in
334 *\ --auto-install\ *)
335 echo -n "Enabling auto install"
336 sed -i "s/rw root/rw config=LABEL=packages-$PKG_VER,install.sh root/" \
337 $TEMP_DIR/boot/isolinux/*.cfg
338 status
339 ;;
340 esac
341 case " $OPTIONS " in
342 *\ --loram-detect\ *)
343 echo -n "Enabling loram autodetection"
344 need $IFMEM_C32 $isoloram
345 which isoinfo > /dev/null || need /usr/bin/isoinfo
346 cp $IFMEM_C32 "$TEMP_DIR/boot/isolinux"
347 isoinfo -R -x "/usr.sqfs" -i $isoloram \
348 > "$TEMP_DIR/usr.sqfs" 2> /dev/null
349 if [ -s "$TEMP_DIR/usr.sqfs" ]; then
350 echo "$SORT_DIR/usr.sqfs -5000" >> $SORT_FILE
351 else
352 rm -f "$TEMP_DIR/usr.sqfs"
353 isoinfo -R -x "/rootfs.gz" -i $isoloram \
354 > "$TEMP_DIR/rootfs.gz" 2> /dev/null
355 echo "$SORT_DIR/rootfs.gz -5000" >> $SORT_FILE
356 fi
357 isoinfo -R -x "/boot/rootfs.gz" -i $isoloram > \
358 "$TEMP_DIR/boot/loram.gz"
359 cat >> $TEMP_DIR/boot/isolinux/common.cfg <<EOT
360 label noram
361 config noram.cfg
362 EOT
363 cat >> $TEMP_DIR/boot/isolinux/noram.cfg <<EOT
364 display isolinux.msg
365 say Not enough RAM to boot slitaz.
366 default reboot
367 label reboot
368 com32 reboot.c32
370 implicit 0
371 prompt 1
372 timeout 80
373 F1 help.txt
374 F2 options.txt
375 F3 isolinux.msg
376 F4 display.txt
377 F5 enhelp.txt
378 F6 enopts.txt
379 EOT
380 sed -i -e 's|kernel /boot/bzImage|kernel /boot/isolinux/ifmem.c32\n\tappend 160768 core 29696 loram noram\n|' \
381 -e "s|\\(.*/\\)rootfs\\(.gz .*\\)\$|label core\\n\\tkernel /boot/bzImage\\n\\1rootfs\\2\\n\\nlabel loram\\n\\tkernel /boot/bzImage\\n\\1loram\\2 loram=LABEL=packages-$PKG_VER,|" \
382 $TEMP_DIR/boot/isolinux/*.cfg
383 status
384 ;;
385 esac
386 echo "$SORT_DIR/boot 0" >> $SORT_FILE
387 ;;
388 *\ --webboot\ *)
389 if extract_boot gpxe; then
390 echo -n "Creating web boot tree"
391 which isoinfo > /dev/null || need /usr/bin/isoinfo
392 mkdir $TEMP_DIR/boot/isolinux/
393 isoinfo -R -x "/boot/isolinux/isolinux.bin" -i $iso > \
394 $TEMP_DIR/boot/isolinux/isolinux.bin
395 mv $TEMP_DIR/boot/gpxe $TEMP_DIR/boot/isolinux
396 echo "$SORT_DIR/boot 0" >> $SORT_FILE
397 cat > $TEMP_DIR/boot/isolinux/isolinux.cfg <<EOT
398 default gpxe
399 append http://mirror.slitaz.org/pxe/pxelinux.0
400 EOT
401 status
402 BOOT_OPT="-sort $SORT_FILE -b boot/isolinux/isolinux.bin \
403 -c boot/isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table"
404 fi
405 ;;
406 esac
408 if [ -n "$BOOT_OPT" ]; then
409 echo "$(du -chs $TEMP_DIR/boot $TEMP_DIR/usr.sqfs 2> /dev/null | \
410 awk 'END { print $1 }') used by boot."
411 fi
413 case " $OPTIONS " in
414 *\ --dry-run\ *)
415 echo "Please check and remove $TEMP_DIR and $SORT_FILE"
416 exit
417 ;;
418 esac
419 # Gen ISO
420 echo -n "Generating iso image"
421 genisoimage -R -J -f -V $VOLUME_ID \
422 -P "$PUBLISHER" -md5-list $REPOS/packages.md5 \
423 -quiet -o $OUTPUT $BOOT_OPT $TEMP_DIR
424 status
426 echo "$(du -hs $OUTPUT | awk '{ print $1 }') used by iso image."
428 cd ${ROOT}
429 echo -n "Creating hybrid DVD/CDROM"
430 ISOHYBRID=isohybrid.sh
431 which isohybrid > /dev/null && ISOHYBRID=isohybrid
432 which $ISOHYBRID > /dev/null && $ISOHYBRID $IMAGE 2> /dev/null
433 status
435 echo -n "Calculating md5sum"
436 md5sum $IMAGE > $(basename $IMAGE .iso).md5
437 status
439 echo -n "Moving file to mirror"
440 mv $IMAGE $ISO_DIR
441 mv $(basename $IMAGE .iso).md5 $ISO_DIR
442 status
444 # Cleaning temp files
445 rm -rf $TEMP_DIR $SORT_FILE