slitaz-arm view rpi/piboot @ rev 123

rpiboot: fix log file name
author Pascal Bellard <pascal.bellard@slitaz.org>
date Mon Apr 21 09:13:53 2014 +0000 (2014-04-21)
parents aa159e25968d
children 2bed449c8905
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
26 cmdlinearg()
27 {
28 grep -q $1= /proc/cmdline && sed "s/.*$1=\([^ ]*\).*/\1/" </proc/cmdline
29 }
31 get()
32 {
33 grep -sq ^$1 $2 && sed "/^$1/!d;s/$1[ :=]*//" $2
34 }
36 list_entry()
37 {
38 n=0
39 while true ; do
40 n=$(($n+1))
41 eval KEYWORD="\$KEYWORD_$n"
42 eval ENTRY="\$ENTRY_$n"
43 [ "$KEYWORD" ] || break
44 [ "$KEYWORD" == "$default" ] && ENTRY="$ENTRY (default)"
45 echo -n "$KEYWORD \"$ENTRY\" "
46 done
47 }
49 edit_menu()
50 {
51 while true; do
53 eval KERNEL="\$KERNEL_$1"
54 eval INITRD="\$INITRD_$1"
55 eval CMDLINE="\$CMDLINE_$1"
57 exec 3>&1
58 value=$($DIALOG --clear \
59 --title "${edittitle:-Edit menu}" \
60 --ok-label "Edit" \
61 --cancel-label "Done" \
62 --menu "" 20 72 14 \
63 Kernel "$KERNEL" \
64 Initramfs "$INITRD" \
65 Cmdline "$CMDLINE" 2>&1 1>&3 )
66 retval=$?
67 exec 3>&-
69 case $retval in
70 1|255) return ;;
71 esac
73 exec 3>&1
74 case $value in
75 Kernel)
76 data=$($DIALOG --clear --title "Select the kernel" \
77 --fselect "$mnt/$KEYWORD/$KERNEL" 10 72 2>&1 1>&3) ;;
78 Initramfs)
79 data=$($DIALOG --clear --title "Select the initramfs" \
80 --fselect "$mnt/$KEYWORD/$INITRD" 10 72 2>&1 1>&3) ;;
81 Cmdline)
82 data=$($DIALOG --clear --title "Edit $value" \
83 --inputbox "Cmdline" 20 72 2>&1 "$CMDLINE" 1>&3) ;;
84 esac
85 retval=$?
86 exec 3>&-
88 case $retval in
89 1|255) continue ;;
90 esac
92 case $value in
93 Kernel) [ -f $data ] && eval KERNEL_$1=\$data ;;
94 Initramfs) [ -f $data ] && eval INITRD_$1=\$data ;;
95 Cmdline) eval CMDLINE_$1=\$data ;;
96 esac
97 done
98 }
100 web_boot_entry()
101 {
102 [ "$USING_WEBBOOT" == "1" ] ||
103 echo -n 'WebBoot "boot from Internet"'
104 }
106 web_boot()
107 {
108 USING_WEBBOOT=1
109 [ -s $mnt/network.conf ] && cp $mnt/network.conf /etc
110 /etc/init.d/network.sh start
111 webpath=$(get webpath $mnt/menu.txt)
112 [ "$webpath" ] || webpath=http://mirror.slitaz.org/pxe/arm/boot.php
113 wget -O /root/webboot.sh $webpath 2>&1 > /dev/null
114 [ -s /root/webboot.sh ] || return
115 . /root/webboot.sh
116 webprefix=$(dirname $webpath)
117 editbutton=""
118 }
120 : ${DIALOG=dialog}
122 mount -t proc proc /proc
123 BOOTDEV=$(cmdlinearg bootdev)
124 mnt=/mnt
125 mount -t devtmpfs /dev /dev
127 # A dirty hack: why devtmpfs does not mount ?
128 # pankso@20140421: It mount fine on my side
129 [ -b /dev/mmcblk0p1 ] || mknod -m 660 /dev/mmcblk0p1 b 179 1
131 mount -r /dev/${BOOTDEV:-mmcblk0p1} $mnt
132 umount /dev
135 # Get global variables
137 title=$(get title $mnt/menu.txt)
138 subtitle=$(get subtitle $mnt/menu.txt)
140 timeout=$(get timeout $mnt/menu.txt)
141 timeout=${timeout:-30}
143 default=$(get default $mnt/menu.txt)
145 editbutton='--extra-button --extra-label "Edit"'
146 grep -qs ^noedit i$mnt/menu.txt && editbutton=
148 kmap=$(get kmap $mnt/menu.txt)
149 [ "$kmap" ] && ! loadkeys $kmap && loadkmap < /usr/share/kmap/$kmap.kmap
151 edittitle=$(get edittitle $mnt/menu.txt)
154 # Get OS variables
156 n=0
157 for i in $mnt/*/ ; do
158 grep -qs ^kernel $i/config.txt || continue
159 n=$(($n+1))
160 eval KERNEL_$n="\$(get kernel \$i/config.txt)"
161 eval INITRD_$n="\$(get initramfs \$i/config.txt)"
162 eval CMDLINE_$n="\$(cat \$i/cmdline.txt)"
163 eval KEYWORD_$n="\$(basename \$i)"
164 eval ENTRY_$n="\$(get entry \$i/menu.txt)"
165 done
168 # Main loop
170 while true; do
172 exec 3>&1
173 value=$(sh 2>&1 1>&3 <<EOT
174 $DIALOG --clear \
175 --title "${title:-Boot menu}" \
176 $editbutton \
177 --ok-label "Boot" \
178 --cancel-label "Halt" \
179 --timeout $timeout \
180 --menu "${subtitle:-Default boot in $timeout seconds}" 20 72 14 \
181 $(list_entry) $(web_boot_entry) \
182 Continue "Execute SliTaz boot sequence"
183 EOT
184 )
185 retval=$?
186 exec 3>&-
188 n=0
189 while true; do
190 n=$(($n+1))
191 eval KEYWORD="\$KEYWORD_$n"
192 [ "$KEYWORD" ] || break
193 [ "$KEYWORD" == "$value" ] && break
194 case $value in
195 *timeout) [ "$KEYWORD" == "$default" ] && break ;;
196 esac
197 done
199 case $retval in
200 0)
201 case "$value" in
202 *WebBoot) web_boot ;;
203 *) break ;;
204 esac ;;
205 1|255)
206 case "$value" in
207 *timeout) break ;;
208 esac
209 umount $mnt
210 umount /proc
211 poweroff -f ;;
212 3)
213 [ "$KEYWORD" ] && edit_menu $n ;;
214 esac
215 done
218 # Start OS
220 case "$KEYWORD" in
222 ''|Continue)
223 umount $mnt
224 umount /proc
225 exec /init ;;
227 *)
228 eval KERNEL="\$KERNEL_$n"
229 eval INITRD="\$INITRD_$n"
230 eval CMDLINE="\$CMDLINE_$n"
232 if [ "$webprefix" ]; then
233 cd /root
234 wget $webprefix/$KEYWORD/$KERNEL
235 wget $webprefix/$KEYWORD/$INITRD
236 else
237 cd $mnt/$KEYWORD
238 cp $KERNEL $INITRD /root
239 cd /root
240 fi
241 [ "$INITRD" ] && INITRD="--initrd $(basename $INITRD)"
242 [ "$CMDLINE" ] && CMDLINE="--command-line \"$CMDLINE\""
244 kexec -l $(basename $KERNEL) $INITRD $CMDLINE --atags
245 umount $mnt
246 umount /proc
247 kexec -e ;;
249 esac