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
This commit is contained in:
Carl Richard Theodor Schneider 2022-10-30 18:34:01 +01:00 committed by Winter
parent 9d1ebafb7b
commit 647ed242dc
2 changed files with 28 additions and 8 deletions

View File

@ -51,8 +51,8 @@ in
};
settings = mkOption {
default = { };
type = submodule {
default = null;
type = nullOr (submodule {
freeformType = (pkgs.formats.yaml { }).type;
options = {
schema_version = mkOption {
@ -79,7 +79,7 @@ in
'';
};
};
};
});
description = lib.mdDoc ''
AdGuard Home configuration. Refer to
<https://github.com/AdguardTeam/AdGuardHome/wiki/Configuration#configuration-file>
@ -89,6 +89,10 @@ in
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`.
:::
'';
};
@ -105,15 +109,15 @@ in
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";
}
@ -128,7 +132,7 @@ in
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

View File

@ -2,6 +2,15 @@
name = "adguardhome";
nodes = {
nullConf = { ... }: { services.adguardhome = { enable = true; }; };
emptyConf = { lib, ... }: {
services.adguardhome = {
enable = true;
settings = {};
};
};
declarativeConf = { ... }: {
services.adguardhome = {
enable = true;
@ -34,6 +43,13 @@
};
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)