#!/usr/bin/env bash # Create a new host from a template FLAKE_DIR="." TEMPLATE="" HOSTNAME="" SYSTEM="" SEPARATOR="________________________________________" usage() { cat <&2 exit 1 } while [[ $# -gt 0 ]]; do case "$1" in -t|--template) TEMPLATE="$2"; shift 2 ;; -n|--hostname) HOSTNAME="$2"; shift 2 ;; -s|--system) SYSTEM="$2"; shift 2 ;; -f|--flake) FLAKE_DIR="$2"; shift 2 ;; -h|--help) usage; exit 0 ;; *) error "Unknown option: $1" ;; esac done # Validate [[ -z "$TEMPLATE" ]] && error "Template is required (-t)" [[ -z "$HOSTNAME" ]] && error "Hostname is required (-n)" TEMPLATE_DIR="$FLAKE_DIR/templates/$TEMPLATE" HOST_DIR="$FLAKE_DIR/hosts/$HOSTNAME" [[ ! -d "$TEMPLATE_DIR" ]] && error "Template '$TEMPLATE' not found in $TEMPLATE_DIR" [[ -d "$HOST_DIR" ]] && error "Host '$HOSTNAME' already exists in $HOST_DIR" # Derive system from template if not specified if [[ -z "$SYSTEM" ]]; then case "$TEMPLATE" in generic-server) SYSTEM="x86_64-linux" ;; raspberry-pi) SYSTEM="aarch64-linux" ;; *) error "Cannot derive system for template '$TEMPLATE'. Use -s to specify." ;; esac fi echo "$SEPARATOR" echo "Creating host '$HOSTNAME' from template '$TEMPLATE'" echo " System: $SYSTEM" echo " Target: $HOST_DIR" echo "$SEPARATOR" # Copy template cp -r "$TEMPLATE_DIR" "$HOST_DIR" # Remove template flake.nix (not needed in host dir) rm -f "$HOST_DIR/flake.nix" # Replace hostname in networking.nix sed -i "s/networking.hostName = \".*\"/networking.hostName = \"$HOSTNAME\"/" "$HOST_DIR/networking.nix" # Create empty secrets.yaml placeholder touch "$HOST_DIR/secrets.yaml" # Add to git git -C "$FLAKE_DIR" add "$HOST_DIR" echo "$SEPARATOR" echo "Host '$HOSTNAME' created successfully." echo "" echo "Next steps:" echo " 1. Add to flake.nix:" echo "" echo " $HOSTNAME = mkNixosConfiguration \"$SYSTEM\" [ ./hosts/$HOSTNAME ];" echo "" echo " 2. Update hardware.nix and disks.sh for your hardware" echo " 3. Update .sops.yaml with creation rules for hosts/$HOSTNAME/secrets.yaml" echo " 4. Follow the first-install guide: docs/getting-started/first-install.md"