vuls: init at 0.27.0
[NixPkgs.git] / nixos / modules / services / ttys / kmscon.nix
blobd274b508300f22fffc941517cd100da4097eb801
1 { config, pkgs, lib, ... }:
2 let
3   inherit (lib) mapAttrs mkIf mkOption optional optionals types;
5   cfg = config.services.kmscon;
7   autologinArg = lib.optionalString (cfg.autologinUser != null) "-f ${cfg.autologinUser}";
9   configDir = pkgs.writeTextFile { name = "kmscon-config"; destination = "/kmscon.conf"; text = cfg.extraConfig; };
10 in {
11   options = {
12     services.kmscon = {
13       enable = mkOption {
14         description = ''
15           Use kmscon as the virtual console instead of gettys.
16           kmscon is a kms/dri-based userspace virtual terminal implementation.
17           It supports a richer feature set than the standard linux console VT,
18           including full unicode support, and when the video card supports drm
19           should be much faster.
20         '';
21         type = types.bool;
22         default = false;
23       };
25       hwRender = mkOption {
26         description = "Whether to use 3D hardware acceleration to render the console.";
27         type = types.bool;
28         default = false;
29       };
31       fonts = mkOption {
32         description = "Fonts used by kmscon, in order of priority.";
33         default = null;
34         example = lib.literalExpression ''[ { name = "Source Code Pro"; package = pkgs.source-code-pro; } ]'';
35         type = with types;
36           let fontType = submodule {
37                 options = {
38                   name = mkOption { type = str; description = "Font name, as used by fontconfig."; };
39                   package = mkOption { type = package; description = "Package providing the font."; };
40                 };
41           }; in nullOr (nonEmptyListOf fontType);
42       };
44       useXkbConfig = mkOption {
45         description = "Configure keymap from xserver keyboard settings.";
46         type = types.bool;
47         default = false;
48       };
50       extraConfig = mkOption {
51         description = "Extra contents of the kmscon.conf file.";
52         type = types.lines;
53         default = "";
54         example = "font-size=14";
55       };
57       extraOptions = mkOption {
58         description = "Extra flags to pass to kmscon.";
59         type = types.separatedString " ";
60         default = "";
61         example = "--term xterm-256color";
62       };
64       autologinUser = mkOption {
65         type = types.nullOr types.str;
66         default = null;
67         description = ''
68           Username of the account that will be automatically logged in at the console.
69           If unspecified, a login prompt is shown as usual.
70         '';
71       };
72     };
73   };
75   config = mkIf cfg.enable {
76     systemd.packages = [ pkgs.kmscon ];
78     systemd.services."kmsconvt@" = {
79       after = [ "systemd-logind.service" "systemd-vconsole-setup.service" ];
80       requires = [ "systemd-logind.service" ];
82       serviceConfig.ExecStart = [
83         ""
84         ''
85           ${pkgs.kmscon}/bin/kmscon "--vt=%I" ${cfg.extraOptions} --seats=seat0 --no-switchvt --configdir ${configDir} --login -- ${pkgs.shadow}/bin/login -p ${autologinArg}
86         ''
87       ];
89       restartIfChanged = false;
90       aliases = [ "autovt@.service" ];
91     };
93     systemd.suppressedSystemUnits = [ "autovt@.service" ];
95     systemd.services.systemd-vconsole-setup.enable = false;
96     systemd.services.reload-systemd-vconsole-setup.enable = false;
98     services.kmscon.extraConfig =
99       let
100         xkb = optionals cfg.useXkbConfig
101           (lib.mapAttrsToList (n: v: "xkb-${n}=${v}") (
102             lib.filterAttrs
103               (n: v: builtins.elem n ["layout" "model" "options" "variant"] && v != "")
104               config.services.xserver.xkb
105           ));
106         render = optionals cfg.hwRender [ "drm" "hwaccel" ];
107         fonts = optional (cfg.fonts != null) "font-name=${lib.concatMapStringsSep ", " (f: f.name) cfg.fonts}";
108       in lib.concatLines (xkb ++ render ++ fonts);
110     hardware.graphics.enable = mkIf cfg.hwRender true;
112     fonts = mkIf (cfg.fonts != null) {
113       fontconfig.enable = true;
114       packages = map (f: f.package) cfg.fonts;
115     };
116   };