1{ config, lib, pkgs, ... }: 2with lib; 3 4let 5 cfg = config.services.greetd; 6 tty = "tty${toString cfg.vt}"; 7 settingsFormat = pkgs.formats.toml { }; 8in 9{ 10 options.services.greetd = { 11 enable = mkEnableOption "greetd, a minimal and flexible login manager daemon"; 12 13 package = mkPackageOption pkgs [ "greetd" "greetd" ] { }; 14 15 settings = mkOption { 16 type = settingsFormat.type; 17 example = literalExpression '' 18 { 19 default_session = { 20 command = "''${pkgs.greetd.greetd}/bin/agreety --cmd sway"; 21 }; 22 } 23 ''; 24 description = '' 25 greetd configuration ([documentation](https://man.sr.ht/~kennylevinsen/greetd/)) 26 as a Nix attribute set. 27 ''; 28 }; 29 30 greeterManagesPlymouth = mkOption { 31 type = types.bool; 32 internal = true; 33 default = false; 34 description = '' 35 Don't configure the greetd service to wait for Plymouth to exit. 36 37 Enable this if the greeter you're using can manage Plymouth itself to provide a smoother handoff. 38 ''; 39 }; 40 41 vt = mkOption { 42 type = types.int; 43 default = 1; 44 description = '' 45 The virtual console (tty) that greetd should use. This option also disables getty on that tty. 46 ''; 47 }; 48 49 restart = mkOption { 50 type = types.bool; 51 default = !(cfg.settings ? initial_session); 52 defaultText = literalExpression "!(config.services.greetd.settings ? initial_session)"; 53 description = '' 54 Whether to restart greetd when it terminates (e.g. on failure). 55 This is usually desirable so a user can always log in, but should be disabled when using 'settings.initial_session' (autologin), 56 because every greetd restart will trigger the autologin again. 57 ''; 58 }; 59 }; 60 config = mkIf cfg.enable { 61 62 services.greetd.settings.terminal.vt = mkDefault cfg.vt; 63 services.greetd.settings.default_session.user = mkDefault "greeter"; 64 65 security.pam.services.greetd = { 66 allowNullPassword = true; 67 startSession = true; 68 enableGnomeKeyring = mkDefault config.services.gnome.gnome-keyring.enable; 69 }; 70 71 # This prevents nixos-rebuild from killing greetd by activating getty again 72 systemd.services."autovt@${tty}".enable = false; 73 74 # Enable desktop session data 75 services.displayManager.enable = lib.mkDefault true; 76 77 systemd.services.greetd = { 78 aliases = [ "display-manager.service" ]; 79 80 unitConfig = { 81 Wants = [ 82 "systemd-user-sessions.service" 83 ]; 84 After = [ 85 "systemd-user-sessions.service" 86 "getty@${tty}.service" 87 ] ++ lib.optionals (!cfg.greeterManagesPlymouth) [ 88 "plymouth-quit-wait.service" 89 ]; 90 Conflicts = [ 91 "getty@${tty}.service" 92 ]; 93 }; 94 95 serviceConfig = { 96 ExecStart = "${pkgs.greetd.greetd}/bin/greetd --config ${settingsFormat.generate "greetd.toml" cfg.settings}"; 97 98 Restart = mkIf cfg.restart "on-success"; 99 100 # Defaults from greetd upstream configuration 101 IgnoreSIGPIPE = false; 102 SendSIGHUP = true; 103 TimeoutStopSec = "30s"; 104 KeyringMode = "shared"; 105 106 Type = "idle"; 107 }; 108 109 # Don't kill a user session when using nixos-rebuild 110 restartIfChanged = false; 111 112 wantedBy = [ "graphical.target" ]; 113 }; 114 115 systemd.defaultUnit = "graphical.target"; 116 117 # Create directories potentially required by supported greeters 118 # See https://github.com/NixOS/nixpkgs/issues/248323 119 systemd.tmpfiles.rules = [ 120 "d '/var/cache/tuigreet' - greeter greeter - -" 121 ]; 122 123 users.users.greeter = { 124 isSystemUser = true; 125 group = "greeter"; 126 }; 127 128 users.groups.greeter = { }; 129 }; 130 131 meta.maintainers = with maintainers; [ queezle ]; 132}