Статья исследование на тему проверки и мониторинга данных из whois сервисов. Задача мониторинга времени делегирования домена на деле оказалась не такой простой, как может показаться. Ниже я подробно расскажу обо всех нюансах мониторинга времени оплаты домена с помощью zabbix.
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном онлайн-курcе по администрированию MikroTik. Автор курcа – сертифицированный тренер MikroTik Дмитрий Скоромнов. Более 40 лабораторных работ по которым дается обратная связь. В три раза больше информации, чем в MTCNA.
Содержание:
- 1 Введение
- 2 Подготовка к мониторингу за доменами
- 3 Парсинг времени делегирования домена через ruby
- 4 Linux утилиты whois и jwhois
- 5 Модуль python-whois для мониторинга оплаты доменов
- 6 Whois клиент для Node.js
- 7 Prometheus domain_exporter
- 8 Скрипт auto discovery доменов для zabbix
- 9 Настройка zabbix агента
- 10 Создание шаблона для наблюдения за доменами
- 11 Мониторинг делегирования домена через сервис Whois API
- 12 Заключение
Введение
Данная статья была изначально написана пару лет назад. В целом, она отвечала на вопрос по мониторингу за делегированием доменов, но со временем к ней стало появляться все больше вопросов. В частности, появлялись новые доменные зоны, информацию по которым не получалось достать выбранным методом. К слову, в первоначальной версии статьи использовалась только одна проверка с помощью ruby.
Чем больше доменов я ставил на мониторинг, тем чаще сталкивался с тем, что по каким-то зонам не мог получить инфу. Из свежих примеров - .pro, .fm, .io. Наверняка были и другие, но я сталкивался с проблемами именно в этих зонах. Решил разобраться с этим вопросом поподробнее.
К моему удивлению, оказалось, что простого, понятного и надежного решения по получению информации о времени делегирования домена просто не существует. Очень подробно разобрана эта тема в статье на хабре. Прочитав и осознав все, что в ней написано, я понял, что реализовать простую потребность в мониторинге доменов малой кровью не получится.
Я стал разбираться, копать тему. Погрузился в нее плотно и потратил кучу времени на казалось бы простецкую задачу. Но увы, универсального и надежного решения так и не получил. Полученный опыт хочу зафиксировать и поделиться им с вами. Может кто-то пойдет дальше и придумает что-то более надежное.
Ниже я опишу несколько консольных способов получения информации о времени оплаты домена для передачи этой информации в zabbix:
- Ruby gem Whois.
- Консольная утилита linux - whois, jwhois.
- Питоновский модуль - python-whois.
- Whois client для node.js.
Первый способ был описан давно, поэтому он по содержанию немного выбивается из общего повествования. Мне не захотелось редактировать всю статью. Я только добавил в начало описание проблемы и другие способы получения информации в конце. Сама реализация со стороны zabbix осталась той же самой. Меняются только скрипты, которые передают в zabbix данные о сроках делегирования домена.
Для удобного выбора нужного способа, составил табличку, где указал, какой из способов какие домены поддерживает. Использовал только те домены, которые нужны мне. Стандартные домены .ru и .com поддерживают все описанные способы.
способ / домен | pro | io | fm |
ruby | + | + | + |
whois | - | + | - |
python | + | - | + |
nodejs | + | + | - |
Если у вас еще нет своего сервера для мониторинга, то рекомендую материалы на эту тему. Для тех, кто предпочитает систему CentOS:
То же самое на Debian 10, если предпочитаете его:
Подготовка к мониторингу за доменами
Для мониторинга за сроком делегирования доменов мы будем использовать скрипт на языке программирования Ruby. Чтобы скрипт работал, необходимо установить Ruby на сервер. Если вы используете, как я, сервер на базе CentOS 7, то можете воспользоваться моей инструкцией по установке последней версии Ruby на CentOS 7. Там как раз речь идет об установке необходимого гема whois-parser для мониторинга срока делегирования домена.
Парсинг времени делегирования домена через ruby
Если у вас настроен и готов к работе zabbix и установлен ruby, приступаем к настройке скриптов. Идем в папку /etc/zabbix/scripts и создаем там скрипт:
# mcedit /etc/zabbix/scripts/domain_left.rb
#!/usr/bin/env ruby 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
Его тут же можно проверить. Сохраняете скрипт и запускаете в командной строке, указывая через пробел имя домена для проверки:
# /etc/zabbix/scripts/domain_left.rb serveradmin.ru 394
Отлично, на выходе просто число, которое очень удобно передать в zabbix. Данный скрипт я написал не сам, а подсмотрел у автора этой статьи. У него есть большой минус. В скрипте используется whois-parser и его функция expires_on. Сделано это для упрощения создания скрипта. Не пришлось вручную парсить вывод, за нас это сделали авторы гема whois-parser. Но эти функции работают не со всеми доменами. В разных зонах вывод может быть разным. Покажу на примере.
Для этого создадим простой скрипт на ruby, который будет просто выводить информацию whois без парсинга, в сыром виде.
#!/usr/bin/env ruby require 'whois-parser' domain = ARGV[0] whois = Whois::Client.new r = whois.lookup(domain) puts r
Сохраняем скрипт и проверим с его помощью 2 домена: из зоны .pro и зоны .ru.
# ./domain.rb server.pro
# ./domain.rb serveradmin.ru
Если вы внимательно посмотрите на вывод, то обнаружите, что в первом случае строка с информацией о сроке оплаты домена выглядит так:
Registry Expiry Date: 2019-08-18T00:00:00Z
а в другом вот так:
paid-till: 2019-08-09T11:01:06Z
Whois-parser умеет обрабатывать только первую строчку, вторую он не понимает, поэтому приведенный выше скрипт выдаст ошибку. Но в целом, библиотека ruby whois по моим опытам корректно обрабатывает больше всего доменов. Нужно только правильно распарсить вывод. Я программировать на ruby не умею, разбираться у меня не было времени, поэтому я оставил это решение как есть. Можно, конечно, выводить в текстовый файл, а потом парсить вывод через bash. Это я умею, но не захотелось костылить таким образом. Да и в целом, мне не нравится этот способ тем, что надо ставить ruby и регулярно обновлять его библиотеку. Только это гарантирует поддержку новых зон и всех изменений по старым.
В общем и целом способ с приведенным скриптом на ruby работает не хуже всех остальных способов, а если нормально распарсить выводы по всем нужным зонам, то это будет самый информативный и надежный вариант, при условии, что вы будете везде ставить ruby и обновлять библиотеку whois. Только этот способ показывал информацию по всем доменам, что мне попадались. Если доделаю скрипт, чтобы он работал со всеми доменами - обновлю.
Пока же я просто сделал костыль и распарсил вывод с помощью bash следующим образом:
#!/bin/bash DOMAIN="$1" data=$(/etc/zabbix/scripts/domain-simple.rb $1 | grep -E 'paid|Expir' | grep -o -E '[0-9]{4}.[0-9]{2}.[0-9]{2}|[0-9]{2}/[0-9]{2}/[0-9]{4}' | tr . / | awk 'NR == 1') expire=$((`date -d "$data" '+%s'`)) today=$((`date '+%s'`)) lefts=$(($expire - $today)) leftd=$(($lefts/86400)) echo $leftd
Сам скрипт domain-simple.rb:
#!/usr/bin/env ruby require 'whois-parser' record = Whois.whois(ARGV[0]) puts record
Я просто делаю полный вывод whois через ruby, а распарсиваю его башем, так как умею в нем работать. Получился вариант, который работает со всеми доменами. Можно этим скриптом передавать данные в zabbix.
Linux утилиты whois и jwhois
В комментариях к первоначальной статье мне подсказали про консольную утилиту whois, а позже я нагуглил и еще одну - jwhois. Я посмотрел на них внимательно и написал простенький скрипт для парсинга информации о делегировании. Данный способ самый простой и удобный. Обе утилиты ставятся через yum, первая из базового репозитория, вторая из репозитория epel. Не нужно дополнительных инструментов. Информативность средняя - все популярные домены есть, в том числе .io, но .pro и .fm не поддерживает. Увы и ах, мне они нужны.
Установим утилиту whois:
# yum install whois
Простой скрипт, который парсит вывод утилиты и показывает, сколько осталось дней до завершения проплаченного периода домена.
#!/bin/bash DOMAIN="$1" data=$(whois $1 | grep -E 'paid|Expir|expir' | grep -o -E '[0-9]{4}.[0-9]{2}.[0-9]{2}|[0-9]{2}/[0-9]{2}/[0-9]{4}' | tr . / | awk 'NR == 1') expire=$((`date -d "$data" '+%s'`)) today=$((`date '+%s'`)) lefts=$(($expire - $today)) leftd=$(($lefts/86400)) echo $leftd
Сохраняйте скрипт и проверяйте работу. Работает так же, как и скрипт для ruby.
# ./domain_left.sh serveradmin.ru 358
Я для себя решил остановиться на этом способе, как самом простом и универсальном.
Модуль python-whois для мониторинга оплаты доменов
В рамках своего исследования я решил проверить как с помощью python можно получать информацию whois. Я подозревал, что должен быть готовый модуль для этого и не ошибся. Такой модуль есть - python-whois. Для его работы нужен python версии 2, который по-умолчанию стоит в системе CentOS 7, что очень удобно.
Нам нужно только установить этот модуль через pip. Pip для 2-й версии ставится из репозитория epel.
# yum install python2-pip # pip install python-whois
Дальше набросал небольшой скрипт под заданную задачу, аналог предыдущих скриптов.
#!/usr/bin/env python import whois from datetime import datetime from sys import argv,exit now = datetime.now() domain = argv[1] w = whois.whois(domain) if type(w.expiration_date) == list: w.expiration_date = w.expiration_date[0] else: w.expiration_date = w.expiration_date domain_expiration_date = str(w.expiration_date.day) + '/' + str(w.expiration_date.month) + '/' + str(w.expiration_date.year) timedelta = w.expiration_date - now days_to_expire = timedelta.days
Проверка:
# ./domain-left.py serveradmin.ru 358
Работает так же, как и предыдущие скрипты. Решение на python поддерживает зоны .pro, .fm, не поддерживает .io.
Whois клиент для Node.js
Последнее рассмотренное мной консольное решение по получению данных whois основывается на клиенте для Node.js. Этот способ неудобен, как и с ruby, тем, что надо отдельно ставить node на сервер. Если python на centos сервере точно будет, то node придется ставить отдельно. Сделаем это.
# curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash - # yum install nodejs
Устанавливаем whois client:
# npm install whois
Под node.js я программировать вообще не умею и со скриптами не работал никогда. Так что готового скрипта для zabbix не сделал. Покажу на простом примере, как выполнять проверку. Делаем скрипт и в нем сразу указываем домен для проверки.
var whois = require('whois') whois.lookup('serveradmin.ru', function(err, data) { console.log(data) })
Запускаем его:
# node domain-left.js
В выводе увидите привычную информацию whois в таком же виде, как и для остальных проверок. Если бы этот способ проверял все необходимые мне домены, я бы его доделал. Он понимает домены .pro и .io, но не понимает .fm. Так что я не стал на нем подробно останавливаться.
Prometheus domain_exporter
Есть еще один простой и быстрый способ проверять время делегирования домена - использовать экспортер для prometheus domain_exporter. Требуется минимум настроек, так как для него есть готовый docker контейнер, который можно запустить где угодно. Например, на самом Zabbix сервере. Сделаем это:
# docker run -d --restart=always -p 9222:9222 caarlos0/domain_exporter
Он запустился локально на порту 9222. Проверим с его помощью время делегирования домена.
# curl localhost:9222/probe?target=serveradmin.ru
Обработаем вывод, чтобы его было удобно передать в Zabbix.
# curl -s localhost:9222/probe?target=serveradmin.ru | grep domain_expiry_days | grep -v '^#' | awk '{print $2}' 332
Можно сделать скрипт с этой командой и использовать его дальше в настройке zabbix-agent, предложенный мной. Но это не обязательно. Так как экспортер отдает данные по http, их можно забирать напрямую с zabbix сервера с помощью http агента. Я только до конца не понимаю, как тут удобнее сделать автоподстановку списка доменов, чтобы не создавать вручную итем для каждого домена.
Этот экспортер работает на go. Какую базу использует - не знаю. Я погонял новомодные домены, вроде все распознал.
Скрипт auto discovery доменов для zabbix
Для того, чтобы автоматом передавать в заббикс сразу все наши домены, создадим еще один скрипт, который будет парсить текстовый файл со списком доменов и передавать его в zabbix.
# mcedit /etc/zabbix/scripts/domain_discovery.sh
#!/bin/bash JSON=$(for i in `cat /etc/zabbix/scripts/domain_list.txt`; do printf "{\"{#DOMAIN}\":\"$i\"},"; done | sed 's/^\(.*\).$/\1/') printf "{\"data\":[" printf "$JSON" printf "]}"
И последнее - создадим файл со списком доменов. Каждый домен с новой строки.
# mcedit /etc/zabbix/scripts/domain_list.txt
yandex.ru mail.ru
Проверим работу скрипта для парсинга:
# /etc/zabbix/scripts/domain_discovery.sh {"data":[{"{#DOMAIN}":"mail.ru"},{"{#DOMAIN}":"yandex.ru"}]}
Вывод подходящий для передачи в заббикс.
Настройка zabbix агента
Я настраиваю zabbix агент на работу со скриптом на ruby. Вы можете выбрать скрипт по своему усмотрению. Изменить нужно будет только путь к скрипту в описании итема domain.expire.
Добавим скрипты через пользовательские параметры (UserParameter) агента. Для этого идем в папку с пользовательскими скриптами /etc/zabbix/zabbix_agentd.d и создаем там конфиг для наших параметров:
# mcedit /etc/zabbix/zabbix_agentd.d/domain.conf
UserParameter=domain.discovery[*], /bin/bash /etc/zabbix/scripts/domain_discovery.sh UserParameter=domain.expire[*], /usr/local/bin/ruby /etc/zabbix/scripts/domain_left.rb $1
Обращаю внимание на путь к ruby. В разных системах он может быть разный. Проверьте куда он у вас установлен и отредактируйте путь. Проверить можно командой:
# whereis ruby ruby: /usr/lib64/ruby /usr/local/bin/ruby /usr/local/lib/ruby /usr/share/ruby /usr/src/ruby-2.3.1/ruby.o /usr/src/ruby-2.3.1/ruby /usr/src/ruby-2.3.1/ruby.c
Сохраняйте конфиг и перезапускайте zabbix agent:
# systemctl restart zabbix-agent
В консоли закончили настройки, теперь идем в панель администрирования заббикс.
Создание шаблона для наблюдения за доменами
Дальше все стандартно и просто. Я выгрузил готовый шаблон у себя и предлагаю вам его скачать и импортировать, чтобы вручную не создавать все необходимое. Забираем файл - шаблон.
Импортируете шаблон себе в систему. Назначаете его хосту, в котором настроили скрипты и ждете появления данных. Минут через 5 проверяете в Latest Data:
Забавно, время делегирования обоих доменов одинаковое. Сначала подумал, что глюк, решил проверить вручную. Оказалось, что все верно. У них одинаковый срок продления. Без проблем работает наблюдение за доменами .рф. Их нужно перевести в Punycode и добавить так же, как и обычные домены.
Если необходимо, можете настроить повторяющиеся оповещения о времени делегирования домена. В данном случае это может быть актуально, так как не продлив сразу домен, можно потом позабыть.
Мониторинг делегирования домена через сервис Whois API
Есть еще один простой и удобный способ мониторинга времени делегирования домена в Zabbix с помощью готового сервиса Whois API. Для того, чтобы им воспользоваться, необходимо зарегистрировать на сайте https://promptapi.com и получить API Key. А потом использовать его в бесплатном тарифе Whois API. Его ограничение - 3000 запросов в месяц, что для доменов более чем достаточно. Хватит и по одному запросу в день к каждому домену, чтобы держать руку на пульсе.
Запрос к сервису и ответ выглядят примерно следующим образом:
# curl --request GET --url 'https://api.promptapi.com/whois/query?domain=serveradmin.ru' --header 'apikey: 3wLbWjVwR54tFGjfdb54MOG'
{ "result": { "domain_name": "SERVERADMIN.RU", "registrar": "REGRU-RU", "creation_date": "2015-08-09 11:01:06", "expiration_date": "2022-08-09 11:01:06", "name_servers": [ "dns1.yandex.net.", "dns2.yandex.net.", "ns1.selectel.org.", "ns2.selectel.org." ], "status": "REGISTERED, DELEGATED, VERIFIED", "emails": null, "org": null } }
Далее можно воспользоваться готовым шаблоном, который я уже подготовил. Экспорт был сделан с версии 5.4. В шаблоне я взял для автообнаружения в качестве источника данных внутреннюю проверку и ключ zabbix[uptime], просто чтобы выбрать что-то, не важно что. Список доменов передал с помощью предобработки в виде javascript, которая список доменов берет из макроса, где они перечислены через запятую. Ну а дальше все распарсить, разбить по элементам, добавить триггеры было делом техники. По ходу дело пришлось и с новым синтаксисом разобраться (есть неочевидные нюансы), и javascript подтянуть.
Чтобы все заработало, необходимо в макросах указать свой API KEY от сервиса promptapi и список доменов через запятую. Больше ничего делать не надо, только шаблон прикрепить к какому-нибудь хосту.
После того, как прикрепите, запустите вручную правило автообнаружения доменов и потом айтемы сбора данных, так как там интервал стоит в 1 день. Замучаетесь ждать результата работы.
В шаблоне настроены триггеры на:
- 7 и 30 дней до окончания делегирования;
- изменение списка NS серверов;
- изменение регистратора.
Соответственно, все эти значения собираются. Можно вывести куда-то на дашборд, если вам они интересны.
Данный способ на текущий момент самый простой и удобный, если вы умещаетесь в бесплатный лимит сервиса. Тут все сделано за вас, только домены добавить нужно. На агенте ничего настраивать не надо. Все проверки и обработка происходят на сервере мониторинга, а хранится всё непосредственно в шаблоне. Единственное неудобство, этот сервис поддерживает не все домены, только наиболее популярные и известные.
Заключение
Очередной пример простоты и удобства системы мониторинга Zabbix. С его помощью можно мониторить все, что угодно. Недавно я настраивал мониторинг системы управления насосами. Система передавала параметры в текстовый файл, а я его парсил и отправлял интересующие параметры заббиксу. Подробнее об этом написал в отдельной статье.
На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.
Спасибо, добр человек! Сделал через API-сервис, делов на 5 минут. Все взлетело, все работает. Главное, чтобы была стабильность в работе сервиса, а то сам сайт у них больно уж лагучий: долго крутит, не открывает, то вообще в ошибку выпадает. Сделаю еще доп. триггеры в шаблоне на nodata - если сервис поломается и перестанут приходить данные, чтобы своевременно узнать об этом.
Рано обрадовался... С .eu и .рф доменов не получил данных. На итеме висит ошибка response code 400
А перед этим на всех доменах несколько раз не было получено данных (на время тестирования шаблона увеличил интервал проверок) - ошибка по таймауту 10с., т.е. есть вопросы к работе сервиса и его стабильности... Увы..( В проде такое опасно использовать.
curl-ом сделал запрос к сайтам .рф и .eu , получил ошибку:
{"result": "error", "message": "TLD not supported"}
буду копать...
т.е. API способ не работает как минимум с этими двумя доменами. В то время как .io .info и прочую экзотику поддерживает, да
Добрый день!
Увидел в комментариях что в 6 zabbix всё работает.
Не подскажете на что обратить внимание если в последних данных не раскрывается имя домена:
https://snipboard.io/Cj6yvA.jpg
https://snipboard.io/ncl2i9.jpg
Решение тут - https://www.zabbix.com/forum/zabbix-troubleshooting-and-problems/440006-items-using-1-in-their-name-do-not-translate-to-the-full-name-after-upgrade-to-5-0
Исправил итем:
https://snipboard.io/XZ0CFs.jpg
И теперь всё отлично.
Здравствуйте! Использовал сервис Whois API. Импортировал шаблон. Zabbix 6.2. У меня несколько узлов сети, к каждому из которых прикрепляю шаблон и меняю макрос {$DOMAIN} с соответствующим доменом. В итоге только на одном из 5ти узлов Domain domain.ru expire days со значением. На других ошибка в инфо - Cannot evaluate function: not enough data at "last(//expiration_date_unix[название домена])-now()".
Можно как-то поправить?
Заранее спасибо!
Добавлю. Я инструкцию прочитал. Но мне нужно именно по каждому отдельному узлу, так как один узел - одна телеграм группа.
Кстати остальные данные из шаблона приходят.
Я так сходу не могу сообразить, в чём тут проблема. Как минимум, если доменов не много, можете вручную эти проверки закинуть на каждый хост, без макросов и автообнаружения.
Zerox, здравствуйте!
Да вроде так и сделал. На некоторых доменах подтянулась инфа.
Есть еще ошибки такого вида Get domain site.spb.ru info Response code "404" did not match any of the required status codes "200".
Что-то с доменами. Пытаюсь вручную данные проверить на сайте https://who.is/whois/ и вижу на проблемных доменах WHOIS data currently unavailable. Видимо какое-то ограничение... Вроде данные у регистраторов не скрыты.
Теперь понял почему нет данных.
Нужно мониторить домен site.spb.ru.
#jwhois site.spb.ru отдает корректно информацию:
registrar: RU-CENTER
created: 2010.04.24
paid-till: 2024.03.02
source: RU-CENTER
Пошел по пути скриптов. В папке /etc/zabbix/scripts два скрипта: domain_discovery.sh и domain_left.sh. В domain_left.sh заменил whois на jwhois.
# ./domain_left.sh site.spb.ru
361
Работает.
# ./domain_discovery.sh
{"data":[{"{#DOMAIN}":"site.spb.ru"}]}[root@site scripts]#
Вроде тоже работает.
/etc/zabbix/zabbix_agent2.d лежит файл domain.conf:
UserParameter=domain.discovery[*], /bin/bash /etc/zabbix/scripts/domain_discovery.sh
UserParameter=domain.expire[*], /bin/bash /etc/zabbix/scripts/domain_left.sh $1
Шаблон к узлу подцепил, но данных нет, даже имени элемента данных.
Подскажите, пожалуйста, как быть)
Вопрос со скриптами решил. Спасибо за команду sed -i 's/\r$//' filename. Проблема была именно в domain_discovery.sh, агент не работал как положено (code=exited, status=2).
Но проблема осталась. С сервера zabbix через команду zabbix_get на удаленный агент получаю данные domain.discovery и domainexpire.
Видимо что-то с шаблоном domain-expiration-template.xml
Шаблон https://serveradmin.ru/files/domain-expiration-template.xml в zabbix 6.0 не импортируется.
Да и сам excel не него ругается что у него вот тут недопустимые символы:
{Domain Expiration:domain.expire[{#DOMAIN}].last()}<30
Запустил все за 10 минут, через указанный шаблон и Whois API. Спасибо!
Zerox, запускали на zabbix 6 whois вариант? Чего-то не идёт.
Проверил сервер, который уже обновил. Там нормально работает мониторинг делегирования. Ничего не поменялось и не сломалось после обновления на 6-ю версию.
В моем случае тоже, не работает. По крайней мере пока. Сделал на bash скриптах
Версия сервера 6.0 LTS, и zabbix-agent2 6.0 LTS
`/etc/zabbix/zabbix_agent2.d/domain.conf` - файл лежит тут. Пути все совпадают. Скрипты работают корректно. но итемы не создаются на сервере после присоединении шаблона
В логах проблем не нашел. После перехода с 5 на 6 версию данный мониторинг у меня отвалился.. Так же как и проверка сертификатов. Вот пока с доменами решаю проблему
1. whois прекрасно работает и в 3 питоне
2. в питоньем скрипте не хватает последней строчки: print(days_to_expire)
Пробую через whois. Получаю дату grep'ом, получаю ей в юниксе, получаю текущую (хотя тут тоже был затык по приведённому скрипту - пришлось запихивать левую переменную, хотя чистый запрос показывает всё как нужно), а на строке lefts=$(($expire - $today)) скрипт падает:
") 1642024800r: invalid arithmetic operator (error token is "
Уже пол дня расставляю в разные стороны скобки, переменные и прочее, но ни в какую. Банально на вычитании ступор. Явно в значения запихивает что то лишнее.
Может кто знает что это может быть? centos7
DOMAIN="$1"
data=$(whois $1 | grep -E 'paid|Expir|expir' | grep -o -E '[0-9]{4}.[0-9]{2}.[0-9]{2}|[0-9]{2}/[0-9]{2}/[0-9]{4}' | tr . / | awk 'NR == 1')
expire=$((`date -d "$data" '+%s'`))
today=$((`date -d "$da" '+%s'`))
lefts=$(($expire - $today))
leftd=$(($lefts/86400))
echo $expire
echo $today
echo $lefts
Пробовал другими скриптами из комментов и ссылок - тоже не сработало.
Вопрос снят - с какого-то перепугу в скрипт затесались переносы строки которые и вытворяли козни. На всякий пожарный - что бы полечить скрипт от этйо гадости используем:
sed -i 's/\r$//' filename
Уберёт кривые переносы.
для безруби
#!/bin/bash
DATEZ=`whois $1 \
| grep paid \
| cut -d\: -f2 \
| sed 's/^[ \t]*//;s/[ \t]*$//'`
DAYZ=`datediff "now" $DATEZ`
echo $DAYZ - $1
Спасибо. Отличный мануал.
Жаль, что ни один способ не работает с доменом CH.
Есть такие домены, которые никуда свою информацию не отдают. Есть какой-то один сервис у этого домена, по которому можно получать информацию о нем. Нужно найти этот сервис и прикрутить к нему мониторинг.
Здравствуйте, хочу поблагодарить автора за этот мануал, все шикарно работает!!
Есть лишь один вопрос, я занес нужные мне домены в domain_list.txt, потом понял что ошибся, и удалил ненужные. Но из мониторинга домены не удалились, пробовал и ребутать, и службу перезапускать. подскажите как удалить домены? повторюсь, в файлике domain_list.txt их нет.
Тут идея следующая. Домены были добавлены в zabbix server правилом автообнаружения. После удаления из файла они останутся на хосте еще какое-то время. По умолчанию, по-моему, неактивные элементы, добавленные через автообнаружение, удаляются через 30 дней. Это время где-то можно изменить. Так что после удаления домена из файла, надо сходить на хост, к которому прикреплен шаблон с доменами и там вручную удалить все те домены, что больше не нужны.
Есть проблемка,
zabbix-server 5.0.3
ruby-2.4.4
whois (5.0.1)
whois-parser (1.2.0)
Ошибка:
24601:20200910:164955.472 item "serveradmin.ru:domain.expire[serveradmin.ru]" became not supported: Value of type "string" is not suitable for value type "Numeric (unsigned)". Value "/usr/local/rvm/rubies/ruby-2.4.4/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:54:in `require': cannot load such file -- whois-parser (LoadError)
from /etc/zabbix/scripts/domain_left.rb:3:in `'"
Ручной запуск выводит:
/etc/zabbix/scripts/domain_left.rb serveradmin.ru
333
zabbix_agentd -t domain.expire[serveradmin.ru]
domain.expire[serveradmin.ru] [t|333]
У вас тип данных в итеме string, а приходит Numeric (число). Поменяйте на число.
Так был числовой (целое положительное). Я сейчас переписал на баше, но так же не видело числа, сменил на "Текст" - все работает.
Наверное и на руби с текстом заработало бы.
Для расширения списка проверяемых доменов, при использовании консольной утилиты, нужно дополнить /etc/whois.conf.
Например списком отсюда:
https://gist.githubusercontent.com/
Для себя взял только одну строку соотв-ю доменам site
Спасибо за информацию. Не знал об этом. Но ссылка, кажется, ошибочная.
Каюсь, вот полная ссылка:
https://gist.githubusercontent.com/thde/3890aa48e03a2b551374/raw/a10a5385a9118889cee1c6279975e2bb26ed5177/whois.conf
А проверка не тормозит с таким огромным списком? Не очень понимаю, как это должно работать. По какому сервису в итоге проверка идет?
Я для себя взял только одну строку соответствующую доменам site.
Проверка занимает больше времени (5-10 секунд), но на результат не влияет, заббикс обновляет эти итемы раз в трое суток.
Перебровав все варианты указанные в статье так и не получилось проверять зону .site, поэтому использую этот вариант.
В моем случае /etc/whois.conf выглядит так:
\.site$ whois.nic.site
\.kz$ whois.nic.kz
Для доменов в зоне .spb.ru ни один из способов не работает без модификации.
Информацию можно получить только с сервера регистратора, поэтому для консольного whois примерно так:
«whois -h whois.regtime.net sample.spb.ru», где whois.regtime.net нужно заменить для каждого домена на сервер регистратора.
Пришлось запилить ещё один скрипт под домены в этой зоне.
Спасибо, полезная информация. Тоже разок столкнулся с тем, что не мог проверить зону spb.ru Не стал заморачиваться.
скрипты через whois
Value "% 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: MAGMA.RU
nserver: ns1.r01.ru.
nserver: ns2.r01.ru.
state: REGISTERED, DELEGATED, VERIFIED
person: Private Person
registrar: RU-CENTER-RU
admin-contact: https://www.nic.ru/whois
created: 2000-10-11T20:00:00Z
paid-till: 2019-10-12T21:00:00Z
free-date: 2019-11-13
source: TCI
Last updated on 2019-05-27T10:56:33Z" of type "string" is not suitable for value type "Numeric (float)"
А не подскажете как правильнее сделать, чтобы в отчете о проблеме что у домена заканчивается срок действия так же указывалось сколько дней осталось. Например если сработал тригерр я мог видеть сколько еще дней осталось. Заранее спасибо.
Вот прям сейчас настраиваю то же самое. Тестирую новый шаблон, где в названии триггера будет автоматически подставляться остаток дней делегирования. И эта же информация будет в уведомлении на почту. Как сделаю, обновлю шаблон в статье и сообщу тут.
Два чая этому столику!
Вдруг будет полезно, покажет количество дней в Мониторинг - Проблемы
Domain {#DOMAIN} expire after {ITEM.LASTVALUE}
че то у вас скрипты не рабочие....
python whois.py ya.ru
Traceback (most recent call last):
File "whois.py", line 3, in
import whois
File "/home/nurlanizimbetov/whois.py", line 10, in
w = whois.whois(domain)
TypeError: 'module' object is not callable
./whois.py serveradmin.ru
Traceback (most recent call last):
File "./whois.py", line 3, in
import whois
File "/home/nurlanizimbetov/whois.py", line 10, in
w = whois.whois(domain)
TypeError: 'module' object is not callable
....
в ходе попыток выяснил что хреново работает с доменами в зоне .ru и .kz (вообще не запускается)
для теста facebook.com отрабатывает...
Скрипты рабочие, у меня работают в личном мониторинге. Но вот с доменами могут быть проблемы. Хотя то, что описано в статье у меня работает нормально. Уж точно с зоной .ru все в порядке. С .kz не проверял никогда. Возможно проблемы с версиями питона, либо самих библиотек.
Спасибо! Прекрасно все работает с bash, но в заббиксе не отображается expires домена. Соотвественно не рабоают алерты.
Подскажите, плиз, куда смотреть. Что править? Zabbix 4.0.0.
Я вижу что есть или появилась проблема
Если это ограничения Ruby Whois есть решение или будем делать другим способом?
/var/lib/gems/2.3.0/gems/whois-parser-1.1.0/lib/whois/scanners/base.rb:110:in `error!': Unexpected token: Please query the RDDS service of the Registrar of Record identified in this output for information on how to contact the Registrant, Admin, or Tech contact of the queried domain name. (Whois::ParserError)
from /var/lib/gems/2.3.0/gems/whois-parser-1.1.0/lib/whois/scanners/base.rb:106:in `unexpected_token'
from /var/lib/gems/2.3.0/gems/whois-parser-1.1.0/lib/whois/scanners/base.rb:102:in `tokenize'
from /var/lib/gems/2.3.0/gems/whois-parser-1.1.0/lib/whois/scanners/base.rb:29:in `parse'
from /var/lib/gems/2.3.0/gems/whois-parser-1.1.0/lib/whois/scanners/scannable.rb:53:in `parse'
from /var/lib/gems/2.3.0/gems/whois-parser-1.1.0/lib/whois/scanners/scannable.rb:59:in `ast'
from /var/lib/gems/2.3.0/gems/whois-parser-1.1.0/lib/whois/scanners/scannable.rb:38:in `node'
from /var/lib/gems/2.3.0/gems/whois-parser-1.1.0/lib/whois/parsers/base_afilias2.rb:66:in `block in '
from /var/lib/gems/2.3.0/gems/whois-parser-1.1.0/lib/whois/parsers/base.rb:398:in `block in handle_property'
from /var/lib/gems/2.3.0/gems/whois-parser-1.1.0/lib/whois/parsers/base.rb:371:in `cached_properties_fetch'
from /var/lib/gems/2.3.0/gems/whois-parser-1.1.0/lib/whois/parsers/base.rb:396:in `handle_property'
from /var/lib/gems/2.3.0/gems/whois-parser-1.1.0/lib/whois/parsers/base.rb:240:in `expires_on'
from /var/lib/gems/2.3.0/gems/whois-parser-1.1.0/lib/whois/parser.rb:361:in `delegate_property_to_parsers'
from /var/lib/gems/2.3.0/gems/whois-parser-1.1.0/lib/whois/parser.rb:327:in `expires_on'
from /var/lib/gems/2.3.0/gems/whois-parser-1.1.0/lib/whois/parser.rb:348:in `method_missing'
from /etc/zabbix/scripts/domain_left.rb:9:in `'
Аналогичная проблема с *.pro *.info *.org, но как я понимаю это ограничения Ruby Whois
Да, надо делать другую реализацию. У меня не проверяет домены .fm Никак не найду время переделать мониторинг доменов.
Да ещё на Zabbix.Server показывает что (domain.discovery) Unsupported item key.
Я добился что-бы домены начали появляться.
Но никаких данных когда заканчивается :
Domain mydomain.ru expire after (и ничего ) а дальше History :
--------------------------------------------------------------------------------------------------------------------
/usr/local/lib/ruby/gems/2.5.0/gems/whois-4.0.6/lib/whois/server/socket_handler.rb:40:in `rescue in call': Errno::EACCES: Permission denied - connect(2) for "whois.tcinet.ru" port 43 (Whois::ConnectionError)
from /usr/local/lib/ruby/gems/2.5.0/gems/whois-4.0.6/lib/whois/server/socket_handler.rb:37:in `call'
from /usr/local/lib/ruby/gems/2.5.0/gems/whois-4.0.6/lib/whois/server/adapters/base.rb:183:in `query'
from /usr/local/lib/ruby/gems/2.5.0/gems/whois-4.0.6/lib/whois/server/adapters/standard.rb:51:in `request'
from /usr/local/lib/ruby/gems/2.5.0/gems/whois-4.0.6/lib/whois/server/adapters/base.rb:113:in `block in lookup'
from /usr/local/lib/ruby/gems/2.5.0/gems/whois-4.0.6/lib/whois/server/adapters/base.rb:151:in `buffer_start'
from /usr/local/lib/ruby/gems/2.5.0/gems/whois-4.0.6/lib/whois/server/adapters/base.rb:112:in `lookup'
from /usr/local/lib/ruby/gems/2.5.0/gems/whois-4.0.6/lib/whois/client.rb:94:in `block in lookup'
from /usr/local/lib/ruby/2.5.0/timeout.rb:93:in `block in timeout'
from /usr/local/lib/ruby/2.5.0/timeout.rb:33:in `block in catch'
from /usr/local/lib/ruby/2.5.0/timeout.rb:33:in `catch'
from /usr/local/lib/ruby/2.5.0/timeout.rb:33:in `catch'
from /usr/local/lib/ruby/2.5.0/timeout.rb:108:in `timeout'
from /usr/local/lib/ruby/gems/2.5.0/gems/whois-4.0.6/lib/whois/client.rb:91:in `lookup'
from /usr/local/lib/ruby/gems/2.5.0/gems/whois-4.0.6/lib/whois.rb:35:in `lookup'
from /etc/zabbix/scripts/domain_left.rb:5:in `'
-----------------------------------------------------------------------------------------------------------------------------------
Самое интересное если делаю проверку в ручную через скрипт то выдаёт нормальные данные правильно.
И если обращаюсь на прямую whois -h whois.tcinet.ru mydomain.ru тоже отвечает правильно
Я просто не не могу понять где я ошибаюсь? Вроде всё правильно.
Если у кого то есть идея что можно исправить я был бы рад попробовать.
В шаблоне изменить "Правила обнаружения" Тип Zabbix агент "Прототипы элементов данных" Тип Zabbix агент
Также задать одинаковый "Интервал обновления"
Но это я и так сделал.
Домены он показывает, проблема в /ruby/gems/2.5.0/ как я описал выше
Установил все по вашей инструкции, заббикс агент тоже установил, скрипты при проверке в консоли выводят информацию. Также проверяю напрямую через передачу параметров в заббикс агент:
zabbix_agentd -t 'domain.expire[bash.im]'
domain.expire[bash.im] [t|323]
Значение возвращает.
Создал узел сети, добавил туда шаблон ваш, но в поле Доступность ZBX серым цветом так и остается. Куда копать?
С этим разобрался в шаблоне было указано Zabbix агент(активный), надо было выбрать просто Zabbix агент, ZBX стал зеленым, в последних данных появились домены, но данных самих нет, просто строчки с Domain xxxxxxx.com expire after без количества оставшихся дней.
У меня такая же ситуация.
Domain domain.ru expire after а в конце только Graph
Но там тоже
Daomain domain.ru [no data]
Trigger: domain.ru expire soon [<30]
Может надо что-то подправить ?
Добрый день!
Мне очень интересно как вы решили эту проблему.
Я уже попробовал многое.
Добрый день!
Только начал изучать zabbix. Спасибо большое автору за труды.
Подскажите, пожалуйста, этот пункт:
"Назначаете его хосту, в котором настроили скрипты и ждете появления данных. Минут через 5 проверяете в Latest Data"
Создал хост, назначил шаблон. Какой ставить интерфейс агента, где и какие скрипты необходимо настроить?
на команду
# /etc/zabbix/scripts/domain_left.rb serveradmin.ru
ругается
root@zabbix:/etc/zabbix/zabbix_agentd.d# /etc/zabbix/scripts/domain_left.rb serveradmin.ru
/usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require': cannot load such file -- whois (LoadError)
from /usr/lib/ruby/1.9.1/rubygems/custom_require.rb:36:in `require'
from /etc/zabbix/scripts/domain_left.rb:2:in `'
установи гем:
gem install whois-parser
RUBY - это круто...
https://mnorin.com/monitoring-daty-prodleniya-domennogo-imeni.html - так не проще?
Спасибо за ссылку, так проще. Но мне под руку сразу попался скрипт на руби, поэтому я на нем сделал. В принципе, никаких сложностей у меня не возникло. Про консольный whois я просто не знал.
в этой статье скрипт дату не верно вычисляет, вернее paid-till видимо ввиду того что при выводе результата от whois в строке paid-till стоит символ T
Так там в статье и говорится, что рассматривается три варианта представления даты, если будет четвертый, то надо писать обработку и для четвертого.Это достаточно несложно