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