| #!/bin/sh |
| # |
| # Upgrade multiple bruno devices at once. Returns 0 if they were all |
| # successful. |
| # |
| mydir=$(dirname "$0") |
| imgfile=$1 |
| imgbase=$(basename "$imgfile" .gi) |
| shift |
| hosts="$*" |
| |
| log() |
| { |
| printf '\x1b[1m%s\x1b[m\n' "$*" >&2 |
| } |
| |
| |
| die() |
| { |
| log "FAILED" |
| exit 1 |
| } |
| |
| |
| run() |
| { |
| "$mydir/run" $hosts -- "$@" || die |
| } |
| |
| |
| if [ ! -e "$imgfile" ] || [ -z "$hosts" ]; then |
| log "Usage: $0 <filename.gi> [hostnames...]" |
| exit 1 |
| fi |
| |
| log "Checking running versions..." |
| versions=$(run ssh root@\$ip cat /etc/version) || die |
| echo "$versions" |
| newhosts=$( |
| echo "$versions" | |
| while IFS=': ' read name version; do |
| if [ "$version" != "$imgbase" ]; then |
| echo "$name" |
| else |
| log "'$name' is up to date; skipping." |
| fi |
| done |
| ) |
| if [ -z "$newhosts" ]; then |
| log "No upgrades needed." |
| exit 0 |
| fi |
| log "Will upgrade:" $newhosts |
| hosts=$newhosts |
| |
| log "Copying image files..." |
| imgfile=$imgfile run 'scp "$imgfile" root@$ip:/tmp/img.gi && echo ok' |
| |
| log "Installing..." |
| run 'ssh root@$ip ginstall -t /tmp/img.gi -p other && echo ok' |
| |
| log "Rebooting..." |
| run ssh root@\$ip '(sleep 2; reboot) &' |
| sleep 5 |
| |
| log "Waiting for hosts to come back up..." |
| run ' |
| for i in $(seq 5 5 90); do |
| if ping -c1 -w5 $ip >/dev/null; then |
| echo "ok!" |
| sleep 5 |
| exit 0 |
| fi |
| done |
| exit 1 |
| ' |
| |
| log "Checking running versions (expect: $imgbase)..." |
| versions=$(run ssh root@\$ip cat /etc/version) || die |
| echo "$versions" |
| echo "$versions" | ( |
| rv=0 |
| while IFS=': ' read name version; do |
| if [ "$version" != "$imgbase" ]; then |
| log "$name: failed to upgrade!" |
| rv=1 |
| fi |
| done |
| exit $rv |
| ) || die |