71 lines
1.7 KiB
Nix
71 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;
|
|
};
|
|
}
|