slitaz-tools annotate tinyutils/bootfloppybox @ rev 549

Tiny edits
author Paul Issott <paul@slitaz.org>
date Sun Mar 06 19:58:55 2011 +0000 (2011-03-06)
parents 4b0ce259164b
children 5e5779810922
rev   line source
pascal@130 1 #! /bin/sh
pascal@130 2 #
pascal@130 3 # Gtkdialog box for the mount command. Part of SliTaz tools.
pascal@130 4 #
pascal@496 5 VERSION=20100701
pascal@130 6
pascal@130 7 # Check if user is root.
pascal@130 8 check_root()
pascal@130 9 {
pascal@130 10 if test $(id -u) != 0 ; then
pascal@130 11 echo -e "
pascal@130 12 You must be root to run `basename $0`. Please type 'su' and
pascal@130 13 root password to become super-user.\n"
pascal@130 14 exit 0
pascal@130 15 fi
pascal@130 16 }
pascal@130 17
paul@477 18 # This function is used after each screen to continue or abort install.
pascal@213 19 check_retval()
pascal@213 20 {
pascal@213 21 case $retval in
pascal@213 22 1)
pascal@214 23 rm -f /tmp/floppybox.grub.menu
pascal@213 24 echo -e "\nVoluntary exit.\n" && exit 0 ;;
pascal@213 25 255)
pascal@214 26 rm -f /tmp/floppybox.grub.menu
pascal@213 27 echo -e "ESC pressed.\n" && exit 0 ;;
pascal@213 28 esac
pascal@213 29 }
pascal@213 30
pascal@496 31 # Trigger floppy driver to update /sys/devices/platform/
pascal@496 32 dd if=/dev/fd0 bs=1k count=1 > /dev/null 2>&1
pascal@496 33
pascal@474 34 # check or list floppy devices.
pascal@474 35 list_floppy()
pascal@474 36 {
pascal@474 37 local list
pascal@474 38 list=""
pascal@496 39 for i in /sys/devices/platform/floppy.*/block/*; do
pascal@474 40 [ -d $i ] || continue
pascal@496 41 list="$list $(basename $i)"
pascal@474 42 done
pascal@474 43 [ -n "$1" ] || echo $list
pascal@474 44 [ -n "$list" ]
pascal@474 45 }
pascal@474 46
pascal@474 47 # dialog to select the floppy device
pascal@213 48 select_floppy()
pascal@213 49 {
pascal@264 50 DEVICE="$DIALOG --title \" Floppy device \" --backtitle \"Boot Floppy Creation\" --clear --extra-button --extra-label \"Format\" --colors --radiolist \"
pascal@264 51 Select boot device
pascal@264 52 \" 18 70 50"
pascal@264 53 on=on
pascal@474 54 for i in $(list_floppy); do
pascal@474 55 DEVICE="$DEVICE /dev/$i 'Floppy in $i' $on"
pascal@264 56 on=off
pascal@264 57 done
pascal@474 58 DEVICE="$DEVICE floppy \"floppy image file boot.fd\" $on"
pascal@474 59 DEVICE="$DEVICE cdrom \"cdrom image file boot.iso\" off 2>&1 1>&3"
pascal@213 60 exec 3>&1
pascal@264 61 DEVICE=`eval $DEVICE`
pascal@213 62 retval=$?
pascal@213 63 exec 3>&-
pascal@213 64 check_retval
pascal@213 65 if [ "$retval" = "3" ]; then
pascal@264 66 case "$DEVICE" in
pascal@264 67 /dev/*) fdformat -n $DEVICE;;
pascal@264 68 esac
pascal@213 69 fi
pascal@213 70 }
pascal@213 71
pascal@474 72 # Build menu for grub or grub4dos
pascal@274 73 mkmenu()
pascal@274 74 {
pascal@274 75 if [ "$1" = "grub4dos" ]; then
pascal@274 76 SAVEDEFAULT="save default"
pascal@274 77 cat > /tmp/floppybox.grub.menu <<EOT
pascal@274 78 # grub4dos menu
pascal@274 79 default /default
pascal@274 80 EOT
pascal@274 81 else
pascal@274 82 SAVEDEFAULT="savedefault"
pascal@274 83 cat > /tmp/floppybox.grub.menu <<EOT
pascal@274 84 # grub menu
pascal@274 85 default saved
pascal@274 86 EOT
pascal@274 87 fi
pascal@274 88 cat >> /tmp/floppybox.grub.menu <<EOT
pascal@274 89 timeout 8
pascal@274 90 color yellow/brown light-green/black
pascal@274 91
pascal@274 92 EOT
pascal@274 93 entry=0
pascal@274 94 [ -f /boot/gpxe ] && entry=$(($entry + 1)) && cat >> /tmp/floppybox.grub.menu <<EOT
pascal@274 95 title gPXE (Boot from the Web, PXE/iSCSI/AoE support)
pascal@274 96 kernel /boot/gpxe $(dd if=/boot/gpxe bs=1 skip=519 count=255 2>/dev/null | strings)
pascal@274 97
pascal@274 98 EOT
pascal@274 99 [ -f /usr/share/boot/btmgr -a -f /usr/share/boot/memdisk.lzma ] \
pascal@274 100 && entry=$(($entry + 1)) && cat >> /tmp/floppybox.grub.menu <<EOT
pascal@274 101 title Smart Boot Manager (text - boot floppy, hard disk or CD/DVD)
pascal@274 102 kernel /boot/memdisk floppy c=80 h=2 s=18
pascal@274 103 initrd /boot/btmgr.gz
pascal@274 104
pascal@274 105 EOT
pascal@382 106 http://mirror.slitaz.org/boot/plpbt.bin
pascal@382 107 [ -f /usr/share/boot/plpbt.bin ] \
pascal@274 108 && entry=$(($entry + 1)) && cat >> /tmp/floppybox.grub.menu <<EOT
pascal@274 109 title Plop Boot Manager (graphic - boot floppy, hard disk, CD/DVD or USB)
pascal@382 110 kernel /boot/plpbt.bin
pascal@274 111
pascal@274 112 EOT
pascal@274 113 [ -f /usr/share/boot/etherboot ] && entry=$(($entry + 1)) && cat >> /tmp/floppybox.grub.menu <<EOT
pascal@274 114 title Etherboot (LAN boot, PXE or NBI)
pascal@274 115 kernel /boot/etherboot
pascal@274 116
pascal@274 117 EOT
pascal@274 118 [ -f /usr/share/boot/memtest.lzma -a -f /usr/share/boot/memdisk.lzma ] \
pascal@274 119 && entry=$(($entry + 1)) && cat >> /tmp/floppybox.grub.menu <<EOT
pascal@274 120 title Memtest86+ (Test system memory)
pascal@274 121 kernel /boot/memdisk floppy c=80 h=2 s=18
pascal@274 122 initrd /boot/memtest.gz
pascal@274 123
pascal@274 124 EOT
pascal@274 125 [ "$1" = "grub4dos" ] && entry=$(($entry + 3)) && cat >> /tmp/floppybox.grub.menu <<EOT
pascal@274 126 title Windows (scan ntldr)
pascal@274 127 fallback $(($entry -3 + 1))
pascal@274 128 find --set-root /ntldr
pascal@274 129 chainloader /ntldr
pascal@274 130 $SAVEDEFAULT --wait=2
pascal@274 131
pascal@274 132 title Windows (scan cmldr)
pascal@274 133 fallback $(($entry -3 + 2))
pascal@274 134 find --set-root /cmldr
pascal@274 135 chainloader /cmldr
pascal@274 136 $SAVEDEFAULT --wait=2
pascal@274 137
pascal@274 138 title Windows (scan io.sys)
pascal@274 139 fallback $(($entry -3 + 3))
pascal@274 140 find --set-root /io.sys
pascal@274 141 chainloader /io.sys
pascal@274 142 $SAVEDEFAULT --wait=2
pascal@274 143
pascal@274 144 EOT
pascal@274 145 entry=$(($entry + 3)) && cat >> /tmp/floppybox.grub.menu <<EOT
pascal@274 146 title Windows (example on /dev/hda1)
pascal@274 147 rootnoverify (hd0,0)
pascal@274 148 chainloader +1
pascal@274 149 $SAVEDEFAULT
pascal@274 150
pascal@274 151 title Slitaz Frugal (example on /dev/hda1)
pascal@274 152 root (hd0,0)
pascal@274 153 kernel /boot/bzImage rw root=/dev/null vga=normal
pascal@274 154 initrd /boot/rootfs.gz
pascal@274 155 $SAVEDEFAULT
pascal@274 156
pascal@274 157 title Slitaz Installed (example on /dev/hda2)
pascal@274 158 root (hd0,1)
pascal@274 159 kernel /boot/bzImage ro root=/dev/hda2 vga=normal
pascal@274 160 $SAVEDEFAULT
pascal@274 161
pascal@274 162 EOT
pascal@274 163 [ "$1" = "grub4dos" ] && entry=$(($entry + 1)) && cat >> /tmp/floppybox.grub.menu <<EOT
pascal@274 164 title Slitaz cdrom image (example on /dev/hda1, DEFRAGMENTED)
pascal@274 165 map (hd0,0)/boot/slitaz-cooking.iso (hd1)
pascal@274 166 map --hook
pascal@274 167 kernel (hd1)/boot/bzImage rw root=/dev/null vga=normal
pascal@274 168 initrd (hd1)/boot/rootfs.gz
pascal@274 169 $SAVEDEFAULT
pascal@274 170
pascal@274 171 EOT
pascal@274 172 false && [ -f /usr/share/boot/grub.exe.lzma ] && entry=$(($entry + 1)) && cat >> /tmp/floppybox.grub.menu <<EOT
pascal@274 173 title Grub4Dos
pascal@274 174 kernel /boot/grub/grub.exe --config-file="configfile (fd0)/boot/grub/menu4dos.lst"
pascal@274 175
pascal@274 176 EOT
pascal@274 177 }
pascal@274 178
pascal@474 179 # Install grub or grub4dos on floppy
pascal@264 180 install_grub()
pascal@264 181 {
pascal@274 182 LOOP=""
pascal@274 183 GRUB_DEV=${DEVICE#/dev/}
pascal@274 184 GRUB_DEV=${GRUB_DEV%% *}
pascal@264 185 case "$DEVICE" in
pascal@274 186 floppy*)
pascal@274 187 LOOP="-o loop"
pascal@274 188 GRUB_DEV=fd0
pascal@274 189 DEVICE=boot.fd
pascal@274 190 dd if=/dev/zero of=$DEVICE bs=18k count=80;;
pascal@274 191 esac
pascal@274 192 grep -qs "^# $2 menu" /tmp/floppybox.grub.menu || mkmenu $2
pascal@274 193 case "$DEVICE" in
pascal@274 194 /dev/*|boot.fd)
pascal@274 195 yes y | mke2fs $DEVICE
pascal@213 196 mkdir /media/floppy
pascal@274 197 mount $LOOP $DEVICE /media/floppy
pascal@274 198 if [ "$2" = "grub4dos" ]; then
pascal@274 199 mkdir -p /media/floppy/boot
pascal@274 200 unlzma -c /usr/share/boot/grldr.lzma > /media/floppy/grldr
pascal@274 201 cp $1/boot/* /media/floppy/boot 2> /dev/null
pascal@274 202 cp /tmp/floppybox.grub.menu /media/floppy/menu.lst
pascal@274 203 umount -d /media/floppy
pascal@274 204 bootlace --floppy --sectors-per-track=18 --heads=2 \
pascal@274 205 --chs --ext2 $DEVICE
pascal@274 206 else
pascal@274 207 mkdir -p /media/floppy/boot/grub
pascal@274 208 cp /usr/lib/grub/i386-pc/stage? /media/floppy/boot/grub
pascal@274 209 cp -a $1/boot /media/floppy
pascal@274 210 cp /tmp/floppybox.grub.menu /media/floppy/boot/grub/menu.lst
pascal@274 211 grub-set-default --root-directory=/media/floppy 0
pascal@274 212 echo "($GRUB_DEV) $(losetup | grep $DEVICE | cut -d: -f1)" > $1/device.map
pascal@274 213 [ -n "$LOOP" ] && LOOP="--device-map=$1/device.map"
pascal@274 214 grub $LOOP --batch <<EOT
pascal@274 215 root ($GRUB_DEV)
pascal@274 216 setup ($GRUB_DEV)
pascal@214 217 quit
pascal@214 218 EOT
pascal@274 219 umount -d /media/floppy
pascal@274 220 fi ;;
pascal@264 221 cdrom*)
pascal@266 222 mkdir -p $1/boot/grub 2> /dev/null
pascal@274 223 cp /tmp/floppybox.grub.menu $1/boot/grub/menu.lst
pascal@274 224 if [ "$2" = "grub4dos" ]; then
pascal@274 225 unlzma -c /usr/share/boot/grldr.lzma > $1/boot/grub/grldr
pascal@274 226 genisoimage -R -o boot.iso -b boot/grub/grldr \
pascal@274 227 -c boot/boot.cat -no-emul-boot -boot-load-seg 0x1000 \
pascal@274 228 -hide boot/boot.cat -input-charset iso8859-1 $1
pascal@274 229 else
pascal@274 230 cp /usr/lib/grub/i386-pc/stage2_eltorito $1/boot/grub
pascal@274 231 genisoimage -R -o boot.iso -b boot/grub/stage2_eltorito \
pascal@274 232 -c boot/boot.cat -no-emul-boot -boot-load-size 4 \
pascal@274 233 -hide boot/boot.cat -input-charset iso8859-1 \
pascal@274 234 -boot-info-table $1
pascal@274 235 fi ;;
pascal@264 236 esac
pascal@264 237 }
pascal@264 238
pascal@474 239 # Build /init for floppies from iso image
pascal@474 240 buildinit()
pascal@474 241 {
pascal@474 242 mv $1/init $1/init.org
pascal@474 243 cat > $1/init <<EOTEOT
pascal@474 244 #!/bin/sh
pascal@474 245
pascal@474 246 mount -t proc proc /proc
pascal@474 247 total=\$(grep MemTotal /proc/meminfo | sed 's/[^0-9]//g')
pascal@474 248 # the floppy driver may not be included in kernel
pascal@474 249 insmod /lib/modules/*/kernel/drivers/block/floppy.ko.gz 2> /dev/null
pascal@474 250 # loram may put floppy.ko.gz module in /lib
pascal@474 251 insmod /lib/floppy.ko.gz 2> /dev/null
pascal@474 252 umount /proc
pascal@474 253 while read name min num count file md5; do
pascal@474 254 [ -e \$file ] && continue
pascal@474 255 [ \$total -lt \$min ] && break
pascal@474 256 while [ \$count -ne 0 ]; do
pascal@474 257 tmp="\$(dd if=/dev/fd0 count=1 2> /dev/null | md5sum)"
pascal@474 258 echo -n "Insert floppy \$num for \$name and press Enter or Q to skip"
pascal@474 259 while true; do
pascal@474 260 echo -n ":"
pascal@474 261 read -t 10 answer < /dev/tty0
pascal@474 262 case "\$answer" in
pascal@474 263 Q*|q*|A*|a*) break 3;;
pascal@474 264 esac
pascal@474 265 dd if=/dev/fd0 count=1 > /tmp/bs.\$\$ 2> /dev/null
pascal@474 266 [ -s /tmp/bs.\$\$ ] || continue
pascal@474 267 [ "\$(md5sum < /tmp/bs.\$\$)" != "\$tmp" ] || continue
pascal@474 268 rm -f /tmp/bs.\$\$
pascal@474 269 break
pascal@474 270 done
pascal@474 271 dd if=/dev/fd0 of=/tmp/rootfs.\$num 2> /dev/null || continue
pascal@474 272 cat /tmp/rootfs.\$num >> /tmp/rootfs
pascal@474 273 rm -f /tmp/rootfs.\$num
pascal@474 274 num=\$((\$num+1))
pascal@474 275 count=\$((\$count-1))
pascal@474 276 done
pascal@474 277 echo "\$md5 /tmp/rootfs" | md5sum -c || break
pascal@474 278 cpio -idmu < /tmp/rootfs > /dev/null 2>&1 ||
pascal@474 279 ( zcat /tmp/rootfs 2> /dev/null || unlzma -c /tmp/rootfs ) | cpio -idmu
pascal@474 280 rm -f /tmp/rootfs*
pascal@474 281 done <<EOT
pascal@474 282 $(while read line; do echo $line; done)
pascal@474 283 EOT
pascal@474 284 mv -f /init.org /init || sh
pascal@474 285 exec /init
pascal@474 286 EOTEOT
pascal@474 287 chmod +x $1/init
pascal@474 288 }
pascal@474 289
pascal@405 290 # write a 32 bits data
pascal@405 291 # usage: storelong offset data32 file
pascal@405 292 storelong()
pascal@405 293 {
pascal@405 294 printf "00000 %02X %02X %02X %02X \n" \
pascal@405 295 $(( $2 & 255 )) $(( ($2>>8) & 255 )) \
pascal@405 296 $(( ($2>>16) & 255 )) $(( ($2>>24) & 255 )) | \
pascal@405 297 hexdump -R | dd bs=1 conv=notrunc of=$3 seek=$(( $1 )) 2> /dev/null
pascal@405 298 }
pascal@405 299
pascal@405 300 # read a 32 bits data
pascal@405 301 # usage: getlong offset file
pascal@405 302 getlong()
pascal@405 303 {
pascal@405 304 dd if=$2 bs=1 skip=$(( $1 )) count=4 2> /dev/null | \
pascal@405 305 hexdump -e '"" 1/4 "%d" "\n"'
pascal@405 306 }
pascal@405 307
pascal@474 308 # output floppy images set
pascal@474 309 floppysetcat()
pascal@405 310 {
pascal@405 311 KERNEL="$1"
pascal@405 312 INITRD="$2"
pascal@405 313 shift 2
pascal@405 314 CMDLINE="$@"
pascal@405 315
pascal@405 316 # bzImage offsets
pascal@405 317 SetupSzOfs=497
pascal@405 318 SyssizeOfs=500
pascal@405 319 CodeAdrOfs=0x214
pascal@405 320 RamfsAdrOfs=0x218
pascal@405 321 RamfsLenOfs=0x21C
pascal@405 322 ArgPtrOfs=0x228
pascal@405 323
pascal@405 324 # boot+setup address
pascal@405 325 SetupBase=0x90000
pascal@405 326
pascal@405 327 stacktop=0x9E00
pascal@405 328
pascal@405 329 bs=/tmp/bs$$
pascal@405 330
pascal@405 331 # Get and patch boot sector
pascal@405 332 dd if=$KERNEL bs=512 count=1 of=$bs 2> /dev/null
pascal@405 333 uudecode <<EOT | dd of=$bs conv=notrunc 2> /dev/null
pascal@405 334 begin-base64 644 -
pascal@474 335 /L+6nWgAkAcGF4n8McC5HQDzq1sfD6mg8X1ABlfFd3ixBvOlZWaPR3gGH8ZF
pascal@490 336 +D/6l1hB6DQBvgACA3QO6HYBWwseKAJ0LFNH6AoBXuhmAbAgzRCwCM0QTuhl
pascal@490 337 ATwIdAOIBK05NigCdPDoPgE8CnXgiHz+ieb/TBD/TBi/9AGBTRz/gMdFMACc
pascal@490 338 sBCxBUi0k4lEHLABiUQUmGaY0+BIZgMFZtPoaAAQB7+AACn4nHMCAccx21BW
pascal@490 339 6J4AXrkAgLSH/kQczRVYnXfcoRoCvxwCsQk4RBxyuJPNE+oAACCQsEYoyL7b
pascal@490 340 AejSAF3rI4D5E3IEOMF3a4D+AnIEOOZ3bGCB/QAGdCoGUlFTlrQCULEGtQTB
pascal@490 341 xQSwDyHoBJAnFEAn6IwA/s117LAgzRDitOiWAJjNE2FSUCjIdwKwAZg5+HIC
pascal@490 342 ifhQtALNE5VeWFpyoJVBjuGAxwJPdFFOdfSM4ZU4wXVFiMj+xrEBOOZ1O4j0
pascal@490 343 /sW2AID9UHIwOi7wAXIqtQBgvt4B/kQMU+gxAFvoOAB1FlKYzRO4AQLNE1rQ
pascal@490 344 1Dpk/nXqRgjkdeVh64sWB7AxLAO0DrsHAM0QPA1088OwDejv/6wIwHX4w79s
pascal@474 345 BLFbZQINuA0BZToNdArNFnT0mM0Wju9Hw1g6AEluc2VydCBkaXNrIDEuBw0A
pascal@408 346 AA==
pascal@405 347 ====
pascal@405 348 EOT
pascal@405 349
pascal@405 350 # Get setup
pascal@405 351 setupsz=$(getlong $SetupSzOfs $bs)
pascal@405 352 setupszb=$(( $setupsz & 255 ))
pascal@405 353 dd if=$KERNEL bs=512 skip=1 count=$setupszb 2> /dev/null >> $bs
pascal@405 354
pascal@405 355 # Store cmdline after setup
pascal@405 356 if [ -n "$CMDLINE" ]; then
pascal@405 357 echo -n "$CMDLINE" | dd bs=512 count=1 conv=sync 2> /dev/null >> $bs
pascal@405 358 storelong ArgPtrOfs $(( $SetupBase + $stacktop )) $bs
pascal@405 359 fi
pascal@405 360
pascal@405 361 # Compute initramfs size
pascal@405 362 initrdlen=0
pascal@405 363 padding=0
pascal@405 364 for i in $( echo $INITRD | sed 's/,/ /' ); do
pascal@405 365 [ -s "$i" ] || continue
pascal@405 366 initrdlen=$(( $initrdlen + $padding ))
pascal@405 367 padding=$(stat -c %s $i)
pascal@405 368 initrdlen=$(( $initrdlen + $padding ))
pascal@405 369 padding=$(( 4096 - ($padding & 4095) ))
pascal@405 370 [ $padding -eq 4096 ] && padding=0
pascal@405 371 done
pascal@405 372 Ksize=$(( $(getlong $SyssizeOfs $bs)*16 ))
pascal@405 373 Kpad=$(( (($Ksize+4095)/4096)*4096 - Ksize ))
pascal@405 374 if [ $initrdlen -ne 0 ]; then
pascal@405 375 Kbase=$(getlong $CodeAdrOfs $bs)
pascal@405 376 storelong $RamfsAdrOfs \
pascal@405 377 $(( (0x1000000 - $initrdlen) & 0xFFFF0000 )) $bs
pascal@405 378 storelong $RamfsLenOfs $initrdlen $bs
pascal@405 379 fi
pascal@405 380
pascal@405 381 # Output boot sector + setup + cmdline
pascal@405 382 dd if=$bs 2> /dev/null
pascal@405 383
pascal@405 384 # Output kernel code
pascal@405 385 dd if=$KERNEL bs=512 skip=$(( $setupszb + 1 )) 2> /dev/null
pascal@405 386
pascal@405 387 # Pad to next sector
pascal@405 388 Kpad=$(( 512 - ($(stat -c %s $KERNEL) & 511) ))
pascal@405 389 [ $Kpad -eq 512 ] || dd if=/dev/zero bs=1 count=$Kpad 2> /dev/null
pascal@405 390
pascal@405 391 # Output initramfs
pascal@405 392 padding=0
pascal@405 393 for i in $( echo $INITRD | sed 's/,/ /' ); do
pascal@405 394 [ -s "$i" ] || continue
pascal@405 395 [ $padding -ne 0 ] && dd if=/dev/zero bs=1 count=$padding
pascal@405 396 dd if=$i 2> /dev/null
pascal@405 397 padding=$(( 4096 - ($(stat -c %s $i) & 4095) ))
pascal@405 398 [ $padding -eq 4096 ] && padding=0
pascal@405 399 done
pascal@405 400
pascal@405 401 # Cleanup
pascal@405 402 rm -f $bs
pascal@405 403 }
pascal@405 404
pascal@474 405 # Create boot floppy set from kernel, initrd & cmdline
pascal@474 406 floppyset()
pascal@474 407 {
pascal@490 408 floppysetcat "$@" | split -b 1440k /dev/stdin floppy$$
pascal@474 409 i=1
pascal@474 410 ls floppy$$* | while read file ; do
pascal@476 411 output=$(printf "fd%03d.img" $i)
pascal@474 412 cat $file /dev/zero | dd bs=1k count=1440 of=$output conv=sync 2> /dev/null
pascal@474 413 rm -f $file
pascal@474 414 i=$(( $i + 1 ))
pascal@474 415 done
pascal@474 416 }
pascal@474 417
pascal@474 418 # Create boot floppy set from a SliTaz ISO image
pascal@474 419 floppysetfromiso()
pascal@474 420 {
pascal@474 421 mkdir /tmp/iso$$
pascal@474 422 mount -o loop,ro $1 /tmp/iso$$
pascal@480 423 rootfs="$(ls /tmp/iso$$/boot/rootfs*z 2> /dev/null | tail -1)"
pascal@474 424 bzimage=/tmp/iso$$/boot/bzImage
pascal@474 425 if [ -z "$rootfs" -o ! -s $bzimage ]; then
pascal@474 426 umount -d /tmp/iso$$
pascal@474 427 rm -rf /tmp/iso$$
pascal@474 428 echo "Not a SliTaz ISO image !"
pascal@474 429 return 1
pascal@474 430 fi
pascal@474 431 mkdir -p /tmp/rootfs$$/fs
pascal@474 432 n=1
pascal@480 433 for i in $(ls /tmp/iso$$/boot/rootfs*z | sort -r); do
pascal@474 434 mkdir /tmp/rootfs$$/$n
pascal@474 435 ln -s $i /tmp/rootfs$$/$n
pascal@474 436 n=$(($n + 1))
pascal@474 437 done
paul@549 438 echo "Unpacking rootfs..."
pascal@474 439 ( zcat $rootfs 2> /dev/null | unlzma -c $rootfs ) | \
pascal@474 440 ( cd /tmp/rootfs$$/fs ; cpio -idm > /dev/null )
pascal@474 441 if [ $(unlzma -c $rootfs 2> /dev/null| wc -c) -gt $(stat -c %s $rootfs) ]; then
pascal@474 442 if [ $(du -ck $rootfs $bzimage | awk 'END { print $1 }') -gt 15296 ]; then
pascal@474 443 # The rootfs.gz file is too big, extract a minimum bootfs with busybox stuff
paul@549 444 echo "Extracting bootfs..."
pascal@474 445 mv /tmp/rootfs$$/fs /tmp/rootfs$$/fs0
pascal@474 446 for i in lib bin sbin usr/bin usr/sbin ; do
pascal@474 447 mkdir -p /tmp/rootfs$$/fs/$i
pascal@474 448 done
pascal@474 449 cd /tmp/rootfs$$/fs0
pascal@474 450 dir=$(echo lib/modules/*/kernel/drivers/block)
pascal@479 451 [ -d $dir ] && mkdir -p ../fs/$dir
pascal@474 452 [ -f $dir/floppy.ko.gz ] && mv $dir/floppy.ko.gz ../fs/$dir
pascal@474 453 for i in dev init mnt proc sys tmp ; do
pascal@474 454 mv $i ../fs
pascal@474 455 done
pascal@479 456 mv lib/ld-* ../fs/lib
pascal@479 457 LD_TRACE_LOADED_OBJECTS=1 /lib/ld*.so bin/busybox | \
pascal@479 458 awk '/\/lib\/lib/ { print $3 }' | while read lib ; do
pascal@479 459 while [ -L .$lib ]; do
pascal@479 460 local target
pascal@479 461 target="$(readlink ".$lib")"
pascal@479 462 case "$target" in
pascal@479 463 /*) ;;
pascal@479 464 *) target="$(dirname $lib)/$target" ;;
pascal@479 465 esac
pascal@479 466 mv ".$lib" ../fs/lib
pascal@479 467 lib="$target"
pascal@479 468 done
pascal@479 469 mv ".$lib" ../fs/lib
pascal@479 470 done
pascal@474 471 for i in $(bin/busybox | awk '{ if (s) printf "%s",$0 }
pascal@474 472 /Currently/ { s=1 }' | sed 's/,//g'); do
pascal@474 473 for j in bin sbin usr/bin usr/sbin ; do
pascal@474 474 [ -e $j/$i ] && mv $j/$i ../fs/$j/$i
pascal@474 475 done
pascal@474 476 done
pascal@474 477 mv bin/busybox ../fs/bin
pascal@479 478 [ -e ../fs/bin/cpio ] || mv bin/cpio ../fs/bin
pascal@474 479 rm -f ../1/*
pascal@474 480 find | cpio -o -H newc | lzma e ../1/rootfs.gz -si
pascal@474 481 cd - > /dev/null
pascal@474 482 rm -rf /tmp/rootfs$$/fs0
pascal@474 483 else
paul@477 484 # The rootfs.gz file fits in 15MB, no need to split it.
pascal@474 485 rm -rf /tmp/rootfs$$/1
pascal@474 486 fi
pascal@474 487 else
pascal@474 488 # This is a loram rootfs.gz, extract loram bootstrap
paul@549 489 echo "Splitting loram rootfs..."
pascal@488 490 offset=$(awk '/07070100/ { o+=index($0,"07070100"); print o/4 ; exit } { o+=1+length() }' < $rootfs)
pascal@488 491 dd if=$rootfs skip=$(($offset / 1024)) bs=4k count=1 2> /dev/null | \
pascal@488 492 dd skip=$(($offset % 1024)) bs=4 of=/tmp/rootfs$$/1/root 2> /dev/null
pascal@488 493 dd if=$rootfs skip=$((1 + ($offset / 1024) )) bs=4k \
pascal@488 494 >> /tmp/rootfs$$/1/root 2> /dev/null
pascal@488 495 rm -f /tmp/rootfs$$/1/rootfs*
pascal@474 496 fi
pascal@474 497 # Create extra rootfs floppies
pascal@474 498 for i in /tmp/rootfs$$/[1-9]*/root* ; do
pascal@474 499 [ -f $i ] || continue
paul@549 500 echo "Creating floppies for rootfs $(basename $(dirname $i) )..."
pascal@474 501 case "$(dd if=$i bs=1 count=4 2> /dev/null)" in
pascal@474 502 0707) cat $i ;;
pascal@474 503 *) zcat $i 2> /dev/null || unlzma -c $i ;;
pascal@474 504 esac | cpio -t > $(dirname $i)/files.list
pascal@474 505 sed -i '/ blocks$/d' $(dirname $i)/files.list
pascal@474 506 x=$(readlink $i)
pascal@474 507 [ -n "$x" ] || x=$i
pascal@474 508 pad=$(( $(stat -c %s $x ) % 1474560 ))
pascal@474 509 [ $pad -ne 0 ] && pad=$(( 1474560 - $pad ))
pascal@474 510 dd if=/dev/zero bs=1 count=$pad 2> /dev/null | cat $i - | \
pascal@474 511 split -b 1440k /dev/stdin $(dirname $i)/floppy
pascal@474 512 done
pascal@479 513 selection="$(grep -s append /tmp/iso$$/boot/isolinux/common.cfg | sed 's/.*append //')"
pascal@474 514 [ -n "$selection" ] || selection="0 slitaz"
pascal@474 515 set -- $selection
pascal@474 516 selection=""
pascal@474 517 while [ -n "$2" ]; do
pascal@474 518 [ ! -d /tmp/rootfs$$/1 -a -z "$4" ] && break
pascal@474 519 case "$1" in
pascal@474 520 *G) selection="$2 $(( ${1%G} * 1024 * 1024 )) $selection" ;;
pascal@474 521 *M) selection="$2 $(( ${1%M} * 1024 )) $selection" ;;
pascal@474 522 *) selection="$2 $1 $selection" ;;
pascal@474 523 esac
pascal@474 524 shift 2
pascal@474 525 done
paul@549 526 echo "Creating /init ..."
pascal@474 527 base=100
pascal@474 528 set -- $selection
pascal@474 529 for i in /tmp/rootfs$$/[1-9]* ; do
pascal@474 530 [ -d $i ] || continue
pascal@474 531 while read file; do
pascal@474 532 [ -e $i/../fs/$file ] && continue
pascal@474 533 [ $(grep -- "$file" $i/../*/files.list | wc -l) -eq 1 ] &&
pascal@474 534 break
pascal@474 535 done < $i/files.list
pascal@474 536 printf "%s %s %03d %d %s %s\n" \
pascal@474 537 $1 $2 $base $(ls $i/floppy* | wc -l) $file \
pascal@474 538 $(cat $i/floppy* | md5sum - | awk '{print $1}')
pascal@474 539 base=$(($base + 100))
pascal@474 540 shift 2
pascal@474 541 done | buildinit /tmp/rootfs$$/fs
pascal@474 542 cmdline="$(grep append /tmp/iso$$/boot/isolinux/isolinux.cfg | tail -n 1 | sed 's/.*gz //')"
pascal@474 543 ( cd /tmp/rootfs$$/fs ; find | cpio -o -H newc ) | lzma e /tmp/rootfs$$/rootfs -si
paul@549 544 echo "Creating first stage boot floppies..."
pascal@490 545 floppyset $bzimage /tmp/rootfs$$/rootfs "$cmdline"
pascal@474 546 base=100
pascal@474 547 for i in /tmp/rootfs$$/[1-9]* ; do
pascal@474 548 [ -d $i ] || continue
pascal@474 549 j=0
pascal@474 550 for f in $i/floppy* ; do
pascal@476 551 mv $f $(printf "fd%03d.img" $(( $base + $j )) )
pascal@474 552 j=$(($j + 1))
pascal@474 553 done
pascal@474 554 base=$(($base + 100))
pascal@474 555 done
pascal@474 556 rm -rf /tmp/rootfs$$
pascal@474 557 umount -d /tmp/iso$$
pascal@474 558 rm -rf /tmp/iso$$
pascal@474 559 }
pascal@474 560
pascal@474 561 # Show new boot floppy set
pascal@474 562 dialogwritefloppyset()
pascal@474 563 {
pascal@474 564 if ! list_floppy check; then
pascal@476 565 du -h fd???.img
pascal@474 566 return
pascal@474 567 fi
pascal@474 568 while true; do
pascal@474 569 exec 3>&1
pascal@474 570 IMAGE=`$DIALOG --title " Write floppy image " \
pascal@474 571 --backtitle "Boot floppy set creation on $DEVICE" --clear \
pascal@474 572 --colors --radiolist "
pascal@474 573 Insert a blank floppy in drive and
paul@477 574 select the floppy image you want to write.
pascal@474 575 " 18 46 46 \
pascal@476 576 $(on="on"; for i in fd???.img; do echo "$i $(du -h $i | cut -f1) $on "; on="off"; done) 2>&1 1>&3`
pascal@474 577 retval=$?
pascal@474 578 exec 3>&-
pascal@474 579 check_retval
pascal@474 580 dd if=$IMAGE of=$DEVICE
pascal@474 581 done
pascal@474 582 }
pascal@474 583
pascal@474 584 dialognofloppyset()
pascal@474 585 {
pascal@474 586 cat << EOT
paul@477 587 The boot loader can't load the kernel and the initramfs in the first 16MB
paul@477 588 of RAM. The total size exceeds 15MB. No floppy image is created.
pascal@474 589 EOT
pascal@474 590 }
pascal@474 591
pascal@474 592 # Check for iso 9660 image
pascal@474 593 isiso()
pascal@474 594 {
pascal@474 595 mkdir /tmp/iso$$
pascal@474 596 mount -o loop,ro $1 /tmp/iso$$ 2> /dev/null
pascal@474 597 status=$?
pascal@474 598 umount -d /tmp/iso$$ 2> /dev/null
pascal@474 599 rm -rf /tmp/iso$$
pascal@474 600 return $status
pascal@474 601 }
pascal@474 602
pascal@474 603 dialogfloppyset()
pascal@474 604 {
pascal@474 605 : ${DIALOG=dialog}
pascal@474 606 while true; do
pascal@474 607 exec 3>&1
pascal@474 608 KERNEL=`$DIALOG --title " Select a Linux kernel or a SliTaz iso " \
pascal@474 609 --backtitle "Boot floppy set creation on $DEVICE" --clear \
pascal@474 610 --colors --fselect "$PWD" 10 70 \
pascal@474 611 2>&1 1>&3`
pascal@474 612 retval=$?
pascal@474 613 exec 3>&-
pascal@474 614 check_retval
pascal@474 615 [ -f $KERNEL ] && break
pascal@474 616 done
pascal@474 617 if isiso $KERNEL ; then
pascal@474 618 bootfloppybox call mkisofloppies $KERNEL
pascal@474 619 dialogwritefloppyset
pascal@474 620 return
pascal@474 621 fi
pascal@474 622 exec 3>&1
pascal@474 623 INITRD=`$DIALOG --title " Select an Initramfs " \
pascal@474 624 --backtitle "Boot floppy set creation on $DEVICE" --clear \
pascal@474 625 --colors --fselect "$PWD" 10 70 \
pascal@474 626 2>&1 1>&3`
pascal@474 627 retval=$?
pascal@474 628 exec 3>&-
pascal@474 629 check_retval
pascal@474 630 [ -f "$INITRD" ] || INITRD=""
pascal@474 631 exec 3>&1
pascal@474 632 CMDLINE=`$DIALOG --title " Enter boot command line " \
pascal@474 633 --backtitle "Boot floppy set creation on $DEVICE" --clear \
pascal@474 634 --colors --inputbox "Kernel command line" 10 70 "rw root=/dev/null autologin" \
pascal@474 635 2>&1 1>&3`
pascal@474 636 retval=$?
pascal@474 637 exec 3>&-
pascal@474 638 check_retval
pascal@490 639 bootfloppybox call mkfloppies "$KERNEL" "$INITRD" "$CMDLINE" &&
pascal@474 640 dialogwritefloppyset ||
pascal@474 641 dialognofloppyset
pascal@474 642 }
pascal@474 643
pascal@474 644 #
pascal@474 645 # Create floppy image set
pascal@474 646 #
pascal@474 647 export IMAGE_SET='
pascal@474 648 <window title="Image set generator" icon-name="gtk-floppy">
pascal@474 649 <vbox>
pascal@474 650 <text use-markup="true">
pascal@474 651 <label>
pascal@474 652 "
pascal@474 653 <b>Create a boot floppy set</b>
pascal@474 654 "
pascal@474 655 </label>
pascal@474 656 </text>
paul@477 657 <notebook labels="Slitaz only|Any Linux">
pascal@474 658 <frame Slitaz only (no size limit)>
pascal@474 659 <vbox>
pascal@474 660 <text wrap="false" width-chars="44" use-markup="true">
pascal@474 661 <label>
pascal@474 662 "
paul@477 663 Slitaz uses a floppy boot flavor as a first
paul@477 664 stage boot to break the tiny loader 15MB limit.
pascal@474 665 "
pascal@474 666 </label>
pascal@474 667 </text>
pascal@474 668 <hbox>
pascal@474 669 <text use-markup="true">
pascal@474 670 <label>"<b>Slitaz ISO : </b>"</label>
pascal@474 671 </text>
pascal@474 672 <entry accept="filename">
pascal@474 673 <label>Select a Slitaz ISO image</label>
pascal@474 674 <variable>ISO</variable>
pascal@474 675 </entry>
pascal@474 676 <button>
pascal@474 677 <input file stock="gtk-open"></input>
pascal@474 678 <action type="fileselect">ISO</action>
pascal@474 679 </button>
pascal@474 680 </hbox>
pascal@474 681 <hbox>
pascal@474 682 <text use-markup="true">
pascal@474 683 <label>"<b>Output directory : </b>"</label>
pascal@474 684 </text>
pascal@474 685 <entry accept="directory">
pascal@474 686 <label>Select output directory</label>
pascal@474 687 <variable>FILE_DIRECTORY</variable>
pascal@474 688 <default>/tmp</default>
pascal@474 689 </entry>
pascal@474 690 <button>
pascal@474 691 <input file stock="gtk-open"></input>
pascal@474 692 <action type="fileselect">FILE_DIRECTORY</action>
pascal@474 693 </button>
pascal@474 694 </hbox>
pascal@474 695 <hbox>
pascal@474 696 <button>
pascal@474 697 <input file icon="forward"></input>
pascal@474 698 <label>Create image set from ISO boot</label>
pascal@476 699 <action>cd $FILE_DIRECTORY; bootfloppybox call mkisofloppiesxterm $ISO</action>
pascal@474 700 <action type="closewindow">IMAGE_SET</action>
pascal@474 701 </button>
pascal@474 702 </hbox>
pascal@474 703 </vbox>
pascal@474 704 </frame>
paul@477 705 <frame Any Linux distribution (max total size 14-15MB)>
pascal@474 706 <vbox>
pascal@474 707 <text wrap="false" width-chars="44" use-markup="true">
pascal@474 708 <label>
pascal@474 709 "
pascal@474 710 The total size of the kernel and the initramfs must be
paul@477 711 lower than 14-15MB due to the tiny boot loader design.
pascal@474 712 "
pascal@474 713 </label>
pascal@474 714 </text>
pascal@474 715 <hbox>
pascal@474 716 <text use-markup="true">
pascal@474 717 <label>"<b>Kernel : </b>"</label>
pascal@474 718 </text>
pascal@474 719 <entry accept="filename">
pascal@474 720 <label>Select a linux kernel</label>
pascal@474 721 <variable>KERNEL</variable>
pascal@474 722 </entry>
pascal@474 723 <button>
pascal@474 724 <input file stock="gtk-open"></input>
pascal@474 725 <action type="fileselect">KERNEL</action>
pascal@474 726 </button>
pascal@474 727 </hbox>
pascal@474 728 <hbox>
pascal@474 729 <text use-markup="true">
pascal@474 730 <label>"<b>Initramfs : </b>"</label>
pascal@474 731 </text>
pascal@474 732 <entry accept="filename">
pascal@474 733 <label>Select an initramfs/initrd file</label>
pascal@474 734 <variable>INITRD</variable>
pascal@474 735 </entry>
pascal@474 736 <button>
pascal@474 737 <input file stock="gtk-open"></input>
pascal@474 738 <action type="fileselect">INITRD</action>
pascal@474 739 </button>
pascal@474 740 </hbox>
pascal@474 741 <hbox>
pascal@474 742 <text use-markup="true">
pascal@474 743 <label>"<b>Cmdline : </b>"</label>
pascal@474 744 </text>
pascal@474 745 <entry>
pascal@474 746 <label>Enter kernel arguments</label>
pascal@474 747 <variable>CMDLINE</variable>
pascal@474 748 <default>rw root=/dev/null autologin</default>
pascal@474 749 </entry>
pascal@474 750 </hbox>
pascal@474 751 <hbox>
pascal@474 752 <text use-markup="true">
pascal@474 753 <label>"<b>Output directory : </b>"</label>
pascal@474 754 </text>
pascal@474 755 <entry accept="directory">
pascal@474 756 <label>Select output directory</label>
pascal@474 757 <variable>OUTPUT_DIRECTORY</variable>
pascal@474 758 <default>/tmp</default>
pascal@474 759 </entry>
pascal@474 760 <button>
pascal@474 761 <input file stock="gtk-open"></input>
pascal@474 762 <action type="fileselect">OUTPUT_DIRECTORY</action>
pascal@474 763 </button>
pascal@474 764 </hbox>
pascal@474 765 <hbox>
pascal@474 766 <button>
pascal@474 767 <input file icon="forward"></input>
pascal@474 768 <label>Create image set</label>
pascal@490 769 <action>cd $OUTPUT_DIRECTORY; bootfloppybox call mkfloppies "$KERNEL" "$INITRD" "$CMDLINE"</action>
pascal@474 770 <action type="closewindow">IMAGE_SET</action>
pascal@474 771 </button>
pascal@474 772 </hbox>
pascal@474 773 </vbox>
pascal@474 774 </frame>
pascal@474 775 </notebook>
pascal@474 776 <hbox>
pascal@474 777 <button>
pascal@474 778 <input file icon="gtk-close"></input>
pascal@474 779 <action type="closewindow">IMAGE_SET</action>
pascal@474 780 </button>
pascal@474 781 </hbox>
pascal@474 782 </vbox>
pascal@474 783 </window>
pascal@474 784 '
pascal@474 785
pascal@474 786 #
pascal@474 787 # Read/write floppy images
pascal@474 788 #
pascal@474 789 export FLOPPY_IMAGE='
pascal@474 790 <window title="Floppy image manager" icon-name="gtk-floppy">
pascal@474 791 <vbox>
pascal@474 792 <frame Floppy disk drive>
pascal@474 793 <hbox>
pascal@474 794 <text use-markup="true">
pascal@474 795 <label>"<b>Device : </b>"</label>
pascal@474 796 </text>
pascal@474 797 <combobox>
pascal@474 798 <variable>DEVICE</variable>'
pascal@474 799 FLOPPY_DEV=""
pascal@474 800 for i in $(list_floppy); do
pascal@474 801 FLOPPY_DEV="$FLOPPY_DEV
pascal@474 802 <item>/dev/$i</item>"
pascal@474 803 done
pascal@474 804 FLOPPY_IMAGE="$FLOPPY_IMAGE$FLOPPY_DEV
pascal@474 805 </combobox>
pascal@474 806 <button>
pascal@474 807 <label>Format floppy</label>
pascal@474 808 <input file icon=\"media-floppy\"></input>
pascal@474 809 <action>fdformat -n $DEVICE</action>
pascal@474 810 </button>
pascal@474 811 </hbox>
pascal@474 812 </frame>
pascal@474 813 <frame Floppy image file>
pascal@474 814 <hbox>
pascal@474 815 <text use-markup=\"true\">
pascal@474 816 <label>\"<b>File : </b>\"</label>
pascal@474 817 </text>
pascal@474 818 <entry accept=\"filename\">
pascal@474 819 <label>Select a floppy image</label>
pascal@474 820 <variable>IMAGE</variable>
pascal@474 821 </entry>
pascal@474 822 <button>
pascal@474 823 <input file stock=\"gtk-open\"></input>
pascal@474 824 <action type=\"fileselect\">IMAGE</action>
pascal@474 825 </button>
pascal@474 826 </hbox>
pascal@474 827 </frame>
pascal@474 828 <hbox>
pascal@474 829 <button>
pascal@474 830 <input file icon=\"reload\"></input>
pascal@474 831 <label>Create image set</label>
pascal@474 832 <action type=\"launch\">IMAGE_SET</action>
pascal@474 833 </button>
pascal@474 834 <button>
pascal@474 835 <input file icon=\"go-jump\"></input>
pascal@474 836 <label>Write image to floppy</label>
pascal@474 837 <action>dd if=\$IMAGE of=\$DEVICE</action>
pascal@474 838 </button>
pascal@474 839 <button>
pascal@474 840 <input file icon=\"undo\"></input>
pascal@474 841 <label>Get floppy image</label>
pascal@474 842 <action>dd if=\$DEVICE of=\$IMAGE</action>
pascal@474 843 </button>
pascal@474 844 <button>
pascal@474 845 <input file icon=\"gtk-close\"></input>
pascal@474 846 <action type=\"closewindow\">FLOPPY_IMAGE</action>
pascal@474 847 </button>
pascal@474 848 </hbox>
pascal@474 849 </vbox>
pascal@474 850 </window>
pascal@474 851 "
pascal@474 852
pascal@474 853 gtkdialogshowfloppyset()
pascal@474 854 {
pascal@474 855 #
pascal@474 856 # Show floppy image set
pascal@474 857 #
pascal@474 858 IMAGE_SHOW='
pascal@474 859 <window title="Image set" icon-name="gtk-floppy">
pascal@474 860 <vbox>
pascal@474 861 <text use-markup="true">
pascal@474 862 <label>
pascal@474 863 "
pascal@474 864 <b>Boot floppy images</b>
pascal@474 865 "
pascal@474 866 </label>
pascal@474 867 </text>
pascal@474 868 <tree>
pascal@474 869 <width>50</width><height>140</height>
pascal@474 870 <label>Size|File</label>
pascal@476 871 <input>du -h fd???.img | sed "s/\t/|/" </input>
pascal@474 872 </tree>
pascal@474 873 <hbox>
pascal@474 874 '
pascal@474 875 [ 0$1 -gt $((15 * 1024 * 1024)) ] && IMAGE_SHOW="$IMAGE_SHOW
pascal@474 876 <frame WARNING>
pascal@474 877 <text>
pascal@474 878 <label>
paul@477 879 \"This floppy set breaks the 15MB limit ($1 bytes).
paul@512 880 It may not be able to complete the boot process.\"
pascal@474 881 </label>
pascal@474 882 </text>
pascal@474 883 </frame>
pascal@474 884 </hbox>
pascal@474 885 <hbox>
pascal@474 886 "
pascal@474 887 list_floppy check && IMAGE_SHOW="$IMAGE_SHOW
pascal@474 888 <button>
pascal@474 889 <input file icon=\"media-floppy\"></input>
pascal@474 890 <label>Manage images</label>
pascal@474 891 <action type=\"launch\">FLOPPY_IMAGE</action>
pascal@474 892 </button>
pascal@474 893 "
pascal@474 894 IMAGE_SHOW="$IMAGE_SHOW
pascal@474 895 <button>
pascal@474 896 <input file icon=\"gtk-close\"></input>
pascal@474 897 <action type=\"closewindow\">IMAGE_SET</action>
pascal@474 898 </button>
pascal@474 899 </hbox>
pascal@474 900 </vbox>
pascal@474 901 </window>
pascal@474 902 "
pascal@474 903 export IMAGE_SHOW
pascal@474 904 gtkdialog --program=IMAGE_SHOW
pascal@474 905 }
pascal@474 906
pascal@264 907 while true; do
pascal@264 908
pascal@264 909 if [ "$1" == "call" ]; then
pascal@264 910 case "$2" in
pascal@274 911 mkmenu) mkmenu $3;;
pascal@474 912 mkisofloppiesxterm)
pascal@474 913 shift 2
pascal@474 914 xterm -geometry 80x16 -title "Build boot floppies from ISO" \
pascal@474 915 -e "$0 call mkisofloppies $@ ; echo -e \"----\nENTER to continue...\" && read close"
pascal@474 916 gtkdialogshowfloppyset
pascal@474 917 ;;
pascal@474 918 mkisofloppies)
pascal@474 919 shift 2
pascal@474 920 floppysetfromiso $@
pascal@474 921 ;;
pascal@405 922 mkfloppies)
pascal@405 923 shift 2
pascal@490 924 floppyset "$@"
pascal@476 925 sz=$(cat fd???.img | wc -c)
pascal@474 926 if [ -n "$XAUTHORITY" ]; then
pascal@474 927 gtkdialogshowfloppyset $sz
pascal@474 928 else
pascal@474 929 if [ $sz -gt $((15 * 1024 * 1024)) ]; then
pascal@474 930 cat <<EOT
paul@477 931 This floppy set breaks the 15MB limit ($sz bytes).
paul@512 932 It may not be able to complete the boot process.
pascal@474 933 EOT
pascal@474 934 fi
pascal@474 935 fi
pascal@474 936 ;;
pascal@264 937 install)
pascal@264 938 DIR=/tmp/mkbootfloppy$$
pascal@264 939 mkdir -p $DIR
pascal@264 940 DEVICE=$4
pascal@264 941 file=$5
pascal@264 942 case "$3" in
pascal@474 943 dialog*)
pascal@474 944 shift 2
pascal@474 945 $@
pascal@474 946 ;;
pascal@274 947 grub*)
pascal@264 948 mkdir -p $DIR/boot/grub
pascal@274 949 [ -f /usr/share/boot/btmgr -a -f /usr/share/boot/memdisk.lzma ] \
pascal@264 950 && cat /usr/share/boot/btmgr /dev/zero | \
pascal@264 951 dd bs=18k count=80 | gzip -9 > \
pascal@264 952 $DIR/boot/btmgr.gz \
pascal@264 953 && unlzma -c /usr/share/boot/memdisk.lzma > \
pascal@264 954 $DIR/boot/memdisk
pascal@382 955 [ -f /usr/share/boot/plpbt.bin ] \
pascal@382 956 && cp /usr/share/boot/plpbt.bin $DIR/boot
pascal@274 957 [ -f /usr/share/boot/etherboot ] \
pascal@264 958 && cp /usr/share/boot/etherboot $DIR/boot
pascal@264 959 [ -f /boot/gpxe ]\
pascal@264 960 && cp /boot/gpxe $DIR/boot
pascal@274 961 [ -f /usr/share/boot/memtest.lzma -a \
pascal@274 962 -f /usr/share/boot/memdisk.lzma ] \
pascal@274 963 && unlzma -c /usr/share/boot/memtest.lzma | \
pascal@274 964 cat - /dev/zero | dd bs=18k count=80 | \
pascal@274 965 gzip -9 > $DIR/boot/memtest.gz \
pascal@274 966 && unlzma -c /usr/share/boot/memdisk.lzma > \
pascal@274 967 $DIR/boot/memdisk
pascal@274 968 install_grub $DIR $3
pascal@264 969 ;;
pascal@264 970 *)
pascal@264 971 case "$file" in
pascal@264 972 *.lzma) action="unlzma -c";;
pascal@264 973 *.gz) action="zcat";;
pascal@264 974 *) action="cat";;
pascal@264 975 esac
pascal@264 976 case "$DEVICE" in
pascal@264 977 /dev/*) $action $file > $DEVICE;;
pascal@274 978 flopp*) $action $file | cat - /dev/zero | \
pascal@274 979 dd bs=18k count=80 > boot.fd;;
pascal@264 980 cdrom*)
pascal@264 981 mkdir -p $DIR/boot/grub
pascal@264 982 case "$3" in
pascal@382 983 btmgr|memtest)
pascal@264 984 $action $file | cat - /dev/zero | \
pascal@264 985 dd bs=18k count=80 | \
pascal@264 986 gzip -9 > $DIR/boot/$3.gz
pascal@264 987 unlzma -c /usr/share/boot/memdisk.lzma \
pascal@264 988 > $DIR/boot/memdisk
pascal@274 989 cat > /tmp/floppybox.grub.menu << EOT
pascal@274 990 # grub menu
pascal@264 991 timeout 0
pascal@264 992 title $3
pascal@264 993 kernel /boot/memdisk floppy c=80 h=2 s=18
pascal@264 994 initrd /boot/$3.gz
pascal@264 995 EOT
pascal@264 996 ;;
pascal@264 997 *) $action $file > $DIR/boot/$3
pascal@274 998 cat > /tmp/floppybox.grub.menu << EOT
pascal@274 999 # grub menu
pascal@264 1000 timeout 0
pascal@264 1001 title $3
pascal@264 1002 kernel /boot/$3
pascal@264 1003 EOT
pascal@264 1004 ;;
pascal@264 1005 esac
pascal@274 1006 install_grub $DIR grub
pascal@264 1007 ;;
pascal@264 1008 esac
pascal@264 1009 ;;
pascal@264 1010 esac
pascal@264 1011 rm -rf $DIR
pascal@264 1012 ;;
pascal@220 1013 get-plop)
pascal@382 1014 mkdir -p /tmp/get-plop$$
pascal@382 1015 PLOP_URL=http://mirror.slitaz.org/boot/plpbt.bin
pascal@382 1016 wget -O - $PLOP_URL > /tmp/get-plop$$/plpbt.bin
pascal@382 1017 VERSION="$(strings /tmp/get-plop$$/plpbt.bin \
pascal@382 1018 | grep 'Boot Manager v' | sed 's/.* v\([0-9\.]*\) .*/\1/')"
pascal@382 1019 mkdir -p $(dirname /tmp/get-plop$$/plop-$VERSION/fs/$3)
pascal@382 1020 mv /tmp/get-plop$$/plpbt.bin \
pascal@382 1021 /tmp/get-plop$$/plop-$VERSION/fs/$3
pascal@285 1022 if [ -s /tmp/get-plop$$/plop-$VERSION/fs/$3 ]; then
pascal@285 1023 cat > /tmp/get-plop$$/plop-$VERSION/receipt <<EOT
pascal@220 1024 PACKAGE="plop"
pascal@285 1025 VERSION="$VERSION"
pascal@220 1026 CATEGORY="non-free"
pascal@220 1027 SHORT_DESC="Plop boot manager."
pascal@220 1028 WEB_SITE="http://www.plop.at/en/bootmanager.html"
pascal@220 1029 EOT
pascal@285 1030 ( cd /tmp/get-plop$$ ; tazpkg pack plop-$VERSION )
pascal@285 1031 tazpkg install /tmp/get-plop$$/plop-$VERSION.tazpkg
pascal@264 1032 fi
pascal@220 1033 rm -rf /tmp/get-plop$$
pascal@220 1034 ;;
pascal@214 1035 *) echo "Invalid command $0 $@" 1>&2
pascal@214 1036 exit 1;;
pascal@214 1037 esac
pascal@214 1038 exit 0
pascal@214 1039 fi
pascal@214 1040
pascal@213 1041 if [ -z "$XAUTHORITY" ]; then
pascal@213 1042
pascal@213 1043 : ${DIALOG=dialog}
pascal@213 1044
pascal@213 1045 DEVICE=/dev/fd0
pascal@474 1046 list_floppy check || DEVICE="floppy"
pascal@213 1047 while true; do
pascal@213 1048 exec 3>&1
pascal@213 1049 ID_SOURCE=`$DIALOG --title " Choose a boot floppy " \
pascal@213 1050 --backtitle "Boot Floppy Creation on $DEVICE" --clear \
pascal@213 1051 --extra-button --extra-label "Change floppy" \
pascal@213 1052 --colors --radiolist "
paul@317 1053 Create a floppy or a cdrom to boot a LiveCD in a PXE network...
pascal@264 1054 May need a floppy disk in drive. Erase the whole floppy disk.
pascal@213 1055 " 18 70 50\
pascal@474 1056 FloppySet "Boot Slitaz with floppies only." on \
pascal@474 1057 SmartBtmgr "Boot any partition or ATAPI CD-ROM." off \
pascal@382 1058 Plop "Boot USB harddisk floppy or CD/DVD." off \
pascal@220 1059 Etherboot "Replacement for proprietary PXE ROMs." off \
pascal@223 1060 gPXE "Boot from http://boot.slitaz.org/" off \
pascal@220 1061 Memtest86+ "Memory failures detection tool." off \
paul@333 1062 Grub4DOS "Enhanced grub version supporting NTFS." off \
pascal@474 1063 Grub "Boot loader with command shell." off \
pascal@474 1064 2>&1 1>&3`
pascal@213 1065 retval=$?
pascal@213 1066 exec 3>&-
pascal@213 1067 check_retval
pascal@213 1068 if [ "$retval" = "3" ]; then
pascal@213 1069 select_floppy
pascal@213 1070 continue;
pascal@213 1071 fi
pascal@213 1072 while read key file pkg; do
pascal@213 1073 [ "$key" = "$ID_SOURCE" ] || continue
pascal@213 1074 if [ ! -f "$file" ]; then
pascal@213 1075 $DIALOG --title " Install package " --colors \
pascal@213 1076 --backtitle "Boot Floppy Creation" --clear \
pascal@213 1077 --yes-label "Install" \
pascal@213 1078 --no-label "Quit" \
pascal@213 1079 --yesno "The package $pkg is not yet installed. Install it ?" 18 70
pascal@213 1080 retval=$?
pascal@220 1081 if [ "$pkg" = "plop" ]; then
pascal@220 1082 bootfloppybox call get-plop $file
pascal@220 1083 else
pascal@264 1084 tazpkg get-install $pkg
pascal@220 1085 fi
pascal@213 1086 fi
pascal@264 1087 bootfloppybox call install "$pkg" "$DEVICE" "$file"
pascal@213 1088 exit 0
pascal@213 1089 done <<EOT
pascal@474 1090 FloppySet /bin/dd dialogfloppyset
pascal@213 1091 SmartBtmgr /usr/share/boot/btmgr btmgr
pascal@382 1092 Plop /usr/share/boot/plpbt.bin plop
pascal@213 1093 Etherboot /usr/share/boot/etherboot etherboot
pascal@222 1094 gPXE /boot/gpxe gpxe
pascal@213 1095 Memtest86+ /usr/share/boot/memtest.lzma memtest
pascal@274 1096 Grub4DOS /usr/share/boot/grldr.lzma grub4dos
pascal@213 1097 Grub /usr/sbin/grub grub
pascal@213 1098 EOT
pascal@213 1099 done
pascal@213 1100 fi
pascal@264 1101 #
pascal@264 1102 # Describe gPXE arguments.
pascal@264 1103 #
pascal@264 1104 export HELP='
pascal@264 1105 <window title="gPXE forced url" icon-name="gtk-floppy">
pascal@264 1106 <vbox>
pascal@474 1107 <text use-markup="true">
pascal@264 1108 <label>"
pascal@264 1109 <b>Web boot parameters</b>"
pascal@264 1110 </label>
pascal@264 1111 </text>
pascal@264 1112 <frame>
pascal@264 1113 <text wrap="true" width-chars="58" use-markup="true">
pascal@264 1114 <label>
paul@333 1115 "Without parameters (i.e. with an empty Boot URL) gPXE will perform a normal PXE boot: IP configuration with DHCP and download the DHCP bootfile with TFTP.
pascal@264 1116
paul@317 1117 You can override the DHCP bootfile with a Boot URL such as <i>tftp://192.168.0.1/pxe/pxeloader</i>, <i>http://mirror.slitaz.org/pxe/pxelinux.0</i>, or <i>x-tftm://192.168.0.201//lts/vmlinuz.ltsp</i>.
pascal@264 1118
paul@333 1119 You can override IP configuration too (useful without a DHCP server), example: <i>ip=192.168.0.10/24 gw=192.168.0.1 dns=192.168.0.1 nodhcp url=http://mirror.slitaz.org/pxe/pxelinux.0</i>
pascal@264 1120
paul@317 1121 The <i>nodhcp</i> keyword avoids dhcp timeouts and the <i>url=</i> keyword is optional when the url is the only one argument.
pascal@337 1122
paul@350 1123 Comma separated URL lists are supported. The PXE client will try to load the first URL. If the load fails, it will try the next URL, and so on.
pascal@264 1124 "
pascal@264 1125 </label>
pascal@264 1126 </text>
pascal@264 1127 </frame>
pascal@264 1128 </vbox>
pascal@264 1129 </window>
pascal@264 1130 '
pascal@264 1131 #
pascal@130 1132 # Write bootfloppy image to floppy device.
pascal@130 1133 #
pascal@130 1134 BOOT_DIALOG='
pascal@139 1135 <window title="bootfloppybox" icon-name="gtk-floppy">
pascal@130 1136 <vbox>
pascal@130 1137
pascal@130 1138 <text use-markup="true">
pascal@130 1139 <label>
pascal@130 1140 "
pascal@130 1141 <b>SliTaz - Bootfloppybox</b>"
pascal@130 1142 </label>
pascal@130 1143 </text>
pascal@134 1144 <text wrap="false" width-chars="44" use-markup="true">
pascal@130 1145 <label>
pascal@130 1146 "
paul@333 1147 Create a floppy or a cdrom to boot a LiveCD in a PXE network or the WEB...
pascal@264 1148 May need a floppy disk in drive. Erase the whole floppy disk.
pascal@130 1149 "
pascal@130 1150 </label>
pascal@130 1151 </text>
pascal@130 1152
pascal@130 1153 <frame Floppy disk drive>
pascal@130 1154 <hbox>
pascal@130 1155 <text use-markup="true">
pascal@132 1156 <label>"<b>Device : </b>"</label>
pascal@130 1157 </text>
pascal@264 1158 <combobox>
pascal@264 1159 <variable>DEVICE</variable>'
pascal@474 1160 FLOPPY_DEV=""
pascal@474 1161 for i in $(list_floppy); do
pascal@474 1162 FLOPPY_DEV="$FLOPPY_DEV
pascal@474 1163 <item>/dev/$i</item>"
pascal@264 1164 done
pascal@474 1165 BOOT_DIALOG="$BOOT_DIALOG$FLOPPY_DEV
pascal@474 1166 <item>floppy image (boot.fd)</item>
paul@333 1167 <item>cdrom image (boot.iso)</item>
pascal@474 1168 </combobox>"
pascal@474 1169 if [ -n "$FLOPPY_DEV" ]; then
pascal@474 1170 tmp='
pascal@132 1171 <button>
pascal@132 1172 <label>Format floppy</label>
pascal@330 1173 <input file icon="media-floppy"></input>
pascal@264 1174 <action>case "$DEVICE" in /dev/*) fdformat -n $DEVICE;; esac</action>
pascal@474 1175 </button>'
pascal@474 1176 BOOT_DIALOG="$BOOT_DIALOG$tmp"
pascal@474 1177 fi
pascal@474 1178 tmp='
pascal@130 1179 </hbox>
pascal@130 1180 </frame>
pascal@474 1181 <notebook labels="Set|LiveCD|USB|PXE Network|WEB Network|Memory Test|Windows|Expert">
pascal@474 1182 <frame Boot floppy set (many floppies)>
pascal@474 1183 <vbox>
pascal@474 1184 <hbox>
pascal@474 1185 <text wrap="true" width-chars="58" use-markup="true">
pascal@474 1186 <label>
pascal@474 1187 "
paul@477 1188 Only people without a CD-ROM, USB and Network should use a floppy set.
pascal@474 1189 The images are built from an ISO boot or from a Linux kernel, an initramfs
paul@477 1190 and a boot command line. Non Slitaz boot floppy sets are limited to 15MB.
pascal@474 1191 "
pascal@474 1192 </label>
pascal@474 1193 </text>
pascal@474 1194 </hbox>
pascal@474 1195 <hbox>
pascal@474 1196 <button>
pascal@474 1197 <label>Create image set</label>
pascal@474 1198 <input file icon="forward"></input>
pascal@474 1199 <action type="launch">IMAGE_SET</action>
pascal@474 1200 </button>
pascal@474 1201 </hbox>
pascal@474 1202 </vbox>
pascal@474 1203 </frame>
pascal@130 1204 '
pascal@264 1205 BOOT_DIALOG="$BOOT_DIALOG$tmp"
pascal@130 1206 while read name file pkg desc; do
pascal@474 1207 tmp="<frame $name (single floppy)>
pascal@130 1208 <hbox>
pascal@474 1209 <text wrap=\"true\" width-chars=\"58\" use-markup=\"true\">
pascal@130 1210 <label>
pascal@130 1211 \"
pascal@130 1212 $(echo -e $desc)
pascal@130 1213 \"
pascal@130 1214 </label>
pascal@130 1215 </text>
pascal@130 1216 </hbox>
pascal@264 1217 <hbox>
pascal@130 1218 "
pascal@130 1219 if [ -f $file ]; then
pascal@274 1220 if [ "$pkg" = "grub" -o "$pkg" = "grub4dos" ]; then
pascal@135 1221 tmp="$tmp
pascal@135 1222 <button>
pascal@200 1223 <label>Grub menu</label>
pascal@200 1224 <input file icon=\"accessories-text-editor\"></input>
pascal@274 1225 <action>bootfloppybox call mkmenu $pkg</action>
pascal@214 1226 <action type=\"lauch\">leafpad /tmp/floppybox.grub.menu</action>
pascal@200 1227 </button>
pascal@135 1228 "
pascal@267 1229 elif [ "$pkg" = "etherboot" ]; then
pascal@267 1230 tmp="$tmp
pascal@267 1231 <button>
pascal@267 1232 <input file icon=\"browser\"></input>
pascal@267 1233 <label>Wiki</label>
pascal@498 1234 <action>browser http://doc.slitaz.org/en:guides:pxe &</action>
pascal@267 1235 </button>
pascal@267 1236 "
pascal@233 1237 elif [ "$pkg" = "gpxe" ]; then
pascal@233 1238 tmp="$tmp
pascal@233 1239 <text wrap=\"true\" use-markup=\"true\">
pascal@233 1240 <label> \"<b>Boot URL:</b>\" </label>
pascal@233 1241 </text>
pascal@233 1242 <entry>
pascal@233 1243 <default>$(dd if=$file bs=1 skip=519 count=255 2>/dev/null | strings)</default>
pascal@233 1244 <variable>URL</variable>
pascal@233 1245 </entry>
pascal@264 1246 </hbox>
pascal@264 1247 <hbox>
pascal@267 1248 <button>
pascal@267 1249 <input file icon=\"browser\"></input>
pascal@267 1250 <label>Wiki</label>
pascal@498 1251 <action>browser http://doc.slitaz.org/en:guides:pxe &</action>
pascal@267 1252 </button>
pascal@264 1253 <button help>
pascal@264 1254 <action type=\"launch\">HELP</action>
pascal@264 1255 </button>
pascal@233 1256 <button>
pascal@233 1257 <label>Update</label>
pascal@233 1258 <input file icon=\"reload\"></input>
pascal@233 1259 <action>echo -n \"\$URL\" | cat - /dev/zero | dd conv=notrunc bs=1 count=255 seek=519 of=$file 2>/dev/null</action>
pascal@233 1260 </button>
pascal@264 1261 "
pascal@264 1262 fi
pascal@267 1263 receipt=/var/lib/tazpkg/installed/$pkg/receipt
pascal@267 1264 if [ -f $receipt ]; then
pascal@267 1265 . $receipt
pascal@267 1266 tmp="$tmp
pascal@267 1267 <button>
pascal@267 1268 <input file icon=\"browser\"></input>
pascal@267 1269 <label>Web</label>
pascal@496 1270 <action>browser $WEB_SITE &</action>
pascal@267 1271 </button>
pascal@267 1272 "
pascal@267 1273 fi
pascal@264 1274 tmp="$tmp
pascal@233 1275 <button>
pascal@233 1276 <label>Write floppy</label>
pascal@233 1277 <input file icon=\"forward\"></input>
pascal@264 1278 <action>bootfloppybox call install \"$pkg\" \"\$DEVICE\" \"$file\"</action>
pascal@233 1279 </button>
pascal@233 1280 </hbox>
pascal@233 1281 </frame>
pascal@233 1282 "
pascal@130 1283 else
pascal@264 1284 tmp2="tazpkg get-install $pkg --forced"
pascal@220 1285 [ "$pkg" = "plop" ] && tmp2="bootfloppybox call get-plop $file"
pascal@130 1286 tmp="$tmp
pascal@157 1287 <text wrap=\"true\" width-chars=\"34\" use-markup=\"true\">
pascal@130 1288 <label>
pascal@130 1289 \"<i>The package <b>$pkg</b> is not yet installed</i>\"
pascal@130 1290 </label>
pascal@130 1291 </text>
pascal@157 1292 <button>
pascal@157 1293 <input file icon=\"go-jump\"></input>
pascal@157 1294 <label>Install</label>
pascal@264 1295 <action>[ -f /var/lib/tazpkg/packages.list ] || tazpkg recharge</action>
pascal@264 1296 <action>xterm -fa MiscFixed -fs 11 -bg gray93 -fg black -geometry 80x17 -title \"$pkg install\" -e \"$tmp2 ; sleep 2\"</action>
pascal@221 1297 <action type=\"exit\">restart</action>
pascal@157 1298 </button>
pascal@130 1299 </hbox>
pascal@130 1300 </frame>
pascal@130 1301 "
pascal@130 1302 fi
pascal@130 1303 BOOT_DIALOG="$BOOT_DIALOG$tmp"
pascal@130 1304 done <<EOT
pascal@474 1305 SmartBtmgr /usr/share/boot/btmgr btmgr This OS independent Smart Boot Manager can boot \\\\nany partition or ATAPI CD-ROM.
pascal@474 1306 Plop /usr/share/boot/plpbt.bin plop This non free Boot Manager can boot a floppy disk, hardisk, USB or \\\\nCD/DVD. Hit Ctrl-ESC for text mode.
pascal@474 1307 Etherboot /usr/share/boot/etherboot etherboot This network bootloader provides a replacement \\\\nfor proprietary PXE or NBI ROMs.
pascal@233 1308 gPXE /boot/gpxe gpxe PXE / iSCSI / AoE network bootloader.
pascal@130 1309 Memtest86+ /usr/share/boot/memtest.lzma memtest Memory failures detection tool.
paul@333 1310 Grub4DOS /usr/share/boot/grldr.lzma grub4dos Enhanced grub version supporting NTFS.
paul@333 1311 Grub /usr/sbin/grub grub General purpose boot loader with command shell.
pascal@130 1312 EOT
pascal@130 1313 tmp='
pascal@134 1314 </notebook>
pascal@130 1315 <hbox>
pascal@474 1316 '
pascal@474 1317 BOOT_DIALOG="$BOOT_DIALOG$tmp"
pascal@474 1318 if [ -e /dev/cdrom ]; then
pascal@474 1319 tmp='
pascal@130 1320 <button>
pascal@330 1321 <input file icon="media-cdrom"></input>
pascal@330 1322 <label>Burn cdrom image</label>
pascal@330 1323 <action>burnbox</action>
pascal@330 1324 </button>
pascal@474 1325 '
pascal@474 1326 BOOT_DIALOG="$BOOT_DIALOG$tmp"
pascal@474 1327 fi
pascal@474 1328 if list_floppy check; then
pascal@474 1329 tmp='
pascal@330 1330 <button>
pascal@330 1331 <input file icon="media-floppy"></input>
pascal@330 1332 <label>Manage floppy image</label>
pascal@330 1333 <action type="launch">FLOPPY_IMAGE</action>
pascal@330 1334 </button>
pascal@474 1335 '
pascal@474 1336 BOOT_DIALOG="$BOOT_DIALOG$tmp"
pascal@474 1337 fi
pascal@474 1338 tmp='
pascal@330 1339 <button>
pascal@130 1340 <input file icon="exit"></input>
pascal@130 1341 <label>Exit</label>
pascal@130 1342 <action type="exit">Exit</action>
pascal@130 1343 </button>
pascal@130 1344 </hbox>
pascal@130 1345
pascal@130 1346 </vbox>
pascal@130 1347 </window>
pascal@130 1348 '
pascal@130 1349 BOOT_DIALOG="$BOOT_DIALOG$tmp"
pascal@130 1350 export BOOT_DIALOG
pascal@130 1351
pascal@130 1352 # Only root can create floppy.
pascal@130 1353 check_root
pascal@221 1354 gtkdialog --program=BOOT_DIALOG | grep -q 'EXIT="restart"' && continue
pascal@214 1355 rm -f /tmp/floppybox.grub.menu
pascal@130 1356 exit 0
pascal@221 1357 done