179 lines
5.1 KiB
Bash
Executable File
179 lines
5.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
|
|
MODE="check"
|
|
|
|
EDGE_HOST="${EDGE_HOST:-192.168.0.188}"
|
|
EDGE_USER="${EDGE_USER:-ollama}"
|
|
EDGE_TARGET="${EDGE_USER}@${EDGE_HOST}"
|
|
REMOTE_HELPER="/usr/local/sbin/awoooi-edge-maintenance"
|
|
REMOTE_STAGE_ROOT="${REMOTE_STAGE_ROOT:-/home/ollama/.cache/awoooi-edge-bootstrap}"
|
|
BOOTSTRAP_IMAGE="${BOOTSTRAP_IMAGE:-alpine@sha256:d9e853e87e55526f6b2917df91a2115c36dd7c696a35be12163d44e6e2a4b6bc}"
|
|
|
|
LOCAL_HELPER="${ROOT_DIR}/ops/reboot-recovery/awoooi-edge-maintenance-helper.sh"
|
|
LOCAL_SUDOERS="${ROOT_DIR}/ops/reboot-recovery/awoooi-edge-maintenance.sudoers"
|
|
LOCAL_CONF="${ROOT_DIR}/ops/nginx/awoooi.wooo.work.conf"
|
|
LOCAL_MAINT="${ROOT_DIR}/ops/maintenance/maintenance.html"
|
|
|
|
SSH_OPTS=(
|
|
-o BatchMode=yes
|
|
-o ConnectTimeout="${SSH_CONNECT_TIMEOUT_SECONDS:-8}"
|
|
-o StrictHostKeyChecking=accept-new
|
|
)
|
|
|
|
usage() {
|
|
cat <<'USAGE'
|
|
Usage:
|
|
bootstrap-edge-maintenance-executor.sh --check
|
|
bootstrap-edge-maintenance-executor.sh --apply
|
|
|
|
--apply is a one-time bounded bootstrap over the edge host's existing Docker
|
|
root-equivalent channel. It uses only a pinned local image with no network,
|
|
installs a fixed helper and exact-command sudoers allowlist, and never applies
|
|
the Nginx payload itself.
|
|
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_CONF" "$LOCAL_MAINT"; do
|
|
if [ ! -f "$file" ]; then
|
|
echo "BLOCKER bootstrap_source_missing path=$file"
|
|
exit 66
|
|
fi
|
|
done
|
|
|
|
remote_check() {
|
|
echo "AWOOOI_EDGE_EXECUTOR_BOOTSTRAP=1"
|
|
echo "MODE=check"
|
|
if ssh "${SSH_OPTS[@]}" "$EDGE_TARGET" \
|
|
"sudo -n '$REMOTE_HELPER' check"; then
|
|
echo "EDGE_EXECUTOR_BOOTSTRAP_READY=1"
|
|
else
|
|
echo "EDGE_EXECUTOR_BOOTSTRAP_READY=0"
|
|
echo "BLOCKER privileged_edge_apply_channel_unavailable"
|
|
return 75
|
|
fi
|
|
}
|
|
|
|
if [ "$MODE" = "check" ]; then
|
|
remote_check
|
|
exit $?
|
|
fi
|
|
|
|
RUN_ID="edge-bootstrap-$(date +%Y%m%dT%H%M%S%z)-$$"
|
|
REMOTE_STAGE="${REMOTE_STAGE_ROOT}/${RUN_ID}"
|
|
|
|
echo "AWOOOI_EDGE_EXECUTOR_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_SUDOERS_SHA256=$(sha256sum "$LOCAL_SUDOERS" | awk '{print $1}')"
|
|
echo "LOCAL_CONF_SHA256=$(sha256sum "$LOCAL_CONF" | awk '{print $1}')"
|
|
echo "LOCAL_MAINT_SHA256=$(sha256sum "$LOCAL_MAINT" | awk '{print $1}')"
|
|
|
|
ssh "${SSH_OPTS[@]}" "$EDGE_TARGET" \
|
|
"install -d -m 0700 '$REMOTE_STAGE'"
|
|
scp -q "${SSH_OPTS[@]}" \
|
|
"$LOCAL_HELPER" "$LOCAL_SUDOERS" "$LOCAL_CONF" "$LOCAL_MAINT" \
|
|
"${EDGE_TARGET}:${REMOTE_STAGE}/"
|
|
|
|
ssh "${SSH_OPTS[@]}" "$EDGE_TARGET" \
|
|
"docker image inspect --format '{{.Id}}' '$BOOTSTRAP_IMAGE'"
|
|
|
|
ssh "${SSH_OPTS[@]}" "$EDGE_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-edge-maintenance
|
|
SUDOERS=/host/etc/sudoers.d/awoooi-edge-maintenance
|
|
CANONICAL_DIR=/host/usr/local/share/awoooi-edge-maintenance
|
|
CANONICAL_CONF=$CANONICAL_DIR/awoooi.wooo.work.conf
|
|
CANONICAL_MAINT=$CANONICAL_DIR/maintenance.html
|
|
BACKUP_ROOT=/host/var/lib/awoooi-edge-maintenance/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_CONF" canonical-conf
|
|
backup_file "$CANONICAL_MAINT" canonical-maint
|
|
|
|
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_CONF" canonical-conf
|
|
restore_file "$CANONICAL_MAINT" canonical-maint
|
|
echo "BOOTSTRAP_ROLLBACK_DONE=1"
|
|
fi
|
|
exit "$rc"
|
|
}
|
|
trap rollback_on_error EXIT
|
|
|
|
cp /payload/awoooi-edge-maintenance-helper.sh "$HELPER"
|
|
cp /payload/awoooi-edge-maintenance.sudoers "$SUDOERS"
|
|
cp /payload/awoooi.wooo.work.conf "$CANONICAL_CONF"
|
|
cp /payload/maintenance.html "$CANONICAL_MAINT"
|
|
chown 0:0 "$HELPER" "$SUDOERS" "$CANONICAL_CONF" "$CANONICAL_MAINT"
|
|
chmod 0755 "$HELPER"
|
|
chmod 0440 "$SUDOERS"
|
|
chmod 0644 "$CANONICAL_CONF" "$CANONICAL_MAINT"
|
|
|
|
chroot /host /bin/bash -n /usr/local/sbin/awoooi-edge-maintenance
|
|
chroot /host /usr/sbin/visudo -cf /etc/sudoers.d/awoooi-edge-maintenance
|
|
|
|
committed=1
|
|
trap - EXIT
|
|
echo "BOOTSTRAP_BACKUP_DIR=${BACKUP_DIR#/host}"
|
|
echo "BOOTSTRAP_INSTALL_DONE=1"
|
|
CONTAINER
|
|
|
|
ssh "${SSH_OPTS[@]}" "$EDGE_TARGET" "rm -rf '$REMOTE_STAGE'"
|
|
remote_check
|