#!/usr/bin/env bash #### Environment FLAKE_ROOT="$(git rev-parse --show-toplevel)" export PROFILE="" case "${1:-''}" in vm | physical) PROFILE="system-$1" ;; *) echo "🛑 Error: Please use 'vm' or 'physical' as first parameter." exit 1 ;; esac HOSTS=$(nix eval --raw "$FLAKE_ROOT"#deploy.nodes --apply " nodes: let inherit (builtins) attrNames filter concatStringsSep; names = attrNames nodes; profile = \"$PROFILE\"; filteredNames = filter (name: nodes.\${name}.profiles ? \${profile}) names; in concatStringsSep \"\\n\" filteredNames ") #### Helpers retry() { local -r -i max_attempts="$1" shift local -i attempt_num=1 until "$@"; do if ((attempt_num == max_attempts)); then echo "⚠️ Warning: Attempt $attempt_num failed and there are no more attempts left!" return 1 else echo "⚠️ Attempt $attempt_num failed! Trying again in $attempt_num seconds..." sleep $((attempt_num++)) fi done } #### Execution for HOST in $HOSTS; do retry 3 deploy --skip-checks --targets "${FLAKE_ROOT}#${HOST}.${PROFILE}" done