diff options
Diffstat (limited to 'recipes/initrdscripts/files/30-bootmenu.sh')
-rw-r--r-- | recipes/initrdscripts/files/30-bootmenu.sh | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/recipes/initrdscripts/files/30-bootmenu.sh b/recipes/initrdscripts/files/30-bootmenu.sh new file mode 100644 index 0000000000..5ebeead430 --- /dev/null +++ b/recipes/initrdscripts/files/30-bootmenu.sh @@ -0,0 +1,180 @@ +# +# (c) 2007 Paul Sokolovsky +# + +# If root is explicitly specified, skip interactive selection +if [ -z "$ROOT_DEVICE" ]; then +############################## + +E="\033[" +MOUNTLOC="tmp" +LOOP_IMG_MASK='*.img' + +if ! (echo " " | read -n1 foo) >/dev/null 2>&1; then + echo "'read' command lacks -n switch support, aborting" + exit 1 +fi + +mkdir -p $MOUNTLOC + +list="" + +add_menu_item() +{ + if [ -n "$list" ]; then + list="$list\n" + fi + + list="$list$1" +} + +show_menu() { + echo -e -n "${E}3;0H" >$CONSOLE + cnt=0 + echo -e $list | \ + while read l; do + if [ $cnt == $num ]; then + echo -e -n "${E}1m" >$CONSOLE + fi + echo -e "$cnt: $l${E}0m" >$CONSOLE + cnt=$((cnt + 1)) + done +} + +get_menu_selection() +{ + cnt=0 + sel=`echo -e $list | \ + while read l; do + if [ $cnt == $num ]; then + echo $l + break + fi + cnt=$((cnt + 1)) + done` +} + +get_partition_type() +{ +# fstype=`mount -f --guess-fstype /dev/$dev $MOUNTLOC` + fstype=`fstype </dev/$dev` + fstype=`expr "$fstype" : 'FSTYPE=\([A-Za-z0-9]*\).*'` +} + +scan_for_loopimgs() +{ +# Scan a device for loopback images, add to the list if found + mount /dev/$dev $MOUNTLOC + p=$PWD + cd $MOUNTLOC + for img in `ls -1 $LOOP_IMG_MASK 2>/dev/null`; do + add_menu_item "$dev/$img (loop img on vfat)" + done + cd $p + umount $MOUNTLOC +} + +# Scan all available device/partitions +while read maj min nblk dev; do + if [ -z "$maj" -o "$maj" == "major" ]; then + continue; + fi + + get_partition_type + if [ "$fstype" != "ext2" -a "$fstype" != "ext3" -a "$fstype" != "vfat" -a "$fstype" != "jffs2" ]; then + # Comment following line to show all available block devices regardless of FS (for debug purposes) + continue + true + fi + + if [ "$fstype" == "vfat" ]; then + scan_for_loopimgs + continue + fi + + add_menu_item "$dev ($fstype)" +done < /proc/partitions + +add_menu_item "NFS (nfsroot=192.168.2.200:/srv/nfs/oe/image)" +add_menu_item "Shell" + +total=`echo -e $list | wc -l` +num=0 + +# Draw UI +stty -F $CONSOLE -echo +echo -e -n "${E}2J" >$CONSOLE +echo -e -n "${E}0;0H" >$CONSOLE +echo "Select boot image:" >$CONSOLE + +# Main loop +show_menu +while read -s -n1 i; do + case "$i" in + "A") + num=$((num - 1)) + if [ $num -lt 0 ]; then + num=$(($total - 1)) + fi + ;; + ["B"-"Z"]) + num=$((num + 1)) + if [ $num -ge $total ]; then + num=0 + fi + ;; + "q") + exec sh + ;; + "") + break + ;; + esac + show_menu +# echo "*$esc$i" +done < $CONSOLE + +stty echo + +# Process results of user selection, prepare input arguments +# for boot modules + +get_menu_selection +echo Selected: $sel + +dev=`expr "$sel" : '\([^ /]*\)'` +path=`expr "$sel" : '[^/]*\([^ ]*\).*'` +fstype=`expr "$sel" : '[^ ]* *\(.*\)'` + +if [ "$dev" == "Shell" ]; then + if [ -x /usr/sbin/dropbear ]; then + modprobe g_ether + ifconfig usb0 192.168.2.202 + mkdir -p /dev/pts + mount -t devpts devpts /dev/pts + export PATH=$PATH:/usr/sbin + /usr/sbin/dropbear -E + echo "Started dropbear @192.168.2.202" + fi + + exec /bin/sh +elif [ "$dev" == "NFS" ]; then + ROOT_DEVICE="/dev/nfs" + CMDLINE="$CMDLINE root=/dev/nfs nfsroot=192.168.2.200:/srv/nfs/oe/image" +elif [ -n "$path" ]; then + ROOT_DEVICE="/dev/loop" + CMDLINE="$CMDLINE root=/dev/loop looproot=/dev/$dev:$path" +else + ROOT_DEVICE="/dev/$dev" + # jffs2 is not recognized by mount automagically + if [ "$fstype" == "(jffs2)" ]; then + ROOT_FSTYPE="jffs2" + fi + CMDLINE="$CMDLINE root=$ROOT_DEVICE" +fi + +echo ROOT_DEVICE=$ROOT_DEVICE >$CONSOLE +echo CMDLINE=$CMDLINE >$CONSOLE + +############################## +fi |