Prevent odhcpd crashes from MAC randomization causing hostname conflicts, stale lease pile-up, and lease flooding. Adds hostname dedup, stale lease cleanup, flood detection, CLI commands, RPC methods, and LuCI dashboard card. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
66 lines
1.4 KiB
Bash
66 lines
1.4 KiB
Bash
#!/bin/sh
|
|
# mac-guardian hotplug handler for hostapd events
|
|
# Provides real-time detection on station connect/disconnect
|
|
|
|
# Exit early for irrelevant events or missing data
|
|
[ -n "$ACTION" ] || exit 0
|
|
[ -n "$MACADDR" ] || exit 0
|
|
|
|
# Only handle station events
|
|
case "$ACTION" in
|
|
AP-STA-CONNECTED|AP-STA-DISCONNECTED) ;;
|
|
*) exit 0 ;;
|
|
esac
|
|
|
|
# Check if enabled
|
|
. /lib/functions.sh
|
|
config_load mac-guardian
|
|
config_get enabled main enabled 0
|
|
[ "$enabled" = "1" ] || exit 0
|
|
|
|
# Fork to background for fast return to hostapd
|
|
{
|
|
. /usr/lib/secubox/mac-guardian/functions.sh
|
|
mg_load_config
|
|
mg_init
|
|
|
|
mac=$(mg_normalize_mac "$MACADDR")
|
|
iface="${INTERFACE:-unknown}"
|
|
|
|
case "$ACTION" in
|
|
AP-STA-CONNECTED)
|
|
if mg_validate_mac "$mac"; then
|
|
if ! mg_is_whitelisted "$mac"; then
|
|
mg_lock && {
|
|
mg_check_station "$mac" "" "$iface"
|
|
mg_unlock
|
|
}
|
|
else
|
|
mg_lock && {
|
|
local hostname
|
|
hostname=$(mg_resolve_hostname "$mac")
|
|
mg_db_upsert "$mac" "$iface" "$hostname"
|
|
mg_unlock
|
|
}
|
|
fi
|
|
fi
|
|
;;
|
|
AP-STA-DISCONNECTED)
|
|
# Update last_seen and clean up stale DHCP lease for this MAC
|
|
if mg_validate_mac "$mac"; then
|
|
mg_lock && {
|
|
local existing
|
|
existing=$(mg_db_lookup "$mac")
|
|
if [ -n "$existing" ]; then
|
|
local hostname
|
|
hostname=$(mg_resolve_hostname "$mac")
|
|
mg_db_upsert "$mac" "$iface" "$hostname"
|
|
fi
|
|
mg_dhcp_cleanup_stale_mac "$mac"
|
|
mg_unlock
|
|
}
|
|
fi
|
|
;;
|
|
esac
|
|
} &
|