diff --git a/docker/routlin-dash/app/pages/dhcpleases/content.json b/docker/routlin-dash/app/pages/dhcpleases/content.json index 098e1df..8b445c7 100644 --- a/docker/routlin-dash/app/pages/dhcpleases/content.json +++ b/docker/routlin-dash/app/pages/dhcpleases/content.json @@ -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" } ] } diff --git a/docker/routlin-dash/app/view_page.py b/docker/routlin-dash/app/view_page.py index 08f8994..696c9fa 100644 --- a/docker/routlin-dash/app/view_page.py +++ b/docker/routlin-dash/app/view_page.py @@ -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