slitaz-arm annotate rpi/piboot @ rev 123

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