Files
felhom.eu/documentation/audits/os-updates-spike-2026-10-04/scripts/g4.sh
T

32 lines
2.8 KiB
Bash

#!/bin/bash
# g4.sh <label> <docker-version> [containerd-version] — runs INSIDE 9202. Steps the engine to one exact
# version and measures: container downtime (front-door probes every 0.5 s), restarts, controller reaction.
export DEBIAN_FRONTEND=noninteractive LC_ALL=C
L=$1 V=$2 C=${3:-}
PL=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}} {{end}}' paperless-webserver | awk '{print $1}')
CT=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}} {{end}}' felhom-controller | awk '{print $1}')
echo "### $L: -> docker $V ${C:+containerd $C} live-restore=$(docker info -f '{{.LiveRestoreEnabled}}' 2>/dev/null) from $(docker version -f '{{.Server.Version}}' 2>/dev/null)"
before=$(for c in $(docker ps -q); do docker inspect -f '{{.Name}}={{.State.StartedAt}}' $c; done | sort)
( while [ ! -f /tmp/g4-stop ]; do
p=$(curl -s -o /dev/null -m 1 -w '%{http_code}' http://$PL:8000/ 2>/dev/null)
k=$(curl -s -o /dev/null -m 1 -w '%{http_code}' http://$CT:8080/api/health 2>/dev/null)
echo "$(date +%s.%N) $p $k"; sleep 0.5; done ) > /tmp/g4-probe-$L.txt &
PP=$!
sleep 3
T0=$(date +%s.%N)
pk="docker-ce=5:$V-1~debian.13~trixie docker-ce-cli=5:$V-1~debian.13~trixie docker-ce-rootless-extras=5:$V-1~debian.13~trixie"
[ -n "$C" ] && pk="$pk containerd.io=$C-1~debian.13~trixie"
apt-get install -y -q --allow-downgrades -o Dpkg::Options::=--force-confold $pk > /tmp/g4-apt-$L.log 2>&1
echo "apt_rc=$? apt_seconds=$(awk -v a=$T0 -v b=$(date +%s.%N) 'BEGIN{printf "%.1f", b-a}')"
for i in $(seq 1 120); do
h=$(docker inspect -f '{{if .State.Health}}{{.State.Health.Status}}{{else}}{{.State.Status}}{{end}}' felhom-controller paperless-webserver paperless-postgres paperless-redis filebrowser traefik 2>/dev/null | sort -u | tr '\n' ' ')
case "$h" in "healthy running "|"healthy ") break;; esac; sleep 1; done
echo "all healthy at +$(awk -v a=$T0 -v b=$(date +%s.%N) 'BEGIN{printf "%.1f", b-a}')s ($h)"
sleep 3; touch /tmp/g4-stop; wait $PP; rm -f /tmp/g4-stop
echo "server now $(docker version -f '{{.Server.Version}}') containerd $(dpkg-query -W -f='${Version}' containerd.io)"
awk -v t0=$T0 '{ if ($2=="000") pd+=0.5; if ($3=="000") kd+=0.5; if ($2=="000" && !pf) pf=$1-t0; if ($2!="000" && pd>0 && !pl) pl=$1-t0 } END { printf "paperless front door: %.1fs NO ANSWER (first at +%.1fs, back by +%.1fs); controller: %.1fs NO ANSWER\n", pd, pf, pl, kd }' /tmp/g4-probe-$L.txt
after=$(for c in $(docker ps -aq); do docker inspect -f '{{.Name}}={{.State.StartedAt}}' $c; done | sort)
echo "containers restarted: $(diff <(echo "$before") <(echo "$after") | grep -c '^>') of $(echo "$before" | wc -l)"
echo "controller log since step (warnings/errors/boot):"
docker logs --since "$(date -u -d @${T0%.*} +%FT%TZ)" felhom-controller 2>&1 | grep -E "\[(WARN|ERROR)\]|starting felhom-controller|boot sweep|recover|app_(start|stop)" | head -8 | cut -c1-220