production-deb/install.sh

120 lines
3.8 KiB
Bash
Raw Normal View History

#!/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."