nixpkgs/nixos/modules/services/x11/display-managers/lightdm.nix

177 lines
4.9 KiB
Nix
Raw Normal View History

{ config, lib, pkgs, ... }:
with lib;
let
dmcfg = config.services.xserver.displayManager;
xEnv = config.systemd.services."display-manager".environment;
cfg = dmcfg.lightdm;
inherit (pkgs) stdenv lightdm writeScript writeText;
# lightdm runs with clearenv(), but we need a few things in the enviornment for X to startup
xserverWrapper = writeScript "xserver-wrapper"
''
#! /bin/sh
${concatMapStrings (n: "export ${n}=\"${getAttr n xEnv}\"\n") (attrNames xEnv)}
exec ${dmcfg.xserverBin} ${dmcfg.xserverArgs}
'';
2015-03-10 21:23:43 +00:00
theme = pkgs.gnome3.gnome_themes_standard;
2015-04-10 16:02:57 +01:00
icons = pkgs.gnome3.defaultIconTheme;
2015-03-10 21:23:43 +00:00
# The default greeter provided with this expression is the GTK greeter.
# Again, we need a few things in the environment for the greeter to run with
# fonts/icons.
wrappedGtkGreeter = stdenv.mkDerivation {
name = "lightdm-gtk-greeter";
buildInputs = [ pkgs.makeWrapper ];
buildCommand = ''
2015-03-10 21:03:12 +00:00
# This wrapper ensures that we actually get themes
makeWrapper ${pkgs.lightdm_gtk_greeter}/sbin/lightdm-gtk-greeter \
$out/greeter \
2015-03-10 21:03:12 +00:00
--prefix PATH : "${pkgs.glibc}/bin" \
2015-03-10 21:23:43 +00:00
--set GDK_PIXBUF_MODULE_FILE "$(find ${theme} -name loaders.cache)" \
--set GTK_PATH "${theme}:${pkgs.gtk3}" \
--set GTK_EXE_PREFIX "${theme}" \
--set GTK_DATA_PREFIX "${theme}" \
--set XDG_DATA_DIRS "${theme}/share:${icons}/share" \
--set XDG_CONFIG_HOME "${theme}/share"
cat - > $out/lightdm-gtk-greeter.desktop << EOF
[Desktop Entry]
Name=LightDM Greeter
Comment=This runs the LightDM Greeter
Exec=$out/greeter
Type=Application
EOF
'';
};
usersConf = writeText "users.conf"
''
[UserList]
minimum-uid=500
2015-03-10 21:35:49 +00:00
hidden-users=${concatStringsSep " " dmcfg.hiddenUsers}
hidden-shells=/run/current-system/sw/bin/nologin
'';
lightdmConf = writeText "lightdm.conf"
''
[LightDM]
greeter-user = ${config.users.extraUsers.lightdm.name}
2014-01-31 11:11:04 +00:00
greeters-directory = ${cfg.greeter.package}
sessions-directory = ${dmcfg.session.desktops}
2015-05-20 23:12:55 +01:00
[Seat:*]
xserver-command = ${xserverWrapper}
session-wrapper = ${dmcfg.session.script}
greeter-session = ${cfg.greeter.name}
${cfg.extraSeatDefaults}
'';
2015-03-10 21:03:12 +00:00
gtkGreeterConf = writeText "lightdm-gtk-greeter.conf"
''
[greeter]
theme-name = Adwaita
icon-theme-name = Adwaita
2015-03-10 22:57:46 +00:00
background = ${cfg.background}
2015-03-10 21:03:12 +00:00
'';
in
{
options = {
services.xserver.displayManager.lightdm = {
2015-03-10 21:55:54 +00:00
enable = mkOption {
default = false;
description = ''
Whether to enable lightdm as the display manager.
'';
};
greeter = mkOption {
description = ''
The LightDM greeter to login via. The package should be a directory
containing a .desktop file matching the name in the 'name' option.
'';
default = {
name = "lightdm-gtk-greeter";
package = wrappedGtkGreeter;
};
};
2015-03-10 22:57:46 +00:00
background = mkOption {
default = "${pkgs.nixos-artwork}/gnome/Gnome_Dark.png";
description = ''
The background image or color to use.
'';
};
extraSeatDefaults = mkOption {
type = types.lines;
default = "";
example = ''
greeter-show-manual-login=true
'';
description = "Extra lines to append to SeatDefaults section.";
};
};
};
config = mkIf cfg.enable {
services.xserver.displayManager.slim.enable = false;
services.xserver.displayManager.job = {
logsXsession = true;
# lightdm relaunches itself via just `lightdm`, so needs to be on the PATH
execCmd = ''
export PATH=${lightdm}/sbin:$PATH
exec ${lightdm}/sbin/lightdm --log-dir=/var/log --run-dir=/run
'';
};
2015-03-10 21:03:12 +00:00
environment.etc."lightdm/lightdm-gtk-greeter.conf".source = gtkGreeterConf;
environment.etc."lightdm/lightdm.conf".source = lightdmConf;
environment.etc."lightdm/users.conf".source = usersConf;
services.dbus.enable = true;
services.dbus.packages = [ lightdm ];
2015-05-22 03:06:03 +01:00
security.pam.services.lightdm = {
allowNullPassword = true;
startSession = true;
};
security.pam.services.lightdm-greeter = {
allowNullPassword = true;
startSession = true;
text = ''
auth required pam_env.so
auth required pam_permit.so
account required pam_permit.so
password required pam_deny.so
session required pam_env.so envfile=${config.system.build.pamEnvironment}
session required pam_unix.so
session optional ${pkgs.systemd}/lib/security/pam_systemd.so
'';
};
users.extraUsers.lightdm = {
createHome = true;
2015-03-10 21:55:54 +00:00
home = "/var/lib/lightdm-data";
2013-08-26 14:20:25 +01:00
group = "lightdm";
uid = config.ids.uids.lightdm;
};
2013-08-26 14:20:25 +01:00
users.extraGroups.lightdm.gid = config.ids.gids.lightdm;
};
}