summaryrefslogtreecommitdiff
path: root/scripts/install.sh
blob: 8a8c3d7b16b46c6f774faa6a42b7a4cf2d002613 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#!/usr/bin/env bash
set -euo pipefail

# --- Defaults ---
HOSTNAME=""
DISKS=()
KEY_LOCATION="./private.asc"
REPO_URL="https://codeberg.org/adikro/nixos-config.git"
TEMP_CONFIG="/tmp/config/etc/nixos"
USE_FACTER=true
WRITE_EFI=true

# --- Parse Arguments ---
PARSED_ARGS=$(getopt -o h:d:r:k:gn --long hostname:,disk:,repo:,key:,generate-config,no-efi -- "$@")
eval set -- "$PARSED_ARGS"

while true; do
    case "$1" in
        -h|--hostname)        HOSTNAME="$2"; shift 2 ;;
        -d|--disk)            DISKS+=("$2"); shift 2 ;;
        -r|--repo)            REPO_URL="$2"; shift 2 ;;
        -k|--key)             KEY_LOCATION="$2"; shift 2 ;;
        -g|--generate-config) USE_FACTER=false; shift ;;
        -n|--no-efi)          WRITE_EFI=false; shift ;;
        --) shift; break ;;
        *) echo "Internal error!"; exit 1 ;;
    esac
done

# --- Validation ---
if [[ -z "$HOSTNAME" || ${#DISKS[@]} -eq 0 ]]; then
    echo "Usage: sudo nix run .#install -- -h <name> -d main:/dev/nvme0n1 [-d storage:/dev/sda]"
    exit 1
fi

if [[ ! -f "$KEY_LOCATION" ]]; then
    echo "Error: Private key not found at $KEY_LOCATION. Cannot proceed without GPG."
    exit 1
fi

# --- Summary & Confirmation ---
echo "------------------------------------------------------------"
echo "INSTALLATION PLAN"
echo "  Hostname:      $HOSTNAME"
echo "  Target Disks:"
for disk in "${DISKS[@]}"; do echo "    - $disk"; done
echo "------------------------------------------------------------"
read -p "Warning: This will format the disks listed above. Proceed? (y/N): " confirm
[[ "$confirm" != [yY] ]] && exit 1

echo "### 1. Importing GPG Key ###"
export GPG_TTY=$(tty)
gpg --import "$KEY_LOCATION"

echo "### 2. Cloning Configuration ###"
sudo rm -rf "$TEMP_CONFIG"
git clone "$REPO_URL" "$TEMP_CONFIG"
cd "$TEMP_CONFIG"

echo "### 3. Hardware Configuration ###"
HOST_DIR="./hosts/$HOSTNAME"
mkdir -p "$HOST_DIR"

if [ "$USE_FACTER" = true ]; then
    nixos-facter -o "$HOST_DIR/facter.json"
    git add "$HOST_DIR/facter.json"
else
    sudo nixos-generate-config --no-filesystems --root /tmp/nixos-gen-root
    mv /tmp/nixos-gen-root/etc/nixos/hardware-configuration.nix "$HOST_DIR/hardware-configuration.nix"
    git add "$HOST_DIR/hardware-configuration.nix"
fi

echo "### 4. SOPS Key Extraction ###"
if printf '%s\n' "${DISKS[@]}" | rg -qv "^main:"; then
    sops -d --extract '["crypt_key"]' secrets/secrets.yaml > /tmp/crypt.key
fi

echo "### 5. Disko Install ###"
DISKO_ARGS=(--flake ".#$HOSTNAME")
for pair in "${DISKS[@]}"; do
    IFS=":" read -r D_NAME D_DEV <<< "$pair"
    DISKO_ARGS+=(--disk "$D_NAME" "$D_DEV")
done
[[ "$WRITE_EFI" == true ]] && DISKO_ARGS+=(--write-efi-boot-entries)

sudo disko-install "${DISKO_ARGS[@]}"

echo "INSTALL COMPLETE. Reboot and run setup script."