Development
This commit is contained in:
parent
8129b2f757
commit
1dce33d4eb
2 changed files with 14 additions and 22 deletions
|
|
@ -54,13 +54,12 @@
|
||||||
"field": "vlan_name"
|
"field": "vlan_name"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"label": "Renews",
|
"label": "Last Active",
|
||||||
"field": "renews"
|
"field": "last_active"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"label": "Recent",
|
"label": "Renews",
|
||||||
"field": "recent",
|
"field": "renews"
|
||||||
"render": "badge_yes_no"
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -175,18 +175,6 @@ def _parse_lease_secs(s):
|
||||||
pass
|
pass
|
||||||
return None
|
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():
|
def live_dhcp_leases():
|
||||||
rows = []
|
rows = []
|
||||||
|
|
@ -205,8 +193,7 @@ def live_dhcp_leases():
|
||||||
for leases_file in glob.glob('/var/lib/misc/dnsmasq-routlin-*.leases'):
|
for leases_file in glob.glob('/var/lib/misc/dnsmasq-routlin-*.leases'):
|
||||||
stem = os.path.basename(leases_file)
|
stem = os.path.basename(leases_file)
|
||||||
vlan_name = stem[len('dnsmasq-routlin-'):-len('.leases')]
|
vlan_name = stem[len('dnsmasq-routlin-'):-len('.leases')]
|
||||||
lease_secs = vlan_lease_secs.get(vlan_name)
|
lease_secs = vlan_lease_secs.get(vlan_name)
|
||||||
restart_time = _dnsmasq_start_time(vlan_name)
|
|
||||||
try:
|
try:
|
||||||
with open(leases_file) as f:
|
with open(leases_file) as f:
|
||||||
for line in f:
|
for line in f:
|
||||||
|
|
@ -218,8 +205,14 @@ def live_dhcp_leases():
|
||||||
continue
|
continue
|
||||||
obtained_ts = (expiry - lease_secs) if lease_secs else None
|
obtained_ts = (expiry - lease_secs) if lease_secs else None
|
||||||
renews_ts = (expiry - lease_secs // 2) 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
|
if obtained_ts is None:
|
||||||
and obtained_ts >= restart_time)
|
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()
|
mac_norm = parts[1].lower()
|
||||||
device_h = parts[3] if parts[3] != '*' else None
|
device_h = parts[3] if parts[3] != '*' else None
|
||||||
res_h = mac_to_res.get(mac_norm)
|
res_h = mac_to_res.get(mac_norm)
|
||||||
|
|
@ -237,8 +230,8 @@ def live_dhcp_leases():
|
||||||
'mac_address': parts[1],
|
'mac_address': parts[1],
|
||||||
'vendor': _get_vendor(parts[1]),
|
'vendor': _get_vendor(parts[1]),
|
||||||
'vlan_name': vlan_name,
|
'vlan_name': vlan_name,
|
||||||
|
'last_active': last_active,
|
||||||
'renews': relative_time_future(renews_ts) if renews_ts else relative_time_future(expiry),
|
'renews': relative_time_future(renews_ts) if renews_ts else relative_time_future(expiry),
|
||||||
'recent': recent,
|
|
||||||
})
|
})
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue