#!/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 tmp="$(cd -P "$(dirname "${source}")" && pwd)" source="$(readlink "${source}")" [[ $source != /* ]] && source="${tmp}/${source}" done echo -n "$(realpath "$(dirname "${source}")")" } ACTUAL_WORKING_DIRECTORY="$(realpath "$(pwd)")" || exit 1 export ACTUAL_WORKING_DIRECTORY GENTOO_INSTALL_REPO_DIR_ORIGINAL="$(get_source_dir)" export GENTOO_INSTALL_REPO_DIR_ORIGINAL 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 # shellcheck source=./scripts/utils.sh source "$GENTOO_INSTALL_REPO_DIR/scripts/utils.sh" # shellcheck source=./scripts/config.sh source "$GENTOO_INSTALL_REPO_DIR/scripts/config.sh" # shellcheck source=./scripts/functions.sh source "$GENTOO_INSTALL_REPO_DIR/scripts/functions.sh" # shellcheck source=./scripts/main.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. This is the default mode," echo " if the given configuration file exists." echo " -R, --chroot [CMD...] Chroot into an existing system. The root filesystem" echo " must already be mounted under DIR. All required special" echo " filesystems will be mounted inside, and unmounted when" echo " the chroot exits." 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)" || die "Could not determine realpath to config" shift ;; "-R"|"--chroot") [[ -z $ACTION ]] || die "Multiple actions given" ACTION="chroot" CHROOT_DIR="$2" [[ -e "$CHROOT_DIR" ]] || die "Chroot directory not found: '$CHROOT_DIR'" shift ;; "-i"|"--install") [[ -z $ACTION ]] || die "Multiple actions given" ACTION="install" ;; "__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. echo "You have not created a gentoo.conf. Starting configurator instead of installing." exec "$GENTOO_INSTALL_REPO_DIR/configure" "$CONFIG" fi fi if [[ "$ACTION" != "chroot" ]]; then # Load config if we aren't just chrooting [[ -e "$CONFIG" ]] \ || die "Configuration file '$CONFIG' does not exist. To run the configurator, omit '-i' flag or run ./configure" # shellcheck disable=SC1090 source "$CONFIG" || die "Could not 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 fi [[ $EUID == 0 ]] \ || die "Must be root" mkdir_or_die 0755 "$TMP_DIR" case "$ACTION" in "chroot") main_chroot "$CHROOT_DIR" "$@" ;; "install") main_install "$@" ;; "__install_gentoo_in_chroot") main_install_gentoo_in_chroot "$@" ;; *) die "Invalid action '$ACTION'" ;; esac