четверг, 9 декабря 2010 г.

Плагин для nagios check_wh.

Итак, пока помню опишу. Все мы страдаем забывчивостью. За доменом необходимо следить. Серьезно. Никто не погладит по головке, если Ваш домен сначала "заморозят", а потом пометят как удаленный. В моей организации используется Nagios для мониторинга кучи серверов. Филиалы имеют свои внешние домены и пару раз случалась ситуация, когда местная бухгалтерия забывала проплатить за доменное имя. Почему то вчера в голову стукнула идея написать скрипт, который бы мониторил это дело и сообщал когда стоит начать шевелиться. Поискав по просторам интернета, нашел пару скриптов под Nagios - один на Perl, другой на bash, но ни один из мне не понравился, так как не выводил количество дней до deadline. Проанализировав результаты команды `whois DOMAIN` для пары десятков украинских и российских доменов, была выведена тенденция и написан небольшой скрипт.
Немного WIKI: WHOIS — сетевой протокол прикладного уровня, базирующийся на протоколе TCP (порт 43). Основное применение — получение регистрационных данных о владельцах доменных имен, IP-адресов и автономных систем.
Теперь о плагине - ушло 4-5 часов на написание (с учетом всех отрывов от написания) и тестирование. Оказалось все просто, однако, будет работать ТОЛЬКО для записей, имеющих значения в полях Status и expire (что поделать, не все придерживаются одинакового синтаксиса в БД whois).
Внимание счастливым админам, не имеющим записей о времени истечения срока действия ваших доменов. Вам остается либо помнить этот знаменательный день, предварительно уточнив его у провайдера, либо попросить/заставить провайдера внести в БД WHOIS необходимые данные.

Собственно сам скрипт.

#!/bin/bash
# Script for checking whois status
# Usage $0 arg1 warning critical

# аргументы [WARNING_THRESHOLD] [CRITICAL_THRESHOLD] опциональные, если их не передавать - будут использоваться значения по умолчанию - 40 и 25 соот.
if [ $# -lt 1 ]; then
echo "Usage: `basename $0` DOMAIN [WARNING_THRESHOLD] [CRITICAL_THRESHOLD]"
exit 3
fi;

# текущая дата в секундах со времен 1970-01-01 00:00:00 UTC
CUR_DATE=`date +%s`

# проверка на передачу аргументов WARNING и CRITICAL. Если WARN задан и больше CRIT, то использовать заданное значение. Если нет - то принять значение по умолчанию 40 (выставил самостоятельно)
if [ $2 ] && [ $2 -gt $3 ]; then
WH_WARN=$2
else
WH_WARN=40
fi;

if [ $3 ]; then
WH_CRIT=$3
else
WH_CRIT=25
fi;

# вывод для отладки
#echo "WH_CRIT=$WH_CRIT"
#echo "WH_WARN=$WH_WARN"
#echo "CUR_DATE=$CUR_DATE"

# запись в переменную результата
WH_RESULT=`whois $1 2>/dev/null`
#echo "WH_RESULT=$WH_RESULT"

# если в результате есть "No entries found for", то выдать на стандартный вывод сообщение и выйти с кодом 3. Насчет кодов выхода: Nagios plug-in development guidelines говорит использовать код 0 для статуса OK, 1 - WARNING, 2 - CRITICAL, 3 - UNKNOWN. Nagios от плагина получит код возврата и строку на стандартном выводе (код используется для определения состояния службы, а текст как информационное сообщение для отправки в почту, вывода на экран и т.п.)
if [ `echo "$WH_RESULT" | grep "No entries found for" | wc -l` -eq 1 ]; then
echo "Domain $1 not found in WHOIS_DB"
exit 3
fi;

# самая "страшная" часть. Положительный результат команды `whois DOMAIN` парсится на наличие строки status. Если строка найдена (в формате "status: OK-UNTIL 20110914000000"), из неё вырезается последняя часть с 8 цифрами - дата (YYYYMMDD) истечения срока действия домена.
tmp2=`echo "$WH_RESULT" | grep status`
#echo "$tmp"
if [ "$tmp2" ]
then
# собственно здесь последняя часть с 8 цифрами - дата (YYYYMMDD) истечения срока действия домена.
tmp0=`expr substr \`echo "$tmp2" | awk {'print $3'}\` 1 8`
# число секунд от 1970-01-01 00:00:00 UTC до определенной выше даты
WH_DATE=`date --date "$tmp0" +%s`
# echo "WHDATE=$WH_DATE"
else
# Если строка status не найдена - ищется строка expire в формате "Record expires: 2011-03-20"
tmp=`echo "$WH_RESULT" | grep -i expire`
# Если найдена такая строка - вырезается последняя часть, из которой удаляются знаки '-'
if [ "$tmp" ]
then
tmp0=`echo "$tmp" | awk {'print $3'} | tr -d -`
# число секунд от 1970-01-01 00:00:00 UTC до определенной выше даты
WH_DATE=`date --date "$tmp0" +%s`
# echo "WHDATE=$WH_DATE"
fi;

fi;

# если переменная пустая, т.е. НЕ содержит записей о статусе или сроке окончания действия домена - выходм с кодом UNKNOWN
if [ -z "$WH_DATE" ]; then
echo "Unknown data for $1 from whois server."
exit 3
fi;

# вычисление разницы во времени в секундах, а затем деление на 86400 (числосекунд в одном дне)
X=`expr $WH_DATE - $CUR_DATE`
X=`expr $X / 86400`
#echo "X=$X"
if [ $X -gt $WH_WARN ]; then
echo "Whois data is valid for $1. $X days to expire. See http://hostmaster.net.ua/?domadv"
exit 0
fi;
if [ $X -lt $WH_WARN ] && [ $X -ge $WH_CRIT ]; then
echo "Whois data is valid for $1. $X days to expire. See http://hostmaster.net.ua/?domadv"
exit 1
fi;
if [ $X -lt $WH_CRIT ] && [ $X -ge 0 ] ; then
echo "Whois data is steel valid for $1, but will be expired in `echo "$X" | tr -d -` days. See http://hostmaster.net.ua/?domadv"
exit 2
else
echo "Whois data is NOT valid for $1. Was expired for `echo "$X" | tr -d -` days. See http://hostmaster.net.ua/?domadv"
exit 2
fi;

PS: всегда welcome здравая критика и предложения.

Литература:
http://ru.wikipedia.org/wiki/WHOIS
http://jon.netdork.net/2009/03/09/nagios-and-monitoring-whois
http://nagiosplug.sourceforge.net/developer-guidelines.html
http://hostmaster.net.ua/?domadv

1 комментарий:

  1. Отлично!
    что-то не работает имя в зоне ua.
    Домен: kinohod.ua
    Получаем:
    expr: syntax error
    Whois data is steel valid for kinohod.ua, but will be expired in 0 days. See http://hostmaster.net.ua/?domadv

    А нельзя ли добавить еще несколько зон?
    .me
    .am
    .com.ru
    .рф ?

    ОтветитьУдалить