diff --git a/modules/clan/gw-router/default.nix b/modules/clan/gw-router/default.nix index 1ebe972..244906a 100644 --- a/modules/clan/gw-router/default.nix +++ b/modules/clan/gw-router/default.nix @@ -120,6 +120,12 @@ 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."; + }; + proxy = { enable = lib.mkEnableOption "internal reverse proxy (Caddy, wildcard cert via DNS-01)"; @@ -350,8 +356,9 @@ ./firewall.nix ./iperf.nix ./ipv6.nix - ./pppoe.nix ./omada.nix + ./pppoe.nix ./proxy.nix + ./speedtest.nix ]; } diff --git a/modules/clan/gw-router/speedtest.nix b/modules/clan/gw-router/speedtest.nix new file mode 100644 index 0000000..8cc0481 --- /dev/null +++ b/modules/clan/gw-router/speedtest.nix @@ -0,0 +1,57 @@ +{ + roles.default.perInstance = { settings, ... }: { + nixosModule = + { + pkgs, + ... + }: + 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 + ]; + 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; + }; + }; + + }; + }; +}