nixos: nylon, use named instances

Changed files
+51 -23
nixos
modules
services
networking
+51 -23
nixos/modules/services/networking/nylon.nix
···
homeDir = "/var/lib/nylon";
-
configFile = pkgs.writeText "nylon.conf" ''
+
configFile = cfg: pkgs.writeText "nylon-${cfg.name}.conf" ''
[General]
No-Simultaneous-Conn=${toString cfg.nrConnections}
Log=${if cfg.logging then "1" else "0"}
···
Deny-IP=${concatStringsSep " " cfg.deniedIPRanges}
'';
-
in
-
-
{
-
-
###### interface
-
-
options = {
+
nylonOpts = { name, config, ... }: {
-
services.nylon = {
+
options = {
enable = mkOption {
type = types.bool;
···
description = ''
Enables nylon as a running service upon activation.
'';
+
};
+
+
name = mkOption {
+
type = types.str;
+
default = "";
+
description = "The name of this nylon instance.";
};
nrConnections = mkOption {
···
'';
};
};
+
config = { name = mkDefault name; };
+
};
+
+
mkNamedNylon = cfg: {
+
"nylon-${cfg.name}" = {
+
description = "Nylon, a lightweight SOCKS proxy server";
+
after = [ "network.target" ];
+
wantedBy = [ "multi-user.target" ];
+
serviceConfig =
+
{
+
User = "nylon";
+
Group = "nylon";
+
WorkingDirectory = homeDir;
+
ExecStart = "${pkgs.nylon}/bin/nylon -f -c ${configFile cfg}";
+
};
+
};
+
};
+
+
anyNylons = collect (p: p ? enable) cfg;
+
enabledNylons = filter (p: p.enable == true) anyNylons;
+
nylonUnits = map (nylon: mkNamedNylon nylon) enabledNylons;
+
+
in
+
+
{
+
+
###### interface
+
+
options = {
+
+
services.nylon = mkOption {
+
default = {};
+
description = "Collection of named nylon instances";
+
type = with types; loaOf (submodule nylonOpts);
+
internal = true;
+
options = [ nylonOpts ];
+
};
+
};
###### implementation
-
config = mkIf cfg.enable {
+
config = mkIf (length(enabledNylons) > 0) {
-
users.extraUsers.nylon= {
+
users.extraUsers.nylon = {
group = "nylon";
description = "Nylon SOCKS Proxy";
home = homeDir;
···
users.extraGroups.nylon.gid = config.ids.gids.nylon;
-
systemd.services.nylon = {
-
description = "Nylon, a lightweight SOCKS proxy server";
-
after = [ "network.target" ];
-
wantedBy = [ "multi-user.target" ];
-
serviceConfig =
-
{
-
User = "nylon";
-
Group = "nylon";
-
WorkingDirectory = homeDir;
-
ExecStart = "${pkgs.nylon}/bin/nylon -f -c ${configFile}";
-
};
-
};
+
systemd.services = fold (a: b: a // b) {} nylonUnits;
+
};
}