Мониторинг даты продления доменного имени

Мониторинг даты продления доменного имениМониторинг даты продления доменного имени — действие, которое нельзя недооценить. Я уже писал о том, как мониторить, сколько дней осталось до продления SSL-сертификата, и теперь давайте разберемся с другой частой проблемой — неожиданным окончанием срока регистрации доменного имени. Казалось бы, все регистраторы на сегодняшний день заранее об этом напоминают (причем обычно несколько раз). Но проблема в том, что эти письма либо не читают, либо они как-то попадают в спам. В общем, не все в курсе, что у них заканчивается срок регистрации доменного имени. В результате сайт не работает, люди не понимают, почему, и тратят иногда много времени, чтобы понять, что происходит. Тем временем доменное имя пропадает из кэша DNS, и через пару дней (или даже раньше, зависит от разных факторов) посетители перестают попадать на сайт. Давайте посмотрим, как мониторить дату окончания регистрации доменного имени. Естественно, скриптом на bash.

Как получить дату регистрации доменного имени

Самый простой вариант — использовать глобальную базу данных whois. В ней хранится информация о доменных именах, такая как организация, ответственное лицо, контакты для связи, дата регистрации и дата окончания срока регистрации. И это как раз то, что нам нужно. Давайте возьмем какой-нибудь популярный домен для примера. Пусть это будет yandex.ru. Вот какая информация хранится в базе whois об этом домене:

$ whois yandex.ru
% By submitting a query to RIPN's Whois Service
% you agree to abide by the following terms of use:
% http://www.ripn.net/about/servpol.html#3.2 (in Russian) 
% http://www.ripn.net/about/en/servpol.html#3.2 (in English).

domain:        YANDEX.RU
nserver:       ns1.yandex.ru. 213.180.193.1, 2a02:6b8::1
nserver:       ns2.yandex.ru. 93.158.134.1, 2a02:6b8:0:1::1
state:         REGISTERED, DELEGATED, VERIFIED
org:           YANDEX, LLC.
registrar:     RU-CENTER-RU
admin-contact: https://www.nic.ru/whois
created:       1997.09.23
paid-till:     2017.10.01
free-date:     2017.11.01
source:        TCI

Last updated on 2017.01.03 05:46:31 MSK

Поле, которое нас интересует — «paid-till», это дата, до которой у нас оплачен домен.

Мониторинг даты продления доменного имени

Мониторинг даты продления доменного имени сделаем примерно так же, как и мониторинг сертификата, но заметно проще. Получаем данные о домене, ищем поле, содержащее дату окончания регистрации, если оно присутствует (если данные whois для этого домена не закрыты), получаем эту дату, получает сегодняшнюю дату и выводим разницу в днях. При желании можно добавить отправку письма, если осталось, скажем, меньше 30 дней до окончания регистрации. Но не всё так просто. Потому что есть как минимум три вида записей об окончании срока регистрации. Первый выглядит так:

paid-till:     2017.10.01

Второй выглядит так:

Registrar Registration Expiration Date: 2020-09-13T21:00:00-0700

И третий выглядит так:

Registry Expiry Date: 2018-05-11T04:00:00Z

И нам, соответственно, надо предусмотреть все три варианта. Или, если встретится четвертый, то и четвертый. Пока давайте разберемся с этими тремя.

Вот как выглядит скрипт:

#!/bin/bash

# Если параметр не указан, выводим подсказку и завершаем работу
if [ "$1" == "" ]
then
cat << EOF

  Script that monitors how many days left until domain registration ends.

  Usage: $(basename $0) domain.name
EOF
exit
fi

# Получаем строку, содержащую дату окончания регистрации
PAIDTILL=$(whois $1 | grep 'paid-till\|Registrar Registration Expiration Date\|Registry Expiry Date')

# Если такая строка не найдена, выходим с ошибкой
if [ -z "$PAIDTILL" ]
then
    echo "Registration end date is not available in whois database"
    exit 1
else
    # Если дата выглядит как ГГГГ.ММ.ДД, то добавляем 00:00:00 в конец
    [[ "$PAIDTILL" =~ "paid-till" ]] && PAIDTILL=${PAIDTILL//./-}" 00:00:00"
    # Удаляем из строки всё до двоеточия, само двоеточие
    # плюс автоматически будут удалены пробелы
    PAIDTILL=${PAIDTILL#*:}
    # Получаем текущую дату
    CURRENTDATE=$(date "+%Y-%m-%d %H:%M:%S")
    # Находим разницу между датами, получаем количество оставшихся дней
    DAYS_LEFT=$(( ($(date -d "$PAIDTILL" +%s) - $(date -d "$CURRENTDATE" +%s) ) / 86400 ))
    # Выводим, сколько дней осталось
    echo $DAYS_LEFT days left
fi

Вот результат работы этого скрипта для разных доменов на момент написания статьи:

$ ./check-dn-reg.sh linux.org
492 days left
$ ./check-dn-reg.sh yahoo.com
2206 days left
$ ./check-dn-reg.sh yandex.ru
270 days left
$ ./check-dn-reg.sh google.com
1349 days left
$ ./check-dn-reg.sh ok.ru
331 days left
$ ./check-dn-reg.sh vk.com
170 days left
$ ./check-dn-reg.sh linux.org
492 days left
$ ./check-dn-reg.sh linux.org.ru
345 days left

Согласитесь, удобно выглядит. Мониторинг даты продления доменного имени скриптом размером всего 660 байт. Уже можно использовать в мониторинге при помощи Nagios или Zabbix.

Если есть дополнения, замечания, пишите в комментарии.

Мониторинг даты продления доменного имени: 3 комментария

  1. Степан

    Исправил несколько багов
    https://gist.githubusercontent.com/De-Luxis/3662703118bfe1a7f59db9e9d7b8673f/raw/017c30edc76ca66a595429bc3487727698410c38/check_domain.sh

    1. Maxim Norin Автор записи

      Можно пулл реквестом сюда — https://github.com/mnorin/bash-scripts/blob/master/utils/check-dn-reg.sh ?

  2. Олег

    Прошу прощения, скрипт прекрасен, но работает немного не правильно
    на примере яндекса
    whois yandex.ru
    paid-till: 2019-09-30T21:00:00Z
    и соотвественно скрипт выдаст
    date: неверная дата «paid-till: 2019-02-23T21:00:00Z 00:00:00»
    -17887 days left
    я так понимаю T и Z мешают вычислению дней. Можно их как-нибудь убрать?
    Заранее спасибо!

Обсуждение закрыто.