#!/usr/bin/env bash
set -Eeuo pipefail
umask 077

readonly EXPECTED_HOST='sqjcmqtt02'
readonly EXPECTED_IP='10.2.203.109'
readonly NODE_KEY='emqx02'
readonly ARCHIVE='/root/emqx-q240-cluster.tar.gz'
readonly ARCHIVE_SHA256='a5b35ffe1a81488b0fd7580972fe55ff86aa9cf0f017fc246ffa2b5cecb77409'
readonly PACKAGE_STAGE='/root/.q240-a5b35ffe1a81488b'
readonly PACKAGE_ROOT="${PACKAGE_STAGE}/emqx-q240-cluster"
readonly ENTRY="${PACKAGE_ROOT}/q240-emqx-cluster.sh"
readonly Q200_RECEIPT='/root/q200-formal-pass.receipt'
readonly COOKIE_FILE='/etc/zhct/secrets/emqx.cluster-cookie'
readonly COOKIE_SHA256='750bf6ce86ab809d35974f7574ea68b8410b5bdcaf01bc8e0ca70c2fe4016fad'
readonly COOKIE_SIZE='65'
readonly AUDIT_LOG='/root/q240-emqx02-join-wrapper.log'

backup_id=''
finish() {
  rc=$?
  trap - EXIT
  set +e
  if [[ "${rc}" -ne 0 && -n "${backup_id}" &&
    -f "/root/q240-emqx-rollback/${NODE_KEY}/${backup_id}/state.env" ]] &&
    grep -Fxq 'JOIN_PERFORMED=1' \
      "/root/q240-emqx-rollback/${NODE_KEY}/${backup_id}/state.env"; then
    printf '%s\n' 'Q240_WRAPPER_ROLLBACK_BEGIN=THIS_RUN_JOIN_ONLY'
    bash "${ENTRY}" "${NODE_KEY}" rollback --backup-id "${backup_id}" \
      --confirm "q240-${NODE_KEY}-rollback"
    rollback_rc=$?
    printf 'Q240_WRAPPER_ROLLBACK_RC=%s\n' "${rollback_rc}"
  elif [[ "${rc}" -ne 0 ]]; then
    printf '%s\n' 'Q240_WRAPPER_ROLLBACK=NOT_REQUIRED_NO_JOIN_THIS_RUN'
  fi
  printf '%s\n' 'Q240_EMQX02_JOIN_WRAPPER_END'
  printf 'Q240_EMQX02_JOIN_WRAPPER_RC=%s\n' "${rc}"
  exit "${rc}"
}
trap finish EXIT

exec > >(tee -a "${AUDIT_LOG}") 2>&1
printf '%s\n' 'Q240_EMQX02_JOIN_WRAPPER_BEGIN'
[[ "${EUID}" -eq 0 ]]
[[ "$(hostname -s)" == "${EXPECTED_HOST}" ]]
ip -o -4 addr show scope global | awk '{print $4}' | cut -d/ -f1 |
  grep -Fxq "${EXPECTED_IP}"
[[ -f "${Q200_RECEIPT}" ]]
[[ "$(stat -c '%U:%G:%a' "${Q200_RECEIPT}")" == root:root:600 ]]
for marker in Q200_FORMAL_PASS=PASS Q200_GLOBAL_DEPENDENCIES_COMPLETE=PASS \
  Q200_EMQX_MINIMUM_NETWORK_MATRIX=PASS Q200_EMQX01_NODE_GATE_PASS \
  Q200_EMQX02_NODE_GATE_PASS Q200_EMQX03_NODE_GATE_PASS; do
  grep -Fxq "${marker}" "${Q200_RECEIPT}"
done
printf 'Q200_RECEIPT_SHA256=%s\n' "$(sha256sum "${Q200_RECEIPT}" | awk '{print $1}')"
[[ "$(stat -c '%U:%G:%a:%s' "${COOKIE_FILE}")" == \
  "root:root:600:${COOKIE_SIZE}" ]]
printf '%s  %s\n' "${COOKIE_SHA256}" "${COOKIE_FILE}" | sha256sum -c -
printf '%s\n' 'COOKIE_VALUE_NOT_OUTPUT'
printf '%s  %s\n' "${ARCHIVE_SHA256}" "${ARCHIVE}" | sha256sum -c -
install -d -m 0700 "${PACKAGE_STAGE}"
tar -xzf "${ARCHIVE}" -C "${PACKAGE_STAGE}"
bash "${ENTRY}" --static-validate
bash "${ENTRY}" "${NODE_KEY}" preflight \
  --expected-cookie-sha256 "${COOKIE_SHA256}"
capture=$(mktemp /root/q240-emqx02-execute.XXXXXX.log)
set +e
bash "${ENTRY}" "${NODE_KEY}" execute \
  --expected-cookie-sha256 "${COOKIE_SHA256}" \
  --confirm q240-emqx02-execute 2>&1 | tee "${capture}"
execute_rc=${PIPESTATUS[0]}
set -e
backup_id=$(awk -F= '/^BACKUP_ID=/{value=$2} END{print value}' "${capture}")
[[ "${execute_rc}" -eq 0 ]]
bash "${ENTRY}" "${NODE_KEY}" archive
printf '%s\n' 'Q240_EMQX02_JOIN_WRAPPER_PASS'

