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

BASE_DIR="/var/lib/cmk-push-agent"
MAX_BYTES=$((20 * 1024 * 1024))   # anpassen
UMASK=027

usage() {
  echo "ERROR: usage: cmk-push-receive --fqdn <fqdn>  (payload via stdin)" >&2
  exit 2
}

# ----------------------------
# Parse fqdn from args or SSH_ORIGINAL_COMMAND
# ----------------------------
FQDN=""

if [[ "${1:-}" == "--fqdn" && -n "${2:-}" && "${3:-}" == "" ]]; then
  # Direct call with args
  FQDN="$2"
elif [[ "$#" -eq 0 ]]; then
  # Forced command call: take arguments from SSH_ORIGINAL_COMMAND
  ORIG="${SSH_ORIGINAL_COMMAND:-}"
  [[ -n "$ORIG" ]] || usage

  # Expect exactly: --fqdn <fqdn>
  # Safe here because fqdn must not contain spaces; we validate strictly below.
  set -- $ORIG
  [[ "$#" -eq 2 && "${1:-}" == "--fqdn" && -n "${2:-}" ]] || usage
  FQDN="$2"
else
  usage
fi

# ----------------------------
# Validate FQDN (strict, path-safe)
# ----------------------------
if ! [[ "$FQDN" =~ ^[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)+$ ]]; then
  echo "ERROR: invalid FQDN" >&2
  exit 3
fi

umask "$UMASK"
install -d -m 0750 "$BASE_DIR"

OUTFILE="${BASE_DIR}/${FQDN}.gz"
TMPFILE="$(mktemp -p "$BASE_DIR" ".${FQDN}.XXXXXX.tmp")"

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

# ----------------------------
# Read stdin with hard cap
# ----------------------------
dd bs=64K count=$((MAX_BYTES / 65536 + 1)) status=none of="$TMPFILE"

SIZE=$(stat -c '%s' "$TMPFILE" 2>/dev/null || echo 0)
if (( SIZE > MAX_BYTES )); then
  echo "ERROR: payload too large" >&2
  exit 4
fi

# ----------------------------
# Minimal gzip sanity check (magic bytes 1f 8b)
# ----------------------------
if ! head -c2 "$TMPFILE" | od -An -t x1 | tr -d ' \n' | grep -qi '^1f8b$'; then
  echo "ERROR: payload is not gzip" >&2
  exit 5
fi

# Atomic replace
mv -f "$TMPFILE" "$OUTFILE"
chmod 0640 "$OUTFILE"

exit 0
