nixos/java: No bashisms in `environment.shellInit` script (#294121)
[NixPkgs.git] / nixos / modules / services / web-apps / icingaweb2 / module-monitoring.nix
blobe9c1d4ffe5eab8a1795264654560f6c85c56ba7d
1 { config, lib, pkgs, ... }: with lib; let
2   cfg = config.services.icingaweb2.modules.monitoring;
4   configIni = ''
5     [security]
6     protected_customvars = "${concatStringsSep "," cfg.generalConfig.protectedVars}"
7   '';
9   backendsIni = let
10     formatBool = b: if b then "1" else "0";
11   in concatStringsSep "\n" (mapAttrsToList (name: config: ''
12     [${name}]
13     type = "ido"
14     resource = "${config.resource}"
15     disabled = "${formatBool config.disabled}"
16   '') cfg.backends);
18   transportsIni = concatStringsSep "\n" (mapAttrsToList (name: config: ''
19     [${name}]
20     type = "${config.type}"
21     ${optionalString (config.instance != null) ''instance = "${config.instance}"''}
22     ${optionalString (config.type == "local" || config.type == "remote") ''path = "${config.path}"''}
23     ${optionalString (config.type != "local") ''
24       host = "${config.host}"
25       ${optionalString (config.port != null) ''port = "${toString config.port}"''}
26       user${optionalString (config.type == "api") "name"} = "${config.username}"
27     ''}
28     ${optionalString (config.type == "api") ''password = "${config.password}"''}
29     ${optionalString (config.type == "remote") ''resource = "${config.resource}"''}
30   '') cfg.transports);
32 in {
33   options.services.icingaweb2.modules.monitoring = with types; {
34     enable = mkOption {
35       type = bool;
36       default = true;
37       description = "Whether to enable the icingaweb2 monitoring module.";
38     };
40     generalConfig = {
41       mutable = mkOption {
42         type = bool;
43         default = false;
44         description = "Make config.ini of the monitoring module mutable (e.g. via the web interface).";
45       };
47       protectedVars = mkOption {
48         type = listOf str;
49         default = [ "*pw*" "*pass*" "community" ];
50         description = "List of string patterns for custom variables which should be excluded from user’s view.";
51       };
52     };
54     mutableBackends = mkOption {
55       type = bool;
56       default = false;
57       description = "Make backends.ini of the monitoring module mutable (e.g. via the web interface).";
58     };
60     backends = mkOption {
61       default = { icinga = { resource = "icinga_ido"; }; };
62       description = "Monitoring backends to define";
63       type = attrsOf (submodule ({ name, ... }: {
64         options = {
65           name = mkOption {
66             visible = false;
67             default = name;
68             type = str;
69             description = "Name of this backend";
70           };
72           resource = mkOption {
73             type = str;
74             description = "Name of the IDO resource";
75           };
77           disabled = mkOption {
78             type = bool;
79             default = false;
80             description = "Disable this backend";
81           };
82         };
83       }));
84     };
86     mutableTransports = mkOption {
87       type = bool;
88       default = true;
89       description = "Make commandtransports.ini of the monitoring module mutable (e.g. via the web interface).";
90     };
92     transports = mkOption {
93       default = {};
94       description = "Command transports to define";
95       type = attrsOf (submodule ({ name, ... }: {
96         options = {
97           name = mkOption {
98             visible = false;
99             default = name;
100             type = str;
101             description = "Name of this transport";
102           };
104           type = mkOption {
105             type = enum [ "api" "local" "remote" ];
106             default = "api";
107             description = "Type of  this transport";
108           };
110           instance = mkOption {
111             type = nullOr str;
112             default = null;
113             description = "Assign a icinga instance to this transport";
114           };
116           path = mkOption {
117             type = str;
118             description = "Path to the socket for local or remote transports";
119           };
121           host = mkOption {
122             type = str;
123             description = "Host for the api or remote transport";
124           };
126           port = mkOption {
127             type = nullOr str;
128             default = null;
129             description = "Port to connect to for the api or remote transport";
130           };
132           username = mkOption {
133             type = str;
134             description = "Username for the api or remote transport";
135           };
137           password = mkOption {
138             type = str;
139             description = "Password for the api transport";
140           };
142           resource = mkOption {
143             type = str;
144             description = "SSH identity resource for the remote transport";
145           };
146         };
147       }));
148     };
149   };
151   config = mkIf (config.services.icingaweb2.enable && cfg.enable) {
152     environment.etc = { "icingaweb2/enabledModules/monitoring" = { source = "${pkgs.icingaweb2}/modules/monitoring"; }; }
153       // optionalAttrs (!cfg.generalConfig.mutable) { "icingaweb2/modules/monitoring/config.ini".text = configIni; }
154       // optionalAttrs (!cfg.mutableBackends) { "icingaweb2/modules/monitoring/backends.ini".text = backendsIni; }
155       // optionalAttrs (!cfg.mutableTransports) { "icingaweb2/modules/monitoring/commandtransports.ini".text = transportsIni; };
156   };