wok view syslinux/stuff/iso2exe/taziso @ rev 17637

syslinux-tools: add taziso (again)
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat Feb 14 21:16:05 2015 +0100 (2015-02-14)
parents 77c3484cda94
children 17923f312c4e
line source
1 #!/bin/sh
3 [ $(id -u) -eq 0 ] || exec su -c "$0 $@"
5 DIALOG=dialog
7 ddq()
8 {
9 dd $@ 2> /dev/null
10 }
12 get()
13 {
14 od -v -j $1 -N ${4:-${3:-2}} -t u${3:-2} -w${3:-2} -An $2 2>/dev/null ||
15 hexdump -v -s $1 -n ${4:-${3:-2}} -e "\"\" 1/${3:-2} \" %d\n\"" $2
16 }
18 bytes2bin()
19 {
20 for i in $@ ; do
21 printf '\\\\x%02X' $(($i&255))
22 done | xargs echo -en
23 }
25 words2bin()
26 {
27 for i in $@ ; do
28 printf '\\\\x%02X\\\\x%02X' $(($i&255)) $((($i>>8)&255))
29 done | xargs echo -en
30 }
32 gettazboot()
33 {
34 echo "Creating $(basename $1) ..."
35 if [ $(get 0 $ISO) -eq 23117 ]; then
36 O=$(($(get 66 $ISO) - 0xC0))
37 L=$(($(get 20 $ISO) - 0xC0 - $(get 24 $ISO) - $O))
38 S=$((32+$L))
39 P=$((($S+511)/512))
40 E=$((4096-(32*$P)))
41 words2bin 0x5A4D $(($S%512)) $P 0 2 $E -1 $((${2:-0}-16)) \
42 -2 0 256 -16 28 0x6C53 0x5469 0x7A61 > $1
43 ddq bs=1 count=$L skip=$(echo $O) if=$ISO >> $1
44 else
45 wget -O $1 http://mirror.slitaz.org/boot/tazboot.exe
46 fi
47 }
49 uncpio()
50 {
51 [ -s "$1" ] || return
52 echo -en "\n Extracting $(basename $1) ..."
53 case $(get 0 $1) in
54 *35615) ( zcat || gunzip ) ;;
55 *14333) unxz ;;
56 *\ 93) unlzma ;;
57 *) cat ;;
58 esac < $1 | ( cd ${2:-/} ; cpio -idmu > /dev/null 2>&1 )
59 }
61 dotwait()
62 {
63 echo -n "${1:-Install filesystem}.."
64 touch /tmp/wait
65 while [ -e /tmp/wait ]; do
66 echo -n "." > /dev/tty
67 sleep 1
68 done &
69 }
71 getuuid()
72 {
73 dev=$(mount | sed "/ $(echo $mnt | sed 's|/|\\/|g') /!d;s/ .*//;s|/dev/||;q")
74 [ "$dev" ] &&
75 blkid | sed "/$dev:/!d;s/.* UUID=.\\([^ ]*\\)\".*/\\1/" ||
76 echo "/dev/hda1"
77 }
79 tazusbinitfs()
80 {
81 PAD=$(($(stat -c %s $1) % 4))
82 [ $PAD -ne 0 ] && ddq if=/dev/zero bs=1 count=$((4 - $PAD)) >> $1
83 mkdir -p /tmp/fs$$/etc /tmp/fs$$/lib /tmp/fs$$/home
84 cp -a /etc/locale.conf /tmp/fs$$/etc 2> /dev/null
85 cp -a /etc/keymap.conf /tmp/fs$$/etc 2> /dev/null
86 cat > /tmp/fs$$/init1 <<EOT
87 #!/bin/sh
88 sed -i 's|sbin/init|init2|' /init
89 exec /init
90 EOT
91 cat > /tmp/fs$$/init2 <<EOT
92 #!/bin/sh
94 mount -t proc /proc /proc
95 for i in /lib/*.ko* ; do insmod \$i 2> /dev/null ; done; sleep 2
96 v=\$(sed '/\\/home=/!d;s|.*/home=\\([^ ]*\\).*|\\1|' /proc/cmdline /cmdline 2> /dev/null)
97 mount / -o remount,rw
98 mkdir /mnt/dos
99 rm -f /cmdline 2> /dev/null
100 mount / -o remount,ro
101 mnt=/mnt/dos/\${v#*/}
102 dev=\$( (blkid /dev/[sh]d* || blkid) | grep \${v%%/*} | sed 's/:.*//;q')
103 echo "Mount \$dev in /mnt/dos for \$v..." | tee -a /run/boot.log
104 mount \$dev /mnt/dos
105 if [ ! -d /mnt/dos/slitaz ]; then
106 umount /mnt/dos 2> /dev/null
107 (blkid /dev/[sh]d* || blkid) | while read dev line; do
108 case "\$line" in
109 *ntfs*|*vfat*|*msdos*) ;;
110 *) continue ;;
111 esac
112 mount \${dev%:} /mnt/dos
113 [ -d /mnt/dos/slitaz ] && break
114 umount /mnt/dos
115 done
116 fi
117 mount.posixovl -F \$mnt -- -oallow_other -odefault_permissions -osuid
118 mount --bind \$mnt /home
119 umount /proc
120 exec /sbin/init
121 EOT
122 chmod 755 /tmp/fs$$/init?
123 ( cd /tmp/fs$$ ; find * | cpio -o -H newc ) | gzip -9 >> $1
124 rm -rf /tmp/fs$$
125 }
127 mkinitrd()
128 {
129 echo -en "\nCreating $(basename $1) "
130 fs=/tmp/fs$$
131 for i in bin lib dev proc tmp mnt etc ; do
132 mkdir -p $fs/$i
133 done
134 for i in /dev/console /dev/null /dev/tty /dev/tty0 /dev/tty1 /dev/tty2 \
135 /dev/fuse /dev/hd* /dev/sd* ; do
136 cp -a $2$i $fs/dev/
137 done
138 for i in /bin/busybox $(which mount.posixovl) $(which blkid); do
139 cp $(LD_TRACE_LOADED_OBJECTS=1 /lib/ld*.so $i | \
140 sed 's|.*=> \(.*/lib/l[^ ]*\).*|\1|;/^\//!d') $fs/lib
141 cp $i $fs/bin
142 done
143 cp -a /lib/ld-* $fs/lib
144 for i in $(busybox | sed '/Current/,$!d'); do
145 [ -e $fs/bin/${i%,} ] || ln -s busybox $fs/bin/${i%,}
146 done
147 ln -s /proc/mounts $fs/etc/mtab
148 sed 's/ .*//' /proc/modules | while read mod ; do
149 find /lib/modules/ | grep $mod.ko | \
150 sed 's|.*|cp & $fs/lib|' | sh
151 done
152 cat > $fs/init <<EOT
153 #!/bin/sh
155 arg()
156 {
157 grep -q \$1 /proc/cmdline &&
158 val="\$(sed "s/.*\$1=\\([^ ]*\\).*/\\1/" < /proc/cmdline)" &&
159 echo "\$2 \$val"
160 }
162 mount -t proc /proc /proc
163 arg debug "shell" && debug=true && set -x
164 for i in /lib/*.ko* ; do insmod \$i 2> /dev/null ; done; sleep 2
165 arg mount "Mount device"
166 mount \$( (blkid /dev/[sh]d* || blkid) | grep \$val | sed 's/:.*//;q') /mnt
167 arg subroot "Change root to directory"
168 if [ -d /mnt/\$val ]; then
169 umount /mnt 2> /dev/null
170 (blkid /dev/[sh]d* || blkid) | while read dev line; do
171 case "\$line" in
172 *ntfs*|*vfat*|*msdos*) ;;
173 *) continue ;;
174 esac
175 mount \${dev%:} /mnt
176 [ -d /mnt/\$val ] && break
177 umount /mnt
178 done
179 fi
180 mount.posixovl -F /mnt/\$val -- -oallow_other -odefault_permissions -osuid
181 mount --bind /mnt /mnt/\$val/mnt/dos
182 mount -o size=0 -t tmpfs tmpfs /mnt/\$val/mnt/dos/\$val
183 LDSO=\$(ls /mnt/\$val/lib/ld-* | sed q)
184 export LD_LIBRARY_PATH=\$val/lib:\$val/usr/lib:/lib
185 [ "$debug" = "true" ] && sh
186 umount /proc
187 exec /bin/switch_root /mnt \${LDSO#/mnt/} \$val/usr/sbin/chroot \$val /sbin/init
188 EOT
189 chmod +x $fs/init
190 ( cd $fs ; find * | cpio -o -H newc ) | lzma e $1 -si 2> /dev/null
191 rm -rf $fs /tmp/wait
192 }
194 ls_r()
195 {
196 ls -r $@ 2> /dev/null || ls $@
197 }
199 doinstall()
200 {
201 mkdir -p $mnt/slitaz/boot $mnt/slitaz/mnt/dos
202 if ! mount.posixovl -F $mnt/slitaz -- \
203 -oallow_other -odefault_permissions -osuid; then
204 echo "Can't install SliTaz. Abort."
205 sleep 5
206 return 1
207 fi
208 dotwait "Install root filesystem in /slitaz.."
209 if [ "$1" ]; then
210 ls_r /media/cdrom/boot/rootfs*gz | \
211 xargs cat > $mnt/slitaz/boot/rootfs.gz
212 tazusbinitfs $mnt/slitaz/boot/rootfs.gz
213 initrd=rootfs.gz
214 extraargs="/home=$(getuuid)/slitaz rdinit=/init1"
215 else
216 for i in $(ls_r /media/cdrom/boot/rootfs*gz); do
217 uncpio $i $mnt/slitaz
218 done
219 for i in $packages_list; do
220 tazpkg get-install $i --root=$mnt/slitaz
221 done
222 for i in $packages_dir/*.tazpkg; do
223 [ -s "$i" ] &&
224 tazpkg install $i --root=$mnt/slitaz
225 done
226 cp -a /etc/locale.conf $mnt/slitaz/etc 2> /dev/null
227 cp -a /etc/keymap.conf $mnt/slitaz/etc 2> /dev/null
228 mkinitrd $mnt/slitaz/boot/initrd $mnt/slitaz
229 initrd=initrd
230 extraargs="mount=$(getuuid) subroot=slitaz"
231 fi
232 echo -en "\nInstall boot files..."
233 for i in /media/cdrom/boot/bzImage /media/cdrom/boot/*pxe* \
234 /media/cdrom/boot/isolinux/he* /media/cdrom/boot/isolinux/opt* \
235 /media/cdrom/README /media/cdrom/boot/memtest* ; do
236 [ -s $i ] && cp $i $mnt/slitaz/boot
237 done
238 for i in $mnt/slitaz/boot/memtest $mnt/slitaz/boot/*pxe* ; do
239 [ $(get 0 $i 2> /dev/null || echo 0) -eq 23117 ] &&
240 mv $i $i.exe
241 done
242 gettazboot $mnt/slitaz/boot/tazboot.exe
243 unix2dos > $mnt/slitaz/boot/tazboot.cmd <<EOT
244 kernel=/slitaz/boot/bzimage
245 initrd=/slitaz/boot/$initrd
246 rw root=/dev/null $extraargs autologin
247 EOT
248 unix2dos $mnt/slitaz/boot/he* $mnt/slitaz/boot/opt* \
249 $mnt/slitaz/boot/README
250 [ -d $mnt/slitaz/usr/sbin -a ! -x $mnt/slitaz/usr/sbin/mount.posixovl ] &&
251 cp $(which mount.posixovl) $mnt/slitaz/usr/sbin
252 rm -f /tmp/wait
253 umount $mnt/slitaz
254 return 0
255 }
257 windev()
258 {
259 DEV="$(blkid | grep -iE "(msdos|vfat|ntfs)" | sed 's/:.*//;s|/dev/||')"
260 [ "$DEV" ] || return
261 cat > /tmp/dialog$$ <<EOT
262 $DIALOG --clear \
263 --title " Select your Windows partition " \
264 --menu "\nPlease select the Windows partition according to its known size.
265 The datas will be kept untouched.\n" \
266 17 70 8 \
267 $(for i in $DEV ; do
268 label="$(blkid | sed "/$i:/!d;s/.*://;s/[^ ]*UUID=[^ ]* //g;s/LABEL=//")"
269 echo -n "/dev/$i \"$(($(cat /sys/block/*/$i/size)/2048))MB $label\" "
270 done)
271 EOT
272 exec 3>&1
273 [ $? -eq 0 ] || return
274 device=$(. /tmp/dialog$$ 2>&1 1>&3)
275 exec 3>&-
276 rm -f /tmp/dialog$$
277 mnt=/tmp/mnt$$
278 mkdir -p $mnt && mount $device $mnt
279 }
281 extra_packages()
282 {
283 packages_list=
284 packages_dir=
285 $DIALOG --clear \
286 --title " Extra packages " \
287 --defaultno --yesno \
288 "
289 Do you want to add extra packages ?
290 " 7 70
291 [ $? -eq 0 ] || return
292 [ -s /var/lib/tazpkg/packages.txt ] || tazpkg recharge
293 if [ -s /media/cdrom/boot/vmlinuz-$(uname -r) ]; then
294 cat > /tmp/dialog$$ <<EOT
295 $DIALOG --clear \
296 --title " Select the packages " \
297 --separate-output \
298 --cancel-label "Skip" \
299 --checklist "Please select the packages you want to install. Try with the first letter." \
300 23 78 20 \\
301 EOT
302 awk -F\| '{ printf "%s \"%s\" off ",$1,$3 }' \
303 /var/lib/tazpkg/packages.desc >> /tmp/dialog$$
304 sh /tmp/dialog$$ 2> /tmp/dialog.out$$
305 [ $? -eq 0 ] && packages_list="$(cat /tmp/dialog.out$$)"
306 fi
307 cat > /tmp/dialog$$ <<EOT
308 $DIALOG --clear \
309 --title "Please select the directory with every custom packages to install." \
310 --cancel-label "Skip" \
311 --dselect $PWD 13 78
312 EOT
313 sh /tmp/dialog$$ 2> /tmp/dialog.out$$
314 [ $? -eq 0 ] && packages_dir="$(cat /tmp/dialog.out$$)"
315 rm -f /tmp/dialog$$ /tmp/dialog.out$$
316 }
318 _install()
319 {
320 extra_packages
321 $DIALOG --clear \
322 --title " SliTaz UMSDOS way installation " \
323 --yes-label "Install" --yesno \
324 "\nSliTaz will be installed in the subdirectory \\slitaz of the current
325 DOS/Windows partition. You will see your files from /mnt/dos.\n\n
326 You can start SliTaz with \\slitaz\\boot\\tazboot.exe\n\n
327 To uninstall SliTaz, you have only to remove this directory.
328 The file \\boot.ini or \\config.sys may be modified too.\n\n
329 SliTaz may run slowly on 'UMSDOS way' installation due to the
330 posixovl filesystem. The 'TAZUSB way' installation runs faster.\n\n
331 To do a traditional installation with disk partitioning,
332 start SliTaz Live with 'SliTaz RAM boot' menu.\n
333 " 19 70
334 [ $? -eq 0 ] || return
335 doinstall
336 }
338 readtazbootconf()
339 {
340 kernel="$(sed '/^kernel=/!d;s/.*=//' $mnt/slitaz/boot/tazboot.cmd)"
341 initrd="$(sed '/^initrd=/!d;s/.*=//' $mnt/slitaz/boot/tazboot.cmd)"
342 cmdline="$(sed '/^kernel=/d;/^initrd=/d' $mnt/slitaz/boot/tazboot.cmd)"
343 }
345 bootinstalled()
346 {
347 [ "$(which kexec)" ] || return
348 [ -x $mnt/slitaz$1 ] || return
349 [ -s $mnt/slitaz/boot/tazboot.cmd ] || return
350 readtazbootconf
351 kexec -l $kernel --initrd $initrd --command-line "$cmdline" --atags
352 umount $mnt
353 rm -rf $mnt
354 umount -d /media/cdrom
355 kexec -e
356 }
358 mkzip()
359 {
360 device=
361 packages_list=
362 packages_dir=
363 mnt=/tmp/mnt$$
364 mkdir -p $mnt
365 $1 || return
366 wget -O $mnt/slitaz/boot/grldr http://mirror.slitaz.org/boot/grldr
367 readtazbootconf
368 cat > $mnt/slitaz/boot/menu.lst <<EOT
369 title SliTaz
370 kernel $kernel $cmdline
371 initrd $initrd
373 EOT
374 while read file title; do
375 file=$(ls $mnt/slitaz/boot/*$file* 2> /dev/null)
376 [ -s "$file" ] && cat >> $mnt/slitaz/boot/menu.lst <<EOT
377 title $title
378 kernel ${file#$mnt}
380 EOT
381 done <<EOT
382 memtest MemTest
383 pxe Web boot
384 EOT
385 unix2dos $mnt/slitaz/boot/menu.lst
386 unix2dos > $mnt/slitaz/boot/install.txt <<EOT
387 For NT/2000/XP users:
389 1- Move the files grldr and menu.lst into the root directory
391 C:\\> copy \\slitaz\\boot\\grldr \\
392 C:\\> copy \\slitaz\\boot\\menu.lst \\
394 2- Remove boot.ini attributes
396 C:\\> attrib -r -h -s boot.ini
398 3- Append the following line to boot.init
400 C:\\grldr="slitaz"
402 4- Restore boot.ini attributes
404 C:\\> attrib +r +h +s boot.ini
406 See http://diddy.boot-land.net/grub4dos/files/README_GRUB4DOS.txt
407 EOT
408 ( cd $mnt ; zip -r9 $(basename $ISO .iso).zip slitaz )
409 mv $mnt/*.zip .
410 umount $mnt
411 rm -rf $mnt
412 }
414 install()
415 {
416 windev || return
417 packages_list=
418 packages_dir=
419 _install && bootinstalled /sbin/init
420 umount $mnt
421 rm -rf $mnt
422 }
424 inst2zip()
425 {
426 mkzip _install
427 }
429 _installtaz()
430 {
431 $DIALOG --clear \
432 --title " SliTaz TAZUSB way installation " \
433 --yes-label "Install" --yesno \
434 "\nSliTaz will be installed in the subdirectory \\slitaz of the current
435 DOS/Windows partition. You will see your files from /mnt/dos.\n\n
436 You can start SliTaz with \\slitaz\\boot\\tazboot.exe\n\n
437 To uninstall SliTaz, you have only to remove this directory.
438 The file \\boot.ini or \\config.sys may be modified too.\n\n
439 The filesystem is loaded entirely into memory upon boot to
440 increase responsiveness. Only /home lands on hard disk.\n\n
441 To do a traditional installation with disk partitioning,
442 start SliTaz Live with 'SliTaz RAM boot' menu.\n
443 " 19 70
444 [ $? -eq 0 ] || return
445 doinstall tazusblike
446 }
448 installtaz()
449 {
450 windev || return
451 packages_list=
452 packages_dir=
453 _installtaz && bootinstalled /boot/bzimage
454 umount $mnt
455 rm -rf $mnt
456 }
458 insttaz2zip()
459 {
460 mkzip _installtaz
461 }
463 bootiso()
464 {
465 for i in $(ls_r /media/cdrom/boot/rootfs*gz); do
466 grep -q ' lm ' /proc/cpuinfo && [ -s ${i}64 ] && i=${i}64
467 cat $i
468 n=$((4 - ($(stat -c %s $i) % 4)))
469 [ $n -eq 4 ] || dd if=/dev/zero bs=1 count=$n
470 done > /tmp/initrd$$
471 kernel=/media/cdrom/boot/bzImage
472 grep -q ' lm ' /proc/cpuinfo && [ -s ${kernel}64 ] && kernel=${kernel}64
473 . /etc/locale.conf
474 kexec -l $kernel --initrd /tmp/initrd$$ --atags --command-line \
475 "root=/dev/null autologin lang=$LANG kmap=$(cat /etc/keymap.conf)"
476 umount -d /media/cdrom
477 kexec -e
478 }
480 tazboot()
481 {
482 $DIALOG --clear \
483 --title " SliTaz bootloader for DOS " \
484 --yes-label "Install" --yesno \
485 "\nThe file TAZBOOT.EXE will be created in the top directory. It supports
486 any linux kernel, multiple initramfs, a kernel command line and
487 an ISO image file loopback (retrieves files from an ISO file).\n\n
488 Usage: tazboot.exe [[@commands]|[kernel=<bzimage>]
489 [initrd=<rootfs>[,<rootfs2>...]] [bootfrom=<isofile>] cmdline args ...]\n\n
490 Defaults: tazboot @tazboot.cmd or tazboot kernel=bzImage auto\n\n\
491 Examples for tazboot.cmd:\n\n\
492 bootfrom=\\isos\\slitaz-4.0.iso\n\
493 kernel=boot/bzImage\n\
494 initrd=boot/rootfs4.gz,boot/rootfs3.gz,boot/rootfs2.gz,boot/rootfs1.gz\n\
495 rw root=/dev/null autologin\n\n\
496 kernel=\\slitaz\\vmlinuz root=/dev/sda5 ro\n\n
497 Unlike GRUB4DOS, it doesn't require unfragmented ISO image files.\n
498 " 24 78
499 [ $? -eq 0 ] || return
500 gettazboot tazboot.exe
501 }
503 md5()
504 {
505 dotwait "Checking files"
506 ( cd /media/cdrom ; ${1:-md5sum -c md5sum*} ) > /tmp/data
507 rm -f /tmp/wait
508 $DIALOG --clear \
509 --title " Checked files " \
510 --textbox /tmp/data 24 78
511 rm -f /tmp/data
512 }
514 gotcdfile()
515 {
516 for i in "/media/cdrom/$1" "/media/cdrom/*/$1" \
517 "/media/cdrom/*/isolinux/$1" ; do
518 file=$(ls $i 2> /dev/null | sed q)
519 [ -s "$file" ] && break
520 done
521 }
523 sha()
524 {
525 gotcdfile 'sha*sum*'
526 sha=$(basename $file)
527 md5 "${sha%sum*}sum -c ${file#/media/cdrom/}"
528 }
530 readme()
531 {
532 gotcdfile 'README*'
533 $DIALOG --clear \
534 --title " Readme " \
535 --textbox $file 24 78
536 }
538 bzimage()
539 {
540 $DIALOG --clear \
541 --title " Create linux.exe ? " \
542 --yes-label "Install" --yesno \
543 "\nLinux.exe launches the linux kernel under DOS (in real mode only).
544 The cmdline arguments are supported except initrd=,
545 vga= (you can try 'rdev -v') and mem= (partially).
546 \nExample:\nC:\\> linux.exe root=/dev/hda2 ro panic=60\n
547 " 12 70
548 [ $? -eq 0 ] || return
549 cp /media/cdrom/boot/bzImage linux.exe
550 }
552 memtest()
553 {
554 $DIALOG --clear \
555 --title " Create memtest.exe ? " \
556 --yes-label "Install" --yesno \
557 "\nMemtest86 is a thorough, stand alone memory test for x86 architecture
558 computers. BIOS based memory tests are a quick, cursory check and often
559 miss many of the failures that are detected by Memtest86.\n
560 " 12 70
561 [ $? -eq 0 ] && gotcdfile 'memtest*' && cp $file memtest.exe
562 }
564 mkfat12()
565 {
566 [ $(($(get 0 $1) - 0x5A4D)) -eq 0 ] || return
567 J=$(($(get 3 $1 1) + 0x02))
568 R=$((1 + $(get 497 $1 1) + 1 + ($(get 500 $1)-1)/32))
569 [ $R -lt 2500 ] || return
570 [ $((($(get 500 $1)-1) & 31)) -lt 30 ] &&
571 ddq if=$file bs=32 count=1 seek=$(($R*16 - 1)) of=/dev/fd0
572 G="18 0 2 0 0 0 0 0"
573 [ $J -gt 25 ] || G=""
574 F=0
575 for i in 1 2 3; do
576 F=$((((2880-$R-$F-$F)*3+1023)/1024))
577 done
578 bytes2bin 0xEB $J 0x90 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 \
579 0 2 2 $(($R%256)) $(($R/256)) 2 64 0 64 11 0xF0 $F 0 \
580 $G | ddq bs=1 of=/dev/fd0
581 ddq if=/dev/zero bs=512 count=$((4+$F+$F)) seek=$R of=/dev/fd0
582 for i in $R $(($R+$F)) ; do
583 bytes2bin 0xF0 0xFF 0xFF | ddq bs=512 seek=$i of=/dev/fd0
584 done
585 echo -n $(basename $1) | ddq bs=1 seek=3 count=8 of=/dev/fd0
586 }
588 mkfloppy()
589 {
590 dotwait "Create a $(basename $1) boot floppy"
591 ddq if=$1 of=/dev/fd0
592 mkfat12 $1
593 rm -f /tmp/wait
594 }
596 fdmemtest()
597 {
598 $DIALOG --clear \
599 --title " Create a Memtest86 boot floppy " \
600 --yes-label "Create floppy" --yesno \
601 "\nMemtest86 is a thorough, stand alone memory test for x86 architecture
602 computers. BIOS based memory tests are a quick, cursory check and often
603 miss many of the failures that are detected by Memtest86.\n\n
604 Please insert a blank disk in floppy drive.\n
605 " 12 70
606 [ $? -eq 0 ] && gotcdfile 'memtest*' && mkfloppy $file
607 }
609 pxe()
610 {
611 gotcdfile '?pxe'
612 $DIALOG --clear \
613 --title " Create $(basename $file).exe ? " \
614 --yes-label "Install" --yesno \
615 "\nBoot your operating system from the internet and enjoy a full system
616 working entirely in RAM with speed and stability in mind. The Linux Kernel
617 and the complete SliTaz compressed root filesystem will be loaded into RAM
618 from the Web using PXE and HTTP protocols.\n
619 " 12 70
620 [ $? -eq 0 ] || return
621 cp $file $(basename $file).exe
622 }
624 fdpxe()
625 {
626 $DIALOG --clear \
627 --title " Create a SliTaz Web boot floppy " \
628 --yes-label "Create floppy" --yesno \
629 "\nBoot your operating system from the internet and enjoy a full system
630 working entirely in RAM with speed and stability in mind. The Linux Kernel
631 and the complete SliTaz compressed root filesystem will be loaded into RAM
632 from the Web using PXE and HTTP protocols.\n\n
633 Please insert a blank disk in floppy drive.\n
634 " 12 70
635 [ $? -eq 0 ] && gotcdfile '?pxe' && mkfloppy $file
636 }
638 gotposixovl()
639 {
640 mount.posixovl 2>&1 | grep -qi usage &&
641 echo -en "\"$1\" \"$2\""
642 }
644 gotposixovlzip()
645 {
646 [ "$(which zip)" ] && gotposixovl "$1" "$2"
647 }
649 xfile()
650 {
651 [ "$(which $1)" ] && echo -en "\"$2\" \"$3\""
652 }
654 cdfile()
655 {
656 gotcdfile "$1" && echo -en "\"$2\" \"$3\""
657 }
659 cdfilex()
660 {
661 [ "$(which kexec)" ] && cdfile "$@"
662 }
664 cdfilef()
665 {
666 [ -e /sys/block/fd0 ] && cdfile "$@"
667 }
669 cdexe()
670 {
671 gotcdfile "$1" &&
672 [ $(get 0 $file 2>/dev/null || echo 0) -eq 23117 ] &&
673 echo -en "\"$2\" \"$3\""
674 }
676 misspkg()
677 {
678 for i in zip kexec-tools posixovl ; do
679 [ -d /var/lib/tazpkg/installed/$i/ ] && continue
680 [ "$1" != "install" ] &&
681 echo -en "\"$1\" \"$2\"" && return
682 tazpkg get-install $i
683 done
684 }
686 missing()
687 {
688 misspkg install
689 }
691 ishybrid()
692 {
693 C=$((2048*$(get $(((17*2048) + 71)) $ISO 4)))
694 [ $(get $C $ISO 4) -eq 1 ] || return
695 [ $(get $(($C+30)) $ISO 4) -eq $((0x88AA55)) ] || return
696 C=$((2048*$(get $(($C+40)) $ISO 4)))
697 [ $(get $(($C+64)) $ISO 4) -eq 1886961915 ] &&
698 echo -en "\"$1\" \"$2\""
699 }
701 isiso()
702 {
703 [ $(get 32769 $ISO 4) -eq 808469571 ] &&
704 echo -en "\"$1\" \"$2\""
705 }
707 gotisomd5()
708 {
709 [ "$(which md5sum 2> /dev/null)" ] &&
710 [ $(get 0 $ISO) -eq 23117 ] &&
711 [ $(get 18 $ISO) -ne 0 ] && echo -en "\"$1\" \"$2\""
712 }
714 isomd5()
715 {
716 dotwait "Checking iso image"
717 [ "$(ddq if=$ISO bs=2k skip=16 \
718 count=$(echo $(get 32848 $ISO 4)) | md5sum)" == \
719 "$(ddq if=$ISO bs=16 count=1 skip=2047 | od -N 16 -t x1 -An | \
720 sed 's/ //g') -" ] && echo "OK" || echo "ERROR"
721 echo -en "\rChecking iso hybrid boot..."
722 n=$(($(get 2 $ISO)-1+($(get 4 $ISO)-1)*512))
723 if [ $n -lt 40000 -a $n -gt 32768 ]; then
724 s=$(get 0 $ISO 2 $n | awk '{ i+= $0 } END { print i }')
725 [ $(((1+$s+$(get $(($n+1)) $ISO 1)) % 65536)) -eq 0 ] &&
726 echo "OK" || echo "ERROR"
727 fi
728 rm -f /tmp/wait
729 echo -e "\rPress RETURN to continue."
730 read n
731 }
733 usbdev()
734 {
735 dotwait "Wait 5 seconds for USB devices"
736 sleep 5
737 rm -f /tmp/wait
738 DEV="$(grep -l 1 /sys/block/*/removable | \
739 sed 's|/sys/block/\(.*\)/removable|\1|')"
740 grep -qs 1 /sys/block/$DEV/ro && return
741 [ "$DEV" ] || return
742 cat > /tmp/dialog$$ <<EOT
743 $DIALOG --clear \
744 --title " Select your USB key " \
745 --menu "\nPlease select the USB key according to its known size.\n\n" \
746 14 70 4 \
747 $(for i in $DEV ; do
748 echo -n "/dev/$i \"$(($(cat /sys/block/$i/size)/2048))MB $(cat /sys/block/$i/device/model 2> /dev/null)\" "
749 done) \
751 EOT
752 exec 3>&1
753 device=$(. /tmp/dialog$$ 2>&1 1>&3)
754 rm -f /tmp/dialog$$
755 retval=$?
756 exec 3>&-
757 rm -f /tmp/dialog$$
758 [ $retval -eq 0 ]
759 }
761 tazusbmsg()
762 {
763 [ "$(which tazusb 2> /dev/null)" ] || return
764 echo "You should choose 'USB key read/write installation' to be
765 able to save the package updates or your own configuration and data files.\n\n"
766 }
768 usbbootkey()
769 {
770 $DIALOG --clear \
771 --title " Create a USB boot key " \
772 --yes-label "Continue" --yesno \
773 "\nThe USB key will be used like a CD-ROM. You will not be able to write
774 any data on the boot partition.\n\n
775 An extra FAT32 partition will be created with the remaining free space.\n\n
776 $(tazusbmsg)Please plug your USB stick in now.\n
777 " 16 70
778 [ $? -eq 0 ] || return
779 usbdev || return
781 # perform dd in progess bar
782 max=$(($(stat -c %s $ISO)/2048))
783 i=0; ddq if=$ISO bs=1024k | (
784 while ddq bs=1024k count=1 ; do
785 i=$(($i + 1))
786 [ $i -gt $max ] && break
787 echo $((($i*100)/$max)) | dialog --gauge \
788 " The ISO image transfer can be long. Please wait..." \
789 6 70 0 > /dev/tty 2>&1
790 done ) > $device
792 # partition + fat32 format for the remining space
793 get 446 $device 2 12 | xargs echo | { read dx cx ol oh ll lh
794 if [ $dx -eq $((0x3F17)) ]; then
795 cx=$(($cx & 0xFF00))
796 ofs=$(($ll+($lh<<16)))
797 n=$(($(cat /sys/block/${device#/dev/}/size)-$ofs))
798 m=$(($cx+($n/8)))
799 [ $m -gt $((0x3FF00)) ] && m=$((0x3FF00))
800 m=$((($m & 0xFF00)+(($m>>16)<<6)))
801 words2bin 0 $((0x101+$cx)) 0x3F0B $((32+$m)) \
802 $ll $lh $(($n & 0xFFFF)) $(($n >> 16)) | \
803 ddq bs=1 seek=446 of=$device
804 if [ "$(which mkdosfs 2> /dev/null)" ]; then
805 losetup -o $((512*$ofs)) /dev/loop2 $device
806 mkdosfs -n "SLITAZ BOOT" /dev/loop2
807 words2bin $(($ofs & 0xFFFF)) $(($ofs >> 16)) | \
808 ddq bs=1 seek=28 of=/dev/loop2
809 losetup -d /dev/loop2
810 fi
811 fi ; }
812 }
814 usbkey()
815 {
816 $DIALOG --clear \
817 --title " Create a SliTaz USB key " \
818 --yes-label "Continue" --yesno \
819 "\nUnlike a hard drive install, the filesystem is kept in a compressed
820 rootfs.gz. The filesystem is loaded entirely into memory upon boot.
821 This should increase responsiveness, protect the filesystem against
822 accidental corruption and reduce read/writes to the USB drive.
823 Once setup, the tazusb utility can rewrite the root filesystem
824 with any changes you have made since booting up,
825 giving the effective benefits of a hard drive install.\n\n
826 /home is mounted on boot using the UUID of your particular flash drive.
827 Unlike a device name, the UUID has the benefit of never changing from machine
828 to machine.\n\n
829 Please plug your USB stick in now.\n
830 " 19 70
831 [ $? -eq 0 ] || return
832 usbdev || return
833 exec 3>&1
834 format=`$DIALOG --clear \
835 --title " Select the filesystem " \
836 --radiolist "\nPlease select the filesystem type to create.\n\n\
837 The filesystem creation will erase all the data \
838 in the USB key." 14 70 4 \
839 "none" "Do not erase the USB key" on \
840 "ext3" "Ext3 journaling filesystem" off \
841 "ext2" "Ext2 filesystem" off \
842 "fat32" "Windows FAT32 filesystem" off \
843 2>&1 1>&3`
844 retval=$?
845 exec 3>&-
846 [ $retval -eq 0 ] || return
847 [ "$format" != "none" ] && tazusb format $device "SliTaz" $format
848 tazusb gen-iso2usb $ISO $device
849 }
851 dokexec()
852 {
853 kexec -l $file
854 umount -d /media/cdrom
855 kexec -e
856 }
858 runmemtest()
859 {
860 gotcdfile 'memtest*' && dokexec
861 }
863 runpxe()
864 {
865 gotcdfile '?pxe' && dokexec
866 }
868 quit()
869 {
870 umount -d /media/cdrom
871 exit
872 }
874 ISO="$1"
875 [ -z "$(isiso 2> /dev/null)" ] && echo "Usage : $0 file.iso" && exit 1
876 mount -o loop,ro $ISO /media/cdrom
878 while true; do
879 cat > /tmp/dialog$$ <<EOT
880 $DIALOG --clear \
881 --title " SliTaz ISO tool " \
882 --menu "" 23 70 17 \
883 $(cdfile 'README*' "readme" "Show the README file") \
884 $(gotisomd5 "isomd5" "Check the ISO image") \
885 $(cdfile 'md5sum*' "md5" "Check the ISO files") \
886 $(cdfile 'sha*sum*' "sha" "Check the ISO files") \
887 $(cdfilex boot/bzImage "bootiso" "Boot the ISO image") \
888 $(gotposixovl "install" "Hard disk installation (UMSDOS way)") \
889 $(gotposixovl "installtaz" "Hard disk installation (TAZUSB way)") \
890 $(gotposixovlzip "inst2zip" "ZIP installation archive (UMSDOS way)") \
891 $(gotposixovlzip "insttaz2zip" "ZIP installation archive (TAZUSB way)") \
892 $(xfile tazusb "usbkey" "USB key read/write installation") \
893 $(ishybrid "usbbootkey" "USB boot key (read only)") \
894 "tazboot" "Get tazboot.exe Linux loader" \
895 $(cdexe boot/bzImage "bzimage" "Get linux DOS/EXE file") \
896 $(cdexe 'memtest*' "memtest" "Get Memtest86 DOS/EXE file") \
897 $(cdfilef 'memtest*' "fdmemtest" "Create a Memtest86 boot floppy") \
898 $(cdfilex 'memtest*' "runmemtest" "Start Memtest86") \
899 $(cdexe '?pxe' "pxe" "Get SliTaz Web boot DOS/EXE utility") \
900 $(cdfilef '?pxe' "fdpxe" "Create a SliTaz Web boot floppy") \
901 $(cdfilex '?pxe' "runpxe" "Start the SliTaz Web boot utility") \
902 $(misspkg "missing" "Install packages to get more options") \
903 "quit" "Quit this utility"
904 EOT
905 exec 3>&1
906 value=$(. /tmp/dialog$$ 2>&1 1>&3)
907 retval=$?
908 exec 3>&-
909 rm -f /tmp/dialog$$
910 [ $retval -eq 0 ] || continue
911 $value
912 done