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")
 | |
|     '';
 | |
|   }
 | |
| )
 | 
