vuls: init at 0.27.0
[NixPkgs.git] / nixos / modules / services / monitoring / prometheus / exporters / imap-mailstat.nix
blob92d02a3f146356016c04768ef270605619eb5af6
1 { config, lib, pkgs, options, ... }:
3 let
4   cfg = config.services.prometheus.exporters.imap-mailstat;
5   valueToString = value:
6     if (builtins.typeOf value == "string") then "\"${value}\""
7     else (
8       if (builtins.typeOf value == "int") then "${toString value}"
9       else (
10         if (builtins.typeOf value == "bool") then (if value then "true" else "false")
11         else "XXX ${toString value}"
12       )
13     );
14   inherit (lib)
15     mkOption
16     types
17     concatStrings
18     concatStringsSep
19     attrValues
20     mapAttrs
21     optionalString
22     ;
23   createConfigFile = accounts:
24     # unfortunately on toTOML yet
25     # https://github.com/NixOS/nix/issues/3929
26     pkgs.writeText "imap-mailstat-exporter.conf" ''
27       ${concatStrings (attrValues (mapAttrs (name: config: "[[Accounts]]\nname = \"${name}\"\n${concatStrings (attrValues (mapAttrs (k: v: "${k} = ${valueToString v}\n") config))}") accounts))}
28     '';
29   mkOpt = type: description: mkOption {
30     type = types.nullOr type;
31     default = null;
32     description = description;
33   };
34   accountOptions.options = {
35     mailaddress = mkOpt types.str "Your email address (at the moment used as login name)";
36     username = mkOpt types.str "If empty string mailaddress value is used";
37     password = mkOpt types.str "";
38     serveraddress = mkOpt types.str "mailserver name or address";
39     serverport = mkOpt types.int "imap port number (at the moment only tls connection is supported)";
40     starttls = mkOpt types.bool "set to true for using STARTTLS to start a TLS connection";
41   };
44   port = 8081;
45   extraOpts = {
46     oldestUnseenDate = mkOption {
47       type = types.bool;
48       default = false;
49       description = ''
50         Enable metric with timestamp of oldest unseen mail
51       '';
52     };
53     accounts = mkOption {
54       type = types.attrsOf (types.submodule accountOptions);
55       default = {};
56       description = ''
57         Accounts to monitor
58       '';
59     };
60     configurationFile = mkOption {
61       type = types.path;
62       example = "/path/to/config-file";
63       description = ''
64         File containing the configuration
65       '';
66     };
67   };
68   serviceOpts = {
69     serviceConfig = {
70       ExecStart = ''
71         ${pkgs.prometheus-imap-mailstat-exporter}/bin/imap-mailstat-exporter \
72           -config ${createConfigFile cfg.accounts} \
73           ${optionalString cfg.oldestUnseenDate "-oldestunseendate"} \
74           ${concatStringsSep " \\\n  " cfg.extraFlags}
75       '';
76     };
77   };