Files
awoooi/scripts/reboot-recovery/bootstrap-host188-hygiene-executor.sh

172 lines
5.1 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
MODE="check"
TARGET="${TARGET:-ollama@192.168.0.188}"
REMOTE_HELPER="/usr/local/sbin/awoooi-host188-hygiene"
REMOTE_STAGE_ROOT="${REMOTE_STAGE_ROOT:-/home/ollama/.cache/awoooi-host188-hygiene-bootstrap}"
BOOTSTRAP_IMAGE="${BOOTSTRAP_IMAGE:-alpine@sha256:d9e853e87e55526f6b2917df91a2115c36dd7c696a35be12163d44e6e2a4b6bc}"
LOCAL_HELPER="${ROOT_DIR}/ops/reboot-recovery/awoooi-host188-hygiene-helper.sh"
LOCAL_SUDOERS="${ROOT_DIR}/ops/reboot-recovery/awoooi-host188-hygiene.sudoers"
LOCAL_STARTUP="${ROOT_DIR}/scripts/reboot-recovery/awoooi-startup.sh"
LOCAL_UNIT="${ROOT_DIR}/scripts/reboot-recovery/awoooi-startup.service"
SSH_OPTS=(
-o BatchMode=yes
-o ConnectTimeout="${SSH_CONNECT_TIMEOUT_SECONDS:-8}"
-o StrictHostKeyChecking=accept-new
)
usage() {
cat <<'USAGE'
Usage:
bootstrap-host188-hygiene-executor.sh --check
bootstrap-host188-hygiene-executor.sh --apply
Installs only the root-owned fixed-action host hygiene helper, canonical startup
payload, and exact sudoers commands. It does not reconcile or restart services.
USAGE
}
while [ "$#" -gt 0 ]; do
case "$1" in
--check)
MODE="check"
;;
--apply)
MODE="apply"
;;
-h|--help)
usage
exit 0
;;
*)
echo "UNKNOWN_ARG=$1" >&2
usage >&2
exit 64
;;
esac
shift
done
for file in "$LOCAL_HELPER" "$LOCAL_SUDOERS" "$LOCAL_STARTUP" "$LOCAL_UNIT"; do
[ -f "$file" ] || {
echo "BLOCKER host188_hygiene_bootstrap_source_missing path=$file"
exit 66
}
done
check() {
echo "AWOOOI_HOST188_HYGIENE_BOOTSTRAP=1"
echo "MODE=check"
if ssh "${SSH_OPTS[@]}" "$TARGET" "sudo -n '$REMOTE_HELPER' check"; then
echo "HOST188_HYGIENE_BOOTSTRAP_READY=1"
else
echo "HOST188_HYGIENE_BOOTSTRAP_READY=0"
echo "BLOCKER host188_hygiene_privileged_executor_unavailable"
return 75
fi
}
if [ "$MODE" = "check" ]; then
check
exit $?
fi
RUN_ID="host188-hygiene-bootstrap-$(date +%Y%m%dT%H%M%S%z)-$$"
REMOTE_STAGE="${REMOTE_STAGE_ROOT}/${RUN_ID}"
echo "AWOOOI_HOST188_HYGIENE_BOOTSTRAP=1"
echo "MODE=apply"
echo "RUN_ID=$RUN_ID"
echo "BOOTSTRAP_IMAGE=$BOOTSTRAP_IMAGE"
echo "LOCAL_HELPER_SHA256=$(sha256sum "$LOCAL_HELPER" | awk '{print $1}')"
echo "LOCAL_STARTUP_SHA256=$(sha256sum "$LOCAL_STARTUP" | awk '{print $1}')"
echo "LOCAL_UNIT_SHA256=$(sha256sum "$LOCAL_UNIT" | awk '{print $1}')"
ssh "${SSH_OPTS[@]}" "$TARGET" "install -d -m 0700 '$REMOTE_STAGE'"
scp -q "${SSH_OPTS[@]}" \
"$LOCAL_HELPER" "$LOCAL_SUDOERS" "$LOCAL_STARTUP" "$LOCAL_UNIT" \
"${TARGET}:${REMOTE_STAGE}/"
ssh "${SSH_OPTS[@]}" "$TARGET" \
"docker image inspect --format '{{.Id}}' '$BOOTSTRAP_IMAGE'"
ssh "${SSH_OPTS[@]}" "$TARGET" \
"docker run -i --rm --pull=never --network=none --userns=host -e RUN_ID='$RUN_ID' -v /:/host -v '$REMOTE_STAGE':/payload:ro '$BOOTSTRAP_IMAGE' /bin/sh -s" <<'CONTAINER'
set -eu
HELPER=/host/usr/local/sbin/awoooi-host188-hygiene
SUDOERS=/host/etc/sudoers.d/awoooi-host188-hygiene
CANONICAL_DIR=/host/usr/local/share/awoooi-host188-hygiene
CANONICAL_STARTUP=$CANONICAL_DIR/awoooi-startup.sh
CANONICAL_UNIT=$CANONICAL_DIR/awoooi-startup.service
BACKUP_ROOT=/host/var/lib/awoooi-host188-hygiene/bootstrap-backups
BACKUP_DIR=$BACKUP_ROOT/$RUN_ID
mkdir -p /host/usr/local/sbin /host/etc/sudoers.d "$CANONICAL_DIR" "$BACKUP_DIR"
chmod 0700 "$BACKUP_ROOT" "$BACKUP_DIR"
backup_file() {
src=$1
name=$2
if [ -e "$src" ]; then
cp -a "$src" "$BACKUP_DIR/$name"
else
: >"$BACKUP_DIR/$name.missing"
fi
}
restore_file() {
dst=$1
name=$2
if [ -e "$BACKUP_DIR/$name" ]; then
cp -a "$BACKUP_DIR/$name" "$dst"
elif [ -e "$BACKUP_DIR/$name.missing" ]; then
rm -f "$dst"
fi
}
backup_file "$HELPER" helper
backup_file "$SUDOERS" sudoers
backup_file "$CANONICAL_STARTUP" canonical-startup
backup_file "$CANONICAL_UNIT" canonical-unit
committed=0
rollback_on_error() {
rc=$?
if [ "$rc" -ne 0 ] && [ "$committed" -eq 0 ]; then
restore_file "$HELPER" helper
restore_file "$SUDOERS" sudoers
restore_file "$CANONICAL_STARTUP" canonical-startup
restore_file "$CANONICAL_UNIT" canonical-unit
echo "BOOTSTRAP_ROLLBACK_DONE=1"
fi
exit "$rc"
}
trap rollback_on_error EXIT
cp /payload/awoooi-host188-hygiene-helper.sh "$HELPER"
cp /payload/awoooi-host188-hygiene.sudoers "$SUDOERS"
cp /payload/awoooi-startup.sh "$CANONICAL_STARTUP"
cp /payload/awoooi-startup.service "$CANONICAL_UNIT"
chown 0:0 "$HELPER" "$SUDOERS" "$CANONICAL_STARTUP" "$CANONICAL_UNIT"
chmod 0755 "$HELPER" "$CANONICAL_STARTUP"
chmod 0440 "$SUDOERS"
chmod 0644 "$CANONICAL_UNIT"
chroot /host /bin/bash -n /usr/local/sbin/awoooi-host188-hygiene
chroot /host /bin/bash -n /usr/local/share/awoooi-host188-hygiene/awoooi-startup.sh
chroot /host /usr/sbin/visudo -cf /etc/sudoers.d/awoooi-host188-hygiene
chroot /host /usr/bin/systemd-analyze verify /usr/local/share/awoooi-host188-hygiene/awoooi-startup.service
committed=1
trap - EXIT
echo "BOOTSTRAP_BACKUP_DIR=${BACKUP_DIR#/host}"
echo "BOOTSTRAP_INSTALL_DONE=1"
CONTAINER
ssh "${SSH_OPTS[@]}" "$TARGET" "rm -rf '$REMOTE_STAGE'"
check