#!/bin/zsh source "$HOME/.config/wryn/env.zsh" RELOAD_ZSH_UTILS ##################################################################### SESSION='update' LOCAL_HOST="$(hostnamectl --static)" UPDATE_REMINDER="{ echo \\UPDATE : an error occured - you may want to stop execution of 'update-all-servers' on $LOCAL_HOST\\\"; read; }" CHECK_SESSION() { tmux list-sessions >/dev/null 2>&1 \ | grep -q "^$SESSION" && return 0 || return 1 } UPDATE_ALL() { __STATUS "starting '$@'" for SERVER in $(echo $SERVER_LIST); do UPDATE $SERVER "$@"; done WAIT_FOR_UPDATES \ && __SUCCESS "'$@' finished across all servers" \ || __FAIL 69 'user abort' \ ; } UPDATE() { local SERVER_HOST="$1" local COMMAND="${@:2} || $UPDATE_REMINDER" [[ $2 =~ ^reboot ]] && [[ $SERVER_HOST =~ $LOCAL_HOST ]] && return 0 [[ $SERVER_HOST =~ $LOCAL_HOST ]] || { COMMAND="ssh -t $SERVER_HOST.lan 'source ~/.zshrc >/dev/null 2>&1; $COMMAND'" } tmux new-window -t $SESSION -n $SERVER_HOST "source ~/.zshrc >/dev/null 2>&1; $COMMAND" } WAIT_FOR_UPDATES() { while [[ $(tmux list-windows -t $SESSION 2>/dev/null | wc -l) -gt 1 ]] do sleep 1 done CHECK_SESSION } ##################################################################### CURRENT_SESSION=$(\ tmux list-panes -a -F '#{pane_tty} #{session_name}' \ | grep $(tty) \ | awk '{print $2;}' \ ) ##################################################################### CHECK_SESSION && __FAIL 1 'update currently in progress' tmux new -d -s $SESSION "echo 'updating all systems'; echo '(leave this window open)'; while true; do sleep 30; done" __yN 'after update, do you want to reboot all machines?' && REBOOT=1 || REBOOT=0 __REMINDER __REMINDER 'manual action is required; (in another tab) connect to tmux:' __REMINDER "tmux a -t $SESSION" __REMINDER __REMINDER 'to stop the update at any time, run:' __REMINDER "tmux kill-session -t $SESSION" __REMINDER [ $CURRENT_SESSION ] && { __SUCCESS 'currently in a tmux session; opening new window...' tmux new-window -t $CURRENT_SESSION "unset TMUX; tmux a -t $SESSION" } SERVER_LIST=$( ls "$DOTWRYN/config/scwrypts/env/" \ | sed 's/^local//; s/^\.//' \ | grep . \ ) UPDATE_ALL 'yay -Syu' UPDATE_ALL 'cd ~/.wryn; git pull --autostash' UPDATE_ALL '~/.wryn/bin/scwrypts config update' UPDATE_ALL '~/.wryn/bin/scwrypts media push' UPDATE_ALL '~/.wryn/bin/scwrypts media pull' [[ $REBOOT -eq 1 ]] && UPDATE_ALL 'reboot || sudo reboot' tmux kill-session -t $SESSION >/dev/null 2>&1 CHECK_SESSION && __WARNING "unable to close tmux session '$SESSION'" __SUCCESS __SUCCESS 'finished system update accross all servers' __SUCCESS [[ $REBOOT -eq 1 ]] && { __STATUS 'rebooting host machine'; sleep 3; reboot || sudo reboot; }