silx: 2.1.1 -> 2.1.2 (#361612)
[NixPkgs.git] / nixos / modules / services / misc / errbot.nix
blob1c7135e774e8349797895679667a680f82292a8f
1 { config, lib, pkgs, ... }:
2 let
3   cfg = config.services.errbot;
4   pluginEnv = plugins: pkgs.buildEnv {
5     name = "errbot-plugins";
6     paths = plugins;
7   };
8   mkConfigDir = instanceCfg: dataDir: pkgs.writeTextDir "config.py" ''
9     import logging
10     BACKEND = '${instanceCfg.backend}'
11     BOT_DATA_DIR = '${dataDir}'
12     BOT_EXTRA_PLUGIN_DIR = '${pluginEnv instanceCfg.plugins}'
14     BOT_LOG_LEVEL = logging.${instanceCfg.logLevel}
15     BOT_LOG_FILE = False
17     BOT_ADMINS = (${lib.concatMapStringsSep "," (name: "'${name}'") instanceCfg.admins})
19     BOT_IDENTITY = ${builtins.toJSON instanceCfg.identity}
21     ${instanceCfg.extraConfig}
22   '';
23 in {
24   options = {
25     services.errbot.instances = lib.mkOption {
26       default = {};
27       description = "Errbot instance configs";
28       type = lib.types.attrsOf (lib.types.submodule {
29         options = {
30           dataDir = lib.mkOption {
31             type = lib.types.nullOr lib.types.path;
32             default = null;
33             description = "Data directory for errbot instance.";
34           };
36           plugins = lib.mkOption {
37             type = lib.types.listOf lib.types.package;
38             default = [];
39             description = "List of errbot plugin derivations.";
40           };
42           logLevel = lib.mkOption {
43             type = lib.types.str;
44             default = "INFO";
45             description = "Errbot log level";
46           };
48           admins = lib.mkOption {
49             type = lib.types.listOf lib.types.str;
50             default = [];
51             description = "List of identifiers of errbot admins.";
52           };
54           backend = lib.mkOption {
55             type = lib.types.str;
56             default = "XMPP";
57             description = "Errbot backend name.";
58           };
60           identity = lib.mkOption {
61             type = lib.types.attrs;
62             description = "Errbot identity configuration";
63           };
65           extraConfig = lib.mkOption {
66             type = lib.types.lines;
67             default = "";
68             description = "String to be appended to the config verbatim";
69           };
70         };
71       });
72     };
73   };
75   config = lib.mkIf (cfg.instances != {}) {
76     users.users.errbot = {
77       group = "errbot";
78       isSystemUser = true;
79     };
80     users.groups.errbot = {};
82     systemd.services = lib.mapAttrs' (name: instanceCfg: lib.nameValuePair "errbot-${name}" (
83     let
84       dataDir = if instanceCfg.dataDir != null then instanceCfg.dataDir else
85         "/var/lib/errbot/${name}";
86     in {
87       after = [ "network-online.target" ];
88       wantedBy = [ "multi-user.target" ];
89       preStart = ''
90         mkdir -p ${dataDir}
91         chown -R errbot:errbot ${dataDir}
92       '';
93       serviceConfig = {
94         User = "errbot";
95         Restart = "on-failure";
96         ExecStart = "${pkgs.errbot}/bin/errbot -c ${mkConfigDir instanceCfg dataDir}/config.py";
97         PermissionsStartOnly = true;
98       };
99     })) cfg.instances;
100   };