[Nix-dev] Ejabberd Options

stewart mackenzie setori88 at gmail.com
Mon Dec 15 12:28:33 CET 2014


So with the kind help of this list and on IRC, a private instance of
ejabberd can compile over our hydra. Now I need to get these options
into the same build as per
https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/services/networking/ejabberd.nix

Questions:
* Would it be better to override ejabberd?
* Or just add the below package with options to nixpkgs via function
arguments available in nixpkgs?

Goal: create a series of testing servers which run NixOS and their
nix-channels are subscribed to our hydra instance. A container will
pull down a developers testing branch of ejabberd, compile then (maybe
using nixops) deploy it to a container. Android and iOS apps will
automatically be built configured to point to each container instances
of ejabberd.

In the configuration.nix file of each testing container
chaatz-ejabberd will be configured, much as one would configure
ejabberd via configuration.nix.

I greatly appreciate your advice.

High level advice would be greatly appreciated.

This is what I've got so far (with the RPM buird removed for
succinctness reasons). It compiles but as I'm sure some of you would
see the options don't work.

release.nix

let
  pkgs = import <nixpkgs> {};
  cfg = pkgs.config.services.chaatz-ejabberd;

  options = {
    services.chaatz-ejabberd = {
      enable = pkgs.lib.mkOption {
        default = false;
        description = "Whether to enable ejabberd server";
      };
      spoolDir = pkgs.lib.mkOption {
        default = "/var/lib/ejabberd";
        description = "Location of the spooldir of ejabberd";
      };
      logsDir = pkgs.lib.mkOption {
        default = "/var/log/ejabberd";
        description = "Location of the logfile directory of ejabberd";
      };
      confDir = pkgs.lib.mkOption {
        default = "/var/ejabberd";
        description = "Location of the config directory of ejabberd";
      };
      virtualHosts = pkgs.lib.mkOption {
        default = "\"localhost\"";
        description = "Virtualhosts that ejabberd should host.
Hostnames are surrounded with doublequotes and separated by commas";
      };
      loadDumps = pkgs.lib.mkOption {
        default = [];
        description = "Configuration dump that should be loaded on the
first startup";
        example = pkgs.literalExample "[ ./myejabberd.dump ]";
      };
    };
  };

  jobs = rec {

    config = pkgs.lib.mkIf cfg.enable {
      environment.systemPackages = [ pkgs.chaatz-ejabberd ];
      jobs.chaatz-ejabberd =
        { description = "Chaatz ejabberd server";
          startOn = "started network-interfaces";
          stopOn = "stopping network-interfaces";
          environment = {
            PATH =
"$PATH:${pkgs.chaatz-ejabberd}/sbin:${pkgs.chaatz-ejabberd}/bin:${pkgs.coreutils}/bin:${pkgs.bash}/bin:${pkgs.gnused}/bin";
          };
          preStart =
            ''
              PATH="$PATH:${pkgs.chaatz-ejabberd}/sbin:${pkgs.chaatz-ejabberd}/bin:${pkgs.coreutils}/bin:${pkgs.bash}/bin:${pkgs.gnused}/bin";
              # Initialise state data
              mkdir -p ${cfg.logsDir}
              if ! test -d ${cfg.spoolDir}
              then
                initialize=1
            cp -av ${pkgs.chaatz-ejabberd}/var/lib/ejabberd /var/lib
              fi

              if ! test -d ${cfg.confDir}
              then
                mkdir -p ${cfg.confDir}
            cp ${pkgs.chaatz-ejabberd}/etc/ejabberd/* ${cfg.confDir}
            sed -e 's|{hosts, \["localhost"\]}.|{hosts,
\[${cfg.virtualHosts}\]}.|'
${pkgs.chaatz-ejabberd}/etc/ejabberd/ejabberd.cfg >
${cfg.confDir}/ejabberd.cfg
              fi
              ejabberdctl --config-dir ${cfg.confDir} --logs
${cfg.logsDir} --spool ${cfg.spoolDir} start
              ${if cfg.loadDumps == [] then "" else
                ''
                  if [ "$initialize" = "1" ]
              then
                # Wait until the ejabberd server is available for use
                count=0
                while ! ejabberdctl --config-dir ${cfg.confDir} --logs
${cfg.logsDir} --spool ${cfg.spoolDir} status
                do
                  if [ $count -eq 30 ]
                  then
                    echo "Tried 30 times, giving up..."
                    exit 1
                      fi

                  echo "Ejabberd daemon not yet started. Waiting for 1
second..."
                  count=$((count++))
                  sleep 1
                    done
                ${pkgs.concatMapStrings (dump:
                  ''
                    echo "Importing dump: ${dump}"
                    if [ -f ${dump} ]
                    then
                      ejabberdctl --config-dir ${cfg.confDir} --logs
${cfg.logsDir} --spool ${cfg.spoolDir} load ${dump}
                    elif [ -d ${dump} ]
                    then
                      for i in ${dump}/ejabberd-dump/*
                      do
                        ejabberdctl --config-dir ${cfg.confDir} --logs
${cfg.logsDir} --spool ${cfg.spoolDir} load $i
                          done
                    fi
                      '') cfg.loadDumps}
                  fi
                ''}
            '';
          postStop =
            ''
              ejabberdctl --config-dir ${cfg.confDir} --logs
${cfg.logsDir} --spool ${cfg.spoolDir} stop
            '';
        };
        security.pam.services.chaatz-ejabberd = {};
    };

    chaatz-ejabberd = pkgs.stdenv.mkDerivation rec {
          name = "chaatz-ejabberd";
          src = <chaatz-ejabberd>;
          buildInputs = ( with pkgs; [
              expat erlang zlib openssl pam automake
              autoconf git libyaml openssh libcouchbase
             ]);
          preConfigure = "./autogen.sh";
      };
};
in
  jobs


More information about the nix-dev mailing list