#!/bin/sh # Netifyd Data Collector # Collects statistics from netifyd and creates status.json # Copyright (C) 2025 CyberMind.fr NETIFYD_STATUS="/var/run/netifyd/status.json" NETIFYD_SOCKET="/var/run/netifyd/netifyd.sock" TMP_FILE="/tmp/netifyd-status.tmp" # Create run directory if needed mkdir -p /var/run/netifyd # Check if netifyd is running if ! pidof netifyd >/dev/null 2>&1; then echo '{"error":"netifyd not running","flow_count":0,"devices":{},"dhc_size":0}' > "$NETIFYD_STATUS" exit 1 fi # Get status from netifyd CLI STATUS_OUTPUT=$(netifyd -s 2>/dev/null) # Parse active flows count FLOW_COUNT=$(echo "$STATUS_OUTPUT" | grep -i "active flows" | awk '{print $NF}' | tr -d ',' || echo 0) # Try to get data from socket if available if [ -S "$NETIFYD_SOCKET" ] && command -v socat >/dev/null 2>&1; then # Request flow dump from socket (with 2 second timeout) SOCKET_DATA=$(timeout 2 socat - UNIX-CONNECT:"$NETIFYD_SOCKET" </dev/null {"type":"request","request":"flow_dump"} EOF ) # Parse socket data if available if [ -n "$SOCKET_DATA" ] && command -v jq >/dev/null 2>&1; then # Extract devices (unique IPs/MACs) DEVICES=$(echo "$SOCKET_DATA" | jq -c '[.flows[]? | {ip: (.local_ip // "unknown"), mac: (.local_mac // "unknown")}] | unique' 2>/dev/null || echo '[]') # Count unique applications APP_COUNT=$(echo "$SOCKET_DATA" | jq '[.flows[]?.detected_application // "Unknown"] | unique | length' 2>/dev/null || echo 0) # Count unique protocols PROTO_COUNT=$(echo "$SOCKET_DATA" | jq '[.flows[]?.detected_protocol // "Unknown"] | unique | length' 2>/dev/null || echo 0) # Calculate total bytes TOTAL_BYTES=$(echo "$SOCKET_DATA" | jq '[.flows[]? | (.bytes_orig // 0) + (.bytes_resp // 0)] | add' 2>/dev/null || echo 0) # Build devices object from array DEVICES_OBJ=$(echo "$DEVICES" | jq -c 'reduce .[] as $item ({}; .[$item.mac] += [$item.ip])' 2>/dev/null || echo '{}') else DEVICES_OBJ='{}' APP_COUNT=0 PROTO_COUNT=0 TOTAL_BYTES=0 fi else # Fallback: estimate from netifyd -s output DEVICES_OBJ='{}' APP_COUNT=0 PROTO_COUNT=0 TOTAL_BYTES=0 fi # Create JSON status file cat > "$TMP_FILE" </dev/null || echo 0) } EOF # Atomic move to prevent partial reads mv "$TMP_FILE" "$NETIFYD_STATUS" exit 0