Жалкая пародия на межсетевой экран в Microsoft Windows по умолчанию запрещает ICMP-ответы. Это осложняет мониторинг ансамбля хостов, используя nagios. В то же время утилита arping позволяет точно определить наличие в сети хоста с заданным IP-адресом. По умолчанию в nagios есть только скрипт cheсk_ping, который используется для проверки сервиса.

Поиск в Google говорит о наличии плагина check_arping для Linux, однако под FreeBSD собрать нужные для него хитрые модули perl, не получается. А ведь по сути достаточно иметь просто скрипт, запускающий поставленную из портов утилиту arping, и согласовывающий его с nagios.  Собственно, в этой заметке, я предлагаю такой способ.

Прежде всего меняем в описании сервиса в конфиге nagios:

define service{
use ping-service
host_name  somehost
service_description ARPING
check_command check_arping!em0!25
# check_command check_ping!100.0,20%!500.0,60%
}

Т.е. передаем для arping 2 аргумента, имя интерфейса и таймаут в миллисекундах.

Далее добавляем в файл  /usr/local/etc/nagios/commands.cfg следующие строки:

# 'check_arping' command definition
define command{
command_name check_arping
command_line $USER1$/check_arping -H $HOSTADDRESS$ -I $ARG1$ -T $ARG2$
}

И, наконец, в директории /usr/local/libexec/nagios создаем скрипт check_arping следующего содержания.

#! /usr/bin/perl
$ip =$ARGV[1];
$iface =$ARGV[3];
$timeout =$ARGV[5]*1000;
$cmd = "/usr/local/sbin/arping -i $iface -w $timeout -c 4 $ip";
@res = `$cmd`;
foreach $str (@res) {
if (($str,'packets')>-1) {
$more = $str;
}
}
$more =~ /.*\s(\d+)%.*/;
$percent = $1;
if ($percent == 0) {
$status = "OK";
$code = 0;
}
if ($percent > 25) {
$status = "WARNING";
$code = 1;
}
if ($percent == 100) {
$status = "CRITICAL";
$code = 2;
}
"ARPING $status - |$more";
$code;
__END__

Скрипт рабочий, но в самом минимуме. Выдает одну строку вида:

# ./check_arping -H 192.168.2.166 -I em0 -T 30
ARPING OK - |4 packets transmitted, 4 packets received, 0% unanswered

Если из четырех пакетов потеряно менее двух скрипт возвращает код 0 — «OK» для nagios, если потеряно два  или три пакета скрпит возвращает код 1 — «WARNING«, а если потеряны все четыре — то скрипт возвращает 2 — «CRITICAL«.

В перспективе планирую облагообразить обработку аргументов, так, как сейчас, — это решение, обусловленное катастрофическим отсутствием времени, поэтому заранее прошу прощения за индусский код.