parent
be25e45fc8
commit
cb38bf33e7
@ -0,0 +1,116 @@ |
||||
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") |
||||
''; |
||||
} |
||||
) |
Loading…
Reference in new issue