nixos/adguardhome: allow for empty/unmanaged configs

This commit fixes broken non-declarative configs by
making the assertions more relaxed.
It also allows to remove the forced configuration merge by making
`settings` `null`able (now the default).

Both cases (trivial non-declarative config and `null`able config) are
verified with additional tests.

Fixes #198665

Changed files
+28 -8
nixos
modules
services
networking
tests
+12 -8
nixos/modules/services/networking/adguardhome.nix
···
};
settings = mkOption {
-
default = { };
-
type = submodule {
+
default = null;
+
type = nullOr (submodule {
freeformType = (pkgs.formats.yaml { }).type;
options = {
schema_version = mkOption {
···
'';
};
};
-
};
+
});
description = lib.mdDoc ''
AdGuard Home configuration. Refer to
<https://github.com/AdguardTeam/AdGuardHome/wiki/Configuration#configuration-file>
···
On start and if {option}`mutableSettings` is `true`,
these options are merged into the configuration file on start, taking
precedence over configuration changes made on the web interface.
+
+
Set this to `null` (default) for a non-declarative configuration without any
+
Nix-supplied values.
+
Declarative configurations are supplied with a default `schema_version`, `bind_host`, and `bind_port`.
:::
'';
};
···
config = mkIf cfg.enable {
assertions = [
{
-
assertion = cfg.settings != { }
-
-> (hasAttrByPath [ "dns" "bind_host" ] cfg.settings)
+
assertion = cfg.settings != null -> cfg.mutableSettings
+
|| (hasAttrByPath [ "dns" "bind_host" ] cfg.settings)
|| (hasAttrByPath [ "dns" "bind_hosts" ] cfg.settings);
message =
"AdGuard setting dns.bind_host or dns.bind_hosts needs to be configured for a minimal working configuration";
}
{
-
assertion = cfg.settings != { }
-
-> hasAttrByPath [ "dns" "bootstrap_dns" ] cfg.settings;
+
assertion = cfg.settings != null -> cfg.mutableSettings
+
|| hasAttrByPath [ "dns" "bootstrap_dns" ] cfg.settings;
message =
"AdGuard setting dns.bootstrap_dns needs to be configured for a minimal working configuration";
}
···
StartLimitBurst = 10;
};
-
preStart = optionalString (cfg.settings != { }) ''
+
preStart = optionalString (cfg.settings != null) ''
if [ -e "$STATE_DIRECTORY/AdGuardHome.yaml" ] \
&& [ "${toString cfg.mutableSettings}" = "1" ]; then
# Writing directly to AdGuardHome.yaml results in empty file
+16
nixos/tests/adguardhome.nix
···
name = "adguardhome";
nodes = {
+
nullConf = { ... }: { services.adguardhome = { enable = true; }; };
+
+
emptyConf = { lib, ... }: {
+
services.adguardhome = {
+
enable = true;
+
settings = {};
+
};
+
};
+
declarativeConf = { ... }: {
services.adguardhome = {
enable = true;
···
};
testScript = ''
+
with subtest("Minimal (settings = null) config test"):
+
nullConf.wait_for_unit("adguardhome.service")
+
+
with subtest("Default config test"):
+
emptyConf.wait_for_unit("adguardhome.service")
+
emptyConf.wait_for_open_port(3000)
+
with subtest("Declarative config test, DNS will be reachable"):
declarativeConf.wait_for_unit("adguardhome.service")
declarativeConf.wait_for_open_port(53)