wok view syslinux/stuff/iso2exe/init @ rev 17591

syslinux/isohybrib.exe: add --md5, --undo
author Pascal Bellard <pascal.bellard@slitaz.org>
date Tue Feb 10 08:53:27 2015 +0100 (2015-02-10)
parents 20fc9712d9c6
children 65c5ea249c9a
line source
1 #!/bin/sh
3 DIALOG=dialog
5 ddq()
6 {
7 dd $@ 2> /dev/null
8 }
10 get()
11 {
12 od -v -j $1 -N ${4:-${3:-2}} -t u${3:-2} -w${3:-2} -An $2 2>/dev/null ||
13 hexdump -v -s $1 -n ${4:-${3:-2}} -e "\"\" 1/${3:-2} \" %d\n\"" $2
14 }
16 getarg()
17 {
18 sed "/$1=/!d;s/.*$1=\\([^ ]*\\).*/\\1/" /proc/cmdline
19 }
21 clear()
22 {
23 echo -e "\x1B[1;1H\x1B[J"
24 }
26 xless()
27 {
28 [ $(wc -l < "$1") -gt 22 ] &&
29 sed 's/..3.;4.m/===/g;$s/.*/&\n---\nPress q to continue/' "$1" | less ||
30 { cat "$1"
31 [ "$2" ] || return
32 echo -e "$2"
33 read n
34 }
35 }
37 tinydialog()
38 {
39 clear
40 label=""
41 while [ "$1" ]; do
42 case "$1" in
43 --title) title=" \x1B[30;47m$2\x1B[37;40m\n"
44 echo -e $title; shift ;;
45 --yes-label) label="$2" ; shift ;;
46 --textbox)
47 xless "$2" "\nPress RETURN to continue."
48 break;;
49 --gauge)
50 t=" "
51 echo -e "$t$2\n"
52 while read pct ; do
53 s=" "
54 s="$s$pct%$s"
55 pct=$((($pct*63)/100))
56 echo -en "\r$t\x1B[30;47m$(echo "$s" | cut -c-$pct)\x1B[37;40m$(echo "$s" | cut -c$(($pct+1))-)"
57 done
58 break;;
59 --yesno)
60 while true; do
61 clear
62 echo "$2" | sed 's/\\n\\n/\\n/g;s/\\n/\n/g'
63 echo -en " <- 1:${label:-Yes} 2:Cancel\r"
64 read x
65 case "$x" in
66 ''|Y*|y*|1) return 0;;
67 N*|n*|2|0) return 1;;
68 esac
69 done ;;
70 --menu|--radiolist)
71 [ "$1" == "--menu" ] && shft=2 || shft=3
72 label=""
73 [ "$2" ] && label="\n$2"
74 shift 5
75 echo -e "$title$label\n0 Cancel" > /tmp/data
76 n=1
77 while [ "$1" ]; do
78 eval key_$n='$1'
79 echo "$((n++)) $2"
80 shift $shft
81 done >> /tmp/data
82 while ! grep -q "^$n " /tmp/data ; do
83 clear
84 xless /tmp/data
85 echo -en "\n <- Enter the selection number\r"
86 read n
87 done 2> /dev/null
88 rm -f /tmp/data
89 [ $n -eq 0 ] && return 1
90 eval echo -n \$key_$n 1>&2
91 return 0;;
92 esac
93 shift
94 done
95 }
97 mount_proc()
98 {
99 mount -t proc /proc /proc
100 mount -t sysfs /sys /sys
101 udevd --daemon 2> /dev/null && udevadm trigger && sleep 5
102 }
104 umount_proc()
105 {
106 killall udevd 2> /dev/null
107 umount /sys/fs/fuse/connections 2> /dev/null
108 umount /sys
109 umount /proc
110 }
112 bytes2bin()
113 {
114 for i in $@ ; do
115 printf '\\\\x%02X' $(($i&255))
116 done | xargs echo -en
117 }
119 words2bin()
120 {
121 for i in $@ ; do
122 printf '\\\\x%02X\\\\x%02X' $(($i&255)) $((($i>>8)&255))
123 done | xargs echo -en
124 }
126 gettazboot()
127 {
128 echo "Creating $(basename $1) ..."
129 O=$(($(get 66 /mnt/$ISO) - 0xC0))
130 L=$(($(get 20 /mnt/$ISO) - 0xC0 - $(get 24 /mnt/$ISO) - $O))
131 S=$((32+$L))
132 P=$((($S+511)/512))
133 E=$((4096-(32*$P)))
134 words2bin 0x5A4D $(($S%512)) $P 0 2 $E -1 $((${2:-0}-16)) \
135 -2 0 256 -16 28 0x6C53 0x5469 0x7A61 > $1
136 ddq bs=1 count=$L skip=$(echo $O) if=/mnt/$ISO >> $1
137 }
139 checkmagic()
140 {
141 [ -s $1 ] && [ $(getarg magic) == $(get 24 $1 4) ]
142 }
144 getiso()
145 {
146 mkdir -p /media/cdrom
147 for dev in /sys/block/?d?/?d??* ; do
148 mount /dev/$(basename $dev) /mnt
149 if checkmagic /mnt/$ISO; then
150 mount -o loop,ro /mnt/$ISO /media/cdrom
151 echo "Found $ISO on $(basename $dev)"
152 break
153 fi
154 umount /mnt
155 done
156 }
158 uncpio()
159 {
160 [ -s "$1" ] || return
161 echo -en "\n Extracting $(basename $1) ..."
162 case $(get 0 $1) in
163 *35615) ( zcat || gunzip ) ;;
164 *14333) unxz ;;
165 *\ 93) unlzma ;;
166 *) cat ;;
167 esac < $1 | ( cd ${2:-/} ; cpio -idmu > /dev/null 2>&1 )
168 }
170 dotwait()
171 {
172 echo -n "${1:-Install filesystem}.."
173 touch /tmp/wait
174 while [ -e /tmp/wait ]; do
175 echo -n "." > /dev/tty0
176 sleep 1
177 done &
178 }
180 getuuid()
181 {
182 dev=$(mount | sed '/ \/mnt /!d;s/ .*//;s|/dev/||;q')
183 blkid | sed "/$dev:/!d;s/.* UUID=.\\([^ ]*\\)\".*/\\1/"
184 }
186 tazusbinitfs()
187 {
188 PAD=$(($(stat -c %s $1) % 4))
189 [ $PAD -ne 0 ] && ddq if=/dev/zero bs=1 count=$((4 - $PAD)) >> $1
190 mkdir -p /tmp/fs/etc /tmp/fs/lib /tmp/fs/home
191 cp -a /etc/locale.conf /tmp/fs/etc 2> /dev/null
192 cp -a /etc/keymap.conf /tmp/fs/etc 2> /dev/null
193 sed 's/ .*//' /proc/modules | while read mod ; do
194 find /lib/modules/ | grep $mod.ko | \
195 sed 's|.*|cp & /tmp/fs/lib|' | sh
196 done
197 cat > /tmp/fs/init1 <<EOT
198 #!/bin/sh
199 sed -i 's|sbin/init|init2|' /init
200 exec /init
201 EOT
202 cat > /tmp/fs/init2 <<EOT
203 #!/bin/sh
205 mount -t proc /proc /proc
206 grep -q debug /proc/cmdline && debug=true && set -x
207 for i in /lib/*.ko* ; do insmod \$i 2> /dev/null ; done; sleep 2
208 v=\$(sed '/\\/home=/!d;s|.*/home=\\([^ ]*\\).*|\\1|' /proc/cmdline /cmdline 2> /dev/null)
209 mount / -o remount,rw
210 mkdir /mnt/dos
211 rm -f /cmdline 2> /dev/null
212 mount / -o remount,ro
213 mnt=/mnt/dos/\${v#*/}
214 dev=\$( (blkid /dev/[sh]d* || blkid) | grep \${v%%/*} | sed 's/:.*//;q')
215 echo "Mount \$dev in /mnt/dos for \$v..." | tee -a /run/boot.log
216 mount \$dev /mnt/dos
217 mount.posixovl -F \$mnt -- -oallow_other -odefault_permissions -osuid
218 mount --bind \$mnt /home
219 [ "\$debug" = "true" ] && sh
220 umount /proc
221 exec /sbin/init
222 EOT
223 chmod 755 /tmp/fs/init?
224 cp -a /tmp/fs/* /
225 ( cd /tmp/fs ; find * | cpio -o -H newc ) | gzip -9 >> $1
226 }
228 mkinitrd()
229 {
230 dotwait "Creating $(basename $1) "
231 for i in bin lib dev proc tmp mnt etc ; do
232 mkdir -p /tmp/fs/$i
233 done
234 for i in /dev/console /dev/null /dev/tty /dev/tty0 /dev/tty1 /dev/tty2 \
235 /dev/fuse /dev/hd* /dev/sd* ; do
236 cp -a $i /tmp/fs$i
237 done
238 for i in /bin/busybox $(which mount.posixovl) $(which blkid); do
239 cp $(LD_TRACE_LOADED_OBJECTS=1 /lib/ld*.so $i | \
240 sed 's|.*=> \(.*/lib/l[^ ]*\).*|\1|;/^\//!d') /tmp/fs/lib
241 cp $i /tmp/fs/bin
242 done
243 cp -a /lib/ld-* /tmp/fs/lib
244 for i in $(busybox | sed '/Current/,$!d'); do
245 [ -e /tmp/fs/bin/${i%,} ] || ln -s busybox /tmp/fs/bin/${i%,}
246 done
247 ln -s /proc/mounts /tmp/fs/etc/mtab
248 sed 's/ .*//' /proc/modules | while read mod ; do
249 find /lib/modules/ | grep $mod.ko | \
250 sed 's|.*|cp & /tmp/fs/lib|' | sh
251 done
252 cat > /tmp/fs/init <<EOT
253 #!/bin/sh
255 arg()
256 {
257 grep -q \$1 /proc/cmdline &&
258 val="\$(sed "s/.*\$1=\\([^ ]*\\).*/\\1/" < /proc/cmdline)" &&
259 echo "\$2 \$val"
260 }
262 mount -t proc /proc /proc
263 arg debug "shell" && debug=true && set -x
264 for i in /lib/*.ko* ; do insmod \$i 2> /dev/null ; done; sleep 2
265 arg mount "Mount device"
266 mount \$( (blkid /dev/[sh]d* || blkid) | grep \$val | sed 's/:.*//;q') /mnt
267 arg subroot "Change root to directory"
268 mount.posixovl -F /mnt/\$val -- -oallow_other -odefault_permissions -osuid
269 mount --bind /mnt /mnt/\$val/mnt/dos
270 mount -o size=0 -t tmpfs tmpfs /mnt/\$val/mnt/dos/\$val
271 LDSO=\$(ls /mnt/\$val/lib/ld-* | sed q)
272 export LD_LIBRARY_PATH=\$val/lib:\$val/usr/lib:/lib
273 [ "$debug" = "true" ] && sh
274 umount /proc
275 exec /bin/switch_root /mnt \${LDSO#/mnt/} \$val/usr/sbin/chroot \$val /sbin/init
276 EOT
277 chmod +x /tmp/fs/init
278 ( cd /tmp/fs ; find * | cpio -o -H newc ) | lzma e $1 -si 2> /dev/null
279 rm -rf /tmp/fs /tmp/wait
280 }
282 is_loram()
283 {
284 [ -s /lib/squashfs.ko* ]
285 }
287 ls_r()
288 {
289 ls -r $@ 2> /dev/null || ls $@
290 }
292 doinstall()
293 {
294 mkdir -p /mnt/slitaz/boot /mnt/slitaz/mnt/dos
295 if ! mount.posixovl -F /mnt/slitaz -- \
296 -oallow_other -odefault_permissions -osuid; then
297 echo "Can't install SliTaz. Abort."