#!/usr/bin/env nix-shell #!nix-shell -i bash -p jp # # Tell all servers belonging to a certain grid that they should update # themselves to the latest configuration associated with that grid. # set -euxo pipefail # Get the path to the ssh key which authorizes us to deliver this # notification. DEPLOY_KEY=$1 shift # Get the name of the grid to which we're going to deliver notification. This # corresponds to the name of one of the directories in the top-level `morph` # directory. GRIDNAME=$1 shift # Tell one server to update itself. update_one_node() { deploy_key=$1 shift node=$1 shift ssh -i "${deploy_key}" "deployment@${node}" } # Tell all servers belonging to one grid to update themselves. update_grid_nodes() { deploy_key=$1 shift gridname=$1 shift case "$gridname" in "production") grid_dir=./morph/grid/production domain=private.storage ;; "staging") grid_dir=./morph/grid/testing domain=privatestorage-staging.com ;; *) echo "Unknown grid: ${gridname}" exit 1 esac # Find the names of all hosts that belong to this grid. This list includes # one extra string, "network", which is morph configuration stuff and we need # to filter out later. nodes=$(nix eval --json "(builtins.concatStringsSep \" \" (builtins.attrNames (import $grid_dir/grid.nix)))" | jp --unquoted @) # Tell every server in the network to update itself. for node in ${nodes}; do if [ "${node}" = "network" ]; then # This isn't a server, it's part of the morph configuration. continue fi update_one_node "${deploy_key}" "${node}.${domain}" done } update_grid_nodes "${DEPLOY_KEY}" "${GRIDNAME}"