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