#!/usr/bin/env bash

set -Eeuo pipefail
umask 077

EXPECTED_HOST="sqjcapp01"
EXPECTED_IP="10.2.203.104"
ARCHIVE="/root/sanquan-app-q110-112.tar.gz"
ARCHIVE_SHA256="f0133d79e006d3be738ceb38883e740fc895b83578ab28657ce4fe5eaa3f953b"
WRAPPER="/root/app01-q111-activate-verify.sh"
WRAPPER_SHA256="93dee879e4694ee180494f2f1817ae3e48a77eee504fa6fbc51a04d46803b5eb"
GATE_SOURCE="/root/Q111_EXECUTE.pass"
GATE_SHA256="5660c78274ae8cf79dd8421d9b6007c720333d3d33dd9646ef0994a12a153421"
GATE_DIR="/root/sanquan-app-q110-112-gates"
GATE_TARGET="${GATE_DIR}/Q111_EXECUTE.pass"
GATE_TEMP="${GATE_DIR}/.Q111_EXECUTE.pass.installing"

FINAL_RESULT="FAIL"
PERSISTENT_WRITE_STARTED=0
WRAPPER_RC="NOT_RUN"

finish() {
    local rc=$?
    trap - EXIT
    set +e
    if [[ "$rc" -eq 0 ]]; then
        FINAL_RESULT="PASS"
    fi
    echo "Q111_ROOT_UPLOAD_TARGET=${EXPECTED_HOST}/${EXPECTED_IP}"
    echo "Q111_ROOT_UPLOAD_PERSISTENT_WRITE_STARTED=$PERSISTENT_WRITE_STARTED"
    echo "Q111_ROOT_UPLOAD_WRAPPER_RC=$WRAPPER_RC"
    echo "Q111_ROOT_UPLOAD_RC=$rc"
    echo "Q111_ROOT_UPLOAD_RESULT=$FINAL_RESULT"
    echo Q111_ROOT_UPLOAD_Q112=NOT_PERFORMED
    echo Q111_ROOT_UPLOAD_END
    exit "$rc"
}
trap finish EXIT

echo Q111_ROOT_UPLOAD_BEGIN
date '+%Y-%m-%dT%H:%M:%S%z'
echo "EXPECTED_HOST=$EXPECTED_HOST EXPECTED_IP=$EXPECTED_IP"

[[ $# -eq 0 ]] || {
    echo "ERROR: launcher accepts no arguments" >&2
    exit 2
}
[[ $(id -u) -eq 0 ]] || {
    echo "ERROR: root required" >&2
    exit 10
}
actual_host=$(hostname -s)
echo "ACTUAL_HOST=$actual_host"
[[ "$actual_host" == "$EXPECTED_HOST" ]] || {
    echo "ERROR: hostname mismatch; persistent write not started" >&2
    exit 11
}
ip -o -4 addr show scope global
ip -o -4 addr show scope global |
    grep -Eq "(^|[[:space:]])${EXPECTED_IP//./\\.}/" || {
    echo "ERROR: expected IPv4 missing; persistent write not started" >&2
    exit 12
}

for source_file in "$ARCHIVE" "$WRAPPER" "$GATE_SOURCE"; do
    [[ -f "$source_file" && ! -L "$source_file" ]] || {
        echo "ERROR: source file absent or unsafe: $source_file" >&2
        exit 13
    }
    [[ $(stat -c '%U:%G' "$source_file") == root:root ]] || {
        echo "ERROR: source file owner mismatch: $source_file" >&2
        exit 14
    }
done

echo "${ARCHIVE_SHA256}  ${ARCHIVE}" | sha256sum -c -
echo "${WRAPPER_SHA256}  ${WRAPPER}" | sha256sum -c -
echo "${GATE_SHA256}  ${GATE_SOURCE}" | sha256sum -c -
bash -n "$WRAPPER"

if [[ -e "$GATE_TARGET" || -L "$GATE_TARGET" || -e "$GATE_TEMP" || -L "$GATE_TEMP" ]]; then
    echo "ERROR: gate target or temporary target already exists" >&2
    exit 15
fi

echo Q111_ROOT_UPLOAD_PREWRITE_GATE_RESULT=PASS
echo Q111_ROOT_UPLOAD_PREWRITE_PERSISTENT_MUTATION=ZERO

PERSISTENT_WRITE_STARTED=1
install -d -m 0700 -o root -g root "$GATE_DIR"
install -m 0600 -o root -g root "$GATE_SOURCE" "$GATE_TEMP"
echo "${GATE_SHA256}  ${GATE_TEMP}" | sha256sum -c -
mv "$GATE_TEMP" "$GATE_TARGET"
chmod 0750 "$WRAPPER"
echo "${GATE_SHA256}  ${GATE_TARGET}" | sha256sum -c -
echo "${WRAPPER_SHA256}  ${WRAPPER}" | sha256sum -c -

set +e
"$WRAPPER" --execute
WRAPPER_RC=$?
set -e
[[ "$WRAPPER_RC" -eq 0 ]]
