137 lines
4.7 KiB
Bash
Executable File
137 lines
4.7 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.
|
|
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
|