Development

This commit is contained in:
Matthew Grotke 2026-06-03 20:54:33 -04:00
parent 885e5ec3ca
commit 65c5b61ca7
2 changed files with 29 additions and 6 deletions

View file

@ -105,6 +105,7 @@ PRODUCT_NAME = "routlin"
SCRIPT_DIR = Path(__file__).parent
CONFIG_FILE = SCRIPT_DIR / "config.json"
DASHBOARD_PENDING = SCRIPT_DIR / ".dashboard-pending"
BLOCKLIST_DIR = SCRIPT_DIR / "blocklists"
METRICS_FILE = SCRIPT_DIR / ".dns-metrics"
DNSMASQ_CONF_DIR = Path(f"/etc/dnsmasq-{PRODUCT_NAME}")
@ -2133,9 +2134,21 @@ def disable_avahi():
print("avahi-daemon: not running, skipping.")
def _remove_pending_cmd(cmd):
try:
if not DASHBOARD_PENDING.exists():
return
lines = DASHBOARD_PENDING.read_text().splitlines()
kept = [l for l in lines if f'[{cmd}]' not in l]
DASHBOARD_PENDING.write_text('\n'.join(kept) + ('\n' if kept else ''))
except Exception:
pass
def show_status(data):
import health as _health
_health.print_table(_health.run_and_write(data))
_, _status = _health.run_and_write(data)
_health.print_table(_status)
def show_configs(data):
for vlan in data["vlans"]:
@ -3093,7 +3106,12 @@ def cmd_apply(data, dry_run=False):
print("Done.")
import health as _health
_health.print_table(_health.run_and_write(data))
_healthy, _status = _health.run_and_write(data)
_health.print_table(_status)
_remove_pending_cmd('core apply')
if _healthy:
_remove_pending_cmd('fix problems')
def main():

View file

@ -5,7 +5,7 @@ Reads config.json, checks services, configuration files, and logs, then writes
.health JSON. Imported by core.py; also runnable standalone.
Public API:
run_and_write(data) -> dict run all checks, write .health, return dict
run_and_write(data) -> (bool, dict) run all checks, write .health, return (all_healthy, status)
print_table(status: dict) render the CLI service table from status dict
"""
import hashlib
@ -711,7 +711,7 @@ def _next_blocklist_update():
# ===================================================================
def run_and_write(data):
"""Run all checks, write .health atomically, return the status dict."""
"""Run all checks, write .health atomically, return (all_healthy, status_dict)."""
status = {
"checked_at": datetime.now().strftime("%Y-%m-%dT%H:%M:%S"),
"services": check_services(data),
@ -722,7 +722,12 @@ def run_and_write(data):
tmp = HEALTH_FILE.with_suffix(".tmp")
tmp.write_text(json.dumps(status, indent=2))
tmp.replace(HEALTH_FILE)
return status
healthy = all(
item.get('status') != 'problem'
for section in ('services', 'configurations', 'logs')
for item in status.get(section, [])
)
return healthy, status
def print_table(status):
@ -797,5 +802,5 @@ if __name__ == "__main__":
except Exception as ex:
print(f"Error loading {CONFIG_FILE}: {ex}", file=sys.stderr)
sys.exit(1)
status = run_and_write(data)
_, status = run_and_write(data)
print_table(status)