nixos/networkd-dispatcher: add rules option

This commit is contained in:
Jonas Heinrich 2023-02-27 16:49:04 +01:00
parent 14b23e091d
commit 26e14e57af

View file

@ -3,8 +3,11 @@
with lib; with lib;
let let
cfg = config.services.networkd-dispatcher; cfg = config.services.networkd-dispatcher;
in { in {
options = { options = {
services.networkd-dispatcher = { services.networkd-dispatcher = {
@ -14,14 +17,49 @@ in {
for usage. for usage.
''); '');
scriptDir = mkOption { rules = mkOption {
type = types.path; default = {};
default = "/var/lib/networkd-dispatcher"; example = lib.literalExpression ''
description = mdDoc '' { "restart-tor" = {
This directory is used for keeping various scripts read and run by onState = ["routable" "off"];
networkd-dispatcher. See [https://gitlab.com/craftyguy/networkd-dispatcher](upstream instructions) script = '''
for directory structure and script usage. #!''${pkgs.runtimeShell}
if [[ $IFACE == "wlan0" && $AdministrativeState == "configured" ]]; then
echo "Restarting Tor ..."
systemctl restart tor
fi
exit 0
''';
};
};
''; '';
description = lib.mdDoc ''
Declarative configuration of networkd-dispatcher rules. See
[https://gitlab.com/craftyguy/networkd-dispatcher](upstream instructions)
for an introduction and example scripts.
'';
type = types.attrsOf (types.submodule {
options = {
onState = mkOption {
type = types.listOf (types.enum [
"routable" "dormant" "no-carrier" "off" "carrier" "degraded"
"configuring" "configured"
]);
default = null;
description = lib.mdDoc ''
List of names of the systemd-networkd operational states which
should trigger the script. See <https://www.freedesktop.org/software/systemd/man/networkctl.html>
for a description of the specific state type.
'';
};
script = mkOption {
type = types.lines;
description = lib.mdDoc ''
Shell commands executed on specified operational states.
'';
};
};
});
}; };
}; };
@ -30,34 +68,31 @@ in {
config = mkIf cfg.enable { config = mkIf cfg.enable {
systemd = { systemd = {
packages = [ pkgs.networkd-dispatcher ]; packages = [ pkgs.networkd-dispatcher ];
services.networkd-dispatcher = { services.networkd-dispatcher = {
wantedBy = [ "multi-user.target" ]; wantedBy = [ "multi-user.target" ];
# Override existing ExecStart definition # Override existing ExecStart definition
serviceConfig.ExecStart = [ serviceConfig.ExecStart = let
scriptDir = pkgs.symlinkJoin {
name = "networkd-dispatcher-script-dir";
paths = lib.mapAttrsToList (name: cfg:
(map(state:
pkgs.writeTextFile {
inherit name;
text = cfg.script;
destination = "/${state}.d/${name}";
executable = true;
}
) cfg.onState)
) cfg.rules;
};
in [
"" ""
"${pkgs.networkd-dispatcher}/bin/networkd-dispatcher -v --script-dir ${cfg.scriptDir} $networkd_dispatcher_args" "${pkgs.networkd-dispatcher}/bin/networkd-dispatcher -v --script-dir ${scriptDir} $networkd_dispatcher_args"
]; ];
}; };
# Directory structure required according to upstream instructions
# https://gitlab.com/craftyguy/networkd-dispatcher
tmpfiles.rules = [
"d '${cfg.scriptDir}' 0750 root root - -"
"d '${cfg.scriptDir}/routable.d' 0750 root root - -"
"d '${cfg.scriptDir}/dormant.d' 0750 root root - -"
"d '${cfg.scriptDir}/no-carrier.d' 0750 root root - -"
"d '${cfg.scriptDir}/off.d' 0750 root root - -"
"d '${cfg.scriptDir}/carrier.d' 0750 root root - -"
"d '${cfg.scriptDir}/degraded.d' 0750 root root - -"
"d '${cfg.scriptDir}/configuring.d' 0750 root root - -"
"d '${cfg.scriptDir}/configured.d' 0750 root root - -"
];
}; };
}; };
} }