Срок делегирования домена под наблюдением

Сегодня предстоит решением такой интересной задачки, как определение срока делегирования домена.
На первый взгляд особых трудностей не заметно — спарсить вывод whois и делов.
По началу так и было, пока количесто доменов было 2 и все они находились в зоне .com.ua
Как только в список добавился домен зоны .com тут то обнаружение и перестало работать.
Первым делом искал какие то whois-сервисы, которые отдавали бы все доменные зоны и даже что то нашел. И уже через 10 минут столкнулся с ограничением по частотности и предложением купить премиум акк… Отпадает.
Недолгие размышления и гуглинья привели к идее выкинуть стандартный whois и заменить его классным gem-ом (библиотека в языке программирования Ruby)
Этот гем поддерживается сообществом и периодически обновляется. Кроме того имеет хорошую документаху и всё такое. Решено было использовать именно его
Приступим

Для работы этого гема необходимо установить Ruby версии старше чем 2.2.0
Я использовал готовый rpm
CentOS 7:

# wget https://github.com/feedforce/ruby-rpm/releases/download/2.3.3/ruby-2.3.3-1.el7.centos.x86_64.rpm
# rpm -Uvh ruby-2.3.3-1.el7.centos.x86_64.rpm

CentOS 6:

# wget https://github.com/feedforce/ruby-rpm/releases/download/2.3.3/ruby-2.3.3-1.el6.x86_64.rpm
# rvm ruby-2.3.3-1.el6.x86_64.rpm

После этого установим гем, о котором говорилось выше

# gem install whois whois-parser
# gem list | grep whois
whois (4.0.1)
whois-parser (1.0.0)

Создаём структуру файлов и каталогов

# mkdir -p /etc/zabbix/scripts/domain
# touch /etc/zabbix/scripts/domain/domain_discovery.sh
# touch /etc/zabbix/scripts/domain/domain_left.rb
# touch /etc/zabbix/scripts/domain/domain_list.txt
# chown -R zabbix:zabbix /etc/zabbix/scripts/domain/
# chmod +x /etc/zabbix/scripts/domain/domain_discovery.sh
# chmod +x /etc/zabbix/scripts/domain/domain_left.rb

Листинг главного скрипта:

# cat /etc/zabbix/scripts/domain/domain_left.rb
require 'whois-parser'

record = Whois.whois(ARGV[0])
parser = record.parser
expire = parser.expires_on.strftime("%Y-%m-%d")
today = Time.now.strftime("%Y-%m-%d")
expire_date = DateTime.parse(expire)
today_date = DateTime.parse(today)
left = (expire_date - today_date).to_i
puts left

Листинг скрипта обнаружения. Обнаружение происходит с помощью чтения файла со списком доменов с последующим преобразованием в JSON-формат, который понимает zabbix

# cat /etc/zabbix/scripts/domain/domain_discovery.sh
#!/bin/bash
JSON=$(for i in `cat /etc/zabbix/scripts/domain/domain_list.txt`; do printf "{\"{#DOMAIN}\":\"$i\"},"; done | sed 's/^\(.*\).$/\1/')
printf "{\"data\":["
printf "$JSON"
printf "]}"

Список доменов. Специально добавил по одному с распространённых зон для проверки.

# cat /etc/zabbix/scripts/domain/domain_list.txt
tradenark.com.ua
google.com
i.ua
bash.im
habrahabr.ru
bitcoin.org

Расширяем возможности заббикса, создав кастомные ключи. Этот параграф очень хорошо описан в документации

# cat /etc/zabbix/zabbix_agentd.d/domain.conf
UserParameter=domain.discovery,/bin/bash /etc/zabbix/scripts/domain/domain_discovery.sh
UserParameter=domain.expire[*],/usr/bin/ruby /etc/zabbix/scripts/domain/domain_left.rb $1

После перезапуска агента можно проврять все ли конфигурации применились:

# zabbix_agentd -t 'domain.discovery'
domain.discovery                              [t|{"data":[{"{#DOMAIN}":"bash.im"},{"{#DOMAIN}":"bitcoin.org"},{"{#DOMAIN}":"habrahabr.ru"},{"{#DOMAIN}":"i.ua"},{"{#DOMAIN}":"google.com"},{"{#DOMAIN}":"tradenark.com.ua"}]}]
# zabbix_agentd -t 'domain.expire[bash.im]'
domain.expire[bash.im]                        [t|178]
# zabbix_agentd -t 'domain.expire[bitcoin.org]'
domain.expire[bitcoin.org]                    [t|2178]
# zabbix_agentd -t 'domain.expire[habrahabr.ru]'
domain.expire[habrahabr.ru]                   [t|230]
# zabbix_agentd -t 'domain.expire[i.ua]'
domain.expire[i.ua]                           [t|570]
# zabbix_agentd -t 'domain.expire[google.com]'
domain.expire[google.com]                     [t|1840]
# zabbix_agentd -t 'domain.expire[tradenark.com.ua]'
domain.expire[tradenark.com.ua]               [t|147]

Готовый шаблон тут
Это решение оказалось более гибким, к тому же дополнительный опыт написания кода на любимом Ruby

Срок делегирования домена под наблюдением: 1 комментарий

Добавить комментарий