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