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