117 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
		
		
			
		
	
	
			117 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Nix
		
	
	
	
	
	
| 
								 | 
							
								import ./make-test-python.nix (
							 | 
						||
| 
								 | 
							
								  { pkgs, ... }: {
							 | 
						||
| 
								 | 
							
								    name = "nagios";
							 | 
						||
| 
								 | 
							
								    meta = with pkgs.stdenv.lib.maintainers; {
							 | 
						||
| 
								 | 
							
								      maintainers = [ symphorien ];
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    machine = { lib, ... }: let
							 | 
						||
| 
								 | 
							
								      writer = pkgs.writeShellScript "write" ''
							 | 
						||
| 
								 | 
							
								        set -x
							 | 
						||
| 
								 | 
							
								        echo "$@"  >> /tmp/notifications
							 | 
						||
| 
								 | 
							
								      '';
							 | 
						||
| 
								 | 
							
								    in
							 | 
						||
| 
								 | 
							
								      {
							 | 
						||
| 
								 | 
							
								        # tested service
							 | 
						||
| 
								 | 
							
								        services.sshd.enable = true;
							 | 
						||
| 
								 | 
							
								        # nagios
							 | 
						||
| 
								 | 
							
								        services.nagios = {
							 | 
						||
| 
								 | 
							
								          enable = true;
							 | 
						||
| 
								 | 
							
								          # make state transitions faster
							 | 
						||
| 
								 | 
							
								          extraConfig.interval_length = "5";
							 | 
						||
| 
								 | 
							
								          objectDefs =
							 | 
						||
| 
								 | 
							
								            (map (x: "${pkgs.nagios}/etc/objects/${x}.cfg") [ "templates" "timeperiods" "commands" ]) ++ [
							 | 
						||
| 
								 | 
							
								              (
							 | 
						||
| 
								 | 
							
								                pkgs.writeText "objects.cfg" ''
							 | 
						||
| 
								 | 
							
								                  # notifications are written to /tmp/notifications
							 | 
						||
| 
								 | 
							
								                  define command {
							 | 
						||
| 
								 | 
							
								                  command_name notify-host-by-file
							 | 
						||
| 
								 | 
							
								                  command_line ${writer} "$HOSTNAME is $HOSTSTATE$"
							 | 
						||
| 
								 | 
							
								                  }
							 | 
						||
| 
								 | 
							
								                  define command {
							 | 
						||
| 
								 | 
							
								                  command_name notify-service-by-file
							 | 
						||
| 
								 | 
							
								                  command_line ${writer} "$SERVICEDESC$ is $SERVICESTATE$"
							 | 
						||
| 
								 | 
							
								                  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                  # nagios boilerplate
							 | 
						||
| 
								 | 
							
								                  define contact {
							 | 
						||
| 
								 | 
							
								                  contact_name                    alice
							 | 
						||
| 
								 | 
							
								                  alias                           alice
							 | 
						||
| 
								 | 
							
								                  host_notifications_enabled      1
							 | 
						||
| 
								 | 
							
								                  service_notifications_enabled   1
							 | 
						||
| 
								 | 
							
								                  service_notification_period     24x7
							 | 
						||
| 
								 | 
							
								                  host_notification_period        24x7
							 | 
						||
| 
								 | 
							
								                  service_notification_options    w,u,c,r,f,s
							 | 
						||
| 
								 | 
							
								                  host_notification_options       d,u,r,f,s
							 | 
						||
| 
								 | 
							
								                  service_notification_commands   notify-service-by-file
							 | 
						||
| 
								 | 
							
								                  host_notification_commands      notify-host-by-file
							 | 
						||
| 
								 | 
							
								                  email                           foo@example.com
							 | 
						||
| 
								 | 
							
								                  }
							 | 
						||
| 
								 | 
							
								                  define contactgroup {
							 | 
						||
| 
								 | 
							
								                  contactgroup_name   admins
							 | 
						||
| 
								 | 
							
								                  alias               Admins
							 | 
						||
| 
								 | 
							
								                  members alice
							 | 
						||
| 
								 | 
							
								                  }
							 | 
						||
| 
								 | 
							
								                  define hostgroup{
							 | 
						||
| 
								 | 
							
								                  hostgroup_name  allhosts
							 | 
						||
| 
								 | 
							
								                  alias  All hosts
							 | 
						||
| 
								 | 
							
								                  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                  # monitored objects
							 | 
						||
| 
								 | 
							
								                  define host {
							 | 
						||
| 
								 | 
							
								                  use         generic-host
							 | 
						||
| 
								 | 
							
								                  host_name   localhost
							 | 
						||
| 
								 | 
							
								                  alias       localhost
							 | 
						||
| 
								 | 
							
								                  address     localhost
							 | 
						||
| 
								 | 
							
								                  hostgroups  allhosts
							 | 
						||
| 
								 | 
							
								                  contact_groups admins
							 | 
						||
| 
								 | 
							
								                  # make state transitions faster.
							 | 
						||
| 
								 | 
							
								                  max_check_attempts 2
							 | 
						||
| 
								 | 
							
								                  check_interval 1
							 | 
						||
| 
								 | 
							
								                  retry_interval 1
							 | 
						||
| 
								 | 
							
								                  }
							 | 
						||
| 
								 | 
							
								                  define service {
							 | 
						||
| 
								 | 
							
								                  use                 generic-service
							 | 
						||
| 
								 | 
							
								                  host_name           localhost
							 | 
						||
| 
								 | 
							
								                  service_description ssh
							 | 
						||
| 
								 | 
							
								                  check_command       check_ssh
							 | 
						||
| 
								 | 
							
								                  # make state transitions faster.
							 | 
						||
| 
								 | 
							
								                  max_check_attempts 2
							 | 
						||
| 
								 | 
							
								                  check_interval 1
							 | 
						||
| 
								 | 
							
								                  retry_interval 1
							 | 
						||
| 
								 | 
							
								                  }
							 | 
						||
| 
								 | 
							
								                ''
							 | 
						||
| 
								 | 
							
								              )
							 | 
						||
| 
								 | 
							
								            ];
							 | 
						||
| 
								 | 
							
								        };
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    testScript = { ... }: ''
							 | 
						||
| 
								 | 
							
								      with subtest("ensure sshd starts"):
							 | 
						||
| 
								 | 
							
								          machine.wait_for_unit("sshd.service")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      with subtest("ensure nagios starts"):
							 | 
						||
| 
								 | 
							
								          machine.wait_for_file("/var/log/nagios/current")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      def assert_notify(text):
							 | 
						||
| 
								 | 
							
								          machine.wait_for_file("/tmp/notifications")
							 | 
						||
| 
								 | 
							
								          real = machine.succeed("cat /tmp/notifications").strip()
							 | 
						||
| 
								 | 
							
								          print(f"got {real!r}, expected {text!r}")
							 | 
						||
| 
								 | 
							
								          assert text == real
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      with subtest("ensure we get a notification when sshd is down"):
							 | 
						||
| 
								 | 
							
								          machine.succeed("systemctl stop sshd")
							 | 
						||
| 
								 | 
							
								          assert_notify("ssh is CRITICAL")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      with subtest("ensure tests can succeed"):
							 | 
						||
| 
								 | 
							
								          machine.succeed("systemctl start sshd")
							 | 
						||
| 
								 | 
							
								          machine.succeed("rm /tmp/notifications")
							 | 
						||
| 
								 | 
							
								          assert_notify("ssh is OK")
							 | 
						||
| 
								 | 
							
								    '';
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								)
							 |