slitaz-arm view rpi/piboot @ rev 195

piboot: add savedefault
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sun Nov 16 10:42:30 2014 +0100 (2014-11-16)
parents e0ff291ac6e2
children 635fc61b4e63
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 # usage: insert 'rdinit=/sbin/piboot' (if you load an initramfs)
8 # or 'init=/sbin/piboot' in the kernel command line /boot/cmdline.txt
9 #
10 # AUTHORS: Pascal Bellard <pascal.bellard@slitaz.org>
11 #
13 # Check for depends ...
14 LOG=/var/log/$(basename $0).log
15 mv -f $LOG $LOG.0 >/dev/null
16 while read file pkg ; do
17 [ "$(which $file)" ] && continue
18 echo "Can't find $file. Please install $pkg." >> $LOG
19 done <<EOT
20 kexec kexec-tools
21 dialog dialog
22 EOT
23 [ -s $LOG ] && exec /init
25 cmdlinearg()
26 {
27 grep -q $1= /proc/cmdline && sed "s/.*$1=\([^ ]*\).*/\1/" </proc/cmdline
28 }
30 get()
31 {
32 grep -sq ^$1 $2 && sed "/^$1/!d;s/$1[ :=]*//" $2
33 }
35 list_entry()
36 {
37 n=0
38 while true ; do
39 n=$(($n+1))
40 eval KEYWORD="\$KEYWORD_$n"
41 eval ENTRY="\$ENTRY_$n"
42 [ "$KEYWORD" ] || break
43 [ "$KEYWORD" == "$default" ] && ENTRY="$ENTRY (default)"
44 echo -n "$KEYWORD \"$ENTRY\" "
45 done
46 }
48 edit_menu()
49 {
50 while true; do
52 eval KERNEL="\$KERNEL_$1"
53 eval INITRD="\$INITRD_$1"
54 eval CMDLINE="\$CMDLINE_$1"
55 extra="--extra-button --extra-label ${msgsave:-Save}"
56 [ "$READONLY" ] && extra=''
58 exec 3>&1
59 value=$($DIALOG --clear \
60 --title "${edittitle:-Edit menu}" \
61 --ok-label "${msgedit:-Edit}" \
62 --cancel-label "${msgdone:-Done}" \
63 --menu "" 20 72 14 \
64 $extra \
65 Kernel "$KERNEL" \
66 Initramfs "$INITRD" \
67 Cmdline "$CMDLINE" 2>&1 1>&3 )
68 retval=$?
69 exec 3>&-
71 case $retval in
72 1|255) return ;;
73 3) cp $mnt/$KEYWORD/config.txt /tmp/config.txt
74 sed -i '/^kernel/d;/^initrd/d;/^cmdline/d' /tmp/config.txt
75 echo "kernel=$KERNEL" >> /tmp/config.txt
76 [ "$INITRD" ] && echo "initrd $INITRD" >> /tmp/config.txt
77 [ "$CMDLINE" ] && echo "cmdline=$CMDLINE" >> /tmp/config.txt
78 mount -o remount,rw $mnt
79 cp /tmp/config.txt $mnt/$KEYWORD/config.txt
80 mount -o remount,ro $mnt ;;
81 esac
83 exec 3>&1
84 case $value in
85 Kernel)
86 data=$($DIALOG --clear --title "${msgselectkernel:-Select the kernel}" \
87 --fselect "$mnt/$KEYWORD/$KERNEL" 10 72 2>&1 1>&3) ;;
88 Initramfs)
89 data=$($DIALOG --clear --title "${msgselectinitrd:-Select the initramfs}" \
90 --fselect "$mnt/$KEYWORD/$INITRD" 10 72 2>&1 1>&3) ;;
91 Cmdline)
92 data=$($DIALOG --clear --title "${msgeditcmdline:-Edit cmdline}" \
93 --inputbox "Cmdline" 20 72 2>&1 "$CMDLINE" 1>&3) ;;
94 esac
95 retval=$?
96 exec 3>&-
98 case $retval in
99 1|255) continue ;;
100 esac
102 case $value in
103 Kernel) [ -f $data ] && eval KERNEL_$1=\$data ;;
104 Initramfs) [ -f $data ] && eval INITRD_$1=\$data ;;
105 Cmdline) eval CMDLINE_$1=\$data ;;
106 esac
107 done
108 }
110 web_boot_entry()
111 {
112 [ "$USING_WEBBOOT" == "1" ] ||
113 echo -n 'WebBoot "boot from Internet"'
114 }
116 web_boot()
117 {
118 USING_WEBBOOT=1
119 [ -s $mnt/network.conf ] && cp $mnt/network.conf /etc
120 /etc/init.d/network.sh start
121 webpath=$(get webpath $mnt/menu.txt)
122 [ "$webpath" ] || webpath=http://mirror.slitaz.org/pxe/arm/boot.php
123 for url in ${webpath//,/ }; do
124 wget -O /root/webboot.sh \
125 $url?mac=$(cat /sys/class/net/eth0/address) 2>&1 > /dev/null
126 [ -s /root/webboot.sh ] || continue
127 . /root/webboot.sh
128 webprefix=$(dirname $url)
129 editbutton=""
130 break
131 done
132 }
134 web_get()
135 {
136 case "$1" in
137 *torrent) # See http://sl-lab.it/dokuwiki/doku.php/tesi:boottorrent_en
138 [ -z "$(which aria2)" ] &&
139 echo "Can't find aria2." >> $LOG &&
140 exec /init
142 wget -O /root/webboot.torrent $1
143 aria2c --enable-dht=false --disable-ipv6=true --seed-time=0 \
144 --file-allocation=none -j5 /root/webboot.torrent
146 if ls | grep -q rootfs; then
147 file=$(ls | grep -q rootfs)
148 cat $file >> $2
149 rm -f $file
150 else
151 mv $(ls *mage* *linu* 2> /dev/null) $2
152 fi
153 rm -f /root/webboot.torrent ;;
154 *)
155 wget -O - $1 >> $2
156 esac
157 }
159 : ${DIALOG=dialog}
161 mount -t proc proc /proc
162 mount -t sysfs sys /sys
163 BOOTDEV=$(cmdlinearg bootdev)
164 mnt=/mnt
165 mount -t devtmpfs /dev /dev
167 # A dirty hack: why devtmpfs does not mount ?
168 # pankso@20140421: It mount fine on my side
169 [ -b /dev/mmcblk0p1 ] || mknod -m 660 /dev/mmcblk0p1 b 179 1
171 mount -r /dev/${BOOTDEV:-mmcblk0p1} $mnt
172 umount /dev
175 # Get global variables
177 title=$(get title $mnt/menu.txt)
178 subtitle=$(get subtitle $mnt/menu.txt)
180 timeout=$(get timeout $mnt/menu.txt)
181 timeout=${timeout:-30}
183 default=$(get default $mnt/menu.txt)
185 editbutton='--extra-button --extra-label "Edit"'
186 grep -qs ^noedit i$mnt/menu.txt && editbutton=
188 READONLY=
189 grep -qs ^readonly i$mnt/menu.txt && READONLY=ON
191 USING_WEBBOOT=
192 grep -qs ^nowebboot i$mnt/menu.txt && USING_WEBBOOT=1
194 kmap=$(get kmap $mnt/menu.txt)
195 [ "$kmap" ] && ! loadkeys $kmap && loadkmap < /usr/share/kmap/$kmap.kmap
197 edittitle=$(get edittitle $mnt/menu.txt)
199 # Get locale
201 msgsave=$(get msgsave $mnt/menu.txt)
202 msgedit=$(get msgedit $mnt/menu.txt)
203 msgdone=$(get msgdone $mnt/menu.txt)
204 msgboot=$(get msgboot $mnt/menu.txt)
205 msghalt=$(get msghalt $mnt/menu.txt)
206 msgselectkernel=$(get msgselectkernel $mnt/menu.txt)
207 msgselectinitrd=$(get msgselectinitrd $mnt/menu.txt)
208 msgeditcmdline=$(get msgeditcmdline $mnt/menu.txt)
209 msgkexec=$(get msgkexec $mnt/menu.txt)
211 # Get OS variables
213 n=0
214 for i in $mnt/*/ ; do
215 grep -qs ^kernel $i/config.txt || continue
216 n=$(($n+1))
217 eval KERNEL_$n="\$(get kernel \$i/config.txt)"
218 eval INITRD_$n="\$(get initramfs \$i/config.txt)"
219 eval CMDLINE_$n="\$(cat \$i/cmdline.txt)"
220 eval SAVEDEFAULT_$n="\$(get savedefault \$i/config.txt)"
221 eval KEYWORD_$n="\$(basename \$i)"
222 eval ENTRY_$n="\$(get entry \$i/menu.txt)"
223 done
226 # Main loop
228 while true; do
230 exec 3>&1
231 value=$(sh 2>&1 1>&3 <<EOT
232 $DIALOG --clear \
233 --title "${title:-Boot menu}" \
234 $editbutton \
235 --ok-label "${msgboot:-Boot}" \
236 --cancel-label "${msghalt:-Halt}" \
237 --timeout $timeout \
238 --menu "${subtitle:-Default boot in $timeout seconds}" 20 72 14 \
239 $(list_entry) $(web_boot_entry) \
240 Continue "${msgkexec:-Execute SliTaz boot sequence}"
241 EOT
242 )
243 retval=$?
244 exec 3>&-
246 n=0
247 while true; do
248 n=$(($n+1))
249 eval KEYWORD="\$KEYWORD_$n"
250 [ "$KEYWORD" ] || break
251 [ "$KEYWORD" == "$value" ] && break
252 case $value in
253 *timeout) [ "$KEYWORD" == "$default" ] && break ;;
254 esac
255 done
257 case $retval in
258 0)
259 case "$value" in
260 *WebBoot) web_boot ;;
261 *) break ;;
262 esac ;;
263 1|255)
264 case "$value" in
265 *timeout) break ;;
266 esac
267 umount $mnt
268 umount /sys
269 umount /proc
270 poweroff -f ;;
271 3)
272 [ "$KEYWORD" ] && edit_menu $n ;;
273 esac
274 done
277 # Start OS
279 case "$KEYWORD" in
281 ''|Continue)
282 KEXEC= ;;
284 *)
285 eval KERNEL="\$KERNEL_$n"
286 eval INITRD="\$INITRD_$n"
287 eval CMDLINE="\$CMDLINE_$n"
288 eval SAVEDEFAULT="\$SAVEDEFAULT_$n"
290 if [ "$webprefix" ]; then
291 cd /root
292 web_get $webprefix/$KEYWORD/$KERNEL vmlinuz
293 KERNEL=vmlinuz
294 for i in ${INITRD//,/ }; do
295 web_get $webprefix/$KEYWORD/$i rootfs.gz
296 n=$(stat -c %s rootfs.gz)
297 n=$(($n % 4))
298 [ $n -eq 0 ] && continue
299 dd if=/dev/zero bs=1 count=$((4 - $n)) >> rootfs.gz
300 done
301 else
302 cd $mnt/$KEYWORD
303 cp $KERNEL /root
304 for i in ${INITRD//,/ }; do
305 cat $i >> /root/rootfs.gz
306 n=$(stat -c %s /root/rootfs.gz)
307 n=$(($n % 4))
308 [ $n -eq 0 ] && continue
309 dd if=/dev/zero bs=1 count=$((4 - $n)) >> /root/rootfs.gz
310 done
311 cd /root
312 fi
313 if [ -z "$READONLY" ] && [ "$SAVEDEFAULT" ] &&
314 [ -s $mnt/$SAVEDEFAULT/config.txt ]; then
315 cp $mnt/menu.txt /tmp
316 sed -i '/^default/d' /tmp/menu.txt
317 echo "default=$SAVEDEFAULT" >> /tmp/menu.txt
318 mount -o remount,rw $mnt
319 cp /tmp/menu.txt $mnt/menu.txt
320 fi
321 [ "$INITRD" ] && INITRD="--initrd rootfs.gz"
322 [ "$CMDLINE" ] && CMDLINE="--command-line \"$CMDLINE\""
324 kexec -l $(basename $KERNEL) $INITRD $CMDLINE --atags
325 KEXEC="kexec -e" ;;
327 esac
329 umount $mnt
330 umount /sys
331 umount /proc
332 $KEXEC
333 exec /init