172 lines
5.1 KiB
Bash
Executable File
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
|