summaryrefslogtreecommitdiff
path: root/packages/altboot/files/set-bootdev
diff options
context:
space:
mode:
Diffstat (limited to 'packages/altboot/files/set-bootdev')
-rwxr-xr-xpackages/altboot/files/set-bootdev150
1 files changed, 150 insertions, 0 deletions
diff --git a/packages/altboot/files/set-bootdev b/packages/altboot/files/set-bootdev
new file mode 100755
index 0000000000..60d0283dc4
--- /dev/null
+++ b/packages/altboot/files/set-bootdev
@@ -0,0 +1,150 @@
+#!/bin/sh
+
+VERSION="0.0.1"
+ENABLE_DEBUG="yes"
+
+die() {
+ echo -e "ERROR: $1"
+ exit 1
+}
+
+. /etc/altboot.func || die "/etc/altboot.func is missing!"
+test -d /sys/block || die "Sysfs problem? (/sys/block not found)"
+
+debug_echo() {
+ test "$ENABLE_DEBUG" = "yes" && echo -e "${C_YELLOW}DEBUG:${C_RESET}${C_WHITE} $1 ${C_RESET}"
+}
+
+scan_devices() {
+ reset_pref "available_devices"
+
+ cnt=1
+ set_pref "available_devices" "$cnt" "Flash" ; let cnt=$cnt+1
+
+ for scsi_disk in `ls -1 /sys/block/ | grep ^sd`
+ do
+ scsi_disk_name="`echo "$scsi_disk" | awk '{printf("%s\n",toupper($0))}'`"
+ test -e /sys/block/$scsi_disk/device/vendor && HDD_VENDOR="`cat /sys/block/$scsi_disk/device/vendor | sed "s/\ $//"`"
+ test -z "$HDD_VENDOR" && HDD_VENDOR="Unknown Vendor"
+
+ test -e /sys/block/$scsi_disk/device/model && HDD_MODEL="`cat /sys/block/$scsi_disk/device/model`"
+ test -z "$HDD_MODEL" && HDD_MODEL="Unknown Model"
+
+ scsi_disk_partition_cnt="`ls -1 /sys/block/$scsi_disk | grep ^$scsi_disk | wc -l | tr -d " "`"
+ test "$scsi_disk_partition_cnt" -gt 1 && scsi_disk_partition_cnt="$scsi_disk_partition_cnt partitions" || scsi_disk_partition_cnt="$scsi_disk_partition_cnt partition"
+
+ set_pref "available_devices" "$cnt" "$scsi_disk_name ( $HDD_VENDOR $HDD_MODEL with $scsi_disk_partition_cnt)"
+ set_pref "available_devices_short" "$cnt" "$scsi_disk"
+ set_pref "available_devices_type" "$cnt" "usb"
+
+ let cnt=$cnt+1
+ done
+
+}
+
+show_menu() {
+ echo -e "\nset-bootdev v$VERSION\n"
+
+ echo -e "Please select the device you wish to boot from:\n"
+
+ cnt2=0 ; let cnt=$cnt-1
+ while test "$cnt" != "$cnt2"
+ do
+ let cnt2=$cnt2+1
+ get_pref "available_devices" "$cnt2" dev
+
+ echo -e "\t[$cnt2] - $dev"
+ done
+
+ while test -z "$selected_dev"
+ do
+ echo -en "\nYour choice: "
+ read junk
+ get_pref "available_devices" "$junk" selected_dev
+ get_pref "available_devices_type" "$junk" part_mode
+
+# debug_echo "show_menu(): selected: [$selected_dev]"
+ done
+
+ if ( echo "$selected_dev" | grep -q "^Flash" )
+ then
+ boot_from flash
+ else
+ get_pref "available_devices_short" "$junk" selected_dev
+# debug_echo "show_menu(): selected_devices_short: [$selected_dev]"
+
+ partitions="`ls -1 /sys/block/$selected_dev|grep ^$selected_dev`"
+ test -z "$partitions" && die "No partitions found on /dev/$selected_dev!"
+
+
+ echo -e "\nPlease select a partition on $selected_dev to boot from:\n"
+
+ cnt=1
+ for partition in $partitions
+ do
+ # We assume that partitions with a "size" < 10 are extended partitions
+ # and should not be listed. TYPE=swap is blacklisted as well.
+ part_size="`cat /sys/block/$selected_dev/$partition/size`"
+ part_type="`blkid -s TYPE -o value /dev/$partition`"
+
+ if test "$part_size" -gt 10 -a "$part_type" != "swap"
+ then
+ let part_size="($part_size/2)/1000"
+ echo -e "\t[$cnt] $partition (~ ${part_size}Mb, $part_type)"
+ set_pref "available_partitions" "$cnt" "$partition"
+
+ let cnt=$cnt+1
+ fi
+ done
+
+ while test -z "$selected_partition"
+ do
+ echo -en "\nYour choice: "
+ read junk
+ get_pref "available_partitions" "$junk" selected_partition
+ done
+
+ part_uuid="`blkid -c /dev/null -s UUID -o value /dev/$selected_partition`"
+
+ boot_from "$part_mode" "$selected_partition" "$part_uuid"
+ fi
+}
+
+boot_from() {
+ debug_echo "boot_from() [$*]"
+
+ part_mode="$1"
+ part_name="$2"
+ part_uuid="$3"
+
+ case "$part_mode" in
+ usb) umount /tmp/mnt.set-bootdev >/dev/null 2>&1
+ rm -rf /tmp/mnt.set-bootdev ; mkdir -p /tmp/mnt.set-bootdev
+
+ if ! ( mount -U "$part_uuid" /tmp/mnt.set-bootdev )
+ then
+ echo "** Note: UUID mount for $part_name failed"
+ mount /dev/$part_name /tmp/mnt.set-bootdev && echo "** Note: Normal mount for $part_name successful"
+ fi
+
+ if ! test -e /tmp/mnt.set-bootdev/sbin/init.sysvinit
+ then
+ copy_rootfs /tmp/mnt.set-bootdev/
+ else
+ umount /tmp/mnt.set-bootdev
+ echo -e "\nSetting /dev/$part_name as boot-partition"
+ echo "$part_mode $part_name $part_uuid" > /etc/set-bootdev.conf
+ fi
+ ;;
+ flash) echo "Setting the onboard flash as boot-partition"
+ echo "$part_mode $part_name $part_uuid" > /etc/set-bootdev.conf
+ ;;
+ esac
+}
+
+copy_rootfs() {
+ debug_echo "copy_rootfs() [$*]"
+}
+
+scan_devices
+show_menu