53 lines
1.3 KiB
Nix
53 lines
1.3 KiB
Nix
{
|
|
pkgs,
|
|
lib,
|
|
config,
|
|
...
|
|
}: let
|
|
cfg = config.wakeup;
|
|
|
|
mkScript = type: dev: let
|
|
expected =
|
|
if type == "enable"
|
|
then "enabled"
|
|
else "disabled";
|
|
in
|
|
pkgs.writeShellApplication {
|
|
name = "wakeup-${type}-${dev}";
|
|
runtimeInputs = [pkgs.coreutils];
|
|
text = ''
|
|
# See if our goal has already been reached and exit if so
|
|
if grep "${dev}" /proc/acpi/wakeup | grep ${expected}; then
|
|
printf "Wakeup settings are ok.\n"
|
|
exit 0
|
|
else
|
|
printf "Fixing /proc/acpi/wakeup.\n"
|
|
echo "${dev}" > /proc/acpi/wakeup
|
|
fi
|
|
# Verify our actions or fail!
|
|
grep "${dev}" /proc/acpi/wakeup | grep ${expected}
|
|
'';
|
|
};
|
|
|
|
createServiceName = type: dev: "wakeup-${type}-${dev}";
|
|
createService = type: dev: {
|
|
description = "${type} ${dev} wakeup setting";
|
|
serviceConfig.Type = "oneshot";
|
|
serviceConfig.ExecStart = "${mkScript type dev}/bin/wakeup-${type}-${dev}";
|
|
wantedBy = ["default.target"];
|
|
};
|
|
in {
|
|
options.wakeup = lib.mkOption {
|
|
type = with lib.types; attrsOf (enum ["enable" "disable"]);
|
|
default = {};
|
|
example = {GPP0 = "disable";};
|
|
};
|
|
|
|
config.systemd.services =
|
|
lib.attrsets.mapAttrs' (dev: type: {
|
|
name = createServiceName type dev;
|
|
value = createService type dev;
|
|
})
|
|
cfg;
|
|
}
|