102 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| { config, lib, pkgs, ... }:
 | |
| 
 | |
| with lib;
 | |
| 
 | |
| let
 | |
|   cfg = config.services.errbot;
 | |
|   pluginEnv = plugins: pkgs.buildEnv {
 | |
|     name = "errbot-plugins";
 | |
|     paths = plugins;
 | |
|   };
 | |
|   mkConfigDir = instanceCfg: dataDir: pkgs.writeTextDir "config.py" ''
 | |
|     import logging
 | |
|     BACKEND = '${instanceCfg.backend}'
 | |
|     BOT_DATA_DIR = '${dataDir}'
 | |
|     BOT_EXTRA_PLUGIN_DIR = '${pluginEnv instanceCfg.plugins}'
 | |
| 
 | |
|     BOT_LOG_LEVEL = logging.${instanceCfg.logLevel}
 | |
|     BOT_LOG_FILE = False
 | |
| 
 | |
|     BOT_ADMINS = (${concatMapStringsSep "," (name: "'${name}'") instanceCfg.admins})
 | |
| 
 | |
|     BOT_IDENTITY = ${builtins.toJSON instanceCfg.identity}
 | |
| 
 | |
|     ${instanceCfg.extraConfig}
 | |
|   '';
 | |
| in {
 | |
|   options = {
 | |
|     services.errbot.instances = mkOption {
 | |
|       default = {};
 | |
|       description = "Errbot instance configs";
 | |
|       type = types.attrsOf (types.submodule {
 | |
|         options = {
 | |
|           dataDir = mkOption {
 | |
|             type = types.nullOr types.path;
 | |
|             default = null;
 | |
|             description = "Data directory for errbot instance.";
 | |
|           };
 | |
| 
 | |
|           plugins = mkOption {
 | |
|             type = types.listOf types.package;
 | |
|             default = [];
 | |
|             description = "List of errbot plugin derivations.";
 | |
|           };
 | |
| 
 | |
|           logLevel = mkOption {
 | |
|             type = types.str;
 | |
|             default = "INFO";
 | |
|             description = "Errbot log level";
 | |
|           };
 | |
| 
 | |
|           admins = mkOption {
 | |
|             type = types.listOf types.str;
 | |
|             default = [];
 | |
|             description = "List of identifiers of errbot admins.";
 | |
|           };
 | |
| 
 | |
|           backend = mkOption {
 | |
|             type = types.str;
 | |
|             default = "XMPP";
 | |
|             description = "Errbot backend name.";
 | |
|           };
 | |
| 
 | |
|           identity = mkOption {
 | |
|             type = types.attrs;
 | |
|             description = "Errbot identity configuration";
 | |
|           };
 | |
| 
 | |
|           extraConfig = mkOption {
 | |
|             type = types.lines;
 | |
|             default = "";
 | |
|             description = "String to be appended to the config verbatim";
 | |
|           };
 | |
|         };
 | |
|       });
 | |
|     };
 | |
|   };
 | |
| 
 | |
|   config = mkIf (cfg.instances != {}) {
 | |
|     users.users.errbot.group = "errbot";
 | |
|     users.groups.errbot = {};
 | |
| 
 | |
|     systemd.services = mapAttrs' (name: instanceCfg: nameValuePair "errbot-${name}" (
 | |
|     let
 | |
|       dataDir = if instanceCfg.dataDir != null then instanceCfg.dataDir else
 | |
|         "/var/lib/errbot/${name}";
 | |
|     in {
 | |
|       after = [ "network-online.target" ];
 | |
|       wantedBy = [ "multi-user.target" ];
 | |
|       preStart = ''
 | |
|         mkdir -p ${dataDir}
 | |
|         chown -R errbot:errbot ${dataDir}
 | |
|       '';
 | |
|       serviceConfig = {
 | |
|         User = "errbot";
 | |
|         Restart = "on-failure";
 | |
|         ExecStart = "${pkgs.errbot}/bin/errbot -c ${mkConfigDir instanceCfg dataDir}/config.py";
 | |
|         PermissionsStartOnly = true;
 | |
|       };
 | |
|     })) cfg.instances;
 | |
|   };
 | |
| }
 | 
