1{
2 config,
3 lib,
4 pkgs,
5 utils,
6 ...
7}:
8{
9 options.services.logind = {
10 settings.Login = lib.mkOption {
11 description = ''
12 Settings option for systemd-logind.
13 See {manpage}`logind.conf(5)` for available options.
14 '';
15 type = lib.types.submodule {
16 freeformType = lib.types.attrsOf utils.systemdUtils.unitOptions.unitOption;
17 options.KillUserProcesses = lib.mkOption {
18 default = false;
19 type = lib.types.bool;
20 description = ''
21 Specifies whether the processes of a user should be killed
22 when the user logs out. If true, the scope unit corresponding
23 to the session and all processes inside that scope will be
24 terminated. If false, the scope is "abandoned"
25 (see {manpage}`systemd.scope(5)`),
26 and processes are not killed.
27
28 See {manpage}`logind.conf(5)` for more details.
29
30 Defaulted to false in nixpkgs because many tools that rely on
31 persistent user processes—like `tmux`, `screen`, `mosh`, `VNC`,
32 `nohup`, and more — would break by the systemd-default behavior.
33 '';
34 };
35 };
36 default = { };
37 example = {
38 KillUserProcesses = false;
39 HandleLidSwitch = "ignore";
40 };
41 };
42 };
43
44 config = {
45 systemd.additionalUpstreamSystemUnits = [
46 "systemd-logind.service"
47 "autovt@.service"
48 "systemd-user-sessions.service"
49 ]
50 ++ lib.optionals config.systemd.package.withImportd [
51 "dbus-org.freedesktop.import1.service"
52 ]
53 ++ lib.optionals config.systemd.package.withMachined [
54 "dbus-org.freedesktop.machine1.service"
55 ]
56 ++ lib.optionals config.systemd.package.withPortabled [
57 "dbus-org.freedesktop.portable1.service"
58 ]
59 ++ [
60 "dbus-org.freedesktop.login1.service"
61 "user@.service"
62 "user-runtime-dir@.service"
63 ];
64
65 environment.etc."systemd/logind.conf".text = ''
66 [Login]
67 ${utils.systemdUtils.lib.attrsToSection config.services.logind.settings.Login}
68 '';
69
70 # Restarting systemd-logind breaks X11
71 # - upstream commit: https://cgit.freedesktop.org/xorg/xserver/commit/?id=dc48bd653c7e101
72 # - systemd announcement: https://github.com/systemd/systemd/blob/22043e4317ecd2bc7834b48a6d364de76bb26d91/NEWS#L103-L112
73 # - this might be addressed in the future by xorg
74 #systemd.services.systemd-logind.restartTriggers = [ config.environment.etc."systemd/logind.conf".source ];
75 systemd.services.systemd-logind.restartIfChanged = false;
76 systemd.services.systemd-logind.stopIfChanged = false;
77
78 # The user-runtime-dir@ service is managed by systemd-logind we should not touch it or else we break the users' sessions.
79 systemd.services."user-runtime-dir@".stopIfChanged = false;
80 systemd.services."user-runtime-dir@".restartIfChanged = false;
81 };
82
83 imports =
84 let
85 settingsRename =
86 old: new:
87 lib.mkRenamedOptionModule
88 [ "services" "logind" old ]
89 [ "services" "logind" "settings" "Login" new ];
90 in
91 [
92 (lib.mkRemovedOptionModule [
93 "services"
94 "logind"
95 "extraConfig"
96 ] "Use services.logind.settings.Login instead.")
97
98 (settingsRename "killUserProcesses" "KillUserProcesses")
99 (settingsRename "powerKey" "HandlePowerKey")
100 (settingsRename "powerKeyLongPress" "HandlePowerKeyLongPress")
101 (settingsRename "rebootKey" "HandleRebootKey")
102 (settingsRename "rebootKeyLongPress" "HandleRebootKeyLongPress")
103 (settingsRename "suspendKey" "HandleSuspendKey")
104 (settingsRename "suspendKeyLongPress" "HandleSuspendKeyLongPress")
105 (settingsRename "hibernateKey" "HandleHibernateKey")
106 (settingsRename "hibernateKeyLongPress" "HandleHibernateKeyLongPress")
107 (settingsRename "lidSwitch" "HandleLidSwitch")
108 (settingsRename "lidSwitchExternalPower" "HandleLidSwitchExternalPower")
109 (settingsRename "lidSwitchDocked" "HandleLidSwitchDocked")
110 ];
111}