python3Packages.orjson: Disable failing tests on 32 bit
[NixPkgs.git] / nixos / modules / services / networking / ejabberd.nix
blob3feafc3bb3bd18045553efa6ab3854c755d68045
1 { config, lib, pkgs, ... }:
3 with lib;
5 let
7   cfg = config.services.ejabberd;
9   ctlcfg = pkgs.writeText "ejabberdctl.cfg" ''
10     ERL_EPMD_ADDRESS=127.0.0.1
11     ${cfg.ctlConfig}
12   '';
14   ectl = ''${cfg.package}/bin/ejabberdctl ${optionalString (cfg.configFile != null) "--config ${cfg.configFile}"} --ctl-config "${ctlcfg}" --spool "${cfg.spoolDir}" --logs "${cfg.logsDir}"'';
16   dumps = lib.escapeShellArgs cfg.loadDumps;
18 in {
20   ###### interface
22   options = {
24     services.ejabberd = {
26       enable = mkOption {
27         type = types.bool;
28         default = false;
29         description = lib.mdDoc "Whether to enable ejabberd server";
30       };
32       package = mkOption {
33         type = types.package;
34         default = pkgs.ejabberd;
35         defaultText = literalExpression "pkgs.ejabberd";
36         description = lib.mdDoc "ejabberd server package to use";
37       };
39       user = mkOption {
40         type = types.str;
41         default = "ejabberd";
42         description = lib.mdDoc "User under which ejabberd is ran";
43       };
45       group = mkOption {
46         type = types.str;
47         default = "ejabberd";
48         description = lib.mdDoc "Group under which ejabberd is ran";
49       };
51       spoolDir = mkOption {
52         type = types.path;
53         default = "/var/lib/ejabberd";
54         description = lib.mdDoc "Location of the spooldir of ejabberd";
55       };
57       logsDir = mkOption {
58         type = types.path;
59         default = "/var/log/ejabberd";
60         description = lib.mdDoc "Location of the logfile directory of ejabberd";
61       };
63       configFile = mkOption {
64         type = types.nullOr types.path;
65         description = lib.mdDoc "Configuration file for ejabberd in YAML format";
66         default = null;
67       };
69       ctlConfig = mkOption {
70         type = types.lines;
71         default = "";
72         description = lib.mdDoc "Configuration of ejabberdctl";
73       };
75       loadDumps = mkOption {
76         type = types.listOf types.path;
77         default = [];
78         description = lib.mdDoc "Configuration dumps that should be loaded on the first startup";
79         example = literalExpression "[ ./myejabberd.dump ]";
80       };
82       imagemagick = mkOption {
83         type = types.bool;
84         default = false;
85         description = lib.mdDoc "Add ImageMagick to server's path; allows for image thumbnailing";
86       };
87     };
89   };
92   ###### implementation
94   config = mkIf cfg.enable {
95     environment.systemPackages = [ cfg.package ];
97     users.users = optionalAttrs (cfg.user == "ejabberd") {
98       ejabberd = {
99         group = cfg.group;
100         home = cfg.spoolDir;
101         createHome = true;
102         uid = config.ids.uids.ejabberd;
103       };
104     };
106     users.groups = optionalAttrs (cfg.group == "ejabberd") {
107       ejabberd.gid = config.ids.gids.ejabberd;
108     };
110     systemd.services.ejabberd = {
111       description = "ejabberd server";
112       wantedBy = [ "multi-user.target" ];
113       after = [ "network.target" ];
114       path = [ pkgs.findutils pkgs.coreutils ] ++ lib.optional cfg.imagemagick pkgs.imagemagick;
116       serviceConfig = {
117         User = cfg.user;
118         Group = cfg.group;
119         ExecStart = "${ectl} foreground";
120         ExecStop = "${ectl} stop";
121         ExecReload = "${ectl} reload_config";
122       };
124       preStart = ''
125         if [ -z "$(ls -A '${cfg.spoolDir}')" ]; then
126           touch "${cfg.spoolDir}/.firstRun"
127         fi
128       '';
130       postStart = ''
131         while ! ${ectl} status >/dev/null 2>&1; do
132           if ! kill -0 "$MAINPID"; then exit 1; fi
133           sleep 0.1
134         done
136         if [ -e "${cfg.spoolDir}/.firstRun" ]; then
137           rm "${cfg.spoolDir}/.firstRun"
138           for src in ${dumps}; do
139             find "$src" -type f | while read dump; do
140               echo "Loading configuration dump at $dump"
141               ${ectl} load "$dump"
142             done
143           done
144         fi
145       '';
146     };
148     systemd.tmpfiles.rules = [
149       "d '${cfg.logsDir}' 0750 ${cfg.user} ${cfg.group} -"
150       "d '${cfg.spoolDir}' 0700 ${cfg.user} ${cfg.group} -"
151     ];
153     security.pam.services.ejabberd = {};
155   };