#!/bin/bash # update-all version #VERSION# # updates all clients defined in #ETCDIR#/update-all.conf via local versions of update-me . #ETCDIR#/update-all.conf usage() { >&2 printf 'usage:\n' >&2 printf ' %s\n' "${0##*/}" >&2 printf ' %s -c\n' "${0##*/}" >&2 printf ' %s $id $tmpdir [cs]\n' "${0##*/}" exit 1 } if [ "$#" -eq 3 ]; then system="${systems["$1"]}" if [ "${system}" == "localhost" ] then cmd="" else cmd="ssh -t -t ${system}" fi cmd="${cmd} update-me" case "$3" in 'c') delay=1 while sleep ${delay}; do ${cmd} -c "$2/$1" fi ;; *) usage ;; esac exit ${err} fi if [ "$#" -eq 1 ] \ && [ "x$1" = 'x-c' ]; then for system in "${!systems[@]}"; do screen -S update-clear-all -d -m "${0}" "${system}" "${tmp_dir}" 'c' done exit fi if [ "$#" -ne 0 ]; then usage 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 "${0}" "${system}" "${tmp_dir}" 's' else urxvt -title "${systems["${system}"]}: update-me" -e "${0}" "${system}" "${tmp_dir}" 's' & pids+=($!) fi screen -S update-clear-all -d -m "${0}" "${system}" "${tmp_dir}" 'c' done if [ -z "${DISPLAY}" ]; then sleep 1 pids=( $( screen -list \ | sed ' s/^\s\+\([0-9]\+\)\.update-all\s.*$/\1/ t d ' ) ) fi while [ -n "${pids[*]}" ]; do if [ -z "${DISPLAY}" ]; then for pid in "${pids[@]}"; do if ! [ -d "/proc/${pid}" ]; then continue fi npids+=("${pid}") screen -r "${pid}" done pids=("${npids[@]}") else sleep 1 fi pids=( $( for pid in "${pids[@]}"; do if [ -d "/proc/${pid}" ]; then printf '%s\n' "${pid}" fi done ) ) done ls "${tmp_dir}" \ | while read -r system; do err=$( cat "${tmp_dir}/${system}" ) if [ "${err}" -ne 0 ]; then printf 'update-me on "%s" failed: %s\n' \ "${systems["${system}"]}" \ "${err}" fi done exit $( find "${tmp_dir}" -type f \ -exec grep -lxFv '0' {} + \ | wc -l )