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