2016-10-20 20:54:38 +02:00
|
|
|
{ config, lib, pkgs, ... }@args: with import <stockholm/lib>; let
|
2017-07-22 19:18:02 +02:00
|
|
|
|
2016-02-21 06:05:49 +01:00
|
|
|
cfg = config.tv.ejabberd;
|
2017-07-22 19:18:02 +02:00
|
|
|
|
|
|
|
gen-dhparam = pkgs.writeDash "gen-dhparam" ''
|
|
|
|
set -efu
|
|
|
|
path=$1
|
|
|
|
bits=2048
|
|
|
|
# TODO regenerate dhfile after some time?
|
|
|
|
if ! test -e "$path"; then
|
|
|
|
${pkgs.openssl}/bin/openssl dhparam "$bits" > "$path"
|
|
|
|
fi
|
|
|
|
'';
|
|
|
|
|
2016-02-21 06:05:49 +01:00
|
|
|
in {
|
|
|
|
options.tv.ejabberd = {
|
|
|
|
enable = mkEnableOption "tv.ejabberd";
|
|
|
|
certfile = mkOption {
|
2021-12-25 11:41:20 +01:00
|
|
|
type = types.absolute-pathname;
|
|
|
|
default = toString <secrets> + "/ejabberd.pem";
|
2017-07-22 19:18:02 +02:00
|
|
|
};
|
2016-02-21 06:05:49 +01:00
|
|
|
hosts = mkOption {
|
|
|
|
type = with types; listOf str;
|
|
|
|
};
|
2017-10-03 23:57:33 +02:00
|
|
|
pkgs.ejabberd = mkOption {
|
2016-02-21 06:05:49 +01:00
|
|
|
type = types.package;
|
2017-10-03 23:57:33 +02:00
|
|
|
default = pkgs.symlinkJoin {
|
|
|
|
name = "ejabberd-wrapper";
|
|
|
|
paths = [
|
|
|
|
(pkgs.writeDashBin "ejabberdctl" ''
|
|
|
|
exec ${pkgs.ejabberd}/bin/ejabberdctl \
|
|
|
|
--config ${toFile "ejabberd.yaml" (import ./config.nix {
|
|
|
|
inherit pkgs;
|
|
|
|
config = cfg;
|
|
|
|
})} \
|
2022-08-22 14:58:40 +02:00
|
|
|
--ctl-config ${toFile "ejabberdctl.cfg" /* sh */ ''
|
|
|
|
ERL_OPTIONS='-setcookie ${cfg.stateDir}/.erlang.cookie'
|
|
|
|
''} \
|
|
|
|
--logs ${cfg.stateDir} \
|
|
|
|
--spool ${cfg.stateDir} \
|
2017-10-03 23:57:33 +02:00
|
|
|
"$@"
|
|
|
|
'')
|
|
|
|
pkgs.ejabberd
|
|
|
|
];
|
|
|
|
};
|
2016-02-21 06:05:49 +01:00
|
|
|
};
|
2017-07-22 19:18:02 +02:00
|
|
|
registration_watchers = mkOption {
|
|
|
|
type = types.listOf types.str;
|
|
|
|
default = [
|
|
|
|
config.krebs.users.tv.mail
|
|
|
|
];
|
|
|
|
};
|
2022-08-22 14:58:40 +02:00
|
|
|
stateDir = mkOption {
|
|
|
|
type = types.absolute-pathname;
|
|
|
|
default = "/var/lib/ejabberd";
|
|
|
|
readOnly = true;
|
2016-02-21 06:05:49 +01:00
|
|
|
};
|
|
|
|
};
|
|
|
|
config = lib.mkIf cfg.enable {
|
2017-10-03 23:58:25 +02:00
|
|
|
environment.systemPackages = [
|
|
|
|
(pkgs.symlinkJoin {
|
|
|
|
name = "ejabberd-sudo-wrapper";
|
|
|
|
paths = [
|
|
|
|
(pkgs.writeDashBin "ejabberdctl" ''
|
2022-08-22 14:58:40 +02:00
|
|
|
exec ${pkgs.systemd}/bin/systemd-run \
|
|
|
|
--unit=ejabberdctl \
|
|
|
|
--property=StateDirectory=ejabberd \
|
|
|
|
--property=User=ejabberd \
|
|
|
|
--collect \
|
|
|
|
--pipe \
|
|
|
|
--quiet \
|
2017-10-03 23:58:25 +02:00
|
|
|
${cfg.pkgs.ejabberd}/bin/ejabberdctl "$@"
|
|
|
|
'')
|
|
|
|
cfg.pkgs.ejabberd
|
|
|
|
];
|
|
|
|
})
|
|
|
|
];
|
2016-02-21 06:05:49 +01:00
|
|
|
|
2021-12-25 11:41:20 +01:00
|
|
|
krebs.systemd.services.ejabberd = {};
|
2016-02-21 06:05:49 +01:00
|
|
|
|
|
|
|
systemd.services.ejabberd = {
|
|
|
|
wantedBy = [ "multi-user.target" ];
|
2021-12-25 11:41:20 +01:00
|
|
|
after = [ "network.target" ];
|
2016-02-21 06:05:49 +01:00
|
|
|
serviceConfig = {
|
2022-08-22 17:09:53 +02:00
|
|
|
ExecStartPre = [
|
|
|
|
"${pkgs.coreutils}/bin/ln -s \${CREDENTIALS_DIRECTORY} /tmp/credentials"
|
|
|
|
"${gen-dhparam} ${cfg.stateDir}/dhfile"
|
|
|
|
];
|
|
|
|
ExecStart = "${cfg.pkgs.ejabberd}/bin/ejabberdctl foreground";
|
|
|
|
ExecStop = [
|
|
|
|
"${cfg.pkgs.ejabberd}/bin/ejabberdctl stop"
|
|
|
|
"${cfg.pkgs.ejabberd}/bin/ejabberdctl stopped"
|
|
|
|
];
|
|
|
|
ExecReload = "${cfg.pkgs.ejabberd}/bin/ejabberdctl reload_config";
|
2021-12-25 11:41:20 +01:00
|
|
|
LoadCredential = [
|
|
|
|
"certfile:${cfg.certfile}"
|
|
|
|
];
|
2022-08-22 17:09:53 +02:00
|
|
|
LimitNOFILE = 65536;
|
|
|
|
PrivateDevices = true;
|
2021-12-25 11:41:20 +01:00
|
|
|
PrivateTmp = true;
|
2016-02-21 06:05:49 +01:00
|
|
|
SyslogIdentifier = "ejabberd";
|
2021-12-25 11:41:20 +01:00
|
|
|
StateDirectory = "ejabberd";
|
2022-08-22 14:58:40 +02:00
|
|
|
User = "ejabberd";
|
|
|
|
DynamicUser = true;
|
2022-08-22 17:09:53 +02:00
|
|
|
TimeoutSec = 60;
|
|
|
|
RestartSec = 5;
|
|
|
|
Restart = "on-failure";
|
|
|
|
Type = "notify";
|
|
|
|
NotifyAccess = "all";
|
|
|
|
WatchdogSec = 30;
|
2016-02-21 06:05:49 +01:00
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
}
|