slitaz-arm view rpi/piboot @ rev 118

Rename bootmenu to piboot since it's R-Pi only and move to rpi/ folder
author Christophe Lincoln <pankso@slitaz.org>
date Mon Apr 21 03:28:33 2014 +0200 (2014-04-21)
parents
children 89c21345e633
line source
1 #!/bin/sh
2 #
3 # /sbin/piboot: SliTaz Raspberry Pi bootloader and web boot!
4 #
5 # (C) 2014 SliTaz GNU/Linux - ...
6 #
7 # AUTHORS: Pascal Bellard <pascal.bellard@slitaz.org>
8 #
10 # Check for depends ...
11 mv -f /var/log/$0.log /var/log/$0.log.0 /dev/null
12 while read file pkg ; do
13 [ "$(which $file)" ] && continue
14 echo "Can't find $file. Please install $pkg." >> /var/log/$0.log
15 done <<EOT
16 kexec kexec-tools
17 dialog dialog
18 EOT
19 [ -s /var/log/$0.log ] && exec /init
22 cmdlinearg()
23 {
24 grep -q $1= /proc/cmdline && sed "s/.*$1=\([^ ]*\).*/\1/" </proc/cmdline
25 }
27 get()
28 {
29 grep -sq ^$1 $2 && sed "/^$1/!d;s/$1[ :=]*//" $2
30 }
32 list_entry()
33 {
34 n=0
35 while true ; do
36 n=$(($n+1))
37 eval KEYWORD="\$KEYWORD_$n"
38 eval ENTRY="\$ENTRY_$n"
39 [ "$KEYWORD" ] || break
40 [ "$KEYWORD" == "$default" ] && ENTRY="$ENTRY (default)"
41 echo -n "$KEYWORD \"$ENTRY\" "
42 done
43 }
45 edit_menu()
46 {
47 while true; do
49 eval KERNEL="\$KERNEL_$1"
50 eval INITRD="\$INITRD_$1"
51 eval CMDLINE="\$CMDLINE_$1"
53 exec 3>&1
54 value=$($DIALOG --clear \
55 --title "${edittitle:-Edit menu}" \
56 --ok-label "Edit" \
57 --cancel-label "Done" \
58 --menu "" 20 72 14 \
59 Kernel "$KERNEL" \
60 Initramfs "$INITRD" \
61 Cmdline "$CMDLINE" 2>&1 1>&3 )
62 retval=$?
63 exec 3>&-
65 case $retval in
66 1|255) return ;;
67 esac
69 exec 3>&1
70 case $value in
71 Kernel)
72 data=$($DIALOG --clear --title "Select the kernel" \
73 --fselect "$mnt/$KEYWORD/$KERNEL" 10 72 2>&1 1>&3) ;;
74 Initramfs)
75 data=$($DIALOG --clear --title "Select the initramfs" \
76 --fselect "$mnt/$KEYWORD/$INITRD" 10 72 2>&1 1>&3) ;;
77 Cmdline)
78 data=$($DIALOG --clear --title "Edit $value" \
79 --inputbox "Cmdline" 20 72 2>&1 "$CMDLINE" 1>&3) ;;
80 esac
81 retval=$?
82 exec 3>&-
84 case $retval in
85 1|255) continue ;;
86 esac
88 case $value in
89 Kernel) [ -f $data ] && eval KERNEL_$1=\$data ;;
90 Initramfs) [ -f $data ] && eval INITRD_$1=\$data ;;
91 Cmdline) eval CMDLINE_$1=\$data ;;
92 esac
93 done
94 }
96 web_boot_entry()
97 {
98 [ "$USING_WEBBOOT" == "1" ] ||
99 echo -n 'WebBoot "boot from Internet"'
100 }
102 web_boot()
103 {
104 USING_WEBBOOT=1
105 [ -s $mnt/network.conf ] && cp $mnt/network.conf /etc
106 /etc/init.d/network.sh start
107 webpath=$(get webpath $mnt/menu.txt)
108 [ "$webpath" ] || webpath=http://mirror.slitaz.org/pxe/arm/boot.php
109 wget -O /root/webboot.sh $webpath 2>&1 > /dev/null
110 [ -s /root/webboot.sh ] || return
111 . /root/webboot.sh
112 webprefix=$(dirname $webpath)
113 editbutton=""
114 }
116 : ${DIALOG=dialog}
118 mount -t proc proc /proc
119 BOOTDEV=$(cmdlinearg bootdev)
120 mnt=/mnt
121 mount -t devtmpfs /dev /dev
123 # A dirty hack: why devtmpfs does not mount ?
124 # pankso@20140421: It mount fine on my side
125 [ -b /dev/mmcblk0p1 ] || mknod -m 660 /dev/mmcblk0p1 b 179 1
127 mount -r /dev/${BOOTDEV:-mmcblk0p1} $mnt
128 umount /dev
131 # Get global variables
133 title=$(get title $mnt/menu.txt)
134 subtitle=$(get subtitle $mnt/menu.txt)
136 timeout=$(get timeout $mnt/menu.txt)
137 timeout=${timeout:-30}
139 default=$(get default $mnt/menu.txt)
141 editbutton='--extra-button --extra-label "Edit"'
142 grep -qs ^noedit i$mnt/menu.txt && editbutton=
144 kmap=$(get kmap $mnt/menu.txt)
145 [ "$kmap" ] && ! loadkeys $kmap && loadkmap < /usr/share/kmap/$kmap.kmap
147 edittitle=$(get edittitle $mnt/menu.txt)
150 # Get OS variables
152 n=0
153 for i in $mnt/*/ ; do
154 grep -qs ^kernel $i/config.txt || continue
155 n=$(($n+1))
156 eval KERNEL_$n="\$(get kernel \$i/config.txt)"
157 eval INITRD_$n="\$(get initramfs \$i/config.txt)"
158 eval CMDLINE_$n="\$(cat \$i/cmdline.txt)"
159 eval KEYWORD_$n="\$(basename \$i)"
160 eval ENTRY_$n="\$(get entry \$i/menu.txt)"
161 done
164 # Main loop
166 while true; do
168 exec 3>&1
169 value=$(sh 2>&1 1>&3 <<EOT
170 $DIALOG --clear \
171 --title "${title:-Boot menu}" \
172 $editbutton \
173 --ok-label "Boot" \
174 --cancel-label "Halt" \
175 --timeout $timeout \
176 --menu "${subtitle:-Default boot in $timeout seconds}" 20 72 14 \
177 $(list_entry) $(web_boot_entry) \
178 Continue "Execute SliTaz boot sequence"
179 EOT
180 )
181 retval=$?
182 exec 3>&-
184 n=0
185 while true; do
186 n=$(($n+1))
187 eval KEYWORD="\$KEYWORD_$n"
188 [ "$KEYWORD" ] || break
189 [ "$KEYWORD" == "$value" ] && break
190 case $value in
191 *timeout) [ "$KEYWORD" == "$default" ] && break ;;
192 esac
193 done
195 case $retval in
196 0)
197 case "$value" in
198 *WebBoot) web_boot ;;
199 *) break ;;
200 esac ;;
201 1|255)
202 case "$value" in
203 *timeout) break ;;
204 esac
205 umount $mnt
206 umount /proc
207 poweroff -f ;;
208 3)
209 [ "$KEYWORD" ] && edit_menu $n ;;
210 esac
211 done
214 # Start OS
216 case "$KEYWORD" in
218 ''|Continue)
219 umount $mnt
220 umount /proc
221 exec /init ;;
223 *)
224 eval KERNEL="\$KERNEL_$n"
225 eval INITRD="\$INITRD_$n"
226 eval CMDLINE="\$CMDLINE_$n"
228 if [ "$webprefix" ]; then
229 cd /root
230 wget $webprefix/$KEYWORD/$KERNEL
231 wget $webprefix/$KEYWORD/$INITRD
232 else
233 cd $mnt/$KEYWORD
234 cp $KERNEL $INITRD /root
235 cd /root
236 fi
237 [ "$INITRD" ] && INITRD="--initrd $(basename $INITRD)"
238 [ "$CMDLINE" ] && CMDLINE="--command-line \"$CMDLINE\""
240 kexec -l $(basename $KERNEL) $INITRD $CMDLINE --atags
241 umount $mnt
242 umount /proc
243 kexec -e ;;
245 esac