summary refs log blame commit diff
path: root/modules/services/networking/ejabberd.nix
blob: b1f485cf1c8ab3e1dfdb0fd10f6680b9af873e38 (plain) (tree)






































                                                                                                                                     




                               
  
















                                          
      









                                                                   
                                                                                                                                                                                                     

                  
                                                                                                                                                                                                                                             






                                                  
 
{pkgs, config, ...}:

###### interface
let
  inherit (pkgs.lib) mkOption mkIf;

  options = {
    services = {
      ejabberd = {
        enable = mkOption {
          default = false;
          description = "Whether to enable ejabberd server";
        };
              
        spoolDir = mkOption {
          default = "/var/lib/ejabberd";
          description = "Location of the spooldir of ejabberd";
        };
        
        logsDir = mkOption {
          default = "/var/log/ejabberd";
          description = "Location of the logfile directory of ejabberd";
        };
        
        confDir = mkOption {
          default = "/var/ejabberd";
          description = "Location of the config directory of ejabberd";
        };
        
        virtualHosts = mkOption {
          default = "\"localhost\"";
          description = "Virtualhosts that ejabberd should host. Hostnames are surrounded with doublequotes and separated by commas";
        };
      };
    };
  };
in

###### implementation

let

cfg = config.services.ejabberd;

in

mkIf config.services.ejabberd.enable {

  require = [
    options
  ];


  services = {
    extraJobs = [{
      name = "ejabberd";
          
      job = ''
        description "EJabberd server"

        start on network-interface/started
        stop on network-interfaces/stop
      
        start script
              # Initialise state data
              mkdir -p ${cfg.logsDir}
              
              if ! test -d ${cfg.spoolDir}
              then
                  cp -av ${pkgs.ejabberd}/var/lib/ejabberd /var/lib
              fi
              
              mkdir -p ${cfg.confDir}
              test -f ${cfg.confDir}/ejabberd.cfg || sed -e 's|{hosts, \["localhost"\]}.|{hosts, \[${cfg.virtualHosts}\]}.|' ${pkgs.ejabberd}/etc/ejabberd/ejabberd.cfg > ${cfg.confDir}/ejabberd.cfg
        end script
        
        respawn ${pkgs.bash}/bin/sh -c 'export PATH=$PATH:${pkgs.ejabberd}/sbin:${pkgs.coreutils}/bin:${pkgs.bash}/bin; cd ~; ejabberdctl --logs ${cfg.logsDir} --spool ${cfg.spoolDir} --config ${cfg.confDir}/ejabberd.cfg start; sleep 1d'
        
        stop script
            ${pkgs.ejabberd}/sbin/ejabberdctl stop
        end script
      '';
    }];
  };
}