wok-next view mirror-tools/stuff/usr/bin/mkpkgiso @ rev 5203

mirror-tools/mkpkgiso: add 3.0 loram support
author Pascal Bellard <pascal.bellard@slitaz.org>
date Mon Mar 29 21:57:31 2010 +0200 (2010-03-29)
parents 9d22b4642908
children 2c7074daece0
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.8
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 Example:
46 $(basename $0) cooking --boot --auto-install --loram-detect --filter --wok --website --sources
47 EOT
48 exit 1
49 fi
51 # Check if we provide a valide version
52 if [ ! -d $REPOS ]; then
53 echo "Boooh! $PKG_VER is not a valid version."
54 exit 1
55 fi
57 # Status function.
58 status()
59 {
60 local CHECK=$?
61 echo -en "\\033[70G[ "
62 if [ $CHECK = 0 ]; then
63 echo -en "\\033[1;33mOK"
64 else
65 echo -en "\\033[1;31mFailed"
66 fi
67 echo -e "\\033[0;39m ]"
68 }
70 need()
71 {
72 found=1
73 for i in $@ ; do
74 [ -s $i ] && continue
75 echo "Missing: $i "
76 found=0
77 done
78 [ $found -ne 0 ] && return
79 status
80 rm -rf $TEMP_DIR $SORT_FILE
81 exit 1
82 }
84 # Create temp directory
85 mkdir -p $TEMP_DIR/packages/$PKG_VER
86 which genisoimage > /dev/null || need /usr/bin/genisoimage
88 # Prepare evrything for ISO
90 echo ""
91 echo "Building ISO for packages $PKG_VER"
92 echo "==============================================================================="
93 echo -n "Creating working dir $(basename $TEMP_DIR)"
94 status
95 echo -n "Creating symlink"
96 status
98 # Link every packages to temp dir
99 cd $PKG_DIR
100 for i in $REPOS/*
101 do
102 ln -s $i >> $LOG 2>&1
103 done
105 echo -n "Creating install script"
106 # Create install script as suggested by Pascal.
107 cat >$TEMP_DIR/install.sh<<EOF
108 #!/bin/sh
109 #
111 DIR=\$(cd \$(busybox dirname \$0); pwd)
113 # Handle --auto-install case
114 if [ "\$DIR" == "/etc/init.d" ]; then
115 DIR=/cdrom
116 if [ ! -f /cdrom/install.sh ]; then
117 mkdir /cdrom 2> /dev/null
118 mount --bind /mnt /cdrom
119 fi
120 # Handle loram on hybrid hard disk / usb key case
121 if [ ! -d /usr/bin ]; then
122 echo ""
123 if [ -d /.usr.rw ]; then
124 echo -n "Mounting /usr read-write... "
125 usr=.usr.ro
126 else
127 echo -n "Mounting /usr read-only... "
128 usr=usr
129 fi
130 FS=\$DIR/usr.cromfs
131 if [ -f \$FS ]; then
132 /bin/cromfs-driver \$FS /\$usr -o ro,dev,suid,allow_other
133 elif [ -f \$DIR/usr.sqfs ]; then
134 FS=\$DIR/usr.sqfs
135 mount -o loop,ro -t squashfs \$FS /\$usr
136 elif [ -L /\$usr ]; then
137 FS=\$DIR/usr
138 fi
139 status
140 if [ -d /.usr.rw ]; then
141 if [ -x /bin/funionfs ]; then
142 /bin/funionfs -o dirs=/.usr.ro=RO:/.usr.rw -o allow_other -o suid,dev NONE /usr
143 else
144 /bin/mount -t aufs -o br:/.usr.rw:/.usr.ro none /usr
145 fi
146 fi
147 fi
148 fi
150 [ -d /var/cache/tazpkg ] || mkdir -p /var/cache/tazpkg
151 ls -d \$DIR/packages/* > /var/lib/tazpkg/mirror
152 ln -fs \$DIR/packages/*/*.tazpkg /var/cache/tazpkg/
153 ln -fs \$DIR/packages/*/packages.* /var/lib/tazpkg
154 echo ""
155 echo "=> all $PKG_VER packages are available for tazpkg/tazpkgbox"
156 EOF
157 [ -e files.list.lzma ] && cat >>$TEMP_DIR/install.sh<<EOF
158 ln -fs \$DIR/packages/*/files.list.lzma /var/lib/tazpkg
159 EOF
161 status
162 cat > $SORT_FILE <<EOT
163 $SORT_DIR/install.sh -4000
164 $SORT_DIR/README -4000
165 $SORT_DIR/index.html -4000
166 $SORT_DIR/md5sum -4000
167 $SORT_DIR/style.css -4000
168 $SORT_DIR/images/header.png -4000
169 $SORT_DIR/boot/bzImage 2
170 $SORT_DIR/boot/rootfs.gz 1
171 $SORT_DIR/packages -9000
172 EOT
173 ( cd $ROOT; ls $SORT_DIR/packages/*/packages* $SORT_DIR/packages/*/files.list.lzma ) | \
174 awk '{ printf "%s -7000\n",$0 }' >> $SORT_FILE
175 chmod 755 $TEMP_DIR/install.sh
177 case " $OPTIONS " in
178 *\ --filter\ *)
179 SIZE=0
180 for i in *.tazpkg; do
181 while read f; do
182 case "$i" in
183 $f*) continue 2;;
184 esac
185 done < packages.list
186 echo -n "Filter out $i ($(du -hs $(readlink $i) | awk '{ print $1 }'))..."
187 SIZE=$(( $SIZE + $(stat -c %s $(readlink $i)) ))
188 rm $i
189 status
190 done
191 UNIT=" bytes"
192 if [ $SIZE -gt 10240 ]; then
193 SIZE=$(( $SIZE / 1024 ))
194 UNIT="K"
195 fi
196 if [ $SIZE -gt 10240 ]; then
197 SIZE=$(( $SIZE / 1024 ))
198 UNIT="M"
199 fi
200 echo "$SIZE$UNIT removed.";;
201 esac
203 # Copy hg subtree
204 get_from_hg()
205 {
206 echo -n "Adding $2"
207 wget -q -O - http://hg.slitaz.org/$1/archive/tip.tar.bz2 | tar xjf - -C $TEMP_DIR
208 mv $TEMP_DIR/$1-* $TEMP_DIR/$1
209 status
210 echo "$(du -hs $TEMP_DIR/$1 | awk '{ print $1 }') used by $2."
211 }
213 for i in $OPTIONS ; do
214 case "$i" in
215 --wok)
216 cat >>$TEMP_DIR/install.sh<<EOF
217 mkdir -p /home/slitaz
218 ln -s \$DIR/wok /home/slitaz
219 echo "=> Wok (cooking) is in /home/slitaz/wok"
220 EOF
221 if get_from_hg wok "wok (cooking)"; then
222 echo "$SORT_DIR/wok -8000" >> $SORT_FILE
223 fi;;
224 --wok-stable)
225 cat >>$TEMP_DIR/install.sh<<EOF
226 mkdir -p /home/slitaz
227 ln -s \$DIR/wok /home/slitaz
228 echo "=> Wok (stable) is in /home/slitaz/wok"
229 EOF
230 if get_from_hg wok-stable "wok (stable)"; then
231 mv $TEMP_DIR/wok-stable $TEMP_DIR/wok
232 echo "$SORT_DIR/wok -8000" >> $SORT_FILE
233 fi;;
234 --website)
235 if get_from_hg website "web site"; then
236 echo "$SORT_DIR/website -6000" >> $SORT_FILE
237 cat >>$TEMP_DIR/install.sh<<EOF
238 echo "=> slitaz web site installed in file://\$DIR/website/index.html"
239 EOF
240 fi;;
241 --sources)
242 cat >>$TEMP_DIR/install.sh<<EOF
243 mkdir -p /home/slitaz
244 ln -s \$DIR/src /home/slitaz
245 echo "=> sources are in /home/slitaz/src"
246 EOF
247 mkdir -p $SRC_DIR
248 cd $SRC_DIR
249 for i in $SOURCES/*/*
250 do
251 case "$i" in
252 */md5sum) continue;;
253 esac
254 ln -s $i >> $LOG 2>&1
255 done
256 find * -not -type d | grep -v md5sum | xargs md5sum > md5sum
257 echo "$(du -hs $SOURCES | awk '{ print $1 }') used by sources." ;;
258 esac
259 done
261 # Extract boot package function
262 extract_boot()
263 {
264 f=$(ls $REPOS/$1-[0-9]*.tazpkg 2> /dev/null)
265 [ -f "$f" ] || return 1
266 [ -d $TEMP_DIR/boot ] || mkdir $TEMP_DIR/boot
267 ( cd $TEMP_DIR/boot ; cpio -i fs.cpio.gz < $f 2> /dev/null )
268 ( cd $TEMP_DIR/boot ; zcat fs.cpio.gz | cpio -id 2> /dev/null )
269 mv $TEMP_DIR/boot/fs/boot/* $TEMP_DIR/boot
270 rm -rf $TEMP_DIR/boot/fs.cpio.gz $TEMP_DIR/boot/fs
271 return 0
272 }
274 # Gen boot part
275 BOOT_OPT=""
276 iso=$ISO_DIR/slitaz-$PKG_VER.iso
277 for i in slitaz-loram-cdrom-sqfs slitaz-$PKG_VER-loram-cdrom ; do
278 isoloram=$ISO_DIR/flavors/$i.iso
279 [ -s $isoloram ] && break
280 done
281 case " $OPTIONS " in
282 *\ --boot\ *)
283 echo -n "Creating boot tree"
284 need $iso
285 which isoinfo > /dev/null || need /usr/bin/isoinfo
286 isoinfo -R -l -i $iso | awk '/^Directory/ { path=$4 } /^-/ { print path$12 }' | while read file; do
287 [ "$(basename $file)" == ".." ] && continue
288 [ "$file" = "/boot/isolinux/boot.cat" ] && continue
289 [ -d "$(dirname $TEMP_DIR/$file)" ] ||
290 mkdir -p "$(dirname $TEMP_DIR/$file)"
291 isoinfo -R -x "$file" -i $iso > "$TEMP_DIR/$file"
292 done
293 if [ -f "$(echo $TEMP_DIR/boot/vmlinuz*)" ]; then
294 rm -f $TEMP_DIR/boot/bzImage
295 ln $TEMP_DIR/boot/vmlinuz* $TEMP_DIR/boot/bzImage
296 fi
297 status
298 BOOT_OPT="-sort $SORT_FILE -b boot/isolinux/isolinux.bin \
299 -c boot/isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table"
300 case " $OPTIONS " in
301 *\ --auto-install\ *)
302 echo -n "Enable auto install"
303 sed -i "s/rw root/rw config=LABEL=packages-$PKG_VER,install.sh root/" \
304 $TEMP_DIR/boot/isolinux/*.cfg
305 status
306 ;;
307 esac
308 case " $OPTIONS " in
309 *\ --loram-detect\ *)
310 echo -n "Enable loram autodetection"
311 need $IFMEM_C32 $isoloram
312 which isoinfo > /dev/null || need /usr/bin/isoinfo
313 cp $IFMEM_C32 "$TEMP_DIR/boot/isolinux"
314 isoinfo -R -x "/usr.sqfs" -i $isoloram \
315 > "$TEMP_DIR/usr.sqfs" 2> /dev/null
316 if [ -s "$TEMP_DIR/usr.sqfs" ]; then
317 echo "$SORT_DIR/usr.sqfs -5000" >> $SORT_FILE
318 else
319 rm -f "$TEMP_DIR/usr.sqfs"
320 isoinfo -R -x "/rootfs.gz" -i $isoloram \
321 > "$TEMP_DIR/rootfs.gz" 2> /dev/null
322 echo "$SORT_DIR/rootfs.gz -5000" >> $SORT_FILE
323 fi
324 isoinfo -R -x "/boot/rootfs.gz" -i $isoloram > \
325 "$TEMP_DIR/boot/loram.gz"
326 cat >> $TEMP_DIR/boot/isolinux/common.cfg <<EOT
327 label noram
328 config noram.cfg
329 EOT
330 cat >> $TEMP_DIR/boot/isolinux/noram.cfg <<EOT
331 display isolinux.msg
332 say Not enough RAM to boot slitaz.
333 default reboot
334 label reboot
335 com32 reboot.c32
337 implicit 0
338 prompt 1
339 timeout 80
340 F1 help.txt
341 F2 options.txt
342 F3 isolinux.msg
343 F4 display.txt
344 F5 enhelp.txt
345 F6 enopts.txt
346 EOT
347 sed -i -e 's|kernel /boot/bzImage|kernel /boot/isolinux/ifmem.c32\n\tappend 160768 core 29696 loram noram\n|' \
348 -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,|" \
349 $TEMP_DIR/boot/isolinux/*.cfg
350 status
351 ;;
352 esac
353 echo "$SORT_DIR/boot 0" >> $SORT_FILE
354 ;;
355 *\ --webboot\ *)
356 if extract_boot gpxe; then
357 echo -n "Creating web boot tree"
358 which isoinfo > /dev/null || need /usr/bin/isoinfo
359 mkdir $TEMP_DIR/boot/isolinux/
360 isoinfo -R -x "/boot/isolinux/isolinux.bin" -i $iso > \
361 $TEMP_DIR/boot/isolinux/isolinux.bin
362 mv $TEMP_DIR/boot/gpxe $TEMP_DIR/boot/isolinux
363 echo "$SORT_DIR/boot 0" >> $SORT_FILE
364 cat > $TEMP_DIR/boot/isolinux/isolinux.cfg <<EOT
365 default gpxe
366 append http://mirror.slitaz.org/pxe/pxelinux.0
367 EOT
368 status
369 BOOT_OPT="-sort $SORT_FILE -b boot/isolinux/isolinux.bin \
370 -c boot/isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table"
371 fi
372 ;;
373 esac
375 if [ -n "$BOOT_OPT" ]; then
376 echo "$(du -chs $TEMP_DIR/boot $TEMP_DIR/usr.sqfs 2> /dev/null | \
377 awk 'END { print $1 }') used by boot."
378 fi
380 case " $OPTIONS " in
381 *\ --dry-run\ *)
382 echo "Please check and remove $TEMP_DIR and $SORT_FILE"
383 exit
384 ;;
385 esac
386 # Gen ISO
387 echo -n "Generating iso image"
388 genisoimage -R -J -f -V $VOLUME_ID \
389 -P "$PUBLISHER" -md5-list $REPOS/packages.md5 \
390 -quiet -o $OUTPUT $BOOT_OPT $TEMP_DIR
391 status
393 echo "$(du -hs $OUTPUT | awk '{ print $1 }') used by iso image."
395 cd ${ROOT}
396 echo -n "Create hybrid DVD/CDROM"
397 which isohybrid > /dev/null && isohybrid $IMAGE 2> /dev/null
398 status
400 echo -n "Calculate md5sum"
401 md5sum $IMAGE > $(basename $IMAGE .iso).md5
402 status
404 echo -n "Moving file to mirror"
405 mv $IMAGE $ISO_DIR
406 mv $(basename $IMAGE .iso).md5 $ISO_DIR
407 status
409 # Cleaning temp files
410 rm -rf $TEMP_DIR $SORT_FILE