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