at v192 5.0 kB view raw
1{ config, lib, pkgs, ... }: 2 3with lib; 4 5let 6 7 dmcfg = config.services.xserver.displayManager; 8 xEnv = config.systemd.services."display-manager".environment; 9 cfg = dmcfg.lightdm; 10 11 inherit (pkgs) stdenv lightdm writeScript writeText; 12 13 # lightdm runs with clearenv(), but we need a few things in the enviornment for X to startup 14 xserverWrapper = writeScript "xserver-wrapper" 15 '' 16 #! /bin/sh 17 ${concatMapStrings (n: "export ${n}=\"${getAttr n xEnv}\"\n") (attrNames xEnv)} 18 exec ${dmcfg.xserverBin} ${dmcfg.xserverArgs} 19 ''; 20 21 theme = pkgs.gnome3.gnome_themes_standard; 22 icons = pkgs.gnome3.defaultIconTheme; 23 24 # The default greeter provided with this expression is the GTK greeter. 25 # Again, we need a few things in the environment for the greeter to run with 26 # fonts/icons. 27 wrappedGtkGreeter = stdenv.mkDerivation { 28 name = "lightdm-gtk-greeter"; 29 buildInputs = [ pkgs.makeWrapper ]; 30 31 buildCommand = '' 32 # This wrapper ensures that we actually get themes 33 makeWrapper ${pkgs.lightdm_gtk_greeter}/sbin/lightdm-gtk-greeter \ 34 $out/greeter \ 35 --prefix PATH : "${pkgs.glibc}/bin" \ 36 --set GDK_PIXBUF_MODULE_FILE "${pkgs.gdk_pixbuf}/lib/gdk-pixbuf-2.0/2.10.0/loaders.cache" \ 37 --set GTK_PATH "${theme}:${pkgs.gtk3}" \ 38 --set GTK_EXE_PREFIX "${theme}" \ 39 --set GTK_DATA_PREFIX "${theme}" \ 40 --set XDG_DATA_DIRS "${theme}/share:${icons}/share" \ 41 --set XDG_CONFIG_HOME "${theme}/share" 42 43 cat - > $out/lightdm-gtk-greeter.desktop << EOF 44 [Desktop Entry] 45 Name=LightDM Greeter 46 Comment=This runs the LightDM Greeter 47 Exec=$out/greeter 48 Type=Application 49 EOF 50 ''; 51 }; 52 53 usersConf = writeText "users.conf" 54 '' 55 [UserList] 56 minimum-uid=500 57 hidden-users=${concatStringsSep " " dmcfg.hiddenUsers} 58 hidden-shells=/run/current-system/sw/bin/nologin 59 ''; 60 61 lightdmConf = writeText "lightdm.conf" 62 '' 63 [LightDM] 64 greeter-user = ${config.users.extraUsers.lightdm.name} 65 greeters-directory = ${cfg.greeter.package} 66 sessions-directory = ${dmcfg.session.desktops} 67 68 [Seat:*] 69 xserver-command = ${xserverWrapper} 70 session-wrapper = ${dmcfg.session.script} 71 greeter-session = ${cfg.greeter.name} 72 ${cfg.extraSeatDefaults} 73 ''; 74 75 gtkGreeterConf = writeText "lightdm-gtk-greeter.conf" 76 '' 77 [greeter] 78 theme-name = Adwaita 79 icon-theme-name = Adwaita 80 background = ${cfg.background} 81 ''; 82 83in 84{ 85 options = { 86 services.xserver.displayManager.lightdm = { 87 88 enable = mkOption { 89 default = false; 90 description = '' 91 Whether to enable lightdm as the display manager. 92 ''; 93 }; 94 95 greeter = mkOption { 96 description = '' 97 The LightDM greeter to login via. The package should be a directory 98 containing a .desktop file matching the name in the 'name' option. 99 ''; 100 default = { 101 name = "lightdm-gtk-greeter"; 102 package = wrappedGtkGreeter; 103 }; 104 }; 105 106 background = mkOption { 107 default = "${pkgs.nixos-artwork}/share/artwork/gnome/Gnome_Dark.png"; 108 description = '' 109 The background image or color to use. 110 ''; 111 }; 112 113 extraSeatDefaults = mkOption { 114 type = types.lines; 115 default = ""; 116 example = '' 117 greeter-show-manual-login=true 118 ''; 119 description = "Extra lines to append to SeatDefaults section."; 120 }; 121 122 }; 123 }; 124 125 config = mkIf cfg.enable { 126 127 services.xserver.displayManager.slim.enable = false; 128 129 services.xserver.displayManager.job = { 130 logsXsession = true; 131 132 # lightdm relaunches itself via just `lightdm`, so needs to be on the PATH 133 execCmd = '' 134 export PATH=${lightdm}/sbin:$PATH 135 exec ${lightdm}/sbin/lightdm --log-dir=/var/log --run-dir=/run 136 ''; 137 }; 138 139 environment.etc."lightdm/lightdm-gtk-greeter.conf".source = gtkGreeterConf; 140 environment.etc."lightdm/lightdm.conf".source = lightdmConf; 141 environment.etc."lightdm/users.conf".source = usersConf; 142 143 services.dbus.enable = true; 144 services.dbus.packages = [ lightdm ]; 145 146 security.pam.services.lightdm = { 147 allowNullPassword = true; 148 startSession = true; 149 }; 150 security.pam.services.lightdm-greeter = { 151 allowNullPassword = true; 152 startSession = true; 153 text = '' 154 auth required pam_env.so 155 auth required pam_permit.so 156 157 account required pam_permit.so 158 159 password required pam_deny.so 160 161 session required pam_env.so envfile=${config.system.build.pamEnvironment} 162 session required pam_unix.so 163 session optional ${pkgs.systemd}/lib/security/pam_systemd.so 164 ''; 165 }; 166 167 users.extraUsers.lightdm = { 168 createHome = true; 169 home = "/var/lib/lightdm-data"; 170 group = "lightdm"; 171 uid = config.ids.uids.lightdm; 172 }; 173 174 users.extraGroups.lightdm.gid = config.ids.gids.lightdm; 175 }; 176}