diff --git a/nixos/modules/services/networking/kea.nix b/nixos/modules/services/networking/kea.nix
index 17b4eb2e283b..994c511bdc2d 100644
--- a/nixos/modules/services/networking/kea.nix
+++ b/nixos/modules/services/networking/kea.nix
@@ -9,20 +9,26 @@ with lib;
let
cfg = config.services.kea;
+ xor = x: y: (!x && y) || (x && !y);
format = pkgs.formats.json {};
- ctrlAgentConfig = format.generate "kea-ctrl-agent.conf" {
+ chooseNotNull = x: y: if x != null then x else y;
+
+ ctrlAgentConfig = chooseNotNull cfg.ctrl-agent.configFile (format.generate "kea-ctrl-agent.conf" {
Control-agent = cfg.ctrl-agent.settings;
- };
- dhcp4Config = format.generate "kea-dhcp4.conf" {
+ });
+
+ dhcp4Config = chooseNotNull cfg.dhcp4.configFile (format.generate "kea-dhcp4.conf" {
Dhcp4 = cfg.dhcp4.settings;
- };
- dhcp6Config = format.generate "kea-dhcp6.conf" {
+ });
+
+ dhcp6Config = chooseNotNull cfg.dhcp6.configFile (format.generate "kea-dhcp6.conf" {
Dhcp6 = cfg.dhcp6.settings;
- };
- dhcpDdnsConfig = format.generate "kea-dhcp-ddns.conf" {
+ });
+
+ dhcpDdnsConfig = chooseNotNull cfg.dhcp-ddns.configFile (format.generate "kea-dhcp-ddns.conf" {
DhcpDdns = cfg.dhcp-ddns.settings;
- };
+ });
package = pkgs.kea;
in
@@ -45,6 +51,17 @@ in
'';
};
+ configFile = mkOption {
+ type = nullOr path;
+ default = null;
+ description = ''
+ Kea Control Agent configuration as a path, see .
+
+ Takes preference over settings.
+ Most users should prefer using settings instead.
+ '';
+ };
+
settings = mkOption {
type = format.type;
default = null;
@@ -73,6 +90,17 @@ in
'';
};
+ configFile = mkOption {
+ type = nullOr path;
+ default = null;
+ description = ''
+ Kea DHCP4 configuration as a path, see .
+
+ Takes preference over settings.
+ Most users should prefer using settings instead.
+ '';
+ };
+
settings = mkOption {
type = format.type;
default = null;
@@ -122,6 +150,17 @@ in
'';
};
+ configFile = mkOption {
+ type = nullOr path;
+ default = null;
+ description = ''
+ Kea DHCP6 configuration as a path, see .
+
+ Takes preference over settings.
+ Most users should prefer using settings instead.
+ '';
+ };
+
settings = mkOption {
type = format.type;
default = null;
@@ -172,6 +211,17 @@ in
'';
};
+ configFile = mkOption {
+ type = nullOr path;
+ default = null;
+ description = ''
+ Kea DHCP-DDNS configuration as a path, see .
+
+ Takes preference over settings.
+ Most users should prefer using settings instead.
+ '';
+ };
+
settings = mkOption {
type = format.type;
default = null;
@@ -214,6 +264,10 @@ in
}
(mkIf cfg.ctrl-agent.enable {
+ assertions = [{
+ assertion = xor (cfg.ctrl-agent.settings == null) (cfg.ctrl-agent.configFile == null);
+ message = "Either services.kea.ctrl-agent.settings or services.kea.ctrl-agent.configFile must be set to a non-null value.";
+ }];
environment.etc."kea/ctrl-agent.conf".source = ctrlAgentConfig;
@@ -252,6 +306,10 @@ in
})
(mkIf cfg.dhcp4.enable {
+ assertions = [{
+ assertion = xor (cfg.dhcp4.settings == null) (cfg.dhcp4.configFile == null);
+ message = "Either services.kea.dhcp4.settings or services.kea.dhcp4.configFile must be set to a non-null value.";
+ }];
environment.etc."kea/dhcp4-server.conf".source = dhcp4Config;
@@ -295,6 +353,10 @@ in
})
(mkIf cfg.dhcp6.enable {
+ assertions = [{
+ assertion = xor (cfg.dhcp6.settings == null) (cfg.dhcp6.configFile == null);
+ message = "Either services.kea.dhcp6.settings or services.kea.dhcp6.configFile must be set to a non-null value.";
+ }];
environment.etc."kea/dhcp6-server.conf".source = dhcp6Config;
@@ -336,6 +398,10 @@ in
})
(mkIf cfg.dhcp-ddns.enable {
+ assertions = [{
+ assertion = xor (cfg.dhcp-ddns.settings == null) (cfg.dhcp-ddns.configFile == null);
+ message = "Either services.kea.dhcp-ddns.settings or services.kea.dhcp-ddns.configFile must be set to a non-null value.";
+ }];
environment.etc."kea/dhcp-ddns.conf".source = dhcpDdnsConfig;