nixos-config/modules/wakeonwlan.nix

76 lines
1.7 KiB
Nix

{
config,
lib,
pkgs,
...
}: let
inherit
(lib)
concatStringsSep
literalExample
mapAttrs'
mkIf
mkOption
nameValuePair
;
cfg = config.my.wakeonwlan;
mkWowlanService = name: cfg:
nameValuePair "wowlan-${name}" {
description = "Enable WoWLAN for interface ${name}";
requires = ["network.target"];
after = ["network.target"];
wantedBy = ["multi-user.target"];
serviceConfig = {
Type = "oneshot";
};
script = ''
${pkgs.iw}/bin/iw ${name} wowlan enable ${concatStringsSep " " cfg.methods}
'';
};
in {
options.my.wakeonwlan = let
inherit (lib) types;
in {
interfaces = mkOption {
default = {};
description = "Wireless interfaces where you want to enable WoWLAN";
example = literalExample ''
{
phy0.methods = [
"magic-packet"
"disconnect"
"gtk-rekey-failure"
"eap-identity-request"
"rfkill-release"
];
phy2.methods = [ "any" ];
}
'';
type = types.attrsOf (
types.submodule {
options = {
methods = mkOption {
type = types.listOf (types.enum [
"4way-handshake"
"any"
"disconnect"
"eap-identity-request"
"gtk-rekey-failure"
"magic-packet"
"rfkill-release"
]);
description = "Wake-On-WiFiLan methods for this interface.";
};
};
}
);
};
};
config = mkIf (cfg.interfaces != {}) {
systemd.services = mapAttrs' mkWowlanService cfg.interfaces;
};
}