#!/bin/bash . <(ffoom init) ffoo import core ffoo import recon ORDER="$(saturnin ini -p push.options.order)" usage() { usage_is "[-o|--order path:host|host:path] host..." } while true; do case $1 in -o|--order) ORDER=$2; shift 2 ;; --help) usage ;; -*) usage ;; "") break ;; *) hosts="$1"; shift ;; esac done test -n "$hosts" || hosts=$(saturnin ini -s push.hosts | debug_pipe ini_hosts) debug -v hosts test -n "$hosts" || die "no valid hosts to begin with" paths=$(saturnin ini -s push.paths) test -n "$paths" || die "no valid paths to begin with" think "Probing & sorting paths" paths=$(echo "$paths" \ | expand_tilde \ | filter test -e \ | sort_paths_by_age \ | debug_pipe ok_paths ) test -n "$paths" || die "no valid paths" think "Probing hosts" hosts=$(echo "$hosts" | filter_hosts -s | debug_pipe ok_hosts ) test -n "$hosts" || die "no valid hosts" test "$(wc -l <<<"$paths")" == 1 && ORDER="path:host" test "$(wc -l <<<"$hosts")" == 1 && ORDER="host:path" think "Pushing (${ORDER/:/, then })..." debug -v "paths:hosts" case "$ORDER" in "path:host") for path in $paths; do for host in $hosts; do if rsync -L -r --delete $path $host: then think $(collapse_tilde <<<"$path") sent to $host fi done done ;; "host:path") for host in $hosts; do for path in $paths; do if rsync -L -r --delete $path $host: then think $host got $path fi done done ;; *) die "unknown push order: '$ORDER'" ;; esac for host in $hosts; do saturnin ini -s push.commands \ | grep . \ | while read cmd; do think "ssh $host -- $cmd" ssh -n $host -- "$cmd" > /dev/null done done