From d7bedef1389ab0275c9059b476be1fbf8b300654 Mon Sep 17 00:00:00 2001 From: "pyther@pyther.net" Date: Sun, 6 Mar 2011 09:53:12 -0500 Subject: Provide Syslinux as a possible bootloader interactive_syslinux depends on the syslinux-install_update script that is in the Arch syslinux package. Signed-off-by: Dieter Plaetinck --- src/core/libs/lib-blockdevices-filesystems.sh | 3 +- src/core/libs/lib-ui-interactive.sh | 118 +++++++++++++++++++++++++- src/core/procedures/base | 1 + 3 files changed, 119 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/core/libs/lib-blockdevices-filesystems.sh b/src/core/libs/lib-blockdevices-filesystems.sh index cb30a2e..13160c9 100644 --- a/src/core/libs/lib-blockdevices-filesystems.sh +++ b/src/core/libs/lib-blockdevices-filesystems.sh @@ -94,7 +94,8 @@ get_possible_fs () { true } -supported_bootloaders=('grub') +syslinux_supported_fs=('ext2' 'ext3' 'ext4' 'btrfs' 'vfat') +supported_bootloaders=('syslinux' 'grub') # procedural code from quickinst functionized and fixed. # there were functions like this in the setup script too, with some subtle differences. see below diff --git a/src/core/libs/lib-ui-interactive.sh b/src/core/libs/lib-ui-interactive.sh index 29453cb..563dc2b 100644 --- a/src/core/libs/lib-ui-interactive.sh +++ b/src/core/libs/lib-ui-interactive.sh @@ -2,7 +2,9 @@ # A library which allows you to do backend stuff by using user interfaces # Global Variables -grubmenu="/boot/grub/menu.lst" # be sure to override this if you have it somewhere else +# Be sure to override these if you have the configuration file elsewhere +grubmenu="/boot/grub/menu.lst" +syslinuxmenu="/boot/syslinux/syslinux.cfg" # check if a worker has completed successfully. if not -> tell user he must do it + return 1 # if ok -> don't warn anything and return 0 @@ -737,7 +739,8 @@ If any previous configuration you've done until now (like fancy filesystems) req done ask_option no "Choose bootloader" "Which bootloader would you like to use?" optional \ - "grub" "GRUB bootloader" + "grub" "GRUB bootloader" \ + "syslinux" "Syslinux bootloader (${syslinux_supported_fs[*]})" bootloader=$ANSWER_OPTION @@ -867,6 +870,8 @@ interactive_install_bootloader () { if [[ $bootloader = grub ]]; then GRUB_OK=0 interactive_grub || return 1 + elif [[ $bootloader = syslinux ]]; then + interactive_syslinux || return 1 else show_warning 'No Bootloader' 'You did not select a bootloader. No bootloader will be installed.' fi @@ -1131,11 +1136,120 @@ EOF fi } +interactive_syslinux() { + debug FS "starting interactive_syslinux" + + # Find and Store the device that has the root filesystem + get_device_with_mount '/' || return 1 + PART_ROOT="$ANSWER_DEVICE" + + # Gets boot device + get_device_with_mount '/boot' + bootdev="$ANSWER_DEVICE" + + # Check to see if /boot or / (root) has a valid FS type and set bootpart + # bootpart == device with /boot dir + if [[ $bootdev ]]; then + filesystem="$(awk '/ \/boot /{print $4}' $TMP_FILESYSTEMS)" + debug FS "$bootdev - FS type: $filesystem" + + local bootpart="$bootdev" + else + filesystem="$(awk '/ \/ /{print $4}' $TMP_FILESYSTEMS)" + debug FS "$PART_ROOT - FS type: $filesystem" + + local bootpart="$PART_ROOT" + fi + + if ! check_is_in "$filesystem" "${syslinux_supported_fs[@]}"; then + show_warning "Invalid FS" "Error: Syslinux does not support $filesystem.\n\nThe following filesystems are supported:\n ${syslinux_supported_fs[@]}" + return 1 + fi + + # remove default entries by truncating file at our little tag (#-*) + sed -i -e '/#-\*/q' "$syslinuxmenu" + + # Generate menu and prompt user to edit it + interactive_bootloader_menu "syslinux" "$syslinuxmenu" + + if device_is_raid "$bootpart"; then + debug FS "Software RAID detected" + local onraid=true + fi + + debug FS "Installing Syslinux ($var_TARGET_DIR/usr/sbin/syslinux-install_update -i -c /mnt)" + inform "Installing Syslinux..." + if ! "$var_TARGET_DIR/usr/sbin/syslinux-install_update" -i -c /mnt >$LOG 2>&1; then + debug FS "FAILED: syslinux-install_update -i -c /mnt failed" + show_warning "FAILED" "syslinux-install_update -i -c /mnt failed" + return 1 + fi + + if ask_yesno "Set boot flag(s) and install the Syslinux MBR?" yes; then + inform "Setting Boot Flag(s)...\nThis could take a while. Please be patient.\n\n" syslinuxprog + if "$var_TARGET_DIR/usr/sbin/syslinux-install_update" -a -c /mnt >$LOG 2>&1; then + debug FS "Successfully set boot flag(s)" + else + debug FS "Failde to set boot flag(s). syslinux-install_update -a failed with Error Code - $?" + show_warning "FAILED" "Failed to set boot flag(s). MBR not installed" && return 1 + fi + + inform "Installing Syslinux MBR..." syslinuxprog + if "$var_TARGET_DIR/usr/sbin/syslinux-install_update" -m -c /mnt >$LOG 2>&1; then + debug FS "Successfully installed MBR(s)" + else + debug FS "Failed to install MBR. syslinux-install_update -m failed with Error Code - $?" + show_warning "FAILED" "Failed to install the MBR!" && return 1 + fi + fi + notify "Syslinux Installation Successful" +} + +generate_syslinux_menu () { + get_kernel_parameters || return + + cat >>$syslinuxmenu <