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 (lib.mdDoc "greetd"); 12 13 package = mkOption { 14 type = types.package; 15 default = pkgs.greetd.greetd; 16 defaultText = literalExpression "pkgs.greetd.greetd"; 17 description = lib.mdDoc "The greetd package that should be used."; 18 }; 19 20 settings = mkOption { 21 type = settingsFormat.type; 22 example = literalExpression '' 23 { 24 default_session = { 25 command = "''${pkgs.greetd.greetd}/bin/agreety --cmd sway"; 26 }; 27 } 28 ''; 29 description = lib.mdDoc '' 30 greetd configuration ([documentation](https://man.sr.ht/~kennylevinsen/greetd/)) 31 as a Nix attribute set. 32 ''; 33 }; 34 35 vt = mkOption { 36 type = types.int; 37 default = 1; 38 description = lib.mdDoc '' 39 The virtual console (tty) that greetd should use. This option also disables getty on that tty. 40 ''; 41 }; 42 43 restart = mkOption { 44 type = types.bool; 45 default = !(cfg.settings ? initial_session); 46 defaultText = literalExpression "!(config.services.greetd.settings ? initial_session)"; 47 description = lib.mdDoc '' 48 Whether to restart greetd when it terminates (e.g. on failure). 49 This is usually desirable so a user can always log in, but should be disabled when using 'settings.initial_session' (autologin), 50 because every greetd restart will trigger the autologin again. 51 ''; 52 }; 53 }; 54 config = mkIf cfg.enable { 55 56 services.greetd.settings.terminal.vt = mkDefault cfg.vt; 57 services.greetd.settings.default_session.user = mkDefault "greeter"; 58 59 security.pam.services.greetd = { 60 allowNullPassword = true; 61 startSession = true; 62 enableGnomeKeyring = mkDefault config.services.gnome.gnome-keyring.enable; 63 }; 64 65 # This prevents nixos-rebuild from killing greetd by activating getty again 66 systemd.services."autovt@${tty}".enable = false; 67 68 systemd.services.greetd = { 69 unitConfig = { 70 Wants = [ 71 "systemd-user-sessions.service" 72 ]; 73 After = [ 74 "systemd-user-sessions.service" 75 "plymouth-quit-wait.service" 76 "getty@${tty}.service" 77 ]; 78 Conflicts = [ 79 "getty@${tty}.service" 80 ]; 81 }; 82 83 serviceConfig = { 84 ExecStart = "${pkgs.greetd.greetd}/bin/greetd --config ${settingsFormat.generate "greetd.toml" cfg.settings}"; 85 86 Restart = mkIf cfg.restart "always"; 87 88 # Defaults from greetd upstream configuration 89 IgnoreSIGPIPE = false; 90 SendSIGHUP = true; 91 TimeoutStopSec = "30s"; 92 KeyringMode = "shared"; 93 94 Type = "idle"; 95 }; 96 97 # Don't kill a user session when using nixos-rebuild 98 restartIfChanged = false; 99 100 wantedBy = [ "graphical.target" ]; 101 }; 102 103 systemd.defaultUnit = "graphical.target"; 104 105 users.users.greeter = { 106 isSystemUser = true; 107 group = "greeter"; 108 }; 109 110 users.groups.greeter = {}; 111 }; 112 113 meta.maintainers = with maintainers; [ queezle ]; 114}