1{ config, lib, ... }:
2
3with lib;
4
5let
6
7 cfg = config.powerManagement;
8
9in
10
11{
12
13 ###### interface
14
15 options = {
16
17 powerManagement = {
18
19 enable = mkOption {
20 type = types.bool;
21 default = true;
22 description =
23 ''
24 Whether to enable power management. This includes support
25 for suspend-to-RAM and powersave features on laptops.
26 '';
27 };
28
29 resumeCommands = mkOption {
30 type = types.lines;
31 default = "";
32 description = "Commands executed after the system resumes from suspend-to-RAM.";
33 };
34
35 powerUpCommands = mkOption {
36 type = types.lines;
37 default = "";
38 example = literalExample ''
39 "''${pkgs.hdparm}/sbin/hdparm -B 255 /dev/sda"
40 '';
41 description =
42 ''
43 Commands executed when the machine powers up. That is,
44 they're executed both when the system first boots and when
45 it resumes from suspend or hibernation.
46 '';
47 };
48
49 powerDownCommands = mkOption {
50 type = types.lines;
51 default = "";
52 example = literalExample ''
53 "''${pkgs.hdparm}/sbin/hdparm -B 255 /dev/sda"
54 '';
55 description =
56 ''
57 Commands executed when the machine powers down. That is,
58 they're executed both when the system shuts down and when
59 it goes to suspend or hibernation.
60 '';
61 };
62
63 };
64
65 };
66
67
68 ###### implementation
69
70 config = mkIf cfg.enable {
71
72 systemd.targets.post-resume = {
73 description = "Post-Resume Actions";
74 requires = [ "post-resume.service" ];
75 after = [ "post-resume.service" ];
76 wantedBy = [ "sleep.target" ];
77 unitConfig.StopWhenUnneeded = true;
78 };
79
80 # Service executed before suspending/hibernating.
81 systemd.services."pre-sleep" =
82 { description = "Pre-Sleep Actions";
83 wantedBy = [ "sleep.target" ];
84 before = [ "sleep.target" ];
85 script =
86 ''
87 ${cfg.powerDownCommands}
88 '';
89 serviceConfig.Type = "oneshot";
90 };
91
92 systemd.services."post-resume" =
93 { description = "Post-Resume Actions";
94 after = [ "suspend.target" "hibernate.target" "hybrid-sleep.target" ];
95 script =
96 ''
97 ${config.systemd.package}/bin/systemctl try-restart post-resume.target
98 ${cfg.resumeCommands}
99 ${cfg.powerUpCommands}
100 '';
101 serviceConfig.Type = "oneshot";
102 };
103
104 };
105
106}