Having monitoring for dualstack connectivity in place helps a lot. Unfortunately in most cases we are running also services we want to offer dualstacked. In the past we just monitored in those cases IPv4 only or created a separate check for the same service on IPv6. This is a bit messy and I was looking for something to check services via IPv4 and IPv6. Digging my most boring search engine doesn’t help much here. So I was talking with some people more involved into the core Icinga/Nagios stuff. Seems there is actually the best solution to use check_multi.

As we have the command definition for “check_multi_icinga” already in place, I created a check_smtp_dualstack.cmd for monitoring a dualstacked SMTP service

command[ IPv4 ]         = check_smtp -4 -H "$HOSTADDRESS$"
command[ IPv6 ]         = check_smtp -6 -H "$HOSTADDRESS6$"
state   [ CRITICAL   ] = COUNT(CRITICAL) > 1
state   [ WARNING    ] = COUNT(WARNING) > 0 || COUNT(CRITICAL) > 0
state   [ UNKNOWN    ] = COUNT(UNKNOWN) > 1

A simple SMTP service definition does the trick (don’t forget ‘address6’ in host definition)

define service{
    use                             generic-service         ; Name of service template to use
    host_name                       localhost
    service_description             SMTP
    check_command                   check_multi_icinga!'check_smtp_dualstack.cmd'!'-r 1+2+4+8'
}

Okay .. that looks nice, but only at the first view. Imagining what we are actually running as service checks, it seems we just need for every unique service check a new cmd-file for check_multi as I didn’t found a way to generalize the whole stuff yet.

Does anybody know a way to  pass commands for check_multi via service definitions? Something like:

define service{
[...]
    check_command                   check_multi_icinga!'check_general_dualstack.cmd'!'check_smtp -p 666'!'-r 1+2+4+8'
[...]
}