34 lines
1.4 KiB
Bash
34 lines
1.4 KiB
Bash
#!/bin/sh
|
|
# OpenVPN Discovery Script (Arthur's Gold Standard)
|
|
# Outputs: {#VPN.USER}, {#VPN.SERVER}, {#VPN.REAL_IP}
|
|
|
|
JSON_OUTPUT="{\"data\":["
|
|
FIRST_ITEM=1
|
|
|
|
# Loop through all status logs
|
|
for logfile in /var/log/openvpn/status*.log; do
|
|
[ -e "$logfile" ] || continue
|
|
|
|
# Extract Server Name from Filename "status_SERVERNAME.log"
|
|
# Note: Busybox filename parsing
|
|
filename=$(basename "$logfile")
|
|
# Remove prefix "status_" and suffix ".log"
|
|
server_name=$(echo "$filename" | sed -e 's/^status_//' -e 's/\.log$//')
|
|
|
|
# Read the file and parse "CLIENT_LIST" lines
|
|
# Format: CLIENT_LIST,CommonName,RealAddress,VirtualAddress,BytesReceived,BytesSent,Since,Since(time_t),Username,ClientID,PeerID
|
|
while IFS=, read -r type common_name real_address virtual_address bytes_rx bytes_tx since since_unix username client_id peer_id; do
|
|
if [ "$type" = "CLIENT_LIST" ] && [ "$common_name" != "Common Name" ]; then
|
|
# Extract IP only from RealAddress (IP:PORT)
|
|
real_ip=$(echo "$real_address" | cut -d: -f1)
|
|
|
|
# Append to JSON
|
|
if [ $FIRST_ITEM -eq 0 ]; then JSON_OUTPUT="$JSON_OUTPUT,"; fi
|
|
JSON_OUTPUT="$JSON_OUTPUT{\"{#VPN.USER}\":\"$common_name\",\"{#VPN.SERVER}\":\"$server_name\",\"{#VPN.REAL_IP}\":\"$real_ip\"}"
|
|
FIRST_ITEM=0
|
|
fi
|
|
done < "$logfile"
|
|
done
|
|
|
|
JSON_OUTPUT="$JSON_OUTPUT]}"
|
|
echo "$JSON_OUTPUT" |