diff --git a/shell.nix b/shell.nix index 5e17da8..60a2fba 100644 --- a/shell.nix +++ b/shell.nix @@ -91,13 +91,83 @@ pkgs.mkShell { } echo "Tpm Key files shreded." } + deployparallel() { + echo "Deploying to all nodes in parallel..." + echo "" + + local nodes=($(grep -E '^[[:space:]]*[a-zA-Z0-9_-]+-[a-zA-Z0-9_-]+-[a-zA-Z0-9_-]+-[a-zA-Z0-9_-]+[[:space:]]*=' nodes.nix | \ + sed 's/^[[:space:]]*//; s/[[:space:]]*=.*//' | \ + grep -v '^#')) + + if [ ${"\${#nodes[@]}"} -eq 0 ]; then + echo "No nodes found in nodes.nix" + return 1 + fi + + echo "Found ${"\${#nodes[@]}"} nodes:" + for node in "${"\${nodes[@]}"}"; do + echo " - $node" + done + echo "" + + read -p "Deploy to all these nodes? (yes/no): " confirm + if [ "$confirm" != "yes" ]; then + echo "Deployment cancelled." + return 0 + fi + + echo "Starting parallel deployment..." + echo "============================================" + + local tmpdir=$(mktemp -d) + local pids=() + + for node in "${"\${nodes[@]}"}"; do + { + echo "[$node] Starting deployment..." + deploy -s ".#$node" 2>&1 | while IFS= read -r line; do + echo "[$node] $line" + done + echo "[$node] Deployment finished" + } > "$tmpdir/$node.log" 2>&1 & + pids+=($!) + done + + while [ ${"\${#pids[@]}"} -gt 0 ]; do + for i in "${"\${!pids[@]}"}"; do + local pid=${"\${pids[i]}"} + local node=${"\${nodes[i]}"} + + if ! kill -0 "$pid" 2>/dev/null; then + # Process finished, display its output + if [ -f "$tmpdir/$node.log" ]; then + cat "$tmpdir/$node.log" + fi + unset 'pids[i]' + unset 'nodes[i]' + fi + done + + pids=(${"\${pids[@]}"}) + nodes=(${"\${nodes[@]}"}) + + sleep 1 + done + + echo "============================================" + echo "All deployments completed" + + rm -rf "$tmpdir" + } export -f rungcall export -f runrebootall export -f getallhk export -f genwgkey + export -f deployparallel echo "Welcome to Federez-LaSuite network deploy-rs shell environment!" + echo "Available helper functions: rungcall, runrebootall, getallhk, genwgkey, deployparallel" ''; }