fix(gc-hosts): use pct/qm list output directly as hostnames #106

Merged
beatzaplenty merged 1 commits from worktree-crispy-churning-kernighan into main 2026-07-29 04:02:51 +00:00
Showing only changes of commit a5308a7ee5 - Show all commits
+16 -26
View File
@@ -23,7 +23,6 @@
set -euo pipefail set -euo pipefail
cd "$(dirname "$0")/.." cd "$(dirname "$0")/.."
source scripts/env.sh 2>/dev/null || true source scripts/env.sh 2>/dev/null || true
source scripts/lib/nix-eval.sh 2>/dev/null || true
# ── config ──────────────────────────────────────────────────────────────────── # ── config ────────────────────────────────────────────────────────────────────
@@ -71,42 +70,33 @@ _add_host "nixos" "${NIXOS_USER}@nixos" "nixos"
_add_host "pve1" "${PVE1_SSH_USER}@${PVE1_HOST}" "nix" _add_host "pve1" "${PVE1_SSH_USER}@${PVE1_HOST}" "nix"
# 3. Dynamically discover running NixOS guests on pve1 # 3. Dynamically discover running NixOS guests on pve1
#
# create-proxmox-resource.sh names every guest after its NixOS hostname:
# pct create ... --hostname <nixos-hostname> (LXC)
# qm create ... --name <nixos-hostname> (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}..." 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. # 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 if ssh "${SSH_QUERY_OPTS[@]}" "${PVE1_SSH_USER}@${PVE1_HOST}" "true" 2>/dev/null; then
running_guests="$( running_guests="$(
ssh "${SSH_QUERY_OPTS[@]}" "${PVE1_SSH_USER}@${PVE1_HOST}" bash <<'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 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 sudo qm list 2>/dev/null | awk 'NR>1 && $3=="running" { print $2 }'
REMOTE DISCOVER
)" || running_guests="" )" || running_guests=""
while IFS= read -r guest; do while IFS= read -r hostname; 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)"
[[ -z "$hostname" ]] && continue [[ -z "$hostname" ]] && continue
# Exclude nix-cache.
# Exclude nix-cache and any hostname already in the list. case "$hostname" in *nix-cache*) continue ;; esac
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 if [[ -n "${_SEEN_HOSTNAMES[$hostname]+_}" ]]; then continue; fi
echo " + $guest$hostname" echo " + $hostname"
_add_host "$hostname" "${NIXOS_USER}@${hostname}" "nixos" _add_host "$hostname" "${NIXOS_USER}@${hostname}" "nixos"
done <<< "$running_guests" done <<< "$(echo "$running_guests" | sort -u)"
else else
echo " warning: ${PVE1_HOST} unreachable — skipping dynamic host discovery" >&2 echo " warning: ${PVE1_HOST} unreachable — skipping dynamic host discovery" >&2
fi fi