feat: Add OpenVPN discovery and data collection scripts with caching for Zabbix.
This commit is contained in:
parent
bc4d64f1eb
commit
825f42d951
|
|
@ -0,0 +1,53 @@
|
||||||
|
#!/bin/sh
|
||||||
|
# OpenVPN Discovery - COLETOR (Arthur's Gold Standard v6-CACHE)
|
||||||
|
# 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
|
||||||
|
|
||||||
|
SOCKET_DIR="/var/etc/openvpn"
|
||||||
|
CACHE_FILE="/tmp/openvpn_discovery.json"
|
||||||
|
CACHE_FILE_TMP="/tmp/openvpn_discovery.json.tmp"
|
||||||
|
|
||||||
|
# Inicia JSON
|
||||||
|
printf '{"data":[' > "$CACHE_FILE_TMP"
|
||||||
|
|
||||||
|
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
|
||||||
|
[ -z "$cn" ] && continue
|
||||||
|
|
||||||
|
real_ip=$(echo "$realaddr" | cut -d: -f1)
|
||||||
|
virt_ip=$(echo "$virtaddr" | cut -d: -f1)
|
||||||
|
|
||||||
|
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 >> "$CACHE_FILE_TMP"
|
||||||
|
|
||||||
|
first=0
|
||||||
|
done
|
||||||
|
|
||||||
|
printf ']}\n' >> "$CACHE_FILE_TMP"
|
||||||
|
|
||||||
|
# Move atomicamente para evitar leitura parcial
|
||||||
|
mv "$CACHE_FILE_TMP" "$CACHE_FILE"
|
||||||
|
chmod 644 "$CACHE_FILE"
|
||||||
|
|
@ -1,47 +1,16 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# OpenVPN Discovery Script via Management Interface (Arthur's Gold Standard v5-FINAL)
|
# OpenVPN Discovery - LEITOR (Arthur's Gold Standard v6-CACHE)
|
||||||
# Compatível com: pfSense 2.x / FreeBSD
|
# Este script é chamado pelo Zabbix e apenas lê o cache
|
||||||
|
# Execução INSTANTÂNEA - sem timeout
|
||||||
#
|
#
|
||||||
# Outputs: {#VPN.USER}, {#VPN.SERVER}, {#VPN.REAL_IP}, {#VPN.VIRTUAL_IP}
|
# Dependência: openvpn-collector.sh rodando via cron
|
||||||
|
|
||||||
SOCKET_DIR="/var/etc/openvpn"
|
CACHE_FILE="/tmp/openvpn_discovery.json"
|
||||||
|
|
||||||
# Inicia JSON
|
# Se o cache existe e tem menos de 5 minutos, usa ele
|
||||||
printf '{"data":['
|
if [ -f "$CACHE_FILE" ]; then
|
||||||
|
cat "$CACHE_FILE"
|
||||||
first=1
|
else
|
||||||
|
# Cache não existe, retorna vazio
|
||||||
# Loop através de cada socket
|
echo '{"data":[]}'
|
||||||
for sockdir in "$SOCKET_DIR"/server*/; do
|
fi
|
||||||
[ -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'
|
|
||||||
Loading…
Reference in New Issue