#!/bin/sh
set -eu

# shellcheck disable=SC1090,SC1091
RUNNER_ROOT_DIR="$(cd "$(dirname "$(readlink "$0" || echo "$0")")"/..; pwd -P)"
echo "Running node dump in ${RUNNER_ROOT_DIR}"
BASE_RUNNER_ROOT_DIR="${BASE_RUNNER_ROOT_DIR:-$RUNNER_ROOT_DIR}"

# shellcheck disable=SC1090,SC1091
. "$RUNNER_ROOT_DIR"/releases/emqx_vars

cd "${RUNNER_ROOT_DIR}"

DUMP="$EMQX_LOG_DIR/node_dump_$(date +"%Y%m%d_%H%M%S").tar.gz"
APP_ENV_DUMP="$EMQX_LOG_DIR/app_env.dump"
CONF_DUMP="$EMQX_LOG_DIR/conf.hocon"
LICENSE_INFO="$EMQX_LOG_DIR/license_info.txt"
ENV_FILE_DUMP="$EMQX_LOG_DIR/emqx.env.dump"
SYSINFO="$EMQX_LOG_DIR/sysinfo.txt"

LOG_MAX_AGE_DAYS=3

collect() {
    echo "========================================================"
    echo "    $*"
    echo "========================================================"
    eval "$*" || echo "Unavailable"
    echo
}

show_help() {
    echo "Collect information about the EMQX node

USAGE:

  $0 [-a DAYS]

OPTIONS:

    -a n  Set maximum age of collected log files in days (3 by default)"
    exit 1
}

while getopts "a:h" opt; do
     case "${opt}" in
        a) LOG_MAX_AGE_DAYS="${OPTARG}" ;;
        h) show_help ;;
        *) ;;
    esac
done

# Collect system info:
{
    collect "$RUNNER_BIN_DIR"/emqx ctl broker
    collect "$RUNNER_BIN_DIR"/emqx eval "'emqx_node_dump:sys_info()'"

    collect uname -a
    collect uptime
    case "$(uname -s)" in
      Linux)
        collect free
        ;;
      Darwin)
        collect vm_stat
        ;;
    esac
    collect netstat -tnl

    collect "$RUNNER_BIN_DIR"/emqx ctl plugins list

    collect "$RUNNER_BIN_DIR"/emqx ctl vm all
    collect "$RUNNER_BIN_DIR"/emqx ctl listeners
} > "${SYSINFO}"

# Collect information about the configuration:
{
    collect "$RUNNER_BIN_DIR"/emqx eval "'emqx_node_dump:app_env_dump().'"
} > "${APP_ENV_DUMP}"

{
    collect "$RUNNER_BIN_DIR"/emqx eval "'emqx_node_dump:print_conf_dump().'"
} > "${CONF_DUMP}"


# Collect the boot-time settings from the environment file.
# Only these known non-secret variables; the file can carry arbitrary
# EMQX_* overrides, including secrets.
if [ -f "$EMQX_ETC_DIR/emqx.env" ]; then
    grep -E '^(EMQX_FEATURES|EMQX_SECURITY_PROFILE)=' \
        "$EMQX_ETC_DIR/emqx.env" > "${ENV_FILE_DUMP}" || true
fi

# Collect license info:
{
    collect "$RUNNER_BIN_DIR"/emqx ctl license info
} > "${LICENSE_INFO}"

# Pack files
{
    find "$EMQX_LOG_DIR" -mtime -"${LOG_MAX_AGE_DAYS}" \( -name '*.log.*' -or -name 'run_erl.log*' \)
    echo "${SYSINFO}"
    echo "${APP_ENV_DUMP}"
    echo "${CONF_DUMP}"
    echo "${LICENSE_INFO}"
    if [ -f "${ENV_FILE_DUMP}" ]; then echo "${ENV_FILE_DUMP}"; fi
} | tar czf "${DUMP}" -T -

## Cleanup:
rm "${SYSINFO}" "${LICENSE_INFO}"
#rm "${APP_ENV_DUMP}" "${CONF_DUMP}" # Keep it for inspection

echo "Created a node dump ${DUMP}"
echo
echo "WARNING: this script tries to obfuscate secrets, but make sure to
inspect log/app_env.dump, log/conf.hocon and log/emqx.env.dump files manually before uploading the node dump
to a public location."
