nixos/ssh: use correct executable for grep in ssh-askpass-wrapper (#373746)
[NixPkgs.git] / nixos / modules / system / boot / systemd / logind.nix
bloba216219b0df73b819b45ee59e47b14dd3bc6d00e
2   config,
3   lib,
4   pkgs,
5   utils,
6   ...
7 }:
8 let
9   cfg = config.services.logind;
11   logindHandlerType = lib.types.enum [
12     "ignore"
13     "poweroff"
14     "reboot"
15     "halt"
16     "kexec"
17     "suspend"
18     "hibernate"
19     "hybrid-sleep"
20     "suspend-then-hibernate"
21     "lock"
22   ];
25   options.services.logind = {
26     extraConfig = lib.mkOption {
27       default = "";
28       type = lib.types.lines;
29       example = "IdleAction=lock";
30       description = ''
31         Extra config options for systemd-logind.
32         See [logind.conf(5)](https://www.freedesktop.org/software/systemd/man/logind.conf.html)
33         for available options.
34       '';
35     };
37     killUserProcesses = lib.mkOption {
38       default = false;
39       type = lib.types.bool;
40       description = ''
41         Specifies whether the processes of a user should be killed
42         when the user logs out.  If true, the scope unit corresponding
43         to the session and all processes inside that scope will be
44         terminated.  If false, the scope is "abandoned"
45         (see [systemd.scope(5)](https://www.freedesktop.org/software/systemd/man/systemd.scope.html#)),
46         and processes are not killed.
48         See [logind.conf(5)](https://www.freedesktop.org/software/systemd/man/logind.conf.html#KillUserProcesses=)
49         for more details.
50       '';
51     };
53     powerKey = lib.mkOption {
54       default = "poweroff";
55       example = "ignore";
56       type = logindHandlerType;
58       description = ''
59         Specifies what to do when the power key is pressed.
60       '';
61     };
63     powerKeyLongPress = lib.mkOption {
64       default = "ignore";
65       example = "reboot";
66       type = logindHandlerType;
68       description = ''
69         Specifies what to do when the power key is long-pressed.
70       '';
71     };
73     rebootKey = lib.mkOption {
74       default = "reboot";
75       example = "ignore";
76       type = logindHandlerType;
78       description = ''
79         Specifies what to do when the reboot key is pressed.
80       '';
81     };
83     rebootKeyLongPress = lib.mkOption {
84       default = "poweroff";
85       example = "ignore";
86       type = logindHandlerType;
88       description = ''
89         Specifies what to do when the reboot key is long-pressed.
90       '';
91     };
93     suspendKey = lib.mkOption {
94       default = "suspend";
95       example = "ignore";
96       type = logindHandlerType;
98       description = ''
99         Specifies what to do when the suspend key is pressed.
100       '';
101     };
103     suspendKeyLongPress = lib.mkOption {
104       default = "hibernate";
105       example = "ignore";
106       type = logindHandlerType;
108       description = ''
109         Specifies what to do when the suspend key is long-pressed.
110       '';
111     };
113     hibernateKey = lib.mkOption {
114       default = "hibernate";
115       example = "ignore";
116       type = logindHandlerType;
118       description = ''
119         Specifies what to do when the hibernate key is pressed.
120       '';
121     };
123     hibernateKeyLongPress = lib.mkOption {
124       default = "ignore";
125       example = "suspend";
126       type = logindHandlerType;
128       description = ''
129         Specifies what to do when the hibernate key is long-pressed.
130       '';
131     };
133     lidSwitch = lib.mkOption {
134       default = "suspend";
135       example = "ignore";
136       type = logindHandlerType;
138       description = ''
139         Specifies what to do when the laptop lid is closed.
140       '';
141     };
143     lidSwitchExternalPower = lib.mkOption {
144       default = cfg.lidSwitch;
145       defaultText = lib.literalExpression "services.logind.lidSwitch";
146       example = "ignore";
147       type = logindHandlerType;
149       description = ''
150         Specifies what to do when the laptop lid is closed
151         and the system is on external power. By default use
152         the same action as specified in services.logind.lidSwitch.
153       '';
154     };
156     lidSwitchDocked = lib.mkOption {
157       default = "ignore";
158       example = "suspend";
159       type = logindHandlerType;
161       description = ''
162         Specifies what to do when the laptop lid is closed
163         and another screen is added.
164       '';
165     };
166   };
168   config = {
169     systemd.additionalUpstreamSystemUnits =
170       [
171         "systemd-logind.service"
172         "autovt@.service"
173         "systemd-user-sessions.service"
174       ]
175       ++ lib.optionals config.systemd.package.withImportd [
176         "dbus-org.freedesktop.import1.service"
177       ]
178       ++ lib.optionals config.systemd.package.withMachined [
179         "dbus-org.freedesktop.machine1.service"
180       ]
181       ++ lib.optionals config.systemd.package.withPortabled [
182         "dbus-org.freedesktop.portable1.service"
183       ]
184       ++ [
185         "dbus-org.freedesktop.login1.service"
186         "user@.service"
187         "user-runtime-dir@.service"
188       ];
190     environment.etc = {
191       "systemd/logind.conf".text = ''
192         [Login]
193         KillUserProcesses=${if cfg.killUserProcesses then "yes" else "no"}
194         HandlePowerKey=${cfg.powerKey}
195         HandlePowerKeyLongPress=${cfg.powerKeyLongPress}
196         HandleRebootKey=${cfg.rebootKey}
197         HandleRebootKeyLongPress=${cfg.rebootKeyLongPress}
198         HandleSuspendKey=${cfg.suspendKey}
199         HandleSuspendKeyLongPress=${cfg.suspendKeyLongPress}
200         HandleHibernateKey=${cfg.hibernateKey}
201         HandleHibernateKeyLongPress=${cfg.hibernateKeyLongPress}
202         HandleLidSwitch=${cfg.lidSwitch}
203         HandleLidSwitchExternalPower=${cfg.lidSwitchExternalPower}
204         HandleLidSwitchDocked=${cfg.lidSwitchDocked}
205         ${cfg.extraConfig}
206       '';
207     };
209     # Restarting systemd-logind breaks X11
210     # - upstream commit: https://cgit.freedesktop.org/xorg/xserver/commit/?id=dc48bd653c7e101
211     # - systemd announcement: https://github.com/systemd/systemd/blob/22043e4317ecd2bc7834b48a6d364de76bb26d91/NEWS#L103-L112
212     # - this might be addressed in the future by xorg
213     #systemd.services.systemd-logind.restartTriggers = [ config.environment.etc."systemd/logind.conf".source ];
214     systemd.services.systemd-logind.restartIfChanged = false;
215     systemd.services.systemd-logind.stopIfChanged = false;
217     # The user-runtime-dir@ service is managed by systemd-logind we should not touch it or else we break the users' sessions.
218     systemd.services."user-runtime-dir@".stopIfChanged = false;
219     systemd.services."user-runtime-dir@".restartIfChanged = false;
220   };