blob: 906aac72bba45ef1402b5f23192e757ef71ff908 [file] [log] [blame]
#!/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