diff --git a/docker/routlin-dash/app/pages/dhcpleases/view.py b/docker/routlin-dash/app/pages/dhcpleases/view.py
index 823af77..06cbf3d 100644
--- a/docker/routlin-dash/app/pages/dhcpleases/view.py
+++ b/docker/routlin-dash/app/pages/dhcpleases/view.py
@@ -1,7 +1,6 @@
import ipaddress
import os
import glob
-import subprocess
from datetime import datetime, timezone
from config_utils import collect_layout_tokens, load_config, relative_time
from factory import (
@@ -47,29 +46,32 @@ def _vendor_cell(vendor):
def _get_arp_table():
- """Return {mac_lower: state} from `ip neigh`. Excludes FAILED/PERMANENT/INCOMPLETE."""
+ """Return {mac_lower: entry} from /proc/net/arp (host-mounted). ATF_COM (0x2) flag means
+ the entry is complete; entries without it (incomplete) are excluded."""
try:
- result = subprocess.run(['ip', 'neigh'], capture_output=True, text=True, timeout=5)
entries = {}
- for line in result.stdout.splitlines():
- parts = line.split()
- if 'lladdr' not in parts:
- continue
- state = parts[-1]
- if state in ('FAILED', 'PERMANENT', 'NOARP', 'INCOMPLETE'):
- continue
- idx = parts.index('lladdr')
- mac = parts[idx + 1].lower()
- ip = parts[0]
- iface = parts[2] if len(parts) > 2 else ''
- entries[mac] = {'ip': ip, 'iface': iface, 'state': state}
+ with open('/proc/net/arp') as f:
+ next(f) # skip header line
+ for line in f:
+ parts = line.split()
+ if len(parts) < 6:
+ continue
+ ip = parts[0]
+ flags = int(parts[2], 16)
+ mac = parts[3].lower()
+ iface = parts[5]
+ if not (flags & 0x2):
+ continue
+ if mac == '00:00:00:00:00:00':
+ continue
+ entries[mac] = {'ip': ip, 'iface': iface, 'state': 'REACHABLE'}
return entries
except Exception:
return {}
def _status_badge(state):
- if state == 'REACHABLE':
+ if state:
return 'Online'
return 'Offline'
diff --git a/docker/routlin-dash/docker-compose.yml b/docker/routlin-dash/docker-compose.yml
index 697ce77..125294f 100644
--- a/docker/routlin-dash/docker-compose.yml
+++ b/docker/routlin-dash/docker-compose.yml
@@ -14,6 +14,7 @@ services:
- /sys/devices:/sys/devices:ro
- /etc/localtime:/etc/localtime:ro
- /var/lib/misc:/var/lib/misc:ro
+ - /proc/net/arp:/proc/net/arp:ro
- /var/log/freeradius:/var/log/freeradius
environment:
- PYTHONPATH=/routlin_location