#!/bin/bash set -uo pipefail ################################################ # Initialize script environment # Find the directory this script is stored in. (from: http://stackoverflow.com/questions/59895) function get_source_dir() { local source="${BASH_SOURCE[0]}" while [[ -h $source ]] do local tmp="$(cd -P "$(dirname "${source}")" && pwd)" source="$(readlink "${source}")" [[ $source != /* ]] && source="${tmp}/${source}" done echo -n "$(realpath "$(dirname "${source}")")" } export ACTUAL_WORKING_DIRECTORY="$(realpath "$(pwd)")" export GENTOO_INSTALL_REPO_DIR_ORIGINAL="$(get_source_dir)" export GENTOO_INSTALL_REPO_DIR="$GENTOO_INSTALL_REPO_DIR_ORIGINAL" export GENTOO_INSTALL_REPO_SCRIPT_ACTIVE=true export GENTOO_INSTALL_REPO_SCRIPT_PID=$$ umask 0077 source "$GENTOO_INSTALL_REPO_DIR/scripts/utils.sh" source "$GENTOO_INSTALL_REPO_DIR/scripts/config.sh" source "$GENTOO_INSTALL_REPO_DIR/scripts/functions.sh" source "$GENTOO_INSTALL_REPO_DIR/scripts/main.sh" ################################################ # Main dispatch # Instantly kill when pressing ctrl-c trap 'kill "$GENTOO_INSTALL_REPO_SCRIPT_PID"' INT ACTION="" CONFIG="$GENTOO_INSTALL_REPO_DIR/gentoo.conf" while [[ $# -gt 0 ]]; do case "$1" in ""|"help"|"--help"|"-help"|"-h") echo "Usage: $0 [opts]... " echo "Performs a minimal gentoo installation. See https://github.com/oddlama/gentoo-install" echo "for more information. If the configuration file does not exist, the configurator will" echo "be started instead." echo "" echo "Options:" echo " -c, --config Use the given configuration file instead of the default" echo " location (gentoo.conf). Applies to installation as well" echo " as initial configuration in case it doesn't exist." echo "" echo "Actions:" echo " -i, --install Installs gentoo as configured. (default if configuration exists)" echo " -R, --chroot Chroot into an existing system. The root filesystem" echo " is mounted automatically based on the partition" echo " UUIDs (generated when installing for the first time)," echo " and unmounted when the chroot exits" echo " -u, --umount Try to unmount all associated mountpoints. (Only needed" echo " if anything gets forcefully interrupted)" exit 0 ;; "-c"|"--config") [[ -f "$2" ]] \ || die "Config file not found: '$2'" CONFIG="$(cd "$ACTUAL_WORKING_DIRECTORY"; realpath --relative-to="$GENTOO_INSTALL_REPO_DIR" "$2" 2>/dev/null)" shift ;; "-R"|"--chroot") [[ -z $ACTION ]] || die "Multiple actions given" ACTION="chroot" ;; "-i"|"--install") [[ -z $ACTION ]] || die "Multiple actions given" ACTION="install" ;; "-u"|"--umount"|"--unmount") [[ -z $ACTION ]] || die "Multiple actions given" ACTION="umount" ;; "__install_gentoo_in_chroot") ACTION="__install_gentoo_in_chroot" ;; *) die "Invalid option '$1'" ;; esac shift done # Check configuration location [[ -z "${CONFIG%%$GENTOO_INSTALL_REPO_DIR*}" ]] \ || die "Configuration file must be inside the installation directory. This is needed so it is accessible from within the chroot environment." if [[ -z "$ACTION" ]]; then if [[ -e "$CONFIG" ]]; then # Default if configuration exists: Run installer ACTION="install" else # Default if configuration does not exists: Run configurator, and exit afterwards. exec "$GENTOO_INSTALL_REPO_DIR/configure" "$CONFIG" fi fi # Load config [[ -e "$CONFIG" ]] \ || die "Configuration file '$CONFIG' does not exist. To run the configurator, omit '-i' or " source "$CONFIG" [[ $I_HAVE_READ_AND_EDITED_THE_CONFIG_PROPERLY == "true" ]] \ || die "You have not properly read the config. Edit the config file and set I_HAVE_READ_AND_EDITED_THE_CONFIG_PROPERLY=true to continue." preprocess_config [[ $EUID == 0 ]] \ || die "Must be root" mkdir_or_die 0755 "$TMP_DIR" case "$ACTION" in "chroot") main_chroot "$@" ;; "install") main_install "$@" ;; "umount") main_umount "$@" ;; "__install_gentoo_in_chroot") main_install_gentoo_in_chroot "$@" ;; *) die "Invalid action '$ACTION'" ;; esac