From a5308a7ee58a533f5f01bfe4d69f239836c6d7ed Mon Sep 17 00:00:00 2001 From: beatzaplenty Date: Wed, 29 Jul 2026 13:58:45 +1000 Subject: [PATCH] fix(gc-hosts): use pct/qm list output directly as hostnames The flake hostname map approach was wrong: create-proxmox-resource.sh names every guest after its NixOS hostname (pct create --hostname , qm create --name ), so pct/qm list already output the final hostname directly. Looking those names up in a map keyed by flake target names (lxc-docker, proxmox-server, ...) found nothing and the dynamic list was always empty. Drop the flake eval entirely; use the pct/qm list output as-is, filtering only nix-cache and already-seen entries. Co-Authored-By: Claude Sonnet 4.6 --- scripts/gc-hosts.sh | 42 ++++++++++++++++-------------------------- 1 file changed, 16 insertions(+), 26 deletions(-) diff --git a/scripts/gc-hosts.sh b/scripts/gc-hosts.sh index e884ad9..2538263 100755 --- a/scripts/gc-hosts.sh +++ b/scripts/gc-hosts.sh @@ -23,7 +23,6 @@ set -euo pipefail cd "$(dirname "$0")/.." source scripts/env.sh 2>/dev/null || true -source scripts/lib/nix-eval.sh 2>/dev/null || true # ── config ──────────────────────────────────────────────────────────────────── @@ -71,42 +70,33 @@ _add_host "nixos" "${NIXOS_USER}@nixos" "nixos" _add_host "pve1" "${PVE1_SSH_USER}@${PVE1_HOST}" "nix" # 3. Dynamically discover running NixOS guests on pve1 +# +# create-proxmox-resource.sh names every guest after its NixOS hostname: +# pct create ... --hostname (LXC) +# qm create ... --name (VM) +# So pct list / qm list output already contains the NixOS hostname directly — +# no flake eval or name translation needed. echo "Discovering running guests on ${PVE1_HOST}..." -# Evaluate the full flake hostname map in one shot. -hostname_map="{}" -if ! hostname_map="$( - nix eval --json "${NIX_EVAL_FLAGS[@]}" .#nixosConfigurations \ - --apply 'cfgs: builtins.mapAttrs (_: cfg: cfg.config.networking.hostName) cfgs' \ - 2>/dev/null -)"; then - echo " warning: flake eval failed — skipping dynamic host discovery" >&2 -fi - # SSH_QUERY_OPTS (no BatchMode) so sudo can prompt if wayne's sudo needs a password. if ssh "${SSH_QUERY_OPTS[@]}" "${PVE1_SSH_USER}@${PVE1_HOST}" "true" 2>/dev/null; then running_guests="$( - ssh "${SSH_QUERY_OPTS[@]}" "${PVE1_SSH_USER}@${PVE1_HOST}" bash <<'REMOTE' - { sudo pct list 2>/dev/null | awk 'NR>1 && $2=="running" { print $NF }'; - sudo qm list 2>/dev/null | awk 'NR>1 && $3=="running" { print $2 }'; } | sort -u -REMOTE + ssh "${SSH_QUERY_OPTS[@]}" "${PVE1_SSH_USER}@${PVE1_HOST}" bash -s <<'DISCOVER' +sudo pct list 2>/dev/null | awk 'NR>1 && $2=="running" { print $NF }' +sudo qm list 2>/dev/null | awk 'NR>1 && $3=="running" { print $2 }' +DISCOVER )" || running_guests="" - while IFS= read -r guest; do - [[ -z "$guest" ]] && continue - - # Resolve flake target name → NixOS hostname. - hostname="$(printf '%s' "$hostname_map" \ - | jq -r --arg g "$guest" '.[$g] // empty' 2>/dev/null || true)" + while IFS= read -r hostname; do [[ -z "$hostname" ]] && continue - - # Exclude nix-cache and any hostname already in the list. - case "$hostname" in nix-cache) continue ;; esac + # Exclude nix-cache. + case "$hostname" in *nix-cache*) continue ;; esac + # Skip if already in the list (e.g. a proxmox-gui guest whose hostname is nixos). if [[ -n "${_SEEN_HOSTNAMES[$hostname]+_}" ]]; then continue; fi - echo " + $guest → $hostname" + echo " + $hostname" _add_host "$hostname" "${NIXOS_USER}@${hostname}" "nixos" - done <<< "$running_guests" + done <<< "$(echo "$running_guests" | sort -u)" else echo " warning: ${PVE1_HOST} unreachable — skipping dynamic host discovery" >&2 fi -- 2.54.0