slitaz-arm diff 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 diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/rpi/piboot Mon Apr 21 03:28:33 2014 +0200 1.3 @@ -0,0 +1,245 @@ 1.4 +#!/bin/sh 1.5 +# 1.6 +# /sbin/piboot: SliTaz Raspberry Pi bootloader and web boot! 1.7 +# 1.8 +# (C) 2014 SliTaz GNU/Linux - ... 1.9 +# 1.10 +# AUTHORS: Pascal Bellard <pascal.bellard@slitaz.org> 1.11 +# 1.12 + 1.13 +# Check for depends ... 1.14 +mv -f /var/log/$0.log /var/log/$0.log.0 /dev/null 1.15 +while read file pkg ; do 1.16 + [ "$(which $file)" ] && continue 1.17 + echo "Can't find $file. Please install $pkg." >> /var/log/$0.log 1.18 +done <<EOT 1.19 +kexec kexec-tools 1.20 +dialog dialog 1.21 +EOT 1.22 +[ -s /var/log/$0.log ] && exec /init 1.23 + 1.24 + 1.25 +cmdlinearg() 1.26 +{ 1.27 + grep -q $1= /proc/cmdline && sed "s/.*$1=\([^ ]*\).*/\1/" </proc/cmdline 1.28 +} 1.29 + 1.30 +get() 1.31 +{ 1.32 + grep -sq ^$1 $2 && sed "/^$1/!d;s/$1[ :=]*//" $2 1.33 +} 1.34 + 1.35 +list_entry() 1.36 +{ 1.37 + n=0 1.38 + while true ; do 1.39 + n=$(($n+1)) 1.40 + eval KEYWORD="\$KEYWORD_$n" 1.41 + eval ENTRY="\$ENTRY_$n" 1.42 + [ "$KEYWORD" ] || break 1.43 + [ "$KEYWORD" == "$default" ] && ENTRY="$ENTRY (default)" 1.44 + echo -n "$KEYWORD \"$ENTRY\" " 1.45 + done 1.46 +} 1.47 + 1.48 +edit_menu() 1.49 +{ 1.50 +while true; do 1.51 + 1.52 + eval KERNEL="\$KERNEL_$1" 1.53 + eval INITRD="\$INITRD_$1" 1.54 + eval CMDLINE="\$CMDLINE_$1" 1.55 + 1.56 + exec 3>&1 1.57 + value=$($DIALOG --clear \ 1.58 + --title "${edittitle:-Edit menu}" \ 1.59 + --ok-label "Edit" \ 1.60 + --cancel-label "Done" \ 1.61 + --menu "" 20 72 14 \ 1.62 + Kernel "$KERNEL" \ 1.63 + Initramfs "$INITRD" \ 1.64 + Cmdline "$CMDLINE" 2>&1 1>&3 ) 1.65 + retval=$? 1.66 + exec 3>&- 1.67 + 1.68 + case $retval in 1.69 + 1|255) return ;; 1.70 + esac 1.71 + 1.72 + exec 3>&1 1.73 + case $value in 1.74 + Kernel) 1.75 + data=$($DIALOG --clear --title "Select the kernel" \ 1.76 + --fselect "$mnt/$KEYWORD/$KERNEL" 10 72 2>&1 1>&3) ;; 1.77 + Initramfs) 1.78 + data=$($DIALOG --clear --title "Select the initramfs" \ 1.79 + --fselect "$mnt/$KEYWORD/$INITRD" 10 72 2>&1 1>&3) ;; 1.80 + Cmdline) 1.81 + data=$($DIALOG --clear --title "Edit $value" \ 1.82 + --inputbox "Cmdline" 20 72 2>&1 "$CMDLINE" 1>&3) ;; 1.83 + esac 1.84 + retval=$? 1.85 + exec 3>&- 1.86 + 1.87 + case $retval in 1.88 + 1|255) continue ;; 1.89 + esac 1.90 + 1.91 + case $value in 1.92 + Kernel) [ -f $data ] && eval KERNEL_$1=\$data ;; 1.93 + Initramfs) [ -f $data ] && eval INITRD_$1=\$data ;; 1.94 + Cmdline) eval CMDLINE_$1=\$data ;; 1.95 + esac 1.96 +done 1.97 +} 1.98 + 1.99 +web_boot_entry() 1.100 +{ 1.101 + [ "$USING_WEBBOOT" == "1" ] || 1.102 + echo -n 'WebBoot "boot from Internet"' 1.103 +} 1.104 + 1.105 +web_boot() 1.106 +{ 1.107 + USING_WEBBOOT=1 1.108 + [ -s $mnt/network.conf ] && cp $mnt/network.conf /etc 1.109 + /etc/init.d/network.sh start 1.110 + webpath=$(get webpath $mnt/menu.txt) 1.111 + [ "$webpath" ] || webpath=http://mirror.slitaz.org/pxe/arm/boot.php 1.112 + wget -O /root/webboot.sh $webpath 2>&1 > /dev/null 1.113 + [ -s /root/webboot.sh ] || return 1.114 + . /root/webboot.sh 1.115 + webprefix=$(dirname $webpath) 1.116 + editbutton="" 1.117 +} 1.118 + 1.119 +: ${DIALOG=dialog} 1.120 + 1.121 +mount -t proc proc /proc 1.122 +BOOTDEV=$(cmdlinearg bootdev) 1.123 +mnt=/mnt 1.124 +mount -t devtmpfs /dev /dev 1.125 + 1.126 +# A dirty hack: why devtmpfs does not mount ? 1.127 +# pankso@20140421: It mount fine on my side 1.128 +[ -b /dev/mmcblk0p1 ] || mknod -m 660 /dev/mmcblk0p1 b 179 1 1.129 + 1.130 +mount -r /dev/${BOOTDEV:-mmcblk0p1} $mnt 1.131 +umount /dev 1.132 + 1.133 + 1.134 +# Get global variables 1.135 + 1.136 +title=$(get title $mnt/menu.txt) 1.137 +subtitle=$(get subtitle $mnt/menu.txt) 1.138 + 1.139 +timeout=$(get timeout $mnt/menu.txt) 1.140 +timeout=${timeout:-30} 1.141 + 1.142 +default=$(get default $mnt/menu.txt) 1.143 + 1.144 +editbutton='--extra-button --extra-label "Edit"' 1.145 +grep -qs ^noedit i$mnt/menu.txt && editbutton= 1.146 + 1.147 +kmap=$(get kmap $mnt/menu.txt) 1.148 +[ "$kmap" ] && ! loadkeys $kmap && loadkmap < /usr/share/kmap/$kmap.kmap 1.149 + 1.150 +edittitle=$(get edittitle $mnt/menu.txt) 1.151 + 1.152 + 1.153 +# Get OS variables 1.154 + 1.155 +n=0 1.156 +for i in $mnt/*/ ; do 1.157 + grep -qs ^kernel $i/config.txt || continue 1.158 + n=$(($n+1)) 1.159 + eval KERNEL_$n="\$(get kernel \$i/config.txt)" 1.160 + eval INITRD_$n="\$(get initramfs \$i/config.txt)" 1.161 + eval CMDLINE_$n="\$(cat \$i/cmdline.txt)" 1.162 + eval KEYWORD_$n="\$(basename \$i)" 1.163 + eval ENTRY_$n="\$(get entry \$i/menu.txt)" 1.164 +done 1.165 + 1.166 + 1.167 +# Main loop 1.168 + 1.169 +while true; do 1.170 + 1.171 + exec 3>&1 1.172 + value=$(sh 2>&1 1>&3 <<EOT 1.173 + $DIALOG --clear \ 1.174 + --title "${title:-Boot menu}" \ 1.175 + $editbutton \ 1.176 + --ok-label "Boot" \ 1.177 + --cancel-label "Halt" \ 1.178 + --timeout $timeout \ 1.179 + --menu "${subtitle:-Default boot in $timeout seconds}" 20 72 14 \ 1.180 + $(list_entry) $(web_boot_entry) \ 1.181 + Continue "Execute SliTaz boot sequence" 1.182 +EOT 1.183 +) 1.184 + retval=$? 1.185 + exec 3>&- 1.186 + 1.187 + n=0 1.188 + while true; do 1.189 + n=$(($n+1)) 1.190 + eval KEYWORD="\$KEYWORD_$n" 1.191 + [ "$KEYWORD" ] || break 1.192 + [ "$KEYWORD" == "$value" ] && break 1.193 + case $value in 1.194 + *timeout) [ "$KEYWORD" == "$default" ] && break ;; 1.195 + esac 1.196 + done 1.197 + 1.198 + case $retval in 1.199 + 0) 1.200 + case "$value" in 1.201 + *WebBoot) web_boot ;; 1.202 + *) break ;; 1.203 + esac ;; 1.204 + 1|255) 1.205 + case "$value" in 1.206 + *timeout) break ;; 1.207 + esac 1.208 + umount $mnt 1.209 + umount /proc 1.210 + poweroff -f ;; 1.211 + 3) 1.212 + [ "$KEYWORD" ] && edit_menu $n ;; 1.213 + esac 1.214 +done 1.215 + 1.216 + 1.217 +# Start OS 1.218 + 1.219 +case "$KEYWORD" in 1.220 + 1.221 +''|Continue) 1.222 + umount $mnt 1.223 + umount /proc 1.224 + exec /init ;; 1.225 + 1.226 +*) 1.227 + eval KERNEL="\$KERNEL_$n" 1.228 + eval INITRD="\$INITRD_$n" 1.229 + eval CMDLINE="\$CMDLINE_$n" 1.230 + 1.231 + if [ "$webprefix" ]; then 1.232 + cd /root 1.233 + wget $webprefix/$KEYWORD/$KERNEL 1.234 + wget $webprefix/$KEYWORD/$INITRD 1.235 + else 1.236 + cd $mnt/$KEYWORD 1.237 + cp $KERNEL $INITRD /root 1.238 + cd /root 1.239 + fi 1.240 + [ "$INITRD" ] && INITRD="--initrd $(basename $INITRD)" 1.241 + [ "$CMDLINE" ] && CMDLINE="--command-line \"$CMDLINE\"" 1.242 + 1.243 + kexec -l $(basename $KERNEL) $INITRD $CMDLINE --atags 1.244 + umount $mnt 1.245 + umount /proc 1.246 + kexec -e ;; 1.247 + 1.248 +esac