{ 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; }