Development

This commit is contained in:
Matthew Grotke 2026-06-03 02:46:14 -04:00
parent 5a3a18d5b0
commit 99a4cf637f
2 changed files with 19 additions and 16 deletions

View file

@ -1,7 +1,6 @@
import ipaddress import ipaddress
import os import os
import glob import glob
import subprocess
from datetime import datetime, timezone from datetime import datetime, timezone
from config_utils import collect_layout_tokens, load_config, relative_time from config_utils import collect_layout_tokens, load_config, relative_time
from factory import ( from factory import (
@ -47,29 +46,32 @@ def _vendor_cell(vendor):
def _get_arp_table(): 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: try:
result = subprocess.run(['ip', 'neigh'], capture_output=True, text=True, timeout=5)
entries = {} entries = {}
for line in result.stdout.splitlines(): with open('/proc/net/arp') as f:
parts = line.split() next(f) # skip header line
if 'lladdr' not in parts: for line in f:
continue parts = line.split()
state = parts[-1] if len(parts) < 6:
if state in ('FAILED', 'PERMANENT', 'NOARP', 'INCOMPLETE'): continue
continue ip = parts[0]
idx = parts.index('lladdr') flags = int(parts[2], 16)
mac = parts[idx + 1].lower() mac = parts[3].lower()
ip = parts[0] iface = parts[5]
iface = parts[2] if len(parts) > 2 else '' if not (flags & 0x2):
entries[mac] = {'ip': ip, 'iface': iface, 'state': state} continue
if mac == '00:00:00:00:00:00':
continue
entries[mac] = {'ip': ip, 'iface': iface, 'state': 'REACHABLE'}
return entries return entries
except Exception: except Exception:
return {} return {}
def _status_badge(state): def _status_badge(state):
if state == 'REACHABLE': if state:
return '<span class="badge badge-enabled">Online</span>' return '<span class="badge badge-enabled">Online</span>'
return '<span class="badge badge-disabled">Offline</span>' return '<span class="badge badge-disabled">Offline</span>'

View file

@ -14,6 +14,7 @@ services:
- /sys/devices:/sys/devices:ro - /sys/devices:/sys/devices:ro
- /etc/localtime:/etc/localtime:ro - /etc/localtime:/etc/localtime:ro
- /var/lib/misc:/var/lib/misc:ro - /var/lib/misc:/var/lib/misc:ro
- /proc/net/arp:/proc/net/arp:ro
- /var/log/freeradius:/var/log/freeradius - /var/log/freeradius:/var/log/freeradius
environment: environment:
- PYTHONPATH=/routlin_location - PYTHONPATH=/routlin_location