wok-current view mirror-tools/stuff/usr/bin/mkpkgiso @ rev 3757

mirror-tools/mkpkgiso: fix sort weights
author Pascal Bellard <pascal.bellard@slitaz.org>
date Fri Jul 24 11:41:10 2009 +0200 (2009-07-24)
parents 326f001ee85c
children 2c5fb2c92a60
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.5
10 ROOT=/home/slitaz/iso
11 SORT_DIR=_iso.$$
12 TEMP_DIR=${ROOT}/$SORT_DIR
13 SORT_FILE=${ROOT}/_sort.$$
14 PKG_VER=$1
15 shift
16 OPTIONS=$@
17 PKG_DIR=$TEMP_DIR/packages/$PKG_VER
18 REPOS=/var/www/slitaz/mirror/packages/$PKG_VER
19 PXE_DIR=/var/www/slitaz/mirror/pxe
20 ISO_DIR=/var/www/slitaz/mirror/iso/$PKG_VER
21 LOG=$PWD/$(basename $0).log
23 #
24 VOLUME_ID="packages-${PKG_VER}"
25 PUBLISHER="SliTaz http://www.slitaz.org/"
26 IMAGE="packages-${PKG_VER}.iso"
27 OUTPUT="$ROOT/$IMAGE"
29 # Check command line option.
30 if [ -z $PKG_VER ]; then
31 cat <<EOT
32 Usage: $(basename $0) <Version>
33 [--boot [--auto-install] [--loram-detect]]|--webboot] [--filter]
34 [--wok] [--wok-stable] [--website][--dry-run]
35 EOT
36 exit 1
37 fi
39 # Check if we provide a valide version
40 if [ ! -d $REPOS ]; then
41 echo "Boooh! $PKG_VER is not a valid version."
42 exit 1
43 fi
45 # Status function.
46 status()
47 {
48 local CHECK=$?
49 echo -en "\\033[70G[ "
50 if [ $CHECK = 0 ]; then
51 echo -en "\\033[1;33mOK"
52 else
53 echo -en "\\033[1;31mFailed"
54 fi
55 echo -e "\\033[0;39m ]"
56 }
58 add_sort()
59 {
60 if true; then
61 echo "$1 $2"
62 else
63 ( cd $ROOT ; find $1 | awk "{ printf \"%s $2\\n\",\$0 }" )
64 fi
65 }
67 # Create temp directory
68 mkdir -p $TEMP_DIR/packages/$PKG_VER
70 # Prepare evrything for ISO
72 echo ""
73 echo "Building ISO for packages $PKG_VER"
74 echo "==============================================================================="
75 echo -n "Creating working dir $(basename $TEMP_DIR)"
76 status
77 echo -n "Creating symlink"
78 status
80 # Link every packages to temp dir
81 cd $PKG_DIR
82 for i in $REPOS/*
83 do
84 ln -s $i >> $LOG 2>&1
85 done
87 echo -n "Creating install script"
88 # Create install script as suggested by Pascal.
89 cat >$TEMP_DIR/install.sh<<EOF
90 #!/bin/sh
91 #
93 DIR=\$(cd \$(busybox dirname \$0); pwd)
95 # Handle --auto-install case
96 if [ "\$DIR" == "/etc/init.d" ]; then
97 DIR=/mnt
99 # Handle loram on hybrid hard disk / usb key case
100 if [ ! -d /usr/bin ]; then
101 if [ -d /.usr.rw ]; then
102 echo -n "Mounting /usr read-write... "
103 usr=.usr.ro
104 else
105 echo -n "Mounting /usr read-only... "
106 usr=usr
107 fi
108 FS=\$DIR/usr.cromfs
109 if [ -f \$FS ]; then
110 /bin/cromfs-driver \$FS /\$usr -o ro,dev,suid,allow_other
111 elif [ -f \$DIR/usr.sqfs ]; then
112 FS=\$DIR/usr.sqfs
113 mount -o loop,ro -t squashfs \$FS /\$usr
114 elif [ -L /\$usr ]; then
115 FS=\$DIR/usr
116 fi
117 status
118 if [ -d /.usr.rw ]; then
119 if [ -x /bin/funionfs ]; then
120 /bin/funionfs -o dirs=/.usr.ro=RO:/.usr.rw -o allow_other -o suid,dev NONE /usr
121 else
122 /bin/mount -t aufs -o br:/.usr.rw:/.usr.ro none /usr
123 fi
124 fi
125 fi
126 fi
128 echo "Install packages..."
129 [ -d /var/cache/tazpkg ] || mkdir -p /var/cache/tazpkg
130 ls -d \$DIR/packages/* > /var/lib/tazpkg/mirror
131 ln -fs \$DIR/packages/*/*.tazpkg /var/cache/tazpkg/
132 ln -fs \$DIR/packages/*/packages.* /var/lib/tazpkg
133 echo "=> all $PKG_VER package are available for tazpkg/tazpkgbox"
134 EOF
135 [ -e files.list.lzma ] && cat >>$TEMP_DIR/install.sh<<EOF
136 ln -fs \$DIR/packages/*/files.list.lzma /var/lib/tazpkg
137 EOF
139 status
140 cat > $SORT_FILE <<EOT
141 $SORT_DIR/install.sh -4000
142 $SORT_DIR/README -4000
143 $SORT_DIR/index.html -4000
144 $SORT_DIR/md5sum -4000
145 $SORT_DIR/style.css -4000
146 $SORT_DIR/images/header.png -4000
147 $SORT_DIR/boot/bzImage 2
148 $SORT_DIR/boot/rootfs.gz 1
149 $SORT_DIR/packages -9000
150 EOT
151 ( cd $ROOT; ls $SORT_DIR/packages/*/packages* $SORT_DIR/packages/*/files.list.lzma ) | \
152 awk '{ printf "%s -7000\n",$0 }' >> $SORT_FILE
153 chmod 755 $TEMP_DIR/install.sh
155 case " $OPTIONS " in
156 *\ --filter\ *)
157 SIZE=0
158 for i in *.tazpkg; do
159 while read f; do
160 case "$i" in
161 $f*) continue 2;;
162 esac
163 done < packages.list
164 echo -n "Filter out $i ($(du -hs $(readlink $i) | awk '{ print $1 }'))..."
165 SIZE=$(( $SIZE + $(stat -c %s $(readlink $i)) ))
166 rm $i
167 status
168 done
169 UNIT=" bytes"
170 if [ $SIZE -gt 10240 ]; then
171 SIZE=$(( $SIZE / 1024 ))
172 UNIT="K"
173 fi
174 if [ $SIZE -gt 10240 ]; then
175 SIZE=$(( $SIZE / 1024 ))
176 UNIT="M"
177 fi
178 echo "$SIZE$UNIT removed.";;
179 esac
181 # Copy hg subtree
182 get_from_hg()
183 {
184 [ /slitaz/home/slitaz/hg/$1 ] || return
185 echo -n "Adding $2"
186 /usr/sbin/chroot /slitaz hg --repository /home/slitaz/hg/$1 pull >/dev/null
187 /usr/sbin/chroot /slitaz hg --repository /home/slitaz/hg/$1 update >/dev/null
188 mkdir $TEMP_DIR/$1
189 cp -a /slitaz/home/slitaz/hg/$1/* $TEMP_DIR/$1
190 status
191 echo "$(du -hs $TEMP_DIR/$1 | awk '{ print $1 }') used by $2."
192 }
194 for i in $OPTIONS ; do
195 case "$i" in
196 --wok)
197 cat >>$TEMP_DIR/install.sh<<EOF
198 echo "=> Wok (cooking) is in \$DIR/wok"
199 EOF
200 if get_from_hg wok "wok (cooking)"; then
201 add_sort $SORT_DIR/wok -8000 >> $SORT_FILE
202 fi;;
203 --wok-stable)
204 cat >>$TEMP_DIR/install.sh<<EOF
205 echo "=> Wok (stable) is in \$DIR/wok"
206 EOF
207 if get_from_hg wok-stable "wok (stable)"; then
208 mv $TEMP_DIR/wok-stable $TEMP_DIR/wok
209 add_sort $SORT_DIR/wok -8000 >> $SORT_FILE
210 fi;;
211 --website)
212 if get_from_hg website "web site"; then
213 add_sort $SORT_DIR/website -6000 >> $SORT_FILE
214 cat >>$TEMP_DIR/install.sh<<EOF
215 [ -d /var/www ] || mkdir -p /var/www
216 ln -s \$DIR/website /var/www
217 tazpkg list | grep -q ^lighttpd || yes y | tazpkg get-install lighttpd > /dev/null 2>&1
218 echo "=> slitaz web site installed in http://localhost/website"
219 EOF
220 fi;;
221 esac
222 done
224 # Extract boot package function
225 extract_boot()
226 {
227 f=$(ls $REPOS/$1-[0-9]*.tazpkg 2> /dev/null)
228 [ -f "$f" ] || return 1
229 [ -d $TEMP_DIR/boot ] || mkdir $TEMP_DIR/boot
230 ( cd $TEMP_DIR/boot ; cpio -i fs.cpio.gz < $f 2> /dev/null )
231 ( cd $TEMP_DIR/boot ; zcat fs.cpio.gz | cpio -id 2> /dev/null )
232 mv $TEMP_DIR/boot/fs/boot/* $TEMP_DIR/boot
233 rm -rf $TEMP_DIR/boot/fs.cpio.gz $TEMP_DIR/boot/fs
234 return 0
235 }
237 # Gen boot part
238 BOOT_OPT=""
239 iso=$ISO_DIR/slitaz-$PKG_VER.iso
240 isoloram=$ISO_DIR/flavors/slitaz-loram-cdrom-sqfs.iso
241 case " $OPTIONS " in
242 *\ --boot\ *)
243 echo -n "Creating boot tree"
244 isoinfo -R -l -i $iso | awk '/^Directory/ { path=$4 } /^-/ { print path$12 }' | while read file; do
245 [ "$(basename $file)" == ".." ] && continue
246 [ "$file" = "/boot/isolinux/boot.cat" ] && continue
247 [ -d "$(dirname $TEMP_DIR/$file)" ] ||
248 mkdir -p "$(dirname $TEMP_DIR/$file)"
249 isoinfo -R -x "$file" -i $iso > "$TEMP_DIR/$file"
250 done
251 if [ -f "$(echo $TEMP_DIR/boot/vmlinuz*)" ]; then
252 rm -f $TEMP_DIR/boot/bzImage
253 ln $TEMP_DIR/boot/vmlinuz* $TEMP_DIR/boot/bzImage
254 fi
255 status
256 BOOT_OPT="-sort $SORT_FILE -b boot/isolinux/isolinux.bin \
257 -c boot/isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table"
258 case " $OPTIONS " in
259 *\ --auto-install\ *)
260 echo -n "Enable auto install"
261 cat >>$TEMP_DIR/install.sh<<EOF
262 echo "mount -o ro -t iso9660 LABEL=packages-$PKG_VER /mnt" >> /etc/init.d/local.sh
263 EOF
264 sed -i "s/rw root/rw config=LABEL=packages-$PKG_VER,install.sh root/" \
265 $TEMP_DIR/boot/isolinux/*.cfg
266 status
267 ;;
268 esac
269 [ -f $PXE_DIR/ifmem.c32 -a -f $isoloram ] && case " $OPTIONS " in
270 *\ --loram-detect\ *)
271 echo -n "Enable loram autodetection"
272 cp $PXE_DIR/ifmem.c32 "$TEMP_DIR/boot/isolinux"
273 isoinfo -R -x "/usr.sqfs" -i $isoloram > "$TEMP_DIR/usr.sqfs"
274 add_sort $SORT_DIR/usr.sqfs -5000 >> $SORT_FILE
275 isoinfo -R -x "/boot/rootfs.gz" -i $isoloram > \
276 "$TEMP_DIR/boot/loram.gz"
277 sed -i -e 's|kernel /boot/bzImage|kernel /boot/isolinux/ifmem.c32\n\tappend 160768 core loram\n|' \
278 -e 's|\(.*/\)rootfs\(.gz .*\)$|label core\n\tkernel /boot/bzImage\n\1rootfs\2\n\nlabel loram\n\tkernel /boot/bzImage\n\1loram\2|' \
279 $TEMP_DIR/boot/isolinux/*.cfg
280 status
281 ;;
282 esac
283 add_sort $SORT_DIR/boot 0 >> $SORT_FILE
284 ;;
285 *\ --webboot\ *)
286 if extract_boot gpxe; then
287 echo -n "Creating web boot tree"
288 mkdir $TEMP_DIR/boot/isolinux/
289 isoinfo -x "/BOOT/ISOLINUX/ISOLINUX.BIN;1" -i $iso > \
290 $TEMP_DIR/boot/isolinux/isolinux.bin
291 mv $TEMP_DIR/boot/gpxe $TEMP_DIR/boot/isolinux
292 add_sort $SORT_DIR/boot 0 >> $SORT_FILE
293 cat > $TEMP_DIR/boot/isolinux/isolinux.cfg <<EOT
294 default gpxe
295 append http://mirror.slitaz.org/pxe/pxelinux.0
296 EOT
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 fi
301 ;;
302 esac
304 if [ -n "$BOOT_OPT" ]; then
305 echo "$(du -chs $TEMP_DIR/boot $TEMP_DIR/usr.sqfs 2> /dev/null | \
306 tail -1 | awk '{ print $1 }') used by boot."
307 fi
309 sort -r -k 2 $SORT_FILE > $SORT_FILE.$$
310 mv $SORT_FILE.$$ $SORT_FILE
311 case " $OPTIONS " in
312 *\ --dry-run\ *)
313 echo "Please check and remove $TEMP_DIR and $SORT_FILE"
314 exit
315 ;;
316 esac
317 # Gen ISO
318 echo -n "Generating iso image"
319 /usr/bin/genisoimage -R -J -f -V $VOLUME_ID \
320 -P "$PUBLISHER" -md5-list $REPOS/packages.md5 \
321 -quiet -o $OUTPUT $BOOT_OPT $TEMP_DIR
322 status
324 echo "$(du -hs $OUTPUT | awk '{ print $1 }') used by iso image."
326 cd ${ROOT}
327 echo -n "Create hybrid DVD/CDROM"
328 [ -x /usr/bin/isohybrid ] && /usr/bin/isohybrid $IMAGE 2> /dev/null
329 status
331 echo -n "Calculate md5sum"
332 /usr/bin/md5sum $IMAGE > $(basename $IMAGE .iso).md5
333 status
335 echo -n "Moving file to mirror"
336 mv $IMAGE $ISO_DIR
337 mv $(basename $IMAGE .iso).md5 $ISO_DIR
338 status
340 # Cleaning temp files
341 rm -rf $TEMP_DIR $SORT_FILE