Сегодня предстоит решением такой интересной задачки, как определение срока делегирования домена.
На первый взгляд особых трудностей не заметно — спарсить вывод 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
Спасибо, годная инструкция. Давно хотел что-то подобное настроить.