- Add secubox-app-ndpid: nDPId daemon with bundled libndpi 5.x - Add luci-app-ndpid: LuCI web interface for nDPId management - Add migration documentation from netifyd to nDPId - Uses git dev branch for latest libndpi API compatibility - Builds nDPId + nDPIsrvd event broker for microservice architecture Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
100 lines
2.5 KiB
Bash
100 lines
2.5 KiB
Bash
#!/bin/sh
|
|
# nDPId shared functions for SecuBox
|
|
# Copyright (C) 2025 CyberMind.fr
|
|
|
|
# Paths
|
|
NDPID_RUNTIME_DIR="/var/run/ndpid"
|
|
NDPID_COLLECTOR_SOCK="${NDPID_RUNTIME_DIR}/collector.sock"
|
|
NDPID_DISTRIBUTOR_SOCK="${NDPID_RUNTIME_DIR}/distributor.sock"
|
|
NDPID_COMPAT_STATUS="/var/run/netifyd/status.json"
|
|
NDPID_FLOWS_FILE="/tmp/ndpid-flows.json"
|
|
NDPID_STATS_FILE="/tmp/ndpid-stats.json"
|
|
|
|
# Check if nDPId is running
|
|
ndpid_running() {
|
|
pidof ndpid >/dev/null 2>&1
|
|
}
|
|
|
|
# Check if nDPIsrvd is running
|
|
ndpisrvd_running() {
|
|
pidof ndpisrvd >/dev/null 2>&1
|
|
}
|
|
|
|
# Get nDPId version
|
|
ndpid_version() {
|
|
ndpid -v 2>&1 | head -1 | grep -oE '[0-9]+\.[0-9]+(\.[0-9]+)?'
|
|
}
|
|
|
|
# Format bytes to human readable
|
|
format_bytes() {
|
|
local bytes="${1:-0}"
|
|
if [ "$bytes" -ge 1073741824 ]; then
|
|
echo "$(awk "BEGIN {printf \"%.2f\", $bytes/1073741824}") GB"
|
|
elif [ "$bytes" -ge 1048576 ]; then
|
|
echo "$(awk "BEGIN {printf \"%.2f\", $bytes/1048576}") MB"
|
|
elif [ "$bytes" -ge 1024 ]; then
|
|
echo "$(awk "BEGIN {printf \"%.2f\", $bytes/1024}") KB"
|
|
else
|
|
echo "${bytes} B"
|
|
fi
|
|
}
|
|
|
|
# Parse nDPId JSON event (strip 5-digit length prefix)
|
|
parse_ndpid_event() {
|
|
local raw="$1"
|
|
echo "${raw:5}"
|
|
}
|
|
|
|
# Extract application name from nDPI proto string
|
|
# e.g., "TLS.Google" -> "google", "QUIC.YouTube" -> "youtube"
|
|
normalize_app_name() {
|
|
local proto="$1"
|
|
echo "$proto" | tr '.' '\n' | tail -1 | tr '[:upper:]' '[:lower:]'
|
|
}
|
|
|
|
# Get list of network interfaces suitable for monitoring
|
|
get_monitor_interfaces() {
|
|
local ifaces=""
|
|
# Get bridge interfaces
|
|
for br in $(ls /sys/class/net/ 2>/dev/null | grep -E '^br-'); do
|
|
ifaces="$ifaces $br"
|
|
done
|
|
# Get ethernet interfaces if no bridges
|
|
if [ -z "$ifaces" ]; then
|
|
for eth in $(ls /sys/class/net/ 2>/dev/null | grep -E '^eth[0-9]'); do
|
|
ifaces="$ifaces $eth"
|
|
done
|
|
fi
|
|
echo "$ifaces" | xargs
|
|
}
|
|
|
|
# Create ipsets for flow actions
|
|
create_action_ipsets() {
|
|
# BitTorrent tracking
|
|
ipset list secubox-bittorrent >/dev/null 2>&1 || \
|
|
ipset create secubox-bittorrent hash:ip timeout 900 2>/dev/null
|
|
|
|
# Streaming services tracking
|
|
ipset list secubox-streaming >/dev/null 2>&1 || \
|
|
ipset create secubox-streaming hash:ip timeout 1800 2>/dev/null
|
|
|
|
# Blocked IPs
|
|
ipset list secubox-blocked >/dev/null 2>&1 || \
|
|
ipset create secubox-blocked hash:ip timeout 3600 2>/dev/null
|
|
}
|
|
|
|
# Add IP to ipset with timeout
|
|
add_to_ipset() {
|
|
local ipset_name="$1"
|
|
local ip="$2"
|
|
local timeout="${3:-900}"
|
|
ipset add "$ipset_name" "$ip" timeout "$timeout" 2>/dev/null
|
|
}
|
|
|
|
# Log message
|
|
ndpid_log() {
|
|
local level="${1:-INFO}"
|
|
shift
|
|
logger -t ndpid "[$level] $*"
|
|
}
|