120 lines
3.8 KiB
Bash
120 lines
3.8 KiB
Bash
|
|
#!/usr/bin/env bash
|
||
|
|
# install.sh — apply my prefs to an existing Debian system.
|
||
|
|
# Sister to build.sh: build.sh produces a fresh-install ISO; this runs against
|
||
|
|
# an already-installed system and applies the same post-install tweaks.
|
||
|
|
#
|
||
|
|
# Usage on the target box (as root):
|
||
|
|
#
|
||
|
|
# git clone ssh://git@192.168.0.100:222/s8n-ru/debian-s8ns-prefs-iso /tmp/s8n
|
||
|
|
# sudo /tmp/s8n/install.sh --variant laptop
|
||
|
|
#
|
||
|
|
# Or via Forgejo tarball API (needs PAT in env):
|
||
|
|
#
|
||
|
|
# curl -fsSL -H "Authorization: token $GIT_PAT" \
|
||
|
|
# https://git.s8n.ru/api/v1/repos/s8n-ru/debian-s8ns-prefs-iso/archive/main.tar.gz \
|
||
|
|
# | sudo tar xz -C /tmp
|
||
|
|
# sudo /tmp/debian-s8ns-prefs-iso/install.sh --variant laptop
|
||
|
|
#
|
||
|
|
# Variants: laptop | server | vanilla (matches variants/*.cfg)
|
||
|
|
|
||
|
|
set -euo pipefail
|
||
|
|
|
||
|
|
if [[ $EUID -ne 0 ]]; then
|
||
|
|
echo "ERR: must run as root (or via sudo)" >&2
|
||
|
|
exit 1
|
||
|
|
fi
|
||
|
|
|
||
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||
|
|
VARIANT=""
|
||
|
|
HOSTNAME_OVERRIDE=""
|
||
|
|
SKIP_PKGS=0
|
||
|
|
|
||
|
|
usage() {
|
||
|
|
cat <<EOF
|
||
|
|
Usage: sudo $0 --variant {laptop|server|vanilla} [opts]
|
||
|
|
|
||
|
|
Required:
|
||
|
|
--variant NAME laptop | server | vanilla
|
||
|
|
|
||
|
|
Optional:
|
||
|
|
--hostname NAME override hostname
|
||
|
|
--skip-pkgs skip apt install of extra.list (testing only)
|
||
|
|
-h | --help show this
|
||
|
|
EOF
|
||
|
|
}
|
||
|
|
|
||
|
|
while [[ $# -gt 0 ]]; do
|
||
|
|
case "$1" in
|
||
|
|
--variant) VARIANT="$2"; shift 2;;
|
||
|
|
--hostname) HOSTNAME_OVERRIDE="$2"; shift 2;;
|
||
|
|
--skip-pkgs) SKIP_PKGS=1; shift;;
|
||
|
|
-h|--help) usage; exit 0;;
|
||
|
|
*) echo "Unknown arg: $1" >&2; usage; exit 1;;
|
||
|
|
esac
|
||
|
|
done
|
||
|
|
|
||
|
|
[[ -n "$VARIANT" ]] || { echo "ERR: --variant required" >&2; usage; exit 1; }
|
||
|
|
VARIANT_FILE="$SCRIPT_DIR/variants/$VARIANT.cfg"
|
||
|
|
[[ -f "$VARIANT_FILE" ]] || { echo "ERR: variant not found: $VARIANT_FILE" >&2; exit 1; }
|
||
|
|
|
||
|
|
# Source variant config
|
||
|
|
# shellcheck source=/dev/null
|
||
|
|
source "$VARIANT_FILE"
|
||
|
|
|
||
|
|
echo "[install] variant=$VARIANT"
|
||
|
|
echo "[install] grub_params=$GRUB_PARAMS"
|
||
|
|
echo "[install] post-install scripts: ${POST_INSTALL_SCRIPTS[*]}"
|
||
|
|
|
||
|
|
# Set hostname if requested
|
||
|
|
if [[ -n "$HOSTNAME_OVERRIDE" ]]; then
|
||
|
|
echo "[install] setting hostname to $HOSTNAME_OVERRIDE"
|
||
|
|
hostnamectl set-hostname "$HOSTNAME_OVERRIDE"
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Stage payload like the chroot install would see it
|
||
|
|
PAYLOAD=/tmp/s8n-payload
|
||
|
|
rm -rf "$PAYLOAD"
|
||
|
|
mkdir -p "$PAYLOAD/post-install" "$PAYLOAD/packages"
|
||
|
|
cp "$SCRIPT_DIR/shared/packages/$PACKAGES_LIST" "$PAYLOAD/packages/extra.list"
|
||
|
|
for s in "${POST_INSTALL_SCRIPTS[@]}"; do
|
||
|
|
cp "$SCRIPT_DIR/shared/post-install/$s" "$PAYLOAD/post-install/$s"
|
||
|
|
chmod +x "$PAYLOAD/post-install/$s"
|
||
|
|
done
|
||
|
|
|
||
|
|
# Persist GRUB cmdline additions (for future kernel updates)
|
||
|
|
GRUB_FILE=/etc/default/grub
|
||
|
|
if [[ -f "$GRUB_FILE" && -n "$GRUB_PARAMS" ]]; then
|
||
|
|
echo "[install] persisting GRUB params: $GRUB_PARAMS"
|
||
|
|
# Strip any already-present tokens to avoid duplication
|
||
|
|
CURRENT=$(grep -E '^GRUB_CMDLINE_LINUX_DEFAULT=' "$GRUB_FILE" | sed -E 's/.*"(.*)"/\1/')
|
||
|
|
NEW="$CURRENT"
|
||
|
|
for tok in $GRUB_PARAMS; do
|
||
|
|
if ! grep -qF -- "$tok" <<<"$NEW"; then
|
||
|
|
NEW="$NEW $tok"
|
||
|
|
fi
|
||
|
|
done
|
||
|
|
NEW="$(echo "$NEW" | sed -E 's/ +/ /g; s/^ //; s/ $//')"
|
||
|
|
sed -i "s|^GRUB_CMDLINE_LINUX_DEFAULT=.*|GRUB_CMDLINE_LINUX_DEFAULT=\"$NEW\"|" "$GRUB_FILE"
|
||
|
|
command -v update-grub >/dev/null && update-grub || true
|
||
|
|
fi
|
||
|
|
|
||
|
|
# Run scripts in order. Skip pkg-install step if --skip-pkgs.
|
||
|
|
LOG=/var/log/s8n-install.log
|
||
|
|
echo "[install] log -> $LOG"
|
||
|
|
{
|
||
|
|
echo "==== s8n install start: $(date -u +%FT%TZ) variant=$VARIANT"
|
||
|
|
for s in "${POST_INSTALL_SCRIPTS[@]}"; do
|
||
|
|
SCRIPT_PATH="$PAYLOAD/post-install/$s"
|
||
|
|
if [[ "$SKIP_PKGS" -eq 1 && "$s" == "00-base.sh" ]]; then
|
||
|
|
echo "==== SKIP $s (--skip-pkgs)"
|
||
|
|
continue
|
||
|
|
fi
|
||
|
|
echo "==== RUN $s"
|
||
|
|
/bin/sh "$SCRIPT_PATH" || echo "==== WARN $s exited $?"
|
||
|
|
done
|
||
|
|
echo "==== s8n install done: $(date -u +%FT%TZ)"
|
||
|
|
} 2>&1 | tee -a "$LOG"
|
||
|
|
|
||
|
|
echo
|
||
|
|
echo "[install] DONE. Reboot if scripts touched modprobe / GRUB / kernel modules."
|