Thank you for reading this post, don't forget to subscribe!
Подготовка
Для проверки срока действия домена нам понадобится утилита whois (у меня Ubuntu):
apt-get install whois
Скрипты
Мониторинг у меня находится на самом заббикс-сервере. Создаём следующую структуру каталогов:
В директории /usr/lib/zabbix/externalscripts создадим папку domain_expire с содержимым:
- data — директория, пока пустая. Наполняться будет автоматически.
- domain_list.txt — файл содержит список доменов, для которых нужно проверять срок действия. В одной строке один домен, например:
12345domain1.rudomain2.comwww.domain3.ruinternet-lab.ruдомен.рф
Кириллические домены поддерживаются! - domain_check.sh — этот скрипт вызывается из заббикс-агента пользовательскими переменными. Без параметра он выводит JSON со списком доменов для автообнаружения. С доменом в качестве параметра возвращает количество дней до окончания срока действия домена, домен должен быть в списке domain_list.txt.
- domain_cron.sh — этот скрипт вызывается в cron раз в шесть часов и обновляет информацию о всех доменах из списка.
- domain_miss.sh — этот скрипт вызывается из заббикс-агента пользовательскими переменными. С доменом в качестве параметра возвращает количество дней, прошедших с момента последнего обновления данных кроном. Помогает вызвать триггер с предупреждением, если crontab перестанет работать или по какой-то причине перестанет обрабатываться домен в скрипте.
Содержимое domain_check.sh:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
#!/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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
#!/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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#!/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.
1 2 3 4 5 6 7 8 9 10 |
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 шаблон
Ставим на сервер шаблон и привязываем к заббикс-серверу. Шаблон я уже набросал.
Скачать шаблон:
В шаблоне одно приложение:
Одно правило автообнаружения, срабатывает раз в час для обновления списка доменов:
Два прототипа элементов данных:
Семь прототипов триггеров: