#!/bin/sh # Installs a rollcall binary the rack controller staged (rollcall-rack-update.path). # The rack checked the region's checksum and the binary's version; this checks # them again, keeps the running binary as .prev, restarts the rack and puts the # previous binary back if the rack does not register with the region in 60 s. set -u D=/var/lib/rollcall/update BIN=/usr/local/bin/rollcall [ -f "$D/ready" ] || exit 0 want=$(cat "$D/ready"); rm -f "$D/ready" cd "$D" || exit 1 result() { echo "$(date -Is) $*" > "$D/last-result"; echo "$*"; } sha256sum -c rollcall.new.sha256 >/dev/null 2>&1 || { result "$want: checksum mismatch, not installed"; exit 1; } got=$(./rollcall.new version 2>/dev/null | awk '{print $2}') [ "$got" = "$want" ] || { result "$want: binary reports '$got', not installed"; exit 1; } cur=$("$BIN" version 2>/dev/null | awk '{print $2}') cp -p "$BIN" "$BIN.prev" install -m 0755 rollcall.new "$BIN.tmp" && mv -f "$BIN.tmp" "$BIN" since=$(date +%s) systemctl restart rollcall-rack.service for _ in $(seq 1 30); do sleep 2 if journalctl -u rollcall-rack.service --since "@$since" -o cat 2>/dev/null | grep -q "^.*registered with"; then rm -f rollcall.new rollcall.new.sha256 result "updated $cur -> $want" exit 0 fi done cp -p "$BIN.prev" "$BIN.tmp" && mv -f "$BIN.tmp" "$BIN" systemctl restart rollcall-rack.service result "$want did not register within 60s; rolled back to $cur" exit 1