Freeze HA scoring and document reported production failover

This commit is contained in:
Lyncoln
2026-09-12 18:07:28 -04:00
parent c8636ed6d4
commit 488a1672d7
29 changed files with 2285 additions and 46 deletions
+91
View File
@@ -0,0 +1,91 @@
#!/usr/bin/env bash
# HISTORICAL LAB TOOL: not a production/scoring installer; see docs/operations.md.
# One-time installation of the modular baseline on the confirmed lab standby.
# Run with sudo in your terminal. No service or PostgreSQL lifecycle actions.
set -euo pipefail
export PATH=/usr/sbin:/usr/bin:/sbin:/bin
project_dir="$(CDPATH= cd -- "$(dirname -- "${BASH_SOURCE[0]}")/.." && pwd)"
provider_dir=/usr/lib/ocf/resource.d/loxthelion
agent="$provider_dir/managed-container"
expected_hash=5eae1f3dba0586dc06105e4dd7a9b8809a5c9961452abe7654dcfce77c3c5ce2
fail() { printf 'STOP: %s\n' "$*" >&2; exit 1; }
[[ "$EUID" == 0 ]] || fail 'Run this installer with sudo in your terminal.'
[[ "$(hostname -s)" == DAVID-ELITEDESK ]] || fail 'This installer is only for DAVID-ELITEDESK.'
[[ "$(crm_attribute --type crm_config --name cluster-name --query --quiet)" == postgres-ra-test ]] || fail 'Unexpected cluster name.'
[[ "$(crm_attribute --type crm_config --name maintenance-mode --query --quiet)" == true ]] || fail 'Pacemaker maintenance-mode must already be true.'
[[ "$(sha256sum "$agent" | cut -d ' ' -f1)" == "$expected_hash" ]] || fail 'Installed agent differs from the confirmed reference.'
[[ ! -e "$provider_dir/managed-container.d" ]] || fail 'A module directory already exists; review it before installing.'
cd "$project_dir"
[[ "$(sha256sum refactored/managed-container | cut -d ' ' -f1)" == "c91f09adfdeb45a3be1a72df3f5ca5b02fd4555dec4397ad944eab439ace0b89" ]] || fail 'This installer is for the original modular baseline only; the scoring enhancement requires separate review.'
sha256sum -c notes/REFACTOR-SHA256SUMS
for file in refactored/managed-container refactored/managed-container.d/*.sh; do
bash -n "$file"
done
# Match the recorded pg-ha resource parameters and avoid inherited test overrides.
run_ra() {
env -i PATH="$PATH" OCF_ROOT=/usr/lib/ocf OCF_RESOURCE_INSTANCE=pg-ha \
OCF_RESKEY_service_user=david OCF_RESKEY_service_name=postgres.service \
OCF_RESKEY_container_name=postgres OCF_RESKEY_pg_os_user=postgres \
OCF_RESKEY_db_user=david OCF_RESKEY_db_name=david \
"$1" "$2"
}
run_ra "$agent" validate-all
run_ra "$agent" monitor || fail 'The original agent must report a healthy unpromoted standby (rc=0).'
mkdir -p /var/backups
backup_dir="$(mktemp -d /var/backups/managed-container-ELITEDESK.XXXXXXXX)"
cp -a "$agent" "$backup_dir/managed-container"
printf 'Original agent backed up to: %s\n' "$backup_dir"
stage_dir="$(mktemp -d "$provider_dir/.managed-container-install.XXXXXXXX")"
install -d -o root -g root -m 0755 "$stage_dir/managed-container.d"
install -o root -g root -m 0755 refactored/managed-container "$stage_dir/managed-container"
install -o root -g root -m 0644 refactored/managed-container.d/*.sh "$stage_dir/managed-container.d/"
run_ra "$agent" meta-data > "$backup_dir/original-metadata.xml"
run_ra "$stage_dir/managed-container" meta-data > "$backup_dir/staged-metadata.xml"
cmp "$backup_dir/original-metadata.xml" "$backup_dir/staged-metadata.xml"
run_ra "$stage_dir/managed-container" validate-all
run_ra "$stage_dir/managed-container" monitor || fail 'Staged agent must report a healthy standby.'
published=false
rollback_on_error() {
local rc=$?
trap - EXIT
if [[ "$rc" != 0 && "$published" == true ]]; then
printf 'Installation/check failed; restoring the original entrypoint.\n' >&2
if install -o root -g root -m 0755 "$backup_dir/managed-container" "$stage_dir/rollback-agent" &&
mv -f "$stage_dir/rollback-agent" "$agent" && restorecon "$agent"; then
printf 'Original restored. New modules remain unused beside it for inspection.\n' >&2
else
printf 'Automatic restoration FAILED. Original backup: %s/managed-container\n' "$backup_dir" >&2
fi
fi
exit "$rc"
}
trap rollback_on_error EXIT
# Recheck immediately before changing the installed files.
[[ "$(crm_attribute --type crm_config --name maintenance-mode --query --quiet)" == true ]] || fail 'Maintenance mode changed; refusing installation.'
published=true
mv "$stage_dir/managed-container.d" "$provider_dir/managed-container.d"
mv -f "$stage_dir/managed-container" "$agent"
restorecon -RF "$agent" "$provider_dir/managed-container.d"
run_ra "$agent" meta-data > "$backup_dir/installed-metadata.xml"
cmp "$backup_dir/original-metadata.xml" "$backup_dir/installed-metadata.xml"
run_ra "$agent" validate-all
run_ra "$agent" monitor || fail 'Installed agent did not report a healthy standby.'
[[ "$(crm_attribute --type crm_config --name maintenance-mode --query --quiet)" == true ]] || fail 'Maintenance mode is no longer true.'
for file in refactored/managed-container refactored/managed-container.d/*.sh; do
cmp "$file" "$provider_dir/${file#refactored/}"
done
sha256sum "$agent" "$provider_dir/managed-container.d/"*.sh > "$backup_dir/installed-SHA256SUMS"
cat "$backup_dir/installed-SHA256SUMS"
published=false
trap - EXIT
rmdir "$stage_dir"
printf '\nPASS: refactored RA installed; metadata identical, validate-all=0, monitor=0.\n'
printf 'Maintenance mode remains true. No service restart or HA transition was requested.\n'
printf 'Backup and validation evidence: %s\n' "$backup_dir"