diff options
-rw-r--r-- | update-all.in | 58 |
1 files changed, 54 insertions, 4 deletions
diff --git a/update-all.in b/update-all.in index 9136058..7074c42 100644 --- a/update-all.in +++ b/update-all.in @@ -5,8 +5,8 @@ . #ETCDIR#/update-all.conf -for system in "${systems[@]}" -do +if [ "$#" -eq 2 ]; then + system="${systems["$1"]}" if [ "${system}" == "localhost" ] then cmd="" @@ -14,9 +14,59 @@ do cmd="ssh -t -t ${system}" fi cmd="${cmd} update-me" + ${cmd} + err=$? + if [ "${err}" -ne 0 ] \ + && [ -d "$2" ]; then + printf '%s\n' "$?" > "$2/$1" + fi + exit ${err} +fi + +if [ "$#" -ne 0 ]; then + >&2 printf 'usage:\n' + >&2 printf ' %s\n' "${0##*/}" + >&2 printf ' %s $id $tmpdir\n' "${0##*/}" + exit 1 +fi + +tmp_dir=$(mktemp -d) +trap 'rm -rf --one-file-system "${tmp_dir}"' EXIT + +pids=() + +for system in "${!systems[@]}"; do if [ -z "${DISPLAY}" ]; then - screen -S update-all -d -m ${cmd} + screen -S update-all -d -m "'$0' '${system}' '${tmp_dir}'" else - urxvt -title "${system}: update-me" -e ${cmd} & + urxvt -title "${systems["${system}"]}: update-me" -e "'$0' '${system}' '${tmp_dir}'" & + pids+=($!) fi done + +if [ -z "${DISPLAY}" ]; then + pids=$( + screen -list \ + | sed ' + s/^\s\+\([0-9]\+\)\.update-all\s.*$/\1/ + t + d + ' + ) +fi + +while kill -0 "${pids[@]}"; do + sleep 1 +done + +ls "${tmp_dir}" \ +| while read -r system; do + printf 'update-me on %s ("%s") failed\n' \ + "${system}" \ + "${systems["${system}"]}" +done + +exit $( + ls "${tmp_dir}" \ + | wc -l +) |