summaryrefslogtreecommitdiff
path: root/scripts/install.sh
blob: 9173646a708f913d35031895b57737eec639a7ac (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
89
90
91
92
93
94
95
96
97
98
99
100
101
#!/usr/bin/env bash
set -euo pipefail

# --- Defaults ---
HOSTNAME=""
MAIN_DISK="/dev/nvme0n1"
STORAGE_DISK=""
REPO_URL="https://codeberg.org/adikro/nixos-config.git"
TEMP_CONFIG="/tmp/config/etc/nixos-config"
USE_FACTER=true
WRITE_EFI=true

# --- Parse Arguments ---
# Added 'g' (generate-config) and 'n' (no-efi) to options
PARSED_ARGS=$(getopt -z -o h:m:s:r:c:gn --long hostname:,main:,storage:,repo:,config:,generate-config,no-efi -- "$@")
eval set -- "$PARSED_ARGS"

while true; do
    case "$1" in
        -h|--hostname)        HOSTNAME="$2"; shift 2 ;;
        -m|--main)            MAIN_DISK="$2"; shift 2 ;;
        -s|--storage)         STORAGE_DISK="$2"; shift 2 ;;
        -r|--repo)            REPO_URL="$2"; shift 2 ;;
        -c|--config)          TEMP_CONFIG="$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" || -z "$MAIN_DISK" ]]; then
    echo "Usage: sudo ./install.sh --hostname <name> [options]"
    echo "Options: --main <disk> --storage <disk> --repo <url> --config <path> --generate-config --no-efi"
    exit 1
fi

# --- Summary & Confirmation ---
echo "------------------------------------------------------------"
echo "INSTALLATION PLAN"
echo "  Hostname:      $HOSTNAME"
echo "  Main Disk:     $MAIN_DISK"
echo "  Storage Disk:  ${STORAGE_DISK:-None}"
echo "  Hardware Mode: $([ "$USE_FACTER" = true ] && echo "Facter" || echo "Legacy Generate-Config")"
echo "  Write EFI:     $WRITE_EFI"
echo "  Repo URL:      $REPO_URL"
echo "------------------------------------------------------------"
read -p "Proceed with formatting? (y/N): " confirm
[[ "$confirm" != [yY] ]] && exit 1

echo "### 1. Preparing GPG ###"
gpg --import ./private.asc || echo "GPG key already present."

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

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

if [ "$USE_FACTER" = true ]; then
    echo "Running Facter scan..."
    # Note: Using your specified format for the command
    sudo nix run github:nix-community/nixos-facter -- -o "./hosts/$HOSTNAME/facter.json"
    git add "./hosts/$HOSTNAME/facter.json"
else
    echo "Generating legacy hardware config..."
    sudo nixos-generate-config --no-filesystems --root /tmp/nixos-gen-root
    sudo mv /tmp/nixos-gen-root/etc/nixos/hardware-configuration.nix "./hosts/$HOSTNAME/hardware-configuration.nix"
    sudo rm -rf /tmp/nixos-gen-root
    git add "./hosts/$HOSTNAME/hardware-configuration.nix"
fi

echo "### 4. SOPS Key Extraction ###"
if [[ -n "$STORAGE_DISK" ]]; then
    echo "Extracting storage_key..."
    nix shell nixpkgs#sops -c sops -d --extract '["storage_key"]' secrets.yaml > /tmp/storage.key
fi

echo "### 5. Disko Install ###"
DISKO_ARGS=(
    --flake ".#$HOSTNAME"
    --disk main "$MAIN_DISK"
)

# Conditionally add the EFI flag
if [ "$WRITE_EFI" = true ]; then
    DISKO_ARGS+=(--write-efi-boot-entries)
fi

# Append storage disk if defined
if [[ -n "$STORAGE_DISK" ]]; then
    DISKO_ARGS+=(--disk storage "$STORAGE_DISK")
fi

sudo nix run 'github:nix-community/disko/latest#disko-install' -- "${DISKO_ARGS[@]}"

echo "------------------------------------------------------------"
echo "INSTALL COMPLETE. Remove pendrive and reboot."