Перейти к основному содержанию
 

Zabbix — срок действия домена 2

Zabbix

Заново переписал скрипт мониторинга срока действия домена. Это вторая версия. Главной целью было снизить нагрузку на агент, чтобы данные отдавались моментально. Дополнительно появились новые триггеры, отслеживающие частоту проверок.

Мониторинг пригодится всем администраторам и владельцам доменов, чтобы не упустить момент оплаты.

Ссылки

Первая версия скрипта мониторинга срока действия домена:

Zabbix - срок действия домена

Подготовка

Для проверки срока действия домена нам понадобится утилита whois (у меня Ubuntu):

apt-get install whois

Скрипты

Мониторинг у меня находится на самом заббикс-сервере. Создаём следующую структуру каталогов:

zabbix

В директории /usr/lib/zabbix/externalscripts создадим папку domain_expire с содержимым:

  • data — директория, пока пустая. Наполняться будет автоматически.
  • domain_list.txt — файл содержит список доменов, для которых нужно проверять срок действия. В одной строке один домен, например:
    domain1.ru
    domain2.com
    www.domain3.ru
    internet-lab.ru
    домен.рф
    Кириллические домены поддерживаются!
  • domain_check.sh — этот скрипт вызывается из заббикс-агента пользовательскими переменными. Без параметра он выводит JSON со списком доменов для автообнаружения. С доменом в качестве параметра возвращает количество дней до окончания срока действия домена, домен должен быть в списке domain_list.txt.
  • domain_cron.sh — этот скрипт вызывается в cron раз в шесть часов и обновляет информацию о всех доменах из списка.
  • domain_miss.sh — этот скрипт вызывается из заббикс-агента пользовательскими переменными. С доменом в качестве параметра возвращает количество дней, прошедших с момента последнего обновления данных кроном. Помогает вызвать триггер с предупреждением, если crontab перестанет работать или по какой-то причине перестанет обрабатываться домен в скрипте.

Содержимое domain_check.sh:

#!/bin/bash

# выводит сколько дней осталось до протухания домена

# получаем имя домена
DOMAIN=$1

#если домен не передан - выводим массив для автообнаружения
if [[ $DOMAIN = "" ]]; then
    # список доменов
    LISTPATH="/usr/lib/zabbix/externalscripts/domain_expire/domain_list.txt"

    #заполняем массив из файла и выводим в JSON
    readarray DOMAINLIST < $LISTPATH
    if ((${#DOMAINLIST[*]}>0)); then
        echo "{"
        echo "  \"data\": ["
        for ((a=0; a < ${#DOMAINLIST[*]}; a++))
        do
            x=${DOMAINLIST[$a]};
            x=${x//[[:space:]]/};
            echo "    {"
            echo "      \"{#DOMAIN}\": \"${x}\""
            if ((a+1 < ${#DOMAINLIST[*]})); then
                echo "    },"
            else
                echo "    }"
            fi
        done
        echo "  ]"
        echo "}"
    fi
else
    #если домен передан - работаем

    #файл
    DATAPATH="/usr/lib/zabbix/externalscripts/domain_expire/data/"
    FILEPATH="${DATAPATH}${DOMAIN}"

    if [ -e $FILEPATH ]; then
        CURRENTDATE=`LANG=en_EN TZ=GMT date +"%b %d %R:%S %Y %Z"`
        EXPDATE=`cat $FILEPATH | grep "ExpDate" | cut -d'=' -f2`
        if [[ $EXPDATE == "" ]]; then
            echo "-1"
        else
            DIFFDAYS=`echo $(( ($(date -d "$EXPDATE" +"%s")-$(date -d "$CURRENTDATE" +"%s"))/86400 ))`
            echo "$DIFFDAYS"
        fi
    else
        echo "-1"
    fi
fi

Содержимое domain_cron.sh:

#!/bin/bash

# Создаёт файлы доменов с текущей датой и датой протухания домена

# переменные
LISTPATH="/usr/lib/zabbix/externalscripts/domain_expire/domain_list.txt"
DATAPATH="/usr/lib/zabbix/externalscripts/domain_expire/data/"
CURRENTDATE=`LANG=en_EN TZ=GMT date +"%b %d %R:%S %Y %Z"`

#заполняем массив из файла
readarray DOMAINLIST < $LISTPATH
if ((${#DOMAINLIST[*]}>0)); then
    for ((a=0; a < ${#DOMAINLIST[*]}; a++))
    do
        DOMAIN=${DOMAINLIST[$a]};
        DOMAIN=${DOMAIN//[[:space:]]/};

        # получаем имя зоны
        ZONE=`echo $DOMAIN | sed 's/\./ /' | awk '{ print $2 }'`

        # получаем дату протухания домена
        case "$ZONE" in
            ru|net.ru|org.ru|pp.ru|рф)
            DATE=`whois $DOMAIN | grep paid-till | awk '{ print $2 }' | sed 's/\./-/g'`
            ;;
            spb.ru|msk.ru)
            DATE=`whois -h whois.flexireg.net $DOMAIN | grep "Registry Expiry Date:" | sed 's/Registry Expiry Date: //g;s/T/ /g' | awk '{ print $1 }'`
            ;;
            shop)
            DATE=`whois -h whois.tucows.com $DOMAIN | grep "Registrar Registration Expiration Date:" | sed 's/Registrar Registration Expiration Date: //g;s/T/ /g' | awk '{ print $1 }'`
            ;;
            re)
            DATE="$(whois $DOMAIN | awk '/[Ee]xpir.*[Dd]ate:/ || /[Tt]ill:/ || /expire/ {print $NF; exit;}')"
            ;;
            tw)
            DATE=`whois $DOMAIN | grep "Record expires on" | awk '{ print $4 }' | sed 's/\./-/g'`
            ;;
            org|com|net)
            DATE=`whois $DOMAIN | grep "Registry Expiry Date:" | sed 's/Registry Expiry Date: //g;s/T/ /g' | awk '{ print $1 }'`
            ;;
            *)
            DATE="$(whois $DOMAIN | awk '/[Ee]xpir.*[Dd]ate:/ || /[Tt]ill:/ || /expire/ {print $NF; exit;}')"
        esac

        VALIDDATE=`LANG=en_EN TZ=GMT date -d"$DATE" +"%b %d %R:%S %Y %Z" > /dev/null 2>&1; echo $?`
        EXPDATE=`LANG=en_EN TZ=GMT date -d"$DATE" +"%b %d %R:%S %Y %Z"`

        #если получили дату
        if [[ $VALIDDATE == 0 ]]; then
            FILEPATH="${DATAPATH}${DOMAIN}"
            touch $FILEPATH
            echo "CheckDate=$CURRENTDATE" > $FILEPATH
            if [[ $EXPDATE != "" ]]; then
                echo "ExpDate=$EXPDATE" >> $FILEPATH
            fi
        fi

    done
fi

Содержимое domain_miss.sh:

#!/bin/bash

# выводит сколько дней назад проверялся домен

# получаем имя домена
DOMAIN=$1

#если домен передан - работаем
if [ $DOMAIN != "" ]; then

        #файл
        DATAPATH="/usr/lib/zabbix/externalscripts/domain_expire/data/"
        FILEPATH="${DATAPATH}${DOMAIN}"

        if [ -f $FILEPATH ]; then
            CURRENTDATE=`LANG=en_EN TZ=GMT date +"%b %d %R:%S %Y %Z"`
            CHECKDATE=`cat $FILEPATH | grep "CheckDate" | cut -d'=' -f2`
            DIFFDAYS=`echo $(( ($(date -d "$CURRENTDATE" +"%s")-$(date -d "$CHECKDATE" +"%s"))/86400 ))`
            echo "$DIFFDAYS"
        else
            echo "-1"
        fi
else
    #ошибка
    echo "-1"
fi

Примечания к скриптам

В коде скриптов есть путь вида usr/lib/zabbix/externalscripts/, если у вас другие пути - нужно будет изменить.

CURRENTDATE=`LANG=en_EN TZ=GMT date +"%b %d %R:%S %Y %Z"`

Это получение текущей даты.

  • TZ=GMT — переводит дату в формат GMT
  • LANG=en_EN — устанавливает язык
  • "%b %d %R:%S %Y %Z" — формат даты вида: Jun 14 03:59:01 2019 GMT

Crontab

В крон добавляем расписание, срабатывает раз в шесть часов:

* */6 * * * /usr/lib/zabbix/externalscripts/domain_expire/domain_cron.sh >/dev/null 2>&1

Перезапускаем крон:

service cron restart

Скрипт должен выполниться и папка data заполнится файлами с названиями доменов. Если не выполнится - запустите domain_cron.sh сами, а потом разбирайтесь, что там с кроном.

Пример содержимого файлов на примере домена internet-lab.ru.

root@zabbix:/usr/lib/zabbix/externalscripts/domain_expire/data# pwd
/usr/lib/zabbix/externalscripts/domain_expire/data

root@zabbix:/usr/lib/zabbix/externalscripts/domain_expire/data# ll | grep internet
-rw-r--r-- 1 root root   69 июн 14 06:59 internet-lab.ru

root@zabbix:/usr/lib/zabbix/externalscripts/domain_expire/data# cat internet-lab.ru
CheckDate=Jun 18 09:59:01 2019 GMT
ExpDate=Feb 20 09:55:45 2020 GMT

Внутри файлов пишется две даты. Дата проверки в формате GMT.

CheckDate=Jun 18 09:59:01 2019 GMT

Дата истечения домена (если удалось определить) в формате GMT:

ExpDate=Feb 20 09:55:45 2020 GMT

Zabbix агент

Теперь нужно настроить заббикс-агент, чтобы он отдавал данные серверу. Убеждаемся, что в /etc/zabbix/zabbix_agentd.conf есть настройка:

Include=/etc/zabbix/zabbix_agentd.conf.d/

Переходим в папку /etc/zabbix/zabbix_agentd.conf.d/, создаём файл domain_expire.conf с содержимым:

UserParameter=domain_expire.check[*],/usr/lib/zabbix/externalscripts/domain_expire/domain_check.sh $1
UserParameter=domain_expire.miss[*],/usr/lib/zabbix/externalscripts/domain_expire/domain_miss.sh $1
UserParameter=domain_expire.list,/usr/lib/zabbix/externalscripts/domain_expire/domain_check.sh
  • domain_expire.list — список доменов в JSON для автообнаружения.
  • domain_expire.check[*] — дней до окончания срока действия домена (float, потому как может возвращать "-1").
  • domain_expire.miss[*] — сколько дней назад была проверка. В идеале должно быть 0, иначе нужно разбираться.

Перезапускаем агент:

service zabbix-agent restart

Zabbix шаблон

Ставим на сервер шаблон и привязываем к заббикс-серверу. Шаблон я уже набросал.

Скачать шаблон: zbx_domain_expire.xml

zabbix

В шаблоне одно приложение:

zabbix

Одно правило автообнаружения, срабатывает раз в час для обновления списка доменов:

zabbix

Два прототипа элементов данных:

zabbix

Семь прототипов триггеров:

zabbix