#!/usr/bin/env bash
#
# install-zabbix-agent2.sh  —  revize pro Zabbix 7.0 LTS / Debian
# Jednoduchá instalace a konfigurace Zabbix Agent 2 s PSK šifrováním.
#
# VERZE JE ZÁMĚRNĚ NAPEVNO (7.0 LTS), aby ladila se serverem.
# Cesty Zabbix repozitáře se mezi verzemi liší (7.0 nemá /release/, 7.4 ho má),
# proto se NEsestavují automaticky – opisují se z oficiálního konfigurátoru.
# Při upgradu serveru (např. na 8.0 LTS) udělej NOVOU REVIZI tohoto scriptu:
#   1) na https://www.zabbix.com/download vyber novou verzi / Debian / Agent
#   2) přepiš ZBX_VERSION a ověř REL_URL níže
#   3) otestuj na jednom hostu, pak nasaď (a verzuj na webu: v8.0/ vedle aktuální)
#
# Použití:
#   curl -fsSL https://get.ypt.cz/zabbix-agent2.sh | bash
#   curl -fsSL https://get.ypt.cz/zabbix-agent2.sh | bash -s -- nazev.domena.cz
#
# Přepsatelné proměnnými prostředí:
#   ZBX_SERVER     – adresa Zabbix serveru (default zabbixserver.yellowpoint.cz)
#   ZBX_SERVER_IP  – volitelně IP serveru; zapíše se do /etc/hosts (vhodné pro DNS servery)
#
set -euo pipefail

# ===================== Konfigurace =====================
ZBX_VERSION="7.0"                                       # napevno – viz hlavička
ZBX_SERVER="${ZBX_SERVER:-zabbixserver.yellowpoint.cz}"
ZBX_SERVER_IP="${ZBX_SERVER_IP:-}"
ZBX_CONF="/etc/zabbix/zabbix_agent2.conf"
ZBX_PSK_FILE="/etc/zabbix/zabbix_agent2.psk"
export DEBIAN_FRONTEND=noninteractive

# ===================== Pomocné funkce =====================
log()  { printf '\033[1;32m[*]\033[0m %s\n' "$*"; }
warn() { printf '\033[1;33m[!]\033[0m %s\n' "$*" >&2; }
die()  { printf '\033[1;31m[x]\033[0m %s\n' "$*" >&2; exit 1; }

# ===================== Kontroly =====================
[ "$(id -u)" -eq 0 ] || die "Spusť jako root (sudo)."

# FQDN: 1. argument, jinak hostname -f
FQDN="${1:-$(hostname -f 2>/dev/null || true)}"
[ -n "$FQDN" ] || die "Nepodařilo se zjistit FQDN. Předej ho jako argument: ... -- nazev.domena.cz"
case "$FQDN" in
  *.*) : ;;
  *) warn "FQDN '$FQDN' nevypadá jako plné doménové jméno – ověř Hostname/TLSPSKIdentity." ;;
esac

# Distribuce – tento script je ověřený pro Debian (12/13).
[ -r /etc/os-release ] || die "Chybí /etc/os-release."
# shellcheck disable=SC1091
. /etc/os-release
OS_ID="${ID:-}"
OS_VER="${VERSION_ID:-}"
[ "$OS_ID" = "debian" ] || die "Script je pro Debian (zjištěno: ${OS_ID:-?}). Pro jinou distribuci uprav REL_URL dle Zabbix konfigurátoru."
[ -n "$OS_VER" ] || die "Nepodařilo se zjistit verzi Debianu."

log "Cíl: $FQDN  |  Debian $OS_VER  |  Zabbix $ZBX_VERSION  |  Server: $ZBX_SERVER"

# ===================== Instalace repozitáře =====================
# URL opsaná z oficiálního konfigurátoru pro 7.0/Debian (pozor: BEZ /release/, na rozdíl od 7.4).
# Mění se jen +debianNN podle verze Debianu (stabilní, předvídatelné).
REL_DEB="zabbix-release_latest_${ZBX_VERSION}+debian${OS_VER}_all.deb"
REL_URL="https://repo.zabbix.com/zabbix/${ZBX_VERSION}/debian/pool/main/z/zabbix-release/${REL_DEB}"

# Úklid: odeber případný starší zabbix-release (jiná verze by jinak míchala zdroje balíčků).
if dpkg-query -W -f='${Status}' zabbix-release 2>/dev/null | grep -q "install ok installed"; then
  log "Odstraňuji předchozí zabbix-release (čistý stav repa)"
  apt-get purge -y -qq zabbix-release >/dev/null || true
fi
# Odeber i případné ruční zbytky z dřívějších revizí tohoto scriptu.
rm -f /etc/apt/sources.list.d/zabbix.sources \
      /etc/apt/preferences.d/zabbix.pref \
      /etc/apt/keyrings/zabbix.gpg

TMP_DEB="$(mktemp --suffix=.deb)"
trap 'rm -f "$TMP_DEB"' EXIT

log "Stahuji repo balíček: $REL_URL"
if command -v curl >/dev/null 2>&1; then
  curl -fsSL -o "$TMP_DEB" "$REL_URL" \
    || die "Stažení selhalo (404?). Ověř URL v Zabbix konfigurátoru pro Debian $OS_VER."
else
  wget -qO "$TMP_DEB" "$REL_URL" \
    || die "Stažení selhalo (404?). Ověř URL v Zabbix konfigurátoru pro Debian $OS_VER."
fi

log "Instaluji repo balíček a aktualizuji apt"
dpkg -i "$TMP_DEB" >/dev/null
apt-get update -qq

log "Instaluji zabbix-agent2"
apt-get install -y -qq zabbix-agent2 >/dev/null

# ===================== PSK =====================
if [ -s "$ZBX_PSK_FILE" ]; then
  log "PSK už existuje – ponechávám stávající ($ZBX_PSK_FILE)"
else
  log "Generuji nový PSK"
  install -d -m 0755 -o root -g root /etc/zabbix
  openssl rand -hex 32 > "$ZBX_PSK_FILE"
fi
chown zabbix:zabbix "$ZBX_PSK_FILE"
chmod 600 "$ZBX_PSK_FILE"

# ===================== Volitelný /etc/hosts záznam =====================
# Pro DNS servery: odváže monitoring od funkčnosti resolvingu.
if [ -n "$ZBX_SERVER_IP" ]; then
  if grep -q "[[:space:]]${ZBX_SERVER}\([[:space:]]\|$\)" /etc/hosts; then
    log "/etc/hosts už obsahuje záznam pro $ZBX_SERVER"
  else
    log "Přidávám $ZBX_SERVER_IP $ZBX_SERVER do /etc/hosts"
    printf '%s\t%s\n' "$ZBX_SERVER_IP" "$ZBX_SERVER" >> /etc/hosts
  fi
fi

# ===================== Konfigurace =====================
if [ -f "$ZBX_CONF" ]; then
  BACKUP="${ZBX_CONF}.$(date +%Y%m%d-%H%M%S).bak"
  cp -a "$ZBX_CONF" "$BACKUP"
  log "Záloha původního configu: $BACKUP"
fi

log "Zapisuji konfiguraci"
cat > "$ZBX_CONF" <<CONF
PidFile=/run/zabbix/zabbix_agent2.pid
LogFile=/var/log/zabbix/zabbix_agent2.log
LogFileSize=0
Server=${ZBX_SERVER}
ServerActive=${ZBX_SERVER}
Hostname=${FQDN}
PluginSocket=/run/zabbix/agent.plugin.sock
ControlSocket=/run/zabbix/agent.sock
TLSConnect=psk
TLSAccept=psk
TLSPSKIdentity=${FQDN}
TLSPSKFile=${ZBX_PSK_FILE}
Include=/etc/zabbix/zabbix_agent2.d/plugins.d/*.conf
Include=/etc/zabbix/zabbix_agent2.d/*.conf
CONF
chmod 644 "$ZBX_CONF"

# ===================== Spuštění =====================
log "Restartuji a povoluji službu"
systemctl restart zabbix-agent2
systemctl enable zabbix-agent2 >/dev/null 2>&1 || true

sleep 1
if systemctl is-active --quiet zabbix-agent2; then
  log "zabbix-agent2 běží."
else
  warn "Služba neběží. Diagnostika:"
  warn "  journalctl -xeu zabbix-agent2 -n 40 --no-pager"
  warn "  zabbix_agent2 -c $ZBX_CONF -f   # běh na popředí vypíše konkrétní vadnou řádku"
fi

# ===================== Výpis pro registraci na serveru =====================
PSK_VALUE="$(cat "$ZBX_PSK_FILE")"
cat <<OUT

==================================================================
 Hotovo. Pro registraci hosta v Zabbix serveru použij:
------------------------------------------------------------------
  Host name        : ${FQDN}
  PSK identity     : ${FQDN}
  PSK              : ${PSK_VALUE}
------------------------------------------------------------------
 (Encryption -> Connections to/from host: PSK)
==================================================================
OUT
