feat(rtl): service

This commit is contained in:
arcnmx 2025-01-27 15:23:27 -08:00
parent 6931de7d18
commit b4dbcc71f0
7 changed files with 156 additions and 6 deletions

75
modules/nixos/rtl_tcp.nix Normal file
View file

@ -0,0 +1,75 @@
{
pkgs,
config,
lib,
utils,
...
}: let
inherit (lib.options) mkOption mkEnableOption mkPackageOption;
inherit (lib.modules) mkIf mkMerge mkOptionDefault mkDefault;
inherit (lib.trivial) mapNullable;
inherit (lib.lists) optionals;
inherit (utils) escapeSystemdExecArgs;
cfg = config.services.rtl_tcp;
defaultPort = 1234;
defaultUser = "rtl_tcp";
in {
options.services.rtl_tcp = with lib.types; {
enable = mkEnableOption "rtl_tcp";
package = mkPackageOption pkgs "rtl-sdr-blog" {};
port = mkOption {
type = port;
default = defaultPort;
};
openFirewall = mkOption {
type = bool;
default = false;
};
user = mkOption {
type = nullOr str;
default = defaultUser;
};
group = mkOption {
type = nullOr str;
};
extraArgs = mkOption {
type = listOf str;
default = [];
};
};
config = let
serviceConf.services.rtl_tcp = {
group = mkOptionDefault (if cfg.user == defaultUser then defaultUser else null);
};
execArgs = optionals (cfg.port != defaultPort) [
"-p" (toString cfg.port)
] ++ cfg.extraArgs;
conf.systemd.services.rtl_tcp = {
wantedBy = ["multi-user.target"];
after = ["network.target"];
serviceConfig = {
ExecStart = "${cfg.package}/bin/rtl_tcp ${escapeSystemdExecArgs execArgs}";
DynamicUser = mkDefault (cfg.user == null);
User = if cfg.user != null then cfg.user else defaultUser;
Group = cfg.group;
};
};
conf.environment.systemPackages = [cfg.package];
conf.users.users.${defaultUser} = mkIf (cfg.user == defaultUser) {
group = cfg.group;
isSystemUser = true;
extraGroups = mkIf config.hardware.rtl-sdr.enable [
"plugdev"
];
};
conf.users.groups.${defaultUser} = mkIf (cfg.user == defaultUser) {
};
conf.networking.firewall = {
allowedTCPPorts = mkIf cfg.openFirewall [cfg.port];
};
in mkMerge [
(mkIf cfg.enable conf)
serviceConf
];
}

View file

@ -0,0 +1,34 @@
{
lib,
gensokyo-zone,
...
}: let
inherit (gensokyo-zone.lib) mkAlmostOptionDefault;
inherit (lib.modules) mkIf;
in {
config.exports.services.rtl_tcp = {config, ...}: {
id = mkAlmostOptionDefault "rtl";
nixos = {
serviceAttr = "rtl_tcp";
assertions = let
mkAssertion = f: nixosConfig: let
cfg = nixosConfig.services.rtl_tcp;
in
f nixosConfig cfg;
in
mkIf config.enable [
(mkAssertion (nixosConfig: cfg: {
assertion = config.ports.tcp.port == cfg.port;
message = "port mismatch";
}))
];
};
defaults.port.listen = mkAlmostOptionDefault "lan";
ports = {
tcp = {
port = mkAlmostOptionDefault 1234;
transport = "tcp";
};
};
};
}