interactive_syslinux depends on the syslinux-install_update script that
is in the Arch Syslinux package.
---
src/core/libs/lib-blockdevices-filesystems.sh | 3 +-
src/core/libs/lib-ui-interactive.sh | 143 ++++++++++++++++++++++++-
src/core/procedures/base | 1 +
3 files changed, 145 insertions(+), 2 deletions(-)
diff --git a/src/core/libs/lib-blockdevices-filesystems.sh b/src/core/libs/lib-blockdevices-filesystems.sh
index 5bf181e..cd17c72 100644
--- a/src/core/libs/lib-blockdevices-filesystems.sh
+++ b/src/core/libs/lib-blockdevices-filesystems.sh
@@ -93,7 +93,8 @@ get_possible_fs () {
done
}
-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 be31440..7309f6d 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
+# 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
@@ -726,7 +728,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
@@ -858,6 +861,8 @@ interactive_install_bootloader () {
if [[ $bootloader = grub ]]; then
GRUB_OK=0
interactive_grub
+ elif [[ $bootloader = syslinux ]]; then
+ interactive_syslinux
else
show_warning 'No Bootloader' 'You did not select a bootloader. No bootloader will be installed.' && return 0
fi
@@ -1121,11 +1126,147 @@ 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 booot 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
+ # Notify the user or trust the scripts?
+ 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; 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
+ "$var_TARGET_DIR/usr/sbin/syslinux-install_update" -a -c /mnt
+ rt=$?
+ case "$rt" in
+ 0)
+ debug FS "Successfully set boot flag(s)"
+ ;;
+ 1)
+ debug FS "Failed to set boot flag. Function in syslinux-install_update exited with status $rt"
+ notify "Failed to set boot flag. MBR not installed!" && return 1
+ ;;
+ 3)
+ debug FS "Failed to set boot flag(s). syslinux-install_update -a exited with status $rt"
+ notify "Failed to set boot flag(s)! MBR not installed!" && return 1
+ ;;
+ *)
+ debug FS "Failde to set boot flag(s). syslinux-install_update -a failed with an unkown Error Code - $rt"
+ notify "Failed to set boot flag(s). MBR not installed" && return 1
+ ;;
+ esac
+
+ inform "Installing Syslinux MBR..." syslinuxprog
+ "$var_TARGET_DIR/usr/sbin/syslinux-install_update" -m -c /mnt
+ rt=$?
+ case "$rt" in
+ 0)
+ debug FS "Successfully installed MBR(s)"
+ ;;
+ 1)
+ debug FS "Failed install MBR. Function in syslinux-install_update -m exited with status $rt"
+ notify "Failed to install the MBR!." && return 1
+ ;;
+ 4)
+ debug FS "Failed to install MBR. syslinux-install_update -m exited with status $rt"
+ notify "Failed to install MBR!" && return 1
+ ;;
+ *)
+ debug FS "Failed to install MBR. syslinux-install_update -m failed with an unkown Error Code - $rt"
+ notify "Failed to install the MBR!" && return 1
+ ;;
+ esac
+ fi
+ notify "Syslinux Installation Successful"
+}
+
+generate_syslinux_menu () {
+ get_kernel_parameters
+
+ cat >>$syslinuxmenu <