123 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
# Zabbix agent daemon.
 | 
						|
{ config, pkgs, ... }:
 | 
						|
 | 
						|
with pkgs.lib;
 | 
						|
 | 
						|
let
 | 
						|
 | 
						|
  cfg = config.services.zabbixAgent;
 | 
						|
 | 
						|
  stateDir = "/var/run/zabbix";
 | 
						|
 | 
						|
  logDir = "/var/log/zabbix";
 | 
						|
 | 
						|
  pidFile = "${stateDir}/zabbix_agentd.pid";
 | 
						|
 | 
						|
  configFile = pkgs.writeText "zabbix_agentd.conf"
 | 
						|
    ''
 | 
						|
      Server = ${cfg.server}
 | 
						|
 | 
						|
      LogFile = ${logDir}/zabbix_agentd
 | 
						|
 | 
						|
      PidFile = ${pidFile}
 | 
						|
 | 
						|
      StartAgents = 1
 | 
						|
 | 
						|
      ${config.services.zabbixAgent.extraConfig}
 | 
						|
    '';
 | 
						|
 | 
						|
in
 | 
						|
 | 
						|
{
 | 
						|
 | 
						|
  ###### interface
 | 
						|
 | 
						|
  options = {
 | 
						|
 | 
						|
    services.zabbixAgent = {
 | 
						|
 | 
						|
      enable = mkOption {
 | 
						|
        default = false;
 | 
						|
        description = ''
 | 
						|
          Whether to run the Zabbix monitoring agent on this machine.
 | 
						|
          It will send monitoring data to a Zabbix server.
 | 
						|
        '';
 | 
						|
      };
 | 
						|
 | 
						|
      server = mkOption {
 | 
						|
        default = "127.0.0.1";
 | 
						|
        description = ''
 | 
						|
          The IP address or hostname of the Zabbix server to connect to.
 | 
						|
        '';
 | 
						|
      };
 | 
						|
 | 
						|
      extraConfig = mkOption {
 | 
						|
        default = "";
 | 
						|
        description = ''
 | 
						|
          Configuration that is injected verbatim into the configuration file.
 | 
						|
        '';
 | 
						|
      };
 | 
						|
 | 
						|
    };
 | 
						|
 | 
						|
  };
 | 
						|
 | 
						|
 | 
						|
  ###### implementation
 | 
						|
 | 
						|
  config = mkIf cfg.enable {
 | 
						|
 | 
						|
    users.extraUsers = singleton
 | 
						|
      { name = "zabbix";
 | 
						|
        uid = config.ids.uids.zabbix;
 | 
						|
        description = "Zabbix daemon user";
 | 
						|
      };
 | 
						|
 | 
						|
    jobs.zabbix_agent =
 | 
						|
      { name = "zabbix-agent";
 | 
						|
 | 
						|
        description = "Zabbix agent daemon";
 | 
						|
 | 
						|
        startOn = "ip-up";
 | 
						|
        stopOn = "stopping network-interfaces";
 | 
						|
 | 
						|
        path = [ pkgs.zabbix.agent ];
 | 
						|
 | 
						|
        preStart =
 | 
						|
          ''
 | 
						|
            mkdir -m 0755 -p ${stateDir} ${logDir}
 | 
						|
            chown zabbix ${stateDir} ${logDir}
 | 
						|
          '';
 | 
						|
 | 
						|
        # Zabbix doesn't have an option not to daemonize, and doesn't
 | 
						|
        # daemonize in a way that allows Upstart to track it.  So to
 | 
						|
        # make sure that we notice when it goes down, we start Zabbix
 | 
						|
        # with an open connection to a fifo, with a `cat' on the other
 | 
						|
        # side.  If Zabbix dies, then `cat' will exit as well, so we
 | 
						|
        # just monitor `cat'.
 | 
						|
        script =
 | 
						|
          ''
 | 
						|
            export PATH=${pkgs.nettools}/bin:$PATH
 | 
						|
            rm -f ${stateDir}/dummy2
 | 
						|
            mkfifo ${stateDir}/dummy2
 | 
						|
            cat ${stateDir}/dummy2 &
 | 
						|
            pid=$!
 | 
						|
            zabbix_agentd --config ${configFile} 100>${stateDir}/dummy2
 | 
						|
            wait "$pid"
 | 
						|
          '';
 | 
						|
 | 
						|
        postStop =
 | 
						|
          ''
 | 
						|
            pid=$(cat ${pidFile} 2> /dev/null || true)
 | 
						|
            (test -n "$pid" && kill "$pid") || true
 | 
						|
            # Wait until they're really gone.
 | 
						|
            while ${pkgs.procps}/bin/pgrep -u zabbix zabbix_agentd > /dev/null; do sleep 1; done
 | 
						|
          '';
 | 
						|
      };
 | 
						|
 | 
						|
    environment.systemPackages = [ pkgs.zabbix.agent ];
 | 
						|
 | 
						|
  };
 | 
						|
 | 
						|
}
 |