templates-zabbix-itguys/templates_gold/pfsense_hybrid_snmp_agent/files/openvpn-collector.sh

77 lines
2.9 KiB
Bash

#!/bin/sh
# OpenVPN Discovery - COLETOR (Arthur's Gold Standard v7-METRICS)
# Este script roda via CRON e grava o resultado em cache
# Compatível com: pfSense 2.x / FreeBSD
#
# Instalação:
# 1. Copie para /opt/zabbix/openvpn-collector.sh
# 2. chmod +x /opt/zabbix/openvpn-collector.sh
# 3. Adicione ao cron: */1 * * * * /opt/zabbix/openvpn-collector.sh
#
# v7 Changelog:
# - Adicionado métricas expandidas: Bytes Received, Bytes Sent, Connected Since
# - Novo cache secundário para métricas: /tmp/openvpn_metrics.json
SOCKET_DIR="/var/etc/openvpn"
CACHE_FILE="/tmp/openvpn_discovery.json"
CACHE_FILE_TMP="/tmp/openvpn_discovery.json.tmp"
METRICS_FILE="/tmp/openvpn_metrics.json"
METRICS_FILE_TMP="/tmp/openvpn_metrics.json.tmp"
# Inicia JSON de discovery
printf '{"data":[' > "$CACHE_FILE_TMP"
# Inicia JSON de métricas
printf '{' > "$METRICS_FILE_TMP"
first_discovery=1
first_metrics=1
# Loop através de cada socket
for sockdir in "$SOCKET_DIR"/server*/; do
[ -d "$sockdir" ] || continue
sockfile="${sockdir}sock"
[ -S "$sockfile" ] || continue
server_name=$(basename "$sockdir")
# Consulta o socket e processa linha por linha
# CLIENT_LIST format: type, cn, realaddr, virtaddr, virtaddr6, bytes_received, bytes_sent, connected_since_human, connected_since_unix, username, clientid, peerid, cipher
(echo "status 2"; sleep 0.3; echo "quit") | /usr/bin/nc -U "$sockfile" 2>/dev/null | \
grep "^CLIENT_LIST," | grep -v "Common Name" | \
while IFS=',' read -r type cn realaddr virtaddr virtaddr6 bytes_recv bytes_sent conn_human conn_unix rest; do
[ -z "$cn" ] && continue
real_ip=$(echo "$realaddr" | cut -d: -f1)
virt_ip=$(echo "$virtaddr" | cut -d: -f1)
# --- Discovery JSON ---
if [ $first_discovery -eq 0 ]; then
printf ',' >> "$CACHE_FILE_TMP"
fi
printf '{"{#VPN.USER}":"%s","{#VPN.SERVER}":"%s","{#VPN.REAL_IP}":"%s","{#VPN.VIRTUAL_IP}":"%s"}' "$cn" "$server_name" "$real_ip" "$virt_ip" >> "$CACHE_FILE_TMP"
first_discovery=0
# --- Metrics JSON ---
# Format: "username": { "bytes_recv": N, "bytes_sent": N, "connected_since": N, "real_ip": "x.x.x.x", "virtual_ip": "y.y.y.y" }
if [ $first_metrics -eq 0 ]; then
printf ',' >> "$METRICS_FILE_TMP"
fi
printf '"%s":{"bytes_recv":%s,"bytes_sent":%s,"connected_since":%s,"real_ip":"%s","virtual_ip":"%s","server":"%s"}' \
"$cn" "${bytes_recv:-0}" "${bytes_sent:-0}" "${conn_unix:-0}" "$real_ip" "$virt_ip" "$server_name" >> "$METRICS_FILE_TMP"
first_metrics=0
done
first_discovery=0
first_metrics=0
done
printf ']}\n' >> "$CACHE_FILE_TMP"
printf '}\n' >> "$METRICS_FILE_TMP"
# Move atomicamente para evitar leitura parcial
mv "$CACHE_FILE_TMP" "$CACHE_FILE"
mv "$METRICS_FILE_TMP" "$METRICS_FILE"
chmod 644 "$CACHE_FILE"
chmod 644 "$METRICS_FILE"