slitaz-arm annotate 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
rev   line source
pankso@118 1 #!/bin/sh
pankso@118 2 #
pankso@118 3 # /sbin/piboot: SliTaz Raspberry Pi bootloader and web boot!
pankso@118 4 #
pankso@118 5 # (C) 2014 SliTaz GNU/Linux - ...
pankso@118 6 #
pankso@118 7 # AUTHORS: Pascal Bellard <pascal.bellard@slitaz.org>
pankso@118 8 #
pankso@118 9
pankso@118 10 # Check for depends ...
pankso@118 11 mv -f /var/log/$0.log /var/log/$0.log.0 /dev/null
pankso@118 12 while read file pkg ; do
pankso@118 13 [ "$(which $file)" ] && continue
pankso@118 14 echo "Can't find $file. Please install $pkg." >> /var/log/$0.log
pankso@118 15 done <<EOT
pankso@118 16 kexec kexec-tools
pankso@118 17 dialog dialog
pankso@118 18 EOT
pankso@118 19 [ -s /var/log/$0.log ] && exec /init
pankso@118 20
pankso@118 21
pankso@118 22 cmdlinearg()
pankso@118 23 {
pankso@118 24 grep -q $1= /proc/cmdline && sed "s/.*$1=\([^ ]*\).*/\1/" </proc/cmdline
pankso@118 25 }
pankso@118 26
pankso@118 27 get()
pankso@118 28 {
pankso@118 29 grep -sq ^$1 $2 && sed "/^$1/!d;s/$1[ :=]*//" $2
pankso@118 30 }
pankso@118 31
pankso@118 32 list_entry()
pankso@118 33 {
pankso@118 34 n=0
pankso@118 35 while true ; do
pankso@118 36 n=$(($n+1))
pankso@118 37 eval KEYWORD="\$KEYWORD_$n"
pankso@118 38 eval ENTRY="\$ENTRY_$n"
pankso@118 39 [ "$KEYWORD" ] || break
pankso@118 40 [ "$KEYWORD" == "$default" ] && ENTRY="$ENTRY (default)"
pankso@118 41 echo -n "$KEYWORD \"$ENTRY\" "
pankso@118 42 done
pankso@118 43 }
pankso@118 44
pankso@118 45 edit_menu()
pankso@118 46 {
pankso@118 47 while true; do
pankso@118 48
pankso@118 49 eval KERNEL="\$KERNEL_$1"
pankso@118 50 eval INITRD="\$INITRD_$1"
pankso@118 51 eval CMDLINE="\$CMDLINE_$1"
pankso@118 52
pankso@118 53 exec 3>&1
pankso@118 54 value=$($DIALOG --clear \
pankso@118 55 --title "${edittitle:-Edit menu}" \
pankso@118 56 --ok-label "Edit" \
pankso@118 57 --cancel-label "Done" \
pankso@118 58 --menu "" 20 72 14 \
pankso@118 59 Kernel "$KERNEL" \
pankso@118 60 Initramfs "$INITRD" \
pankso@118 61 Cmdline "$CMDLINE" 2>&1 1>&3 )
pankso@118 62 retval=$?
pankso@118 63 exec 3>&-
pankso@118 64
pankso@118 65 case $retval in
pankso@118 66 1|255) return ;;
pankso@118 67 esac
pankso@118 68
pankso@118 69 exec 3>&1
pankso@118 70 case $value in
pankso@118 71 Kernel)
pankso@118 72 data=$($DIALOG --clear --title "Select the kernel" \
pankso@118 73 --fselect "$mnt/$KEYWORD/$KERNEL" 10 72 2>&1 1>&3) ;;
pankso@118 74 Initramfs)
pankso@118 75 data=$($DIALOG --clear --title "Select the initramfs" \
pankso@118 76 --fselect "$mnt/$KEYWORD/$INITRD" 10 72 2>&1 1>&3) ;;
pankso@118 77 Cmdline)
pankso@118 78 data=$($DIALOG --clear --title "Edit $value" \
pankso@118 79 --inputbox "Cmdline" 20 72 2>&1 "$CMDLINE" 1>&3) ;;
pankso@118 80 esac
pankso@118 81 retval=$?
pankso@118 82 exec 3>&-
pankso@118 83
pankso@118 84 case $retval in
pankso@118 85 1|255) continue ;;
pankso@118 86 esac
pankso@118 87
pankso@118 88 case $value in
pankso@118 89 Kernel) [ -f $data ] && eval KERNEL_$1=\$data ;;
pankso@118 90 Initramfs) [ -f $data ] && eval INITRD_$1=\$data ;;
pankso@118 91 Cmdline) eval CMDLINE_$1=\$data ;;
pankso@118 92 esac
pankso@118 93 done
pankso@118 94 }
pankso@118 95
pankso@118 96 web_boot_entry()
pankso@118 97 {
pankso@118 98 [ "$USING_WEBBOOT" == "1" ] ||
pankso@118 99 echo -n 'WebBoot "boot from Internet"'
pankso@118 100 }
pankso@118 101
pankso@118 102 web_boot()
pankso@118 103 {
pankso@118 104 USING_WEBBOOT=1
pankso@118 105 [ -s $mnt/network.conf ] && cp $mnt/network.conf /etc
pankso@118 106 /etc/init.d/network.sh start
pankso@118 107 webpath=$(get webpath $mnt/menu.txt)
pankso@118 108 [ "$webpath" ] || webpath=http://mirror.slitaz.org/pxe/arm/boot.php
pankso@118 109 wget -O /root/webboot.sh $webpath 2>&1 > /dev/null
pankso@118 110 [ -s /root/webboot.sh ] || return
pankso@118 111 . /root/webboot.sh
pankso@118 112 webprefix=$(dirname $webpath)
pankso@118 113 editbutton=""
pankso@118 114 }
pankso@118 115
pankso@118 116 : ${DIALOG=dialog}
pankso@118 117
pankso@118 118 mount -t proc proc /proc
pankso@118 119 BOOTDEV=$(cmdlinearg bootdev)
pankso@118 120 mnt=/mnt
pankso@118 121 mount -t devtmpfs /dev /dev
pankso@118 122
pankso@118 123 # A dirty hack: why devtmpfs does not mount ?
pankso@118 124 # pankso@20140421: It mount fine on my side
pankso@118 125 [ -b /dev/mmcblk0p1 ] || mknod -m 660 /dev/mmcblk0p1 b 179 1
pankso@118 126
pankso@118 127 mount -r /dev/${BOOTDEV:-mmcblk0p1} $mnt
pankso@118 128 umount /dev
pankso@118 129
pankso@118 130
pankso@118 131 # Get global variables
pankso@118 132
pankso@118 133 title=$(get title $mnt/menu.txt)
pankso@118 134 subtitle=$(get subtitle $mnt/menu.txt)
pankso@118 135
pankso@118 136 timeout=$(get timeout $mnt/menu.txt)
pankso@118 137 timeout=${timeout:-30}
pankso@118 138
pankso@118 139 default=$(get default $mnt/menu.txt)
pankso@118 140
pankso@118 141 editbutton='--extra-button --extra-label "Edit"'
pankso@118 142 grep -qs ^noedit i$mnt/menu.txt && editbutton=
pankso@118 143
pankso@118 144 kmap=$(get kmap $mnt/menu.txt)
pankso@118 145 [ "$kmap" ] && ! loadkeys $kmap && loadkmap < /usr/share/kmap/$kmap.kmap
pankso@118 146
pankso@118 147 edittitle=$(get edittitle $mnt/menu.txt)
pankso@118 148
pankso@118 149
pankso@118 150 # Get OS variables
pankso@118 151
pankso@118 152 n=0
pankso@118 153 for i in $mnt/*/ ; do
pankso@118 154 grep -qs ^kernel $i/config.txt || continue
pankso@118 155 n=$(($n+1))
pankso@118 156 eval KERNEL_$n="\$(get kernel \$i/config.txt)"
pankso@118 157 eval INITRD_$n="\$(get initramfs \$i/config.txt)"
pankso@118 158 eval CMDLINE_$n="\$(cat \$i/cmdline.txt)"
pankso@118 159 eval KEYWORD_$n="\$(basename \$i)"
pankso@118 160 eval ENTRY_$n="\$(get entry \$i/menu.txt)"
pankso@118 161 done
pankso@118 162
pankso@118 163
pankso@118 164 # Main loop
pankso@118 165
pankso@118 166 while true; do
pankso@118 167
pankso@118 168 exec 3>&1
pankso@118 169 value=$(sh 2>&1 1>&3 <<EOT
pankso@118 170 $DIALOG --clear \
pankso@118 171 --title "${title:-Boot menu}" \
pankso@118 172 $editbutton \
pankso@118 173 --ok-label "Boot" \
pankso@118 174 --cancel-label "Halt" \
pankso@118 175 --timeout $timeout \
pankso@118 176 --menu "${subtitle:-Default boot in $timeout seconds}" 20 72 14 \
pankso@118 177 $(list_entry) $(web_boot_entry) \
pankso@118 178 Continue "Execute SliTaz boot sequence"
pankso@118 179 EOT
pankso@118 180 )
pankso@118 181 retval=$?
pankso@118 182 exec 3>&-
pankso@118 183
pankso@118 184 n=0
pankso@118 185 while true; do
pankso@118 186 n=$(($n+1))
pankso@118 187 eval KEYWORD="\$KEYWORD_$n"
pankso@118 188 [ "$KEYWORD" ] || break
pankso@118 189 [ "$KEYWORD" == "$value" ] && break
pankso@118 190 case $value in
pankso@118 191 *timeout) [ "$KEYWORD" == "$default" ] && break ;;
pankso@118 192 esac
pankso@118 193 done
pankso@118 194
pankso@118 195 case $retval in
pankso@118 196 0)
pankso@118 197 case "$value" in
pankso@118 198 *WebBoot) web_boot ;;
pankso@118 199 *) break ;;
pankso@118 200 esac ;;
pankso@118 201 1|255)
pankso@118 202 case "$value" in
pankso@118 203 *timeout) break ;;
pankso@118 204 esac
pankso@118 205 umount $mnt
pankso@118 206 umount /proc
pankso@118 207 poweroff -f ;;
pankso@118 208 3)
pankso@118 209 [ "$KEYWORD" ] && edit_menu $n ;;
pankso@118 210 esac
pankso@118 211 done
pankso@118 212
pankso@118 213
pankso@118 214 # Start OS
pankso@118 215
pankso@118 216 case "$KEYWORD" in
pankso@118 217
pankso@118 218 ''|Continue)
pankso@118 219 umount $mnt
pankso@118 220 umount /proc
pankso@118 221 exec /init ;;
pankso@118 222
pankso@118 223 *)
pankso@118 224 eval KERNEL="\$KERNEL_$n"
pankso@118 225 eval INITRD="\$INITRD_$n"
pankso@118 226 eval CMDLINE="\$CMDLINE_$n"
pankso@118 227
pankso@118 228 if [ "$webprefix" ]; then
pankso@118 229 cd /root
pankso@118 230 wget $webprefix/$KEYWORD/$KERNEL
pankso@118 231 wget $webprefix/$KEYWORD/$INITRD
pankso@118 232 else
pankso@118 233 cd $mnt/$KEYWORD
pankso@118 234 cp $KERNEL $INITRD /root
pankso@118 235 cd /root
pankso@118 236 fi
pankso@118 237 [ "$INITRD" ] && INITRD="--initrd $(basename $INITRD)"
pankso@118 238 [ "$CMDLINE" ] && CMDLINE="--command-line \"$CMDLINE\""
pankso@118 239
pankso@118 240 kexec -l $(basename $KERNEL) $INITRD $CMDLINE --atags
pankso@118 241 umount $mnt
pankso@118 242 umount /proc
pankso@118 243 kexec -e ;;
pankso@118 244
pankso@118 245 esac