From a0c3960a8cb30544695490b712e272fe1176d368 Mon Sep 17 00:00:00 2001 From: kurogeek Date: Tue, 11 Aug 2026 16:57:03 +0700 Subject: [PATCH] mob next [ci-skip] [ci skip] [skip ci] lastFile:clan.nix --- clan.nix | 10 +++- modules/clan/gw-router/default.nix | 15 ++++-- modules/clan/gw-router/speedtest.nix | 81 ++++++++++++++-------------- 3 files changed, 62 insertions(+), 44 deletions(-) diff --git a/clan.nix b/clan.nix index 184a61f..193ed0e 100644 --- a/clan.nix +++ b/clan.nix @@ -79,11 +79,11 @@ in in { settings = { - enableOmada = true; wan = { interface = "enp1s0"; vlanId = null; }; + vlans = { mgmt = lib.recursiveUpdate (genVlan 10 24) { dhcp.fixedIPs.storinator01 = { @@ -106,6 +106,7 @@ in }; }; }; + trunkPorts = [ "enp2s0" ]; accessPorts = { @@ -113,6 +114,13 @@ in }; upLinkPorts = [ "enp3s0" ]; + + enableOmada = true; + + speedtest = { + enable = true; + }; + }; }; }; diff --git a/modules/clan/gw-router/default.nix b/modules/clan/gw-router/default.nix index 244906a..d54befe 100644 --- a/modules/clan/gw-router/default.nix +++ b/modules/clan/gw-router/default.nix @@ -120,10 +120,17 @@ description = "TP-Link Omada SDN controller (podman container)"; }; - speedtestInterval = lib.mkOption { - type = lib.types.str; - default = "hourly"; - description = "systemd OnCalendar spec for the WAN speed test."; + speedtest = { + enable = { + type = lib.types.bool; + default = false; + description = "Periodic WAN speed test so ISP degradation shows up as a trend. A timer runs librespeed-cli and writes the results as Prometheus metrics into node_exporter's textfile collector"; + }; + interval = lib.mkOption { + type = lib.types.str; + default = "hourly"; + description = "systemd OnCalendar spec for the WAN speed test."; + }; }; proxy = { diff --git a/modules/clan/gw-router/speedtest.nix b/modules/clan/gw-router/speedtest.nix index 8cc0481..84c557c 100644 --- a/modules/clan/gw-router/speedtest.nix +++ b/modules/clan/gw-router/speedtest.nix @@ -3,55 +3,58 @@ nixosModule = { pkgs, + lib, ... }: let textfileDir = "/var/lib/speedtest"; in { - services.prometheus.exporters.node.extraFlags = [ - "--collector.textfile.directory=${textfileDir}" - ]; - - systemd.services.speedtest = { - description = "WAN speed test to Prometheus textfile metrics"; - after = [ "network-online.target" ]; - wants = [ "network-online.target" ]; - path = [ - pkgs.librespeed-cli - pkgs.jq + config = lib.mkIf (settings.speedtest.enable) { + services.prometheus.exporters.node.extraFlags = [ + "--collector.textfile.directory=${textfileDir}" ]; - serviceConfig = { - Type = "oneshot"; - StateDirectory = "speedtest"; - # One test at boot would race PPPoE and log a spurious failure. - ExecCondition = "${pkgs.iproute2}/bin/ip link show ppp0"; - }; - script = '' - tmp="${textfileDir}/.speedtest.prom.tmp" - if result=$(librespeed-cli --json); then - jq -r '.[0] - | "speedtest_download_mbps \(.download)", - "speedtest_upload_mbps \(.upload)", - "speedtest_ping_ms \(.ping)", - "speedtest_jitter_ms \(.jitter)", - "speedtest_success 1"' <<<"$result" > "$tmp" - else - echo "speedtest_success 0" > "$tmp" - fi - mv "$tmp" "${textfileDir}/speedtest.prom" - ''; - }; - systemd.timers.speedtest = { - wantedBy = [ "timers.target" ]; - timerConfig = { - OnCalendar = settings.speedtestInterval; - RandomizedDelaySec = "10m"; - Persistent = true; + systemd.services.speedtest = { + description = "WAN speed test to Prometheus textfile metrics"; + after = [ "network-online.target" ]; + wants = [ "network-online.target" ]; + path = [ + pkgs.librespeed-cli + pkgs.jq + ]; + serviceConfig = { + Type = "oneshot"; + StateDirectory = "speedtest"; + # One test at boot would race PPPoE and log a spurious failure. + ExecCondition = "${pkgs.iproute2}/bin/ip link show ppp0"; + }; + script = '' + tmp="${textfileDir}/.speedtest.prom.tmp" + if result=$(librespeed-cli --json); then + jq -r '.[0] + | "speedtest_download_mbps \(.download)", + "speedtest_upload_mbps \(.upload)", + "speedtest_ping_ms \(.ping)", + "speedtest_jitter_ms \(.jitter)", + "speedtest_success 1"' <<<"$result" > "$tmp" + else + echo "speedtest_success 0" > "$tmp" + fi + mv "$tmp" "${textfileDir}/speedtest.prom" + ''; }; - }; + systemd.timers.speedtest = { + wantedBy = [ "timers.target" ]; + timerConfig = { + OnCalendar = settings.speedtest.interval; + RandomizedDelaySec = "10m"; + Persistent = true; + }; + }; + + }; }; }; }