New packages: - secubox-threat-analyst: AI-powered threat analysis with CrowdSec integration - luci-app-threat-analyst: LuCI dashboard for threat intelligence - secubox-dns-guard: DNS security monitoring and blocking - secubox-mcp-server: Model Context Protocol server for AI assistant integration Enhancements: - dns-provider: Add DynDNS support (dyndns, get, update, domains commands) - gandi.sh: Full DynDNS with WAN IP detection and record updates - luci-app-dnsguard: Upgrade to v1.1.0 with improved dashboard Infrastructure: - BIND9 DNS setup for secubox.in with CAA records - Wildcard SSL certificates via DNS-01 challenge - HAProxy config fixes for secubox.in subdomains - Mail server setup with Roundcube webmail Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
88 lines
2.7 KiB
Bash
88 lines
2.7 KiB
Bash
# SecuBox MCP Tool: WireGuard Status
|
|
# Provides VPN tunnel status for all WireGuard interfaces
|
|
|
|
tool_wireguard_status() {
|
|
local args="$1"
|
|
local iface=$(echo "$args" | jsonfilter -e '@.interface' 2>/dev/null)
|
|
|
|
# Check if wg command is available
|
|
if ! command -v wg >/dev/null 2>&1; then
|
|
echo '{"error":"WireGuard tools not installed"}'
|
|
return 1
|
|
fi
|
|
|
|
if [ -n "$iface" ]; then
|
|
# Single interface
|
|
get_wg_interface_json "$iface"
|
|
else
|
|
# All interfaces
|
|
local interfaces=$(wg show interfaces 2>/dev/null)
|
|
if [ -z "$interfaces" ]; then
|
|
echo '{"interfaces":[]}'
|
|
return 0
|
|
fi
|
|
|
|
local json='{"interfaces":['
|
|
local first=1
|
|
|
|
for iface in $interfaces; do
|
|
[ $first -eq 0 ] && json="${json},"
|
|
first=0
|
|
json="${json}$(get_wg_interface_json "$iface")"
|
|
done
|
|
|
|
json="${json}]}"
|
|
echo "$json"
|
|
fi
|
|
}
|
|
|
|
get_wg_interface_json() {
|
|
local iface="$1"
|
|
|
|
# Get interface info
|
|
local pubkey=$(wg show "$iface" public-key 2>/dev/null)
|
|
local port=$(wg show "$iface" listen-port 2>/dev/null)
|
|
local peers_raw=$(wg show "$iface" peers 2>/dev/null)
|
|
local peer_count=$(echo "$peers_raw" | grep -c . 2>/dev/null || echo 0)
|
|
|
|
# Traffic stats from sysfs
|
|
local rx_bytes=0
|
|
local tx_bytes=0
|
|
if [ -f "/sys/class/net/${iface}/statistics/rx_bytes" ]; then
|
|
rx_bytes=$(cat "/sys/class/net/${iface}/statistics/rx_bytes")
|
|
tx_bytes=$(cat "/sys/class/net/${iface}/statistics/tx_bytes")
|
|
fi
|
|
|
|
# Get peer details
|
|
local peers_json='['
|
|
local first=1
|
|
|
|
if [ -n "$peers_raw" ]; then
|
|
for peer_pubkey in $peers_raw; do
|
|
[ $first -eq 0 ] && peers_json="${peers_json},"
|
|
first=0
|
|
|
|
local endpoint=$(wg show "$iface" endpoints 2>/dev/null | grep "^$peer_pubkey" | cut -f2)
|
|
local latest_handshake=$(wg show "$iface" latest-handshakes 2>/dev/null | grep "^$peer_pubkey" | cut -f2)
|
|
local transfer=$(wg show "$iface" transfer 2>/dev/null | grep "^$peer_pubkey")
|
|
local peer_rx=$(echo "$transfer" | awk '{print $2}')
|
|
local peer_tx=$(echo "$transfer" | awk '{print $3}')
|
|
|
|
# Calculate if peer is active (handshake within last 3 minutes)
|
|
local active="false"
|
|
local now=$(date +%s)
|
|
if [ -n "$latest_handshake" ] && [ "$latest_handshake" != "0" ]; then
|
|
local age=$((now - latest_handshake))
|
|
[ $age -lt 180 ] && active="true"
|
|
fi
|
|
|
|
peers_json="${peers_json}{\"public_key\":\"${peer_pubkey}\",\"endpoint\":\"${endpoint:-null}\",\"latest_handshake\":${latest_handshake:-0},\"active\":${active},\"rx_bytes\":${peer_rx:-0},\"tx_bytes\":${peer_tx:-0}}"
|
|
done
|
|
fi
|
|
|
|
peers_json="${peers_json}]"
|
|
|
|
printf '{"interface":"%s","public_key":"%s","listen_port":%s,"peer_count":%d,"rx_bytes":%s,"tx_bytes":%s,"peers":%s}' \
|
|
"$iface" "$pubkey" "${port:-0}" "$peer_count" "$rx_bytes" "$tx_bytes" "$peers_json"
|
|
}
|