#!/usr/bin/env bash

set -Eeuo pipefail
umask 077

readonly EXPECTED_HOSTNAME='sqjcmqtt02'
readonly EXPECTED_IP='10.2.203.109'
readonly CONFIG='/etc/emqx/emqx.conf'
readonly COOKIE='/etc/zhct/secrets/emqx.cluster-cookie'
readonly COOKIE_TRANSFER='/root/emqx.cluster-cookie.transfer'
readonly ACL='/etc/emqx/acl.conf'
readonly TARGET_PORT_RE=':(1883|8083|18083|4370|5370|8883|8084)([[:space:]]|$)'

q142_diag_finish() {
  q142_diag_rc=$?
  trap - EXIT
  printf '%s\n' 'Q142_ETC_DIR_READONLY_DIAG_END'
  printf 'Q142_ETC_DIR_READONLY_DIAG_RC=%s\n' "${q142_diag_rc}"
  exit "${q142_diag_rc}"
}
trap q142_diag_finish EXIT

printf '%s\n' 'Q142_ETC_DIR_READONLY_DIAG_BEGIN'

test "${EUID}" -eq 0
test "$(hostname -s)" = "${EXPECTED_HOSTNAME}"
hostname -s
ip -br -4 addr show ens192
ip -br -4 addr show ens192 | grep -F "${EXPECTED_IP}/24"

printf '%s\n' '=== ROLLBACK STATE ==='
for q142_diag_unit in emqx.service mosquitto.service; do
  q142_diag_enabled=$(systemctl is-enabled "${q142_diag_unit}" 2>&1 || true)
  q142_diag_active=$(systemctl is-active "${q142_diag_unit}" 2>&1 || true)
  printf '%s enabled=%s active=%s\n' \
    "${q142_diag_unit}" "${q142_diag_enabled}" "${q142_diag_active}"
  test "${q142_diag_enabled}" = disabled
  test "${q142_diag_active}" = inactive
done
if pgrep -x beam.smp >/dev/null || pgrep -x mosquitto >/dev/null; then
  printf '%s\n' 'ROLLBACK_TARGET_PROCESSES_UNEXPECTED'
  exit 1
else
  printf '%s\n' 'ROLLBACK_TARGET_PROCESSES_ZERO'
fi
if ss -lntupH | grep -E "${TARGET_PORT_RE}" >/dev/null; then
  printf '%s\n' 'ROLLBACK_TARGET_LISTENERS_UNEXPECTED'
  exit 1
else
  printf '%s\n' 'ROLLBACK_TARGET_LISTENERS_ZERO'
fi
for q142_diag_runtime_dir in /var/lib/emqx /var/log/emqx; do
  test -d "${q142_diag_runtime_dir}"
  if find "${q142_diag_runtime_dir}" -mindepth 1 -print -quit |
    grep -q .; then
    printf 'ROLLBACK_RUNTIME_DIRECTORY_NOT_EMPTY=%s\n' \
      "${q142_diag_runtime_dir}"
    exit 1
  else
    printf 'ROLLBACK_RUNTIME_DIRECTORY_EMPTY=%s\n' \
      "${q142_diag_runtime_dir}"
  fi
done
test -f "${CONFIG}"
grep -Fq '__EMQX_CLUSTER_COOKIE__' "${CONFIG}"
test ! -e "${COOKIE}"
test ! -e "${COOKIE_TRANSFER}"
test ! -e "${ACL}"
printf '%s\n' 'ROLLBACK_PLACEHOLDER_CONFIG_PRESENT'
printf '%s\n' 'ROLLBACK_COOKIE_ABSENT'
printf '%s\n' 'ROLLBACK_COOKIE_TRANSFER_ABSENT'
printf '%s\n' 'ROLLBACK_RPM_ACL_ABSENT'
printf '%s\n' 'Q142_FAILED_ATTEMPT_ROLLBACK_STATE_PASS'

printf '%s\n' '=== PATH METADATA ONLY ==='
stat -c 'PATH=%n TYPE=%F OWNER=%U:%G MODE=%a SIZE=%s' \
  /etc /etc/emqx "${CONFIG}" /etc/emqx/base.hocon
printf '%s\n' '=== RPM DIRECTORY METADATA ==='
q142_diag_rpm_dir_metadata=$(
  rpm -q --dump emqx |
    awk '$1 == "/etc/emqx" {print "RPM_PATH=" $1 " MODE=" $5 " OWNER=" $6 ":" $7; found=1}
      END {if (!found) print "RPM_ETC_EMQX_ENTRY_ABSENT"}'
)
printf '%s\n' "${q142_diag_rpm_dir_metadata}"

printf '%s\n' '=== ACCESS TESTS WITHOUT CONTENT OUTPUT ==='
test -r "${CONFIG}"
printf '%s\n' 'ROOT_CONFIG_READ=PASS'
if runuser -u emqx -- test -x /etc/emqx; then
  printf '%s\n' 'EMQX_USER_ETC_DIR_TRAVERSE=PASS'
  q142_diag_traverse=PASS
else
  printf '%s\n' 'EMQX_USER_ETC_DIR_TRAVERSE=FAIL'
  q142_diag_traverse=FAIL
fi
if runuser -u emqx -- test -r "${CONFIG}"; then
  printf '%s\n' 'EMQX_USER_CONFIG_READ=PASS'
  q142_diag_config_read=PASS
else
  printf '%s\n' 'EMQX_USER_CONFIG_READ=FAIL'
  q142_diag_config_read=FAIL
fi
if runuser -u emqx -- test -r /etc/emqx/base.hocon; then
  printf '%s\n' 'EMQX_USER_BASE_HOCON_READ=PASS'
  q142_diag_base_read=PASS
else
  printf '%s\n' 'EMQX_USER_BASE_HOCON_READ=FAIL'
  q142_diag_base_read=FAIL
fi

if [[ "${q142_diag_traverse}" == FAIL &&
  "${q142_diag_config_read}" == FAIL &&
  "${q142_diag_base_read}" == FAIL ]]; then
  printf '%s\n' 'ROOT_CAUSE_CANDIDATE=ETC_EMQX_DIRECTORY_TRAVERSE_DENIED'
else
  printf '%s\n' 'ROOT_CAUSE_CANDIDATE=NOT_CONFIRMED'
fi

printf '%s\n' 'CONFIG_CONTENT_NOT_OUTPUT'
printf '%s\n' 'COOKIE_VALUE_NOT_OUTPUT'
printf '%s\n' 'REMOTE_MUTATION=ZERO'
printf '%s\n' 'Q142_ETC_DIR_READONLY_DIAG_PASS'
