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