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