#!/usr/bin/env bash
set -euo pipefail

# cmk-push-relay.sh
# Fetch remote agent output via TCP/6556 and push to CMK server (same upload path/logic as push-agent)

ID="${1:-}"

# =====================
# Defaults (can be overridden by config)
# =====================
CMK_SERVER="cmk.bashclub.org"
CMK_USER="cmkpush"
CMK_PORT="22"
REMOTE_BASE="/var/lib/cmk-push-agent"

RELAY_REMOTE_HOST=""
RELAY_REMOTE_PORT="6556"
RELAY_TIMEOUT="20"
RELAY_HOSTNAME=""     # hostname under which data should be stored on CMK server
RELAY_BIND_ADDR=""    # optional; only needed for special routing cases

# =====================
# Load configuration
# =====================
# target (same as push-agent)
source /etc/cmk-push-agent/cmk-push-agent.conf

# source (per relay instance)
if [[ -n "$ID" && -r "/etc/cmk-push-agent/relays.d/${ID}.conf" ]]; then
  source "/etc/cmk-push-agent/relays.d/${ID}.conf"
fi

: "${RELAY_REMOTE_HOST:?missing RELAY_REMOTE_HOST (e.g. 10.0.0.1)}"

# jitter to avoid thundering herd (0–20s)
sleep $(( RANDOM % 20 ))

TMP="$(mktemp)"
TMP_GZ="${TMP}.gz"

cleanup() { rm -f "$TMP" "$TMP_GZ"; }
trap cleanup EXIT

# =====================
# Collect agent output (REMOTE)
# =====================
# Prefer waitmax shipped with Checkmk; fallback to coreutils timeout if not present
WAITMAX="/usr/bin/waitmax"
if [[ ! -x "$WAITMAX" ]]; then
  WAITMAX="/usr/bin/timeout"
fi

[[ -x "$WAITMAX" ]] || { echo "Neither waitmax nor timeout found" >&2; exit 2; }
"$WAITMAX" "${RELAY_TIMEOUT}" nc -w "${RELAY_TIMEOUT}" "${RELAY_REMOTE_HOST}" "${RELAY_REMOTE_PORT}" > "$TMP"


# sanity check: looks like checkmk agent output?
grep -q '^<<<' "$TMP" || { echo "No valid Checkmk agent output from ${RELAY_REMOTE_HOST}:${RELAY_REMOTE_PORT}" >&2; exit 1; }

# Add static data to relayed output
echo "<<<local:sep(0)>>>" >> "$TMP"
echo "0 \"cmk-push-relay Agent\" - $(hostname -f)" >> "$TMP"
echo "0 \"Last Execution\" - $(date '+%Y-%m-%d %H:%M:%S')" >> "$TMP"

# compress (important for scale)
gzip -c "$TMP" > "$TMP_GZ"

# =====================
# Atomic upload (same as push-agent)
# =====================
ssh -T \
  -o BatchMode=yes \
  -o ConnectTimeout=10 \
  -o StrictHostKeyChecking=yes \
  -o IPQoS=throughput \
  -p "${CMK_PORT}" \
  "${CMK_USER}@${CMK_SERVER}" \
  -- --fqdn "${RELAY_HOSTNAME}" \
  < "$TMP_GZ"