This is beneficial for ZFS pools and for humans to see whether the correct disk was selected.
136 lines
4.6 KiB
Bash
Executable File
136 lines
4.6 KiB
Bash
Executable File
#!/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]... <action>"
|
|
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 <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 <DIR> [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.
|
|
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
|