vuls: init at 0.27.0
[NixPkgs.git] / nixos / modules / services / hardware / rasdaemon.nix
blobac3c675a7fbedad11740d1c901e9d52395b6ea24
1 { config, lib, pkgs, ... }:
2 let
4   cfg = config.hardware.rasdaemon;
6 in
8   options.hardware.rasdaemon = {
10     enable = lib.mkEnableOption "RAS logging daemon";
12     record = lib.mkOption {
13       type = lib.types.bool;
14       default = true;
15       description = "record events via sqlite3, required for ras-mc-ctl";
16     };
18     mainboard = lib.mkOption {
19       type = lib.types.lines;
20       default = "";
21       description = "Custom mainboard description, see {manpage}`ras-mc-ctl(8)` for more details.";
22       example = ''
23         vendor = ASRock
24         model = B450M Pro4
26         # it should default to such values from
27         # /sys/class/dmi/id/board_[vendor|name]
28         # alternatively one can supply a script
29         # that returns the same format as above
31         script = <path to script>
32       '';
33     };
35     # TODO, accept `rasdaemon.labels = " ";` or `rasdaemon.labels = { dell = " "; asrock = " "; };'
37     labels = lib.mkOption {
38       type = lib.types.lines;
39       default = "";
40       description = "Additional memory module label descriptions to be placed in /etc/ras/dimm_labels.d/labels";
41       example = ''
42         # vendor and model may be shown by 'ras-mc-ctl --mainboard'
43         vendor: ASRock
44           product: To Be Filled By O.E.M.
45           model: B450M Pro4
46             # these labels are names for the motherboard slots
47             # the numbers may be shown by `ras-mc-ctl --error-count`
48             # they are mc:csrow:channel
49             DDR4_A1: 0.2.0;  DDR4_B1: 0.2.1;
50             DDR4_A2: 0.3.0;  DDR4_B2: 0.3.1;
51       '';
52     };
54     config = lib.mkOption {
55       type = lib.types.lines;
56       default = "";
57       description = ''
58         rasdaemon configuration, currently only used for CE PFA
59         for details, read rasdaemon.outPath/etc/sysconfig/rasdaemon's comments
60       '';
61       example = ''
62         # defaults from included config
63         PAGE_CE_REFRESH_CYCLE="24h"
64         PAGE_CE_THRESHOLD="50"
65         PAGE_CE_ACTION="soft"
66       '';
67     };
69     extraModules = lib.mkOption {
70       type = lib.types.listOf lib.types.str;
71       default = [];
72       description = "extra kernel modules to load";
73       example = [ "i7core_edac" ];
74     };
76     testing = lib.mkEnableOption "error injection infrastructure";
77   };
79   config = lib.mkIf cfg.enable {
81     environment.etc = {
82       "ras/mainboard" = {
83         enable = cfg.mainboard != "";
84         text = cfg.mainboard;
85       };
86     # TODO, handle multiple cfg.labels.brand = " ";
87       "ras/dimm_labels.d/labels" = {
88         enable = cfg.labels != "";
89         text = cfg.labels;
90       };
91       "sysconfig/rasdaemon" = {
92         enable = cfg.config != "";
93         text = cfg.config;
94       };
95     };
96     environment.systemPackages = [ pkgs.rasdaemon ]
97       ++ lib.optionals (cfg.testing) (with pkgs.error-inject; [
98         edac-inject
99         mce-inject
100         aer-inject
101       ]);
103     boot.initrd.kernelModules = cfg.extraModules
104       ++ lib.optionals (cfg.testing) [
105         # edac_core and amd64_edac should get loaded automatically
106         # i7core_edac may not be, and may not be required, but should load successfully
107         "edac_core"
108         "amd64_edac"
109         "i7core_edac"
110         "mce-inject"
111         "aer-inject"
112       ];
114     boot.kernelPatches = lib.optionals (cfg.testing) [{
115       name = "rasdaemon-tests";
116       patch = null;
117       extraConfig = ''
118         EDAC_DEBUG y
119         X86_MCE_INJECT y
121         PCIEPORTBUS y
122         PCIEAER y
123         PCIEAER_INJECT y
124       '';
125     }];
127     # i tried to set up a group for this
128     # but rasdaemon needs higher permissions?
129     # `rasdaemon: Can't locate a mounted debugfs`
131     # most of this taken from src/misc/
132     systemd.services = {
133       rasdaemon = {
134         description = "the RAS logging daemon";
135         documentation = [ "man:rasdaemon(1)" ];
136         wantedBy = [ "multi-user.target" ];
138         serviceConfig = {
139           StateDirectory = lib.optionalString (cfg.record) "rasdaemon";
141           ExecStart = "${pkgs.rasdaemon}/bin/rasdaemon --foreground"
142             + lib.optionalString (cfg.record) " --record";
143           ExecStop = "${pkgs.rasdaemon}/bin/rasdaemon --disable";
144           Restart = "on-abort";
146           # src/misc/rasdaemon.service.in shows this:
147           # ExecStartPost = ${pkgs.rasdaemon}/bin/rasdaemon --enable
148           # but that results in unpredictable existence of the database
149           # and everything seems to be enabled without this...
150         };
151       };
152       ras-mc-ctl = lib.mkIf (cfg.labels != "") {
153         description = "register DIMM labels on startup";
154         documentation = [ "man:ras-mc-ctl(8)" ];
155         wantedBy = [ "multi-user.target" ];
156         serviceConfig = {
157           Type = "oneshot";
158           ExecStart = "${pkgs.rasdaemon}/bin/ras-mc-ctl --register-labels";
159           RemainAfterExit = true;
160         };
161       };
162     };
163   };
165   meta.maintainers = [ lib.maintainers.evils ];