60 lines
2.4 KiB
Bash
Executable File
60 lines
2.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -Eeuo pipefail
|
|
umask 0077
|
|
|
|
SOURCE_ROOT="${1:?source root required}"
|
|
ROOT="$(mktemp -d /tmp/aios-orchestrator-rollback-test.XXXXXX)"
|
|
trap 'rm -rf "$ROOT"' EXIT
|
|
INSTALL_ROOT="$ROOT/opt"
|
|
STATE_ROOT="$ROOT/state"
|
|
mkdir -p "$INSTALL_ROOT/releases" "$STATE_ROOT" "$ROOT/bin"
|
|
chmod 0700 "$STATE_ROOT"
|
|
|
|
OLD="$(printf 'a%.0s' {1..64})"
|
|
NEW="$(printf 'b%.0s' {1..64})"
|
|
mkdir "$INSTALL_ROOT/releases/$OLD" "$INSTALL_ROOT/releases/$NEW"
|
|
printf '%s\n' "$OLD" > "$INSTALL_ROOT/releases/$OLD/SOURCE_DIGEST"
|
|
printf '%s\n' "$NEW" > "$INSTALL_ROOT/releases/$NEW/SOURCE_DIGEST"
|
|
ln -s "$INSTALL_ROOT/releases/$NEW" "$INSTALL_ROOT/current"
|
|
python3 - "$STATE_ROOT/install-receipt.json" "$INSTALL_ROOT/releases/$NEW" "$INSTALL_ROOT/releases/$OLD" <<'PY'
|
|
import json, sys
|
|
with open(sys.argv[1], "w", encoding="utf-8") as handle:
|
|
json.dump({
|
|
"schema_version": 1,
|
|
"source_digest": "b" * 64,
|
|
"current_release": sys.argv[2],
|
|
"previous_release": sys.argv[3],
|
|
"last_rollback": None,
|
|
}, handle)
|
|
PY
|
|
chmod 0600 "$STATE_ROOT/install-receipt.json"
|
|
cat > "$ROOT/bin/systemctl" <<'SH'
|
|
#!/bin/sh
|
|
printf '%s\n' "$*" >> "${SYSTEMCTL_LOG:?}"
|
|
exit 0
|
|
SH
|
|
chmod 0755 "$ROOT/bin/systemctl"
|
|
: > "$ROOT/systemctl.log"
|
|
|
|
SYSTEMCTL_LOG="$ROOT/systemctl.log" PATH="$ROOT/bin:/usr/bin:/bin" INSTALL_ROOT="$INSTALL_ROOT" STATE_ROOT="$STATE_ROOT" \
|
|
bash "$SOURCE_ROOT/scripts/rollback_aios_orchestrator_gateway.sh"
|
|
FIRST="$(readlink -f "$INSTALL_ROOT/current")"
|
|
SYSTEMCTL_LOG="$ROOT/systemctl.log" PATH="$ROOT/bin:/usr/bin:/bin" INSTALL_ROOT="$INSTALL_ROOT" STATE_ROOT="$STATE_ROOT" \
|
|
bash "$SOURCE_ROOT/scripts/rollback_aios_orchestrator_gateway.sh"
|
|
SECOND="$(readlink -f "$INSTALL_ROOT/current")"
|
|
[[ "$FIRST" == "$INSTALL_ROOT/releases/$OLD" ]]
|
|
[[ "$SECOND" == "$FIRST" ]]
|
|
grep -Fxq 'stop aios-orchestrator-gateway-poll.timer' "$ROOT/systemctl.log"
|
|
grep -Fxq 'stop aios-orchestrator-gateway-poll.service' "$ROOT/systemctl.log"
|
|
grep -Fxq 'start aios-orchestrator-gateway-poll.timer' "$ROOT/systemctl.log"
|
|
|
|
printf 'tampered\n' > "$INSTALL_ROOT/releases/$OLD/SOURCE_DIGEST"
|
|
if SYSTEMCTL_LOG="$ROOT/systemctl.log" PATH="$ROOT/bin:/usr/bin:/bin" \
|
|
INSTALL_ROOT="$INSTALL_ROOT" STATE_ROOT="$STATE_ROOT" \
|
|
bash "$SOURCE_ROOT/scripts/rollback_aios_orchestrator_gateway.sh" >/dev/null 2>&1; then
|
|
echo 'ROLLBACK_DIGEST_MISMATCH_TEST=FAIL' >&2
|
|
exit 1
|
|
fi
|
|
echo "ROLLBACK_DIGEST_MISMATCH_TEST=PASS"
|
|
echo "ROLLBACK_REPEAT_TEST=PASS"
|