Jack O'Sullivan
a2b146e8ba
All checks were successful
CI / Check, build and cache Nix flake (push) Successful in 22m56s
77 lines
2.3 KiB
Nix
77 lines
2.3 KiB
Nix
{ lib, pkgs, config, ... }:
|
|
let
|
|
inherit (builtins) toJSON;
|
|
inherit (lib) mkOption mkMerge mkIf mkDefault;
|
|
inherit (lib.my) mkOpt' mkBoolOpt';
|
|
|
|
cfg = config.my.librespeed;
|
|
|
|
serversConf = map (s: s // {
|
|
dlURL = "backend/garbage";
|
|
ulURL = "backend/empty";
|
|
pingURL = "backend/empty";
|
|
getIpURL = "backend/getIP";
|
|
}) cfg.frontend.servers;
|
|
frontendTree = pkgs.runCommand "librespeed-frontend" {
|
|
speedtestServers = toJSON serversConf;
|
|
} ''
|
|
mkdir "$out"
|
|
cp "${pkgs.librespeed-go}"/assets/* "$out"/
|
|
substitute ${./index.html} "$out"/index.html --subst-var speedtestServers
|
|
'';
|
|
|
|
backendConf = pkgs.writers.writeTOML "librespeed.toml" cfg.backend.settings;
|
|
generateBackendSettings = base: dst: if (cfg.backend.extraSettingsFile != null) then ''
|
|
oldUmask="$(umask)"
|
|
umask 006
|
|
cat "${base}" "${cfg.backend.extraSettingsFile}" > "${dst}"
|
|
umask "$oldUmask"
|
|
'' else ''
|
|
cp "${base}" "${dst}"
|
|
'';
|
|
in
|
|
{
|
|
options.my.librespeed = with lib.types; {
|
|
frontend = {
|
|
servers = mkOpt' (listOf (attrsOf unspecified)) { } "Server configs.";
|
|
webroot = mkOption {
|
|
description = "Frontend webroot.";
|
|
type = package;
|
|
readOnly = true;
|
|
};
|
|
};
|
|
backend = {
|
|
enable = mkBoolOpt' false "Whether to enable librespeed backend.";
|
|
settings = mkOpt' (attrsOf unspecified) { } "Backend settings.";
|
|
extraSettingsFile = mkOpt' (nullOr str) null "Extra settings file.";
|
|
};
|
|
};
|
|
|
|
config = mkMerge [
|
|
(mkIf (cfg.frontend.servers != { }) {
|
|
my.librespeed.frontend.webroot = frontendTree;
|
|
})
|
|
(mkIf cfg.backend.enable {
|
|
my.librespeed.backend.settings = {
|
|
assets_path = frontendTree;
|
|
database_type = mkDefault "bolt";
|
|
database_file = mkDefault "/var/lib/librespeed-go/speedtest.db";
|
|
};
|
|
|
|
systemd.services.librespeed = {
|
|
description = "LibreSpeed Go backend";
|
|
wants = [ "network-online.target" ];
|
|
after = [ "network-online.target" ];
|
|
|
|
preStart = generateBackendSettings backendConf "/run/librespeed-go/settings.toml";
|
|
serviceConfig = {
|
|
ExecStart = "${pkgs.librespeed-go}/bin/speedtest -c /run/librespeed-go/settings.toml";
|
|
RuntimeDirectory = "librespeed-go";
|
|
StateDirectory = "librespeed-go";
|
|
};
|
|
wantedBy = [ "multi-user.target" ];
|
|
};
|
|
})
|
|
];
|
|
}
|