#!/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}"

# 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"
CONF_DUMP="$EMQX_LOG_DIR/conf.dump"
LICENSE_INFO="$EMQX_LOG_DIR/license_info.txt"
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
    collect free
    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()'"
} > "${CONF_DUMP}"

# 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 "${CONF_DUMP}"
    echo "${LICENSE_INFO}"
} | tar czf "${DUMP}" -T -

## Cleanup:
rm "${SYSINFO}" "${LICENSE_INFO}"
#rm "${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/conf.dump file manually before uploading the node dump
to a public location."
