#!/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'