van-leds fix round 2: state_max_age_s default 180, non-finite/invalid config guards, log-recurrence test
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KqhjP7nud5gdBg25zCiRk9
This commit is contained in:
+14
-4
@@ -19,6 +19,7 @@ keys: "sysfs_leds", "sysfs_net", "failover_state".
|
||||
"""
|
||||
|
||||
import json
|
||||
import math
|
||||
import os
|
||||
import signal
|
||||
import sys
|
||||
@@ -33,7 +34,7 @@ DEFAULTS = {
|
||||
"sysfs_leds": "/sys/class/leds",
|
||||
"sysfs_net": "/sys/class/net",
|
||||
"failover_state": "/run/van-failover/state.json",
|
||||
"state_max_age_s": 60, # older failover state is ignored (wired-uplink fallback)
|
||||
"state_max_age_s": 180, # older failover state is ignored (wired-uplink fallback); van-failover rewrites it every ~61-65 s
|
||||
}
|
||||
LED_KEYS = (("power", "led_power"), ("lan", "led_lan"), ("wan", "led_wan"), ("wlan", "led_wlan"))
|
||||
|
||||
@@ -60,9 +61,18 @@ def clear_log(key):
|
||||
|
||||
def interval(cfg):
|
||||
try:
|
||||
return max(1.0, float(cfg["poll_interval_s"]))
|
||||
v = float(cfg["poll_interval_s"])
|
||||
except (TypeError, ValueError):
|
||||
return 5.0
|
||||
return max(1.0, v) if math.isfinite(v) else 5.0
|
||||
|
||||
|
||||
def max_age(cfg):
|
||||
try:
|
||||
v = float(cfg["state_max_age_s"])
|
||||
except (TypeError, ValueError):
|
||||
return 180.0
|
||||
return v if math.isfinite(v) else 180.0
|
||||
|
||||
|
||||
def load_config(path):
|
||||
@@ -98,7 +108,7 @@ def state_stale(state, now, max_age):
|
||||
return now - t > max_age
|
||||
|
||||
|
||||
def desired_wan(state, uplink_carrier, uplink=None, now=None, max_age=60):
|
||||
def desired_wan(state, uplink_carrier, uplink=None, now=None, max_age=180):
|
||||
"""-> ("netdev", device) | ("heartbeat", None) | ("none", None). `now`: epoch seconds (default: clock)."""
|
||||
if isinstance(state, dict) and state_stale(state, time.time() if now is None else now, max_age):
|
||||
state = None
|
||||
@@ -151,7 +161,7 @@ def carrier(cfg, iface):
|
||||
def wanted(cfg, now=None):
|
||||
"""{role: (trigger, device)} for every role (before skipping absent LEDs)."""
|
||||
wan = desired_wan(load_state(cfg["failover_state"]), carrier(cfg, cfg["uplink_iface"]),
|
||||
cfg["uplink_iface"] or None, now, cfg["state_max_age_s"])
|
||||
cfg["uplink_iface"] or None, now, max_age(cfg))
|
||||
return {
|
||||
"power": ("default-on", None),
|
||||
"lan": ("netdev", cfg["lan_iface"]),
|
||||
|
||||
Reference in New Issue
Block a user