]> git.immae.eu Git - perso/Immae/Config/Nix.git/commitdiff
Add loginctl module
authorIsmaël Bouya <ismael.bouya@normalesup.org>
Tue, 4 Feb 2020 07:29:52 +0000 (08:29 +0100)
committerIsmaël Bouya <ismael.bouya@normalesup.org>
Tue, 4 Feb 2020 07:29:52 +0000 (08:29 +0100)
modules/private/default.nix
modules/private/loginctl-linger.nix [new file with mode: 0644]

index 47abec84952d753a1b1b20a21ed8f8e61e886d63..945a79936842c8ecf2015943003e8d9b2f627d31 100644 (file)
@@ -75,6 +75,7 @@ set = {
 
   environment = ./environment.nix;
   system = ./system.nix;
+  loginctl-linger = ./loginctl-linger.nix;
 };
 in
 builtins.listToAttrs (map (attr: { name = "priv${attr}"; value = set.${attr}; }) (builtins.attrNames set))
diff --git a/modules/private/loginctl-linger.nix b/modules/private/loginctl-linger.nix
new file mode 100644 (file)
index 0000000..e6b9f23
--- /dev/null
@@ -0,0 +1,47 @@
+{ config, lib, pkgs, ... }:
+
+# https://github.com/michalrus/dotfiles/commit/ebd5fa9583f82589f23531647aa677feb3f8d344#diff-4d353005ef5b3e37f33c07332b8523edR1
+# A temporary hack to `loginctl enable-linger $somebody` (for
+# multiplexer sessions to last), until this one is unresolved:
+# https://github.com/NixOS/nixpkgs/issues/3702
+#
+# Usage: `users.extraUsers.somebody.linger = true` or slt.
+
+with lib;
+
+let
+
+  dataDir = "/var/lib/systemd/linger";
+
+  lingeringUsers = map (u: u.name) (attrValues (flip filterAttrs config.users.users (n: u: u.linger)));
+
+  lingeringUsersFile = builtins.toFile "lingering-users"
+    (concatStrings (map (s: "${s}\n")
+      (sort (a: b: a < b) lingeringUsers))); # this sorting is important for `comm` to work correctly
+
+  updateLingering = pkgs.writeScript "update-lingering" ''
+    if [ ! -e ${dataDir} ]; then
+      install -m 0755 -o root -g root -d ${dataDir}
+    fi
+    if [ -e ${dataDir} ] ; then
+      ls ${dataDir} | sort | comm -3 -1 ${lingeringUsersFile} - | xargs -r ${pkgs.systemd}/bin/loginctl disable-linger
+      ls ${dataDir} | sort | comm -3 -2 ${lingeringUsersFile} - | xargs -r ${pkgs.systemd}/bin/loginctl  enable-linger
+    fi
+  '';
+
+in
+
+{
+  options = {
+    users.users = mkOption {
+      options = [{
+        linger = mkEnableOption "lingering for the user";
+      }];
+    };
+  };
+
+  config = {
+    system.activationScripts.update-lingering =
+      stringAfter [ "users" ] updateLingering;
+  };
+}