slitaz-arm view bootmenu @ rev 111

Add bootmenu
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sat Apr 19 06:23:40 2014 +0000 (2014-04-19)
parents
children
line source
1 #!/bin/sh
3 # Check for depends ...
5 mv -f /var/log/$0.log /var/log/$0.log.0 /dev/null
6 while read file pkg ; do
7 [ "$(which $file)" ] && continue
8 echo "Can't find $file. Please install $pkg." >> /var/log/$0.log
9 done <<EOT
10 kexec kexec-tools
11 dialog dialog
12 EOT
13 [ -s /var/log/$0.log ] && exec /init
16 cmdlinearg()
17 {
18 grep -q $1= /proc/cmdline && sed "s/.*$1=\([^ ]*\).*/\1/" </proc/cmdline
19 }
21 get()
22 {
23 grep -sq ^$1 $2 && sed "/^$1/!d;s/$1[ :=]*//" $2
24 }
26 list_entry()
27 {
28 n=0
29 while true ; do
30 n=$(($n+1))
31 eval KEYWORD="\$KEYWORD_$n"
32 eval ENTRY="\$ENTRY_$n"
33 [ "$KEYWORD" ] || break
34 [ "$KEYWORD" == "$default" ] && ENTRY="$ENTRY (default)"
35 echo -n "$KEYWORD \"$ENTRY\" "
36 done
37 }
39 edit_menu()
40 {
41 while true; do
43 eval KERNEL="\$KERNEL_$1"
44 eval INITRD="\$INITRD_$1"
45 eval CMDLINE="\$CMDLINE_$1"
47 exec 3>&1
48 value=$($DIALOG --clear \
49 --title "${edittitle:-Edit menu}" \
50 --ok-label "Edit" \
51 --cancel-label "Done" \
52 --menu "" 20 72 14 \
53 Kernel "$KERNEL" \
54 Initramfs "$INITRD" \
55 Cmdline "$CMDLINE" 2>&1 1>&3 )
56 retval=$?
57 exec 3>&-
59 case $retval in
60 1|255) return ;;
61 esac
63 exec 3>&1
64 case $value in
65 Kernel)
66 data=$($DIALOG --clear --title "Select the kernel" \
67 --fselect "$mnt/$KEYWORD/$KERNEL" 10 72 2>&1 1>&3) ;;
68 Initramfs)
69 data=$($DIALOG --clear --title "Select the initramfs" \
70 --fselect "$mnt/$KEYWORD/$INITRD" 10 72 2>&1 1>&3) ;;
71 Cmdline)
72 data=$($DIALOG --clear --title "Edit $value" \
73 --inputbox "Cmdline" 20 72 2>&1 "$CMDLINE" 1>&3) ;;
74 esac
75 retval=$?
76 exec 3>&-
78 case $retval in
79 1|255) continue ;;
80 esac
82 case $value in
83 Kernel) [ -f $data ] && eval KERNEL_$1=\$data ;;
84 Initramfs) [ -f $data ] && eval INITRD_$1=\$data ;;
85 Cmdline) eval CMDLINE_$1=\$data ;;
86 esac
87 done
88 }
90 web_boot_entry()
91 {
92 [ "$USING_WEBBOOT" == "1" ] ||
93 echo -n 'WebBoot "boot from Internet"'
94 }
96 web_boot()
97 {
98 USING_WEBBOOT=1
99 [ -s $mnt/network.conf ] && cp $mnt/network.conf /etc
100 /etc/init.d/network.sh start
101 webpath=$(get webpath $mnt/menu.txt)
102 [ "$webpath" ] || webpath=http://mirror.slitaz.org/pxe/arm/boot.php
103 wget -O /root/webboot.sh $webpath 2>&1 > /dev/null
104 [ -s /root/webboot.sh ] || return
105 . /root/webboot.sh
106 webprefix=$(dirname $webpath)
107 editbutton=""
108 }
110 : ${DIALOG=dialog}
112 mount -t proc proc /proc
113 BOOTDEV=$(cmdlinearg bootdev)
114 mnt=/mnt
115 mount -t devtmpfs /dev /dev
117 # A dirty hack: why devtmpfs does not mount ?
118 [ -b /dev/mmcblk0p1 ] || mknod -m 660 /dev/mmcblk0p1 b 179 1
120 mount -r /dev/${BOOTDEV:-mmcblk0p1} $mnt
121 umount /dev
124 # Get global variables
126 title=$(get title $mnt/menu.txt)
127 subtitle=$(get subtitle $mnt/menu.txt)
129 timeout=$(get timeout $mnt/menu.txt)
130 timeout=${timeout:-30}
132 default=$(get default $mnt/menu.txt)
134 editbutton='--extra-button --extra-label "Edit"'
135 grep -qs ^noedit i$mnt/menu.txt && editbutton=
137 kmap=$(get kmap $mnt/menu.txt)
138 [ "$kmap" ] && ! loadkeys $kmap && loadkmap < /usr/share/kmap/$kmap.kmap
140 edittitle=$(get edittitle $mnt/menu.txt)
143 # Get OS variables
145 n=0
146 for i in $mnt/*/ ; do
147 grep -qs ^kernel $i/config.txt || continue
148 n=$(($n+1))
149 eval KERNEL_$n="\$(get kernel \$i/config.txt)"
150 eval INITRD_$n="\$(get initramfs \$i/config.txt)"
151 eval CMDLINE_$n="\$(cat \$i/cmdline.txt)"
152 eval KEYWORD_$n="\$(basename \$i)"
153 eval ENTRY_$n="\$(get entry \$i/menu.txt)"
154 done
157 # Main loop
159 while true; do
161 exec 3>&1
162 value=$(sh 2>&1 1>&3 <<EOT
163 $DIALOG --clear \
164 --title "${title:-Boot menu}" \
165 $editbutton \
166 --ok-label "Boot" \
167 --cancel-label "Halt" \
168 --timeout $timeout \
169 --menu "${subtitle:-Default boot in $timeout seconds}" 20 72 14 \
170 $(list_entry) $(web_boot_entry) \
171 Continue "Execute SliTaz boot sequence"
172 EOT
173 )
174 retval=$?
175 exec 3>&-
177 n=0
178 while true; do
179 n=$(($n+1))
180 eval KEYWORD="\$KEYWORD_$n"
181 [ "$KEYWORD" ] || break
182 [ "$KEYWORD" == "$value" ] && break
183 case $value in
184 *timeout) [ "$KEYWORD" == "$default" ] && break ;;
185 esac
186 done
188 case $retval in
189 0)
190 case "$value" in
191 *WebBoot) web_boot ;;
192 *) break ;;
193 esac ;;
194 1|255)
195 case "$value" in
196 *timeout) break ;;
197 esac
198 umount $mnt
199 umount /proc
200 poweroff -f ;;
201 3)
202 [ "$KEYWORD" ] && edit_menu $n ;;
203 esac
204 done
207 # Start OS
209 case "$KEYWORD" in
211 ''|Continue)
212 umount $mnt
213 umount /proc
214 exec /init ;;
216 *)
217 eval KERNEL="\$KERNEL_$n"
218 eval INITRD="\$INITRD_$n"
219 eval CMDLINE="\$CMDLINE_$n"
221 if [ "$webprefix" ]; then
222 cd /root
223 wget $webprefix/$KEYWORD/$KERNEL
224 wget $webprefix/$KEYWORD/$INITRD
225 else
226 cd $mnt/$KEYWORD
227 cp $KERNEL $INITRD /root
228 cd /root
229 fi
230 [ "$INITRD" ] && INITRD="--initrd $(basename $INITRD)"
231 [ "$CMDLINE" ] && CMDLINE="--command-line \"$CMDLINE\""
233 kexec -l $(basename $KERNEL) $INITRD $CMDLINE --atags
234 umount $mnt
235 umount /proc
236 kexec -e ;;
238 esac