Development

This commit is contained in:
Matthew Grotke 2026-06-01 23:17:23 -04:00
parent 8129b2f757
commit 1dce33d4eb
2 changed files with 14 additions and 22 deletions

View file

@ -54,13 +54,12 @@
"field": "vlan_name"
},
{
"label": "Renews",
"field": "renews"
"label": "Last Active",
"field": "last_active"
},
{
"label": "Recent",
"field": "recent",
"render": "badge_yes_no"
"label": "Renews",
"field": "renews"
}
]
}

View file

@ -175,18 +175,6 @@ def _parse_lease_secs(s):
pass
return None
def _dnsmasq_start_time(vlan_name):
"""Return epoch timestamp when the dnsmasq instance for this VLAN last started."""
try:
pid = int(open(f'/run/dnsmasq-routlin-{vlan_name}.pid').read().strip())
start_ticks = int(open(f'/proc/{pid}/stat').read().split()[21])
clk_tck = os.sysconf('SC_CLK_TCK')
boot_time = next(
int(line.split()[1]) for line in open('/proc/stat') if line.startswith('btime ')
)
return boot_time + start_ticks / clk_tck
except Exception:
return None
def live_dhcp_leases():
rows = []
@ -205,8 +193,7 @@ def live_dhcp_leases():
for leases_file in glob.glob('/var/lib/misc/dnsmasq-routlin-*.leases'):
stem = os.path.basename(leases_file)
vlan_name = stem[len('dnsmasq-routlin-'):-len('.leases')]
lease_secs = vlan_lease_secs.get(vlan_name)
restart_time = _dnsmasq_start_time(vlan_name)
lease_secs = vlan_lease_secs.get(vlan_name)
try:
with open(leases_file) as f:
for line in f:
@ -218,8 +205,14 @@ def live_dhcp_leases():
continue
obtained_ts = (expiry - lease_secs) if lease_secs else None
renews_ts = (expiry - lease_secs // 2) if lease_secs else None
recent = (obtained_ts is not None and restart_time is not None
and obtained_ts >= restart_time)
if obtained_ts is None:
last_active = '-'
elif obtained_ts <= now:
last_active = relative_time(obtained_ts)
elif renews_ts and renews_ts > now:
last_active = 'ETA ' + relative_time_future(renews_ts)[3:]
else:
last_active = 'ETA soon'
mac_norm = parts[1].lower()
device_h = parts[3] if parts[3] != '*' else None
res_h = mac_to_res.get(mac_norm)
@ -237,8 +230,8 @@ def live_dhcp_leases():
'mac_address': parts[1],
'vendor': _get_vendor(parts[1]),
'vlan_name': vlan_name,
'last_active': last_active,
'renews': relative_time_future(renews_ts) if renews_ts else relative_time_future(expiry),
'recent': recent,
})
except Exception:
pass