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

syslinux-tools: add taziso
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat Feb 14 18:17:26 2015 +0100 (2015-02-14)
parents
children 77c3484cda94
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/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/menu.lst <<EOT
377 title $title
378 kernel $file
380 EOT
381 done <<EOT
382 memtest MemTest
383 pxe Web boot
384 EOT
385 cat > $mnt/slitaz/install.txt <<EOT
386 For NT/2000/XP users:
388 1- Move the files grldr and menu.lst into the root directory
390 C:\\> copy \\slitaz\\boot\\grldr \\
391 C:\\> copy \\slitaz\\boot\\menu.lst \\
393 2- Remove boot.ini attributes
395 C:\\> attrib -r -h -s boot.ini
397 3- Append the following line to boot.init
399 C:\\grldr="slitaz"
401 4- Restore boot.ini attributes
403 C:\\> attrib +r +h +s boot.ini
405 See http://diddy.boot-land.net/grub4dos/files/README_GRUB4DOS.txt
406 EOT
407 ( cd $mnt ; zip -r9 $(basename $ISO .iso) slitaz )
408 mv $mnt/*.zip .
409 }
411 install()
412 {
413 windev || return
414 packages_list=
415 packages_dir=
416 _install && bootinstalled /sbin/init
417 umount $mnt
418 rm -rf $mnt
419 }
421 inst2zip()
422 {
423 mkzip _install
424 }
426 _installtaz()
427 {
428 $DIALOG --clear \
429 --title " SliTaz TAZUSB way installation " \
430 --yes-label "Install" --yesno \
431 "\nSliTaz will be installed in the subdirectory \\slitaz of the current
432 DOS/Windows partition. You will see your files from /mnt/dos.\n\n
433 You can start SliTaz with \\slitaz\\boot\\tazboot.exe\n\n
434 To uninstall SliTaz, you have only to remove this directory.
435 The file \\boot.ini or \\config.sys may be modified too.\n\n
436 The filesystem is loaded entirely into memory upon boot to
437 increase responsiveness. Only /home lands on hard disk.\n\n
438 To do a traditional installation with disk partitioning,
439 start SliTaz Live with 'SliTaz RAM boot' menu.\n
440 " 19 70
441 [ $? -eq 0 ] || return
442 doinstall tazusblike
443 }
445 installtaz()
446 {
447 windev || return
448 packages_list=
449 packages_dir=
450 _installtaz && bootinstalled /boot/bzimage
451 umount $mnt
452 rm -rf $mnt
453 }
455 insttaz2zip()
456 {
457 mkzip _installtaz
458 }
460 bootiso()
461 {
462 for i in $(ls_r /media/cdrom/boot/rootfs*gz); do
463 grep -q ' lm ' /proc/cpuinfo && [ -s ${i}64 ] && i=${i}64
464 cat $i
465 n=$((4 - ($(stat -c %s $i) % 4)))
466 [ $n -eq 4 ] || dd if=/dev/zero bs=1 count=$n
467 done > /tmp/initrd$$
468 kernel=/media/cdrom/boot/bzImage
469 grep -q ' lm ' /proc/cpuinfo && [ -s ${kernel}64 ] && kernel=${kernel}64
470 . /etc/locale.conf
471 kexec -l $kernel --initrd /tmp/initrd$$ --atags --command-line \
472 "root=/dev/null autologin lang=$LANG kmap=$(cat /etc/keymap.conf)"
473 umount -d /media/cdrom
474 kexec -e
475 }
477 tazboot()
478 {
479 $DIALOG --clear \
480 --title " SliTaz bootloader for DOS " \
481 --yes-label "Install" --yesno \
482 "\nThe file TAZBOOT.EXE will be created in the top directory. It supports
483 any linux kernel, multiple initramfs, a kernel command line and
484 an ISO image file loopback (retrieves files from an ISO file).\n\n
485 Usage: tazboot.exe [[@commands]|[kernel=<bzimage>]
486 [initrd=<rootfs>[,<rootfs2>...]] [bootfrom=<isofile>] cmdline args ...]\n\n
487 Defaults: tazboot @tazboot.cmd or tazboot kernel=bzImage auto\n\n\
488 Examples for tazboot.cmd:\n\n\
489 bootfrom=\\isos\\slitaz-4.0.iso\n\
490 kernel=boot/bzImage\n\
491 initrd=boot/rootfs4.gz,boot/rootfs3.gz,boot/rootfs2.gz,boot/rootfs1.gz\n\
492 rw root=/dev/null autologin\n\n\
493 kernel=\\slitaz\\vmlinuz root=/dev/sda5 ro\n\n
494 Unlike GRUB4DOS, it doesn't require unfragmented ISO image files.\n
495 " 24 78
496 [ $? -eq 0 ] || return
497 gettazboot tazboot.exe
498 }
500 md5()
501 {
502 dotwait "Checking files"
503 ( cd /media/cdrom ; ${1:-md5sum -c md5sum*} ) > /tmp/data
504 rm -f /tmp/wait
505 $DIALOG --clear \
506 --title " Checked files " \
507 --textbox /tmp/data 24 78
508 rm -f /tmp/data
509 }
511 gotcdfile()
512 {
513 for i in "/media/cdrom/$1" "/media/cdrom/*/$1" \
514 "/media/cdrom/*/isolinux/$1" ; do
515 file=$(ls $i 2> /dev/null | sed q)
516 [ -s "$file" ] && break
517 done
518 }
520 sha()
521 {
522 gotcdfile 'sha*sum*'
523 sha=$(basename $file)
524 md5 "${sha%sum*}sum -c ${file#/media/cdrom/}"
525 }
527 readme()
528 {
529 gotcdfile 'README*'
530 $DIALOG --clear \
531 --title " Readme " \
532 --textbox $file 24 78
533 }
535 bzimage()
536 {
537 $DIALOG --clear \
538 --title " Create linux.exe ? " \
539 --yes-label "Install" --yesno \
540 "\nLinux.exe launches the linux kernel under DOS (in real mode only).
541 The cmdline arguments are supported except initrd=,
542 vga= (you can try 'rdev -v') and mem= (partially).
543 \nExample:\nC:\\> linux.exe root=/dev/hda2 ro panic=60\n
544 " 12 70
545 [ $? -eq 0 ] || return
546 cp /media/cdrom/boot/bzImage linux.exe
547 }
549 memtest()
550 {
551 $DIALOG --clear \
552 --title " Create memtest.exe ? " \
553 --yes-label "Install" --yesno \
554 "\nMemtest86 is a thorough, stand alone memory test for x86 architecture
555 computers. BIOS based memory tests are a quick, cursory check and often
556 miss many of the failures that are detected by Memtest86.\n
557 " 12 70
558 [ $? -eq 0 ] && gotcdfile 'memtest*' && cp $file memtest.exe
559 }
561 mkfat12()
562 {
563 [ $(($(get 0 $1) - 0x5A4D)) -eq 0 ] || return
564 J=$(($(get 3 $1 1) + 0x02))
565 R=$((1 + $(get 497 $1 1) + 1 + ($(get 500 $1)-1)/32))
566 [ $R -lt 2500 ] || return
567 [ $((($(get 500 $1)-1) & 31)) -lt 30 ] &&
568 ddq if=$file bs=32 count=1 seek=$(($R*16 - 1)) of=/dev/fd0
569 G="18 0 2 0 0 0 0 0"
570 [ $J -gt 25 ] || G=""
571 F=0
572 for i in 1 2 3; do
573 F=$((((2880-$R-$F-$F)*3+1023)/1024))
574 done
575 bytes2bin 0xEB $J 0x90 0x20 0x20 0x20 0x20 0x20 0x20 0x20 0x20 \
576 0 2 2 $(($R%256)) $(($R/256)) 2 64 0 64 11 0xF0 $F 0 \
577 $G | ddq bs=1 of=/dev/fd0
578 ddq if=/dev/zero bs=512 count=$((4+$F+$F)) seek=$R of=/dev/fd0
579 for i in $R $(($R+$F)) ; do
580 bytes2bin 0xF0 0xFF 0xFF | ddq bs=512 seek=$i of=/dev/fd0
581 done
582 echo -n $(basename $1) | ddq bs=1 seek=3 count=8 of=/dev/fd0
583 }
585 mkfloppy()
586 {
587 dotwait "Create a $(basename $1) boot floppy"
588 ddq if=$1 of=/dev/fd0
589 mkfat12 $1
590 rm -f /tmp/wait
591 }
593 fdmemtest()
594 {
595 $DIALOG --clear \
596 --title " Create a Memtest86 boot floppy " \
597 --yes-label "Create floppy" --yesno \
598 "\nMemtest86 is a thorough, stand alone memory test for x86 architecture
599 computers. BIOS based memory tests are a quick, cursory check and often
600 miss many of the failures that are detected by Memtest86.\n\n
601 Please insert a blank disk in floppy drive.\n
602 " 12 70
603 [ $? -eq 0 ] && gotcdfile 'memtest*' && mkfloppy $file
604 }
606 pxe()
607 {
608 gotcdfile '?pxe'
609 $DIALOG --clear \
610 --title " Create $(basename $file).exe ? " \
611 --yes-label "Install" --yesno \
612 "\nBoot your operating system from the internet and enjoy a full system
613 working entirely in RAM with speed and stability in mind. The Linux Kernel
614 and the complete SliTaz compressed root filesystem will be loaded into RAM
615 from the Web using PXE and HTTP protocols.\n
616 " 12 70
617 [ $? -eq 0 ] || return
618 cp $file $(basename $file).exe
619 }
621 fdpxe()
622 {
623 $DIALOG --clear \
624 --title " Create a SliTaz Web boot floppy " \
625 --yes-label "Create floppy" --yesno \
626 "\nBoot your operating system from the internet and enjoy a full system
627 working entirely in RAM with speed and stability in mind. The Linux Kernel
628 and the complete SliTaz compressed root filesystem will be loaded into RAM
629 from the Web using PXE and HTTP protocols.\n\n
630 Please insert a blank disk in floppy drive.\n
631 " 12 70
632 [ $? -eq 0 ] && gotcdfile '?pxe' && mkfloppy $file
633 }
635 gotposixovl()
636 {
637 mount.posixovl 2>&1 | grep -qi usage &&
638 echo -en "\"$1\" \"$2\""
639 }
641 gotposixovlzip()
642 {
643 [ "$(which zip)" ] && gotposixovl "$1" "$2"
644 }
646 xfile()
647 {
648 [ "$(which $1)" ] && echo -en "\"$2\" \"$3\""
649 }
651 cdfile()
652 {
653 gotcdfile "$1" && echo -en "\"$2\" \"$3\""
654 }
656 cdfilex()
657 {
658 [ "$(which kexec)" ] && cdfile "$@"
659 }
661 cdfilef()
662 {
663 [ -e /sys/block/fd0 ] && cdfile "$@"
664 }
666 cdexe()
667 {
668 gotcdfile "$1" &&
669 [ $(get 0 $file 2>/dev/null || echo 0) -eq 23117 ] &&
670 echo -en "\"$2\" \"$3\""
671 }
673 misspkg()
674 {
675 for i in zip kexec-tools posixovl ; do
676 [ -d /var/lib/tazpkg/installed/$i/ ] && continue
677 [ "$1" != "install" ] &&
678 echo -en "\"$1\" \"$2\"" && return
679 tazpkg get-install $i
680 done
681 }
683 missing()
684 {
685 misspkg install
686 }
688 ishybrid()
689 {
690 C=$((2048*$(get $(((17*2048) + 71)) $ISO 4)))
691 [ $(get $C $ISO 4) -eq 1 ] || return
692 [ $(get $(($C+30)) $ISO 4) -eq $((0x88AA55)) ] || return
693 C=$((2048*$(get $(($C+40)) $ISO 4)))
694 [ $(get $(($C+64)) $ISO 4) -eq 1886961915 ] &&
695 echo -en "\"$1\" \"$2\""
696 }
698 isiso()
699 {
700 [ $(get 32769 $ISO 4) -eq 808469571 ] &&
701 echo -en "\"$1\" \"$2\""
702 }
704 gotisomd5()
705 {
706 [ "$(which md5sum 2> /dev/null)" ] &&
707 [ $(get 0 $ISO) -eq 23117 ] &&
708 [ $(get 18 $ISO) -ne 0 ] && echo -en "\"$1\" \"$2\""
709 }
711 isomd5()
712 {
713 dotwait "Checking iso image"
714 [ "$(ddq if=$ISO bs=2k skip=16 \
715 count=$(echo $(get 32848 $ISO 4)) | md5sum)" == \
716 "$(ddq if=$ISO bs=16 count=1 skip=2047 | od -N 16 -t x1 -An | \
717 sed 's/ //g') -" ] && echo "OK" || echo "ERROR"
718 echo -en "\rChecking iso hybrid boot..."
719 n=$(($(get 2 $ISO)-1+($(get 4 $ISO)-1)*512))
720 if [ $n -lt 40000 -a $n -gt 32768 ]; then
721 s=$(get 0 $ISO 2 $n | awk '{ i+= $0 } END { print i }')
722 [ $(((1+$s+$(get $(($n+1)) $ISO 1)) % 65536)) -eq 0 ] &&
723 echo "OK" || echo "ERROR"
724 fi
725 rm -f /tmp/wait
726 echo -e "\rPress RETURN to continue."
727 read n
728 }
730 usbdev()
731 {
732 dotwait "Wait 5 seconds for USB devices"
733 sleep 5
734 rm -f /tmp/wait
735 DEV="$(grep -l 1 /sys/block/*/removable | \
736 sed 's|/sys/block/\(.*\)/removable|\1|')"
737 grep -qs 1 /sys/block/$DEV/ro && return
738 [ "$DEV" ] || return
739 cat > /tmp/dialog$$ <<EOT
740 $DIALOG --clear \
741 --title " Select your USB key " \
742 --menu "\nPlease select the USB key according to its known size.\n\n" \
743 14 70 4 \
744 $(for i in $DEV ; do
745 echo -n "/dev/$i \"$(($(cat /sys/block/$i/size)/2048))MB $(cat /sys/block/$i/device/model 2> /dev/null)\" "
746 done) \
748 EOT
749 exec 3>&1
750 device=$(. /tmp/dialog$$ 2>&1 1>&3)
751 rm -f /tmp/dialog$$
752 retval=$?
753 exec 3>&-
754 rm -f /tmp/dialog$$
755 [ $retval -eq 0 ]
756 }
758 tazusbmsg()
759 {
760 [ "$(which tazusb 2> /dev/null)" ] || return
761 echo "You should choose 'USB key read/write installation' to be
762 able to save the package updates or your own configuration and data files.\n\n"
763 }
765 usbbootkey()
766 {
767 $DIALOG --clear \
768 --title " Create a USB boot key " \
769 --yes-label "Continue" --yesno \
770 "\nThe USB key will be used like a CD-ROM. You will not be able to write
771 any data on the boot partition.\n\n
772 An extra FAT32 partition will be created with the remaining free space.\n\n
773 $(tazusbmsg)Please plug your USB stick in now.\n
774 " 16 70
775 [ $? -eq 0 ] || return
776 usbdev || return
778 # perform dd in progess bar
779 max=$(($(stat -c %s $ISO)/2048))
780 i=0; ddq if=$ISO bs=1024k | (
781 while ddq bs=1024k count=1 ; do
782 i=$(($i + 1))
783 [ $i -gt $max ] && break
784 echo $((($i*100)/$max)) | dialog --gauge \
785 " The ISO image transfer can be long. Please wait..." \
786 6 70 0 > /dev/tty 2>&1
787 done ) > $device
789 # partition + fat32 format for the remining space
790 get 446 $device 2 12 | xargs echo | { read dx cx ol oh ll lh
791 if [ $dx -eq $((0x3F17)) ]; then
792 cx=$(($cx & 0xFF00))
793 ofs=$(($ll+($lh<<16)))
794 n=$(($(cat /sys/block/${device#/dev/}/size)-$ofs))
795 m=$(($cx+($n/8)))
796 [ $m -gt $((0x3FF00)) ] && m=$((0x3FF00))
797 m=$((($m & 0xFF00)+(($m>>16)<<6)))
798 words2bin 0 $((0x101+$cx)) 0x3F0B $((32+$m)) \
799 $ll $lh $(($n & 0xFFFF)) $(($n >> 16)) | \
800 ddq bs=1 seek=446 of=$device
801 if [ "$(which mkdosfs 2> /dev/null)" ]; then
802 losetup -o $((512*$ofs)) /dev/loop2 $device
803 mkdosfs -n "SLITAZ BOOT" /dev/loop2
804 words2bin $(($ofs & 0xFFFF)) $(($ofs >> 16)) | \
805 ddq bs=1 seek=28 of=/dev/loop2
806 losetup -d /dev/loop2
807 fi
808 fi ; }
809 }
811 usbkey()
812 {
813 $DIALOG --clear \
814 --title " Create a SliTaz USB key " \
815 --yes-label "Continue" --yesno \
816 "\nUnlike a hard drive install, the filesystem is kept in a compressed
817 rootfs.gz. The filesystem is loaded entirely into memory upon boot.
818 This should increase responsiveness, protect the filesystem against
819 accidental corruption and reduce read/writes to the USB drive.
820 Once setup, the tazusb utility can rewrite the root filesystem
821 with any changes you have made since booting up,
822 giving the effective benefits of a hard drive install.\n\n
823 /home is mounted on boot using the UUID of your particular flash drive.
824 Unlike a device name, the UUID has the benefit of never changing from machine
825 to machine.\n\n
826 Please plug your USB stick in now.\n
827 " 19 70
828 [ $? -eq 0 ] || return
829 usbdev || return
830 exec 3>&1
831 format=`$DIALOG --clear \
832 --title " Select the filesystem " \
833 --radiolist "\nPlease select the filesystem type to create.\n\n\
834 The filesystem creation will erase all the data \
835 in the USB key." 14 70 4 \
836 "none" "Do not erase the USB key" on \
837 "ext3" "Ext3 journaling filesystem" off \
838 "ext2" "Ext2 filesystem" off \
839 "fat32" "Windows FAT32 filesystem" off \
840 2>&1 1>&3`
841 retval=$?
842 exec 3>&-
843 [ $retval -eq 0 ] || return
844 [ "$format" != "none" ] && tazusb format $device "SliTaz" $format
845 tazusb gen-iso2usb $ISO $device
846 }
848 dokexec()
849 {
850 kexec -l $file
851 umount -d /media/cdrom
852 kexec -e
853 }
855 runmemtest()
856 {
857 gotcdfile 'memtest*' && dokexec
858 }
860 runpxe()
861 {
862 gotcdfile '?pxe' && dokexec
863 }
865 quit()
866 {
867 umount -d /media/cdrom
868 exit
869 }
871 ISO="$1"
872 [ -z "$(isiso 2> /dev/null)" ] && echo "Usage : $0 file.iso" && exit 1
873 mount -o loop,ro $ISO /media/cdrom
875 while true; do
876 cat > /tmp/dialog$$ <<EOT
877 $DIALOG --clear \
878 --title " SliTaz ISO tool " \
879 --menu "" 23 70 17 \
880 $(cdfile 'README*' "readme" "Show the README file") \
881 $(gotisomd5 "isomd5" "Check the ISO image") \
882 $(cdfile 'md5sum*' "md5" "Check the ISO files") \
883 $(cdfile 'sha*sum*' "sha" "Check the ISO files") \
884 $(cdfilex boot/bzImage "bootiso" "Boot the ISO image") \
885 $(gotposixovl "install" "Hard disk installation (UMSDOS way)") \
886 $(gotposixovl "installtaz" "Hard disk installation (TAZUSB way)") \
887 $(gotposixovlzip "inst2zip" "ZIP installation archive (UMSDOS way)") \
888 $(gotposixovlzip "insttaz2zip" "ZIP installation archive (TAZUSB way)") \
889 $(xfile tazusb "usbkey" "USB key read/write installation") \
890 $(ishybrid "usbbootkey" "USB boot key (read only)") \
891 "tazboot" "Get tazboot.exe Linux loader" \
892 $(cdexe boot/bzImage "bzimage" "Get linux DOS/EXE file") \
893 $(cdexe 'memtest*' "memtest" "Get Memtest86 DOS/EXE file") \
894 $(cdfilef 'memtest*' "fdmemtest" "Create a Memtest86 boot floppy") \
895 $(cdfilex 'memtest*' "runmemtest" "Start Memtest86") \
896 $(cdexe '?pxe' "pxe" "Get SliTaz Web boot DOS/EXE utility") \
897 $(cdfilef '?pxe' "fdpxe" "Create a SliTaz Web boot floppy") \
898 $(cdfilex '?pxe' "runpxe" "Start the SliTaz Web boot utility") \
899 $(misspkg "missing" "Install packages to get more options") \
900 "quit" "Quit this utility"
901 EOT
902 exec 3>&1
903 value=$(. /tmp/dialog$$ 2>&1 1>&3)
904 retval=$?
905 exec 3>&-
906 rm -f /tmp/dialog$$
907 [ $retval -eq 0 ] || continue
908 $value
909 done