#!/bin/bash
# Haven Blueshore — Zabbix agent 6.4.21 silent install (Debian/Ubuntu .deb,
# RHEL 9 .rpm, or the generic static tarball as fallback).
# Pre-configured for PSK auto-registration onto mon.havenblueshore.cloud.
# Hostname is NOT set: the agent reports system.hostname.
# Run as root from the folder containing this script and the packages.
set -euo pipefail
cd "$(dirname "$0")"
[ "$(id -u)" = 0 ] || { echo "Run as root"; exit 1; }

set_conf() { # file key value
  local f="$1" k="$2" v="$3"
  if grep -qE "^[# ]*$k=" "$f"; then
    sed -i -E "s|^[# ]*$k=.*|$k=$v|" "$f"
  else
    printf '%s=%s\n' "$k" "$v" >> "$f"
  fi
}

if command -v apt-get >/dev/null 2>&1; then
  . /etc/os-release
  case "${ID}${VERSION_ID}" in
    ubuntu22.04) PKG="zabbix-agent_6.4.21-1+ubuntu22.04_amd64.deb" ;;
    ubuntu24.04) PKG="zabbix-agent_6.4.21-1+ubuntu24.04_amd64.deb" ;;
    debian12)    PKG="zabbix-agent_6.4.21-1+debian12_amd64.deb" ;;
    *) echo "Untested ${ID} ${VERSION_ID}; trying the static tarball fallback."; PKG="" ;;
  esac
  if [ -n "${PKG:-}" ]; then
    dpkg -i "$PKG" || apt-get install -f -y
  fi
elif command -v dnf >/dev/null 2>&1 || command -v yum >/dev/null 2>&1; then
  PKG="zabbix-agent-6.4.21-release1.el9.x86_64.rpm"
  if command -v dnf >/dev/null 2>&1; then dnf install -y "./$PKG"; else yum install -y "./$PKG"; fi
else
  PKG=""
fi

if [ ! -f /etc/zabbix/zabbix_agentd.conf ]; then
  # Static tarball fallback: any other distro.
  echo "Installing from static tarball..."
  id zabbix >/dev/null 2>&1 || useradd --system --no-create-home --shell /usr/sbin/nologin zabbix
  mkdir -p /usr/local/zabbix /etc/zabbix
  tar -xzf zabbix_agent-6.4.21-linux-3.0-amd64-static.tar.gz -C /tmp/zbx-extract --strip-components=1 2>/dev/null || \
    { mkdir -p /tmp/zbx-extract; tar -xzf zabbix_agent-6.4.21-linux-3.0-amd64-static.tar.gz -C /tmp/zbx-extract; }
  cp "$(find /tmp/zbx-extract -name zabbix_agentd -type f | head -1)" /usr/local/zabbix/
  cp "$(find /tmp/zbx-extract -name 'zabbix_agentd.conf' | head -1)" /etc/zabbix/zabbix_agentd.conf
  cat > /etc/systemd/system/zabbix-agent.service <<'SVC'
[Unit]
Description=Zabbix Agent
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/zabbix/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf
ExecStop=/usr/local/zabbix/zabbix_agentd -c /etc/zabbix/zabbix_agentd.conf -R stop
User=zabbix
Group=zabbix
Restart=on-failure
[Install]
WantedBy=multi-user.target
SVC
  systemctl daemon-reload
fi

CONF=/etc/zabbix/zabbix_agentd.conf
PSKFILE=/etc/zabbix/zabbix_agentd.psk
printf '%s' 'cd1a785ee4257e33de073c4cfe6b1dde555d2ed9e22d80215313b3fcf49ed742' > "$PSKFILE"
chmod 600 "$PSKFILE"
chown zabbix:zabbix "$PSKFILE" 2>/dev/null || chown zabbix "$PSKFILE" 2>/dev/null || true
set_conf "$CONF" Server            "mon.havenblueshore.cloud"
set_conf "$CONF" ServerActive      "mon.havenblueshore.cloud:10051"
set_conf "$CONF" HostMetadata      "Linux"
set_conf "$CONF" TLSConnect        "psk"
set_conf "$CONF" TLSAccept         "psk"
set_conf "$CONF" TLSPSKIdentity    "havenblueshore-autoreg"
set_conf "$CONF" TLSPSKFile        "$PSKFILE"
systemctl enable --now zabbix-agent
systemctl restart zabbix-agent
sleep 2
systemctl is-active --quiet zabbix-agent && echo "Zabbix Agent 6.4.21 installed and running (PSK auto-registration to mon.havenblueshore.cloud:10051)."
