diff --git a/setup_proxy.sh b/setup_proxy.sh index 79d14ad..f16fcd5 100644 --- a/setup_proxy.sh +++ b/setup_proxy.sh @@ -12,11 +12,20 @@ export LC_ALL=C # dans la supervision FAIT (pas d agent, pas de paquet fait-zabbix, pas # d updater) : pour ca, lancer bootstrap.sh separement sur la meme machine. # -# Variables surchargeables : -# ZBX_PROXY_HOSTNAME nom du proxy, doit correspondre EXACTEMENT au nom -# declare cote serveur (defaut zbx-proxy.audiency.fr) -# ZBX_PSK_IDENTITY identite PSK, idem cote serveur -# (defaut "PSK zbx-proxy audiency") +# L identite du proxy n a pas de defaut : elle est demandee au terminal, ou +# passee en variable. Les deux valeurs doivent correspondre au caractere pres +# a ce qui est declare cote serveur. +# +# ZBX_PROXY_HOSTNAME nom du proxy (demande ; defaut propose : le FQDN) +# ZBX_PSK_IDENTITY identite PSK (demandee ; defaut propose : "PSK ") +# +# Sans terminal (cron, provisionnement), ces deux variables sont obligatoires : +# +# curl -fsSL https://.../setup_proxy.sh \ +# | sudo ZBX_PROXY_HOSTNAME=zbx-proxy.client.fr \ +# ZBX_PSK_IDENTITY="PSK zbx-proxy client" bash +# +# Variables a defaut : # ZBX_SERVER serveur Zabbix a joindre (defaut sup.fabout.it) # ZABBIX_MAJOR branche Zabbix (defaut 7.0) # ZBX_PSK_FILE chemin de la cle PSK (defaut @@ -30,10 +39,15 @@ export LC_ALL=C ZABBIX_MAJOR="${ZABBIX_MAJOR:-7.0}" ZBX_SERVER="${ZBX_SERVER:-sup.fabout.it}" -ZBX_PROXY_HOSTNAME="${ZBX_PROXY_HOSTNAME:-zbx-proxy.audiency.fr}" -ZBX_PSK_IDENTITY="${ZBX_PSK_IDENTITY:-PSK zbx-proxy audiency}" ZBX_PSK_FILE="${ZBX_PSK_FILE:-/etc/zabbix/zabbix_proxy.psk}" +# Pas de defaut : l identite du proxy est propre a chaque site. Un defaut ici +# ferait installer silencieusement un proxy portant le nom d un autre client, +# qui ne se raccorderait jamais — et la panne serait attribuee au reseau bien +# avant qu on pense a relire le Hostname. +ZBX_PROXY_HOSTNAME="${ZBX_PROXY_HOSTNAME:-}" +ZBX_PSK_IDENTITY="${ZBX_PSK_IDENTITY:-}" + PROXY_CONF=/etc/zabbix/zabbix_proxy.conf PROXY_DB=/var/lib/zabbix/zabbix_proxy.sqlite3 @@ -43,6 +57,44 @@ err() { echo "ERROR: $*" >&2; exit 1; } [[ "${EUID}" -eq 0 ]] || err "A lancer en root (sudo)." +# --- identite du proxy -------------------------------------------------------- +# Lit sur /dev/tty et non sur stdin : sous "curl ... | sudo bash", stdin est le +# code source du script, et un read classique en avalerait la suite. /dev/tty +# vise le terminal reel, qui reste disponible derriere le pipe. +# +# Sans terminal (cron, provisionnement, CI), il n y a personne pour repondre : +# le script exige alors les variables plutot que de deviner. Un defaut invente +# ici produirait un proxy qui s installe proprement et ne se raccorde jamais. +demander() { + local invite="$1" defaut="${2:-}" reponse="" + if [[ ! -r /dev/tty ]]; then + return 1 + fi + if [[ -n "${defaut}" ]]; then + printf '%s [%s] : ' "${invite}" "${defaut}" > /dev/tty + else + printf '%s : ' "${invite}" > /dev/tty + fi + IFS= read -r reponse < /dev/tty || return 1 + printf '%s' "${reponse:-${defaut}}" +} + +if [[ -z "${ZBX_PROXY_HOSTNAME}" ]]; then + ZBX_PROXY_HOSTNAME="$(demander "Nom du proxy (Hostname, identique au serveur)" \ + "$(hostname -f 2>/dev/null || hostname)")" \ + || err "Aucun terminal pour la saisie : passer ZBX_PROXY_HOSTNAME en variable." +fi +[[ -n "${ZBX_PROXY_HOSTNAME}" ]] || err "Le nom du proxy est obligatoire." + +if [[ -z "${ZBX_PSK_IDENTITY}" ]]; then + # Defaut derive du nom : l identite n a pas a etre inventee, elle doit juste + # etre stable et identique des deux cotes. + ZBX_PSK_IDENTITY="$(demander "Identite PSK (TLSPSKIdentity, identique au serveur)" \ + "PSK ${ZBX_PROXY_HOSTNAME}")" \ + || err "Aucun terminal pour la saisie : passer ZBX_PSK_IDENTITY en variable." +fi +[[ -n "${ZBX_PSK_IDENTITY}" ]] || err "L identite PSK est obligatoire." + [[ -r /etc/os-release ]] || err "/etc/os-release introuvable, distribution non supportee." # shellcheck disable=SC1091 . /etc/os-release @@ -146,6 +198,15 @@ Hostname=${ZBX_PROXY_HOSTNAME} # --- Base SQLite (creee automatiquement au 1er demarrage) --- DBName=${PROXY_DB} +# --- Fichier PID --- +# L unite systemd du paquet est de Type=forking : elle attend ce fichier pour +# considerer le service demarre. Sans cette directive, zabbix_proxy tourne +# normalement mais n ecrit aucun PID, et le service reste bloque en +# "activating" jusqu au timeout — un demarrage qui parait fige alors que le +# proxy fonctionne. La conf du paquet la contient ; la reecrire sans elle la +# perd. +PidFile=/run/zabbix/zabbix_proxy.pid + # --- Resilience liaison internet --- # Garde les donnees jusqu a 24h si ${ZBX_SERVER} est injoignable (coupure WAN) ProxyOfflineBuffer=24 @@ -188,8 +249,29 @@ preparer_db() { demarrer() { systemctl enable zabbix-proxy >/dev/null 2>&1 || warn "Echec de l activation au demarrage." # Le premier demarrage cree le schema SQLite, ce qui prend quelques secondes. - systemctl restart zabbix-proxy \ - || err "Le proxy n a pas demarre. Voir : journalctl -u zabbix-proxy -n 50" + # + # --no-block rend la main tout de suite : sans lui, un proxy qui n arrive pas + # a joindre le serveur laisse systemctl attendre son timeout, et l installation + # parait figee juste apres la derniere ligne affichee. On verifie l etat nous + # memes ensuite, avec un message qui dit ou regarder. + systemctl restart --no-block zabbix-proxy \ + || warn "La demande de demarrage a echoue." + + local i=0 + while [[ $i -lt 15 ]]; do + if systemctl is-active --quiet zabbix-proxy; then + log "Service zabbix-proxy actif." + return 0 + fi + if systemctl is-failed --quiet zabbix-proxy; then + warn "Le service a echoue. Voir : journalctl -u zabbix-proxy -n 50" + return 0 + fi + sleep 1 + i=$((i + 1)) + done + warn "Le service n est pas encore actif apres 15s (creation de la base ?)." + warn "Suivre : journalctl -u zabbix-proxy -f" } resume() {