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

47 lines
1.4 KiB
Bash

#!/bin/sh
# OpenVPN Discovery Script via Management Interface (Arthur's Gold Standard v5-FINAL)
# Compatível com: pfSense 2.x / FreeBSD
#
# Outputs: {#VPN.USER}, {#VPN.SERVER}, {#VPN.REAL_IP}, {#VPN.VIRTUAL_IP}
SOCKET_DIR="/var/etc/openvpn"
# Inicia JSON
printf '{"data":['
first=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
(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 rest; do
# Ignora se CN está vazio ou é o header
[ -z "$cn" ] && continue
# Extrai apenas IP (remove porta)
real_ip=$(echo "$realaddr" | cut -d: -f1)
virt_ip=$(echo "$virtaddr" | cut -d: -f1)
# Imprime separador se não for primeiro
if [ $first -eq 0 ]; then
printf ','
fi
printf '{"{#VPN.USER}":"%s","{#VPN.SERVER}":"%s","{#VPN.REAL_IP}":"%s","{#VPN.VIRTUAL_IP}":"%s"}' "$cn" "$server_name" "$real_ip" "$virt_ip"
first=0
done
# Atualiza flag first se houve saída
first=0
done
printf ']}\n'