eepush.in 2.2KB

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