saturnin-push 2.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. #!/bin/bash
  2. . <(ffoom init)
  3. ffoo import core
  4. ffoo import recon
  5. ORDER="$(saturnin-ini -p push.options.order)"
  6. while true; do case $1 in
  7. -o|--order) ORDER=$2; shift 2; ;;
  8. -h|--help) usage; ;;
  9. "") break ;;
  10. -*) usage; ;;
  11. *) hosts="$1"; shift; ;;
  12. esac done
  13. test -n "$hosts" || hosts=$(saturnin-ini -s push.hosts | debug_pipe ini_hosts)
  14. debug -v hosts
  15. test -n "$hosts" || die "no valid hosts to begin with"
  16. paths=$(saturnin-ini -s push.paths)
  17. test -n "$paths" || die "no valid paths to begin with"
  18. think "Probing & sorting paths"
  19. paths=$(echo "$paths" \
  20. | expand_tilde \
  21. | filter test -e \
  22. | sort_paths_by_age \
  23. | debug_pipe ok_paths
  24. )
  25. test -n "$paths" || die "no valid paths"
  26. think "Probing hosts"
  27. hosts=$(echo "$hosts" | filter_hosts -s | debug_pipe ok_hosts )
  28. test -n "$hosts" || die "no valid hosts"
  29. test "$(wc -l <<<"$paths")" == 1 && ORDER="path:host"
  30. test "$(wc -l <<<"$hosts")" == 1 && ORDER="host:path"
  31. think "Pushing (${ORDER/:/, then })..."
  32. debug -v "paths:hosts"
  33. case "$ORDER" in
  34. "path:host")
  35. for path in $paths;
  36. do
  37. for host in $hosts;
  38. do
  39. if rsync -L -r --delete $path $host:
  40. then
  41. think $(collapse_tilde <<<"$path") sent to $host
  42. fi
  43. done
  44. done
  45. ;;
  46. "host:path")
  47. for host in $hosts;
  48. do
  49. for path in $paths;
  50. do
  51. if rsync -L -r --delete $path $host:
  52. then
  53. think $host got $path
  54. fi
  55. done
  56. done
  57. ;;
  58. *)
  59. die "unknown push order: '$ORDER'"
  60. ;;
  61. esac
  62. for host in $hosts;
  63. do
  64. saturnin-ini -s push.commands \
  65. | grep . \
  66. | while read cmd;
  67. do
  68. think "ssh $host -- $cmd"
  69. ssh -n $host -- "$cmd" > /dev/null
  70. done
  71. done