Мониторинг даты освобождения домена в Zabbix при помощи whois
Постановка задачи
Имеем несколько доменов, необходимо мониторить не просрочена ли оплата и продлен ли домен.
Обычно если домен не продлен, то через 30 дней он освобождается. Нижеприведенный скрипт и шаблон для zabbix проверяют дату "Expire" домена, и если до нее осталось менее чем 28 дней (это значит домен не продлен), то срабатывает триггер.
Скрипты
Список доменов кладем в файл /etc/zabbix/scripts/domains.txt
domain1.ru domain2.com
Discovery - cкрипт /etc/zabbix/scripts/domain_discovery.sh
1 2 3 4 5 | #!/bin/bash JSON=$(for i in `cat /etc/zabbix/scripts/domains.txt | grep -v '#'`; do printf "{\"{#DOMAIN}\":\"$i\"},"; done | sed 's/^\(.*\).$/\1/') printf "{\"data\":[" printf "$JSON" printf "]}" |
Скрипт мониторинга /etc/zabbix/scripts/domain_left_days_before_expire.pl
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 60 61 62 | #!/usr/bin/perl use strict; use warnings; use DateTime; use DateTime::Format::DateParse; # yum install perl-DateTime-Format-DateParse use DateTime::Format::Natural; # yum install perl-DateTime-Format-Natural use Data::Dumper; # ====== Preferences and constants ====== # my $debug=0; my $WHOIS = '/usr/bin/whois'; my $expire; # ========= End of preferences ========== # my $domain = shift; die "Usage: $0 <domain>\n" if !$domain; exit if $domain eq '#'; my @OUT = `$WHOIS $domain`; foreach my $line (@OUT) { chomp $line; # Registry Expiry Date: 2021-10-13T20:03:46Z if ($line =~ /.*Expiry.*:\s(.+)$/i) { print "Rule nuber 1 faired! \n" if $debug; $expire = DateTime::Format::DateParse->parse_datetime($1)->epoch; } # Record expires on: Sat Feb 8 16:51:25 2020 if ($line =~ /.*expires.*:\s(.+)$/i) { print "Rule nuber 2 faired! \n" if $debug; $expire = DateTime::Format::DateParse->parse_datetime($1)->epoch; } # free-date: 2020-01-14 if ($line =~ /.*free-date.*:\s(.+)$/i) { print "Rule nuber 3 faired! \n" if $debug; $expire = DateTime::Format::DateParse->parse_datetime($1)->epoch; } # expire: 22.10.2020 if ($line =~ /expire:\s+(.+)$/i) { print "Rule nuber 4 faired! \n" if $debug; my $parser = DateTime::Format::Natural->new; $expire = $parser->parse_datetime($1)->epoch; } # Expiration Date: 10-oct-2020 if ($line =~ /^Expiration Date:\s(\d+-\S+-\d+)$/) { print "Rule nuber 5 faired! \n" if $debug; $expire = DateTime::Format::DateParse->parse_datetime($1)->epoch; } # Expiration Date:22-Oct-2021 10:32:44 UTC if ($line =~ /^Expiration Date:(\d+-\S+-\d+ \d+:\d+:\d+ \S+)$/) { print "Rule nuber 6 faired! \n" if $debug; $expire = DateTime::Format::DateParse->parse_datetime($1)->epoch; } } die "Unable get expire for domain $domain" if !$expire; print "Doman: $domain expire: $expire \n" if $debug; #print $expire->strftime('%F %T'),"\n"; my $now = time; my $time_left=int(($expire-$now)/60/60/24); print "$time_left \n"; |
Конфиг userparameter /etc/zabbix/zabbix_agentd.d/domain.conf
UserParameter=domain.discovery[*], /bin/bash /etc/zabbix/scripts/domain_discovery.sh UserParameter=domain.expire[*], /etc/zabbix/scripts/domain_left_days_before_expire.pl $1
Шаблон для zabbix:
Шаблон для версии Zabbix 4.0.6: Domain_Expiration.zip
Enjoy!