-
Задача: Имеется DHCP-сервер, который должен выдавать ip-адреса по mac-адресу. Имеется Zabbix-сервер, которым мы хотим мониторить способность DHCP-сервера выполнять эту функцию. Решение под катом.
Сразу обращу внимание, что реально ip-адрес выдаваться не будет, дабы не нарушать работу Zabbix-сервера. Мы будем просто проверять, приходит ли предложение DHCPOFFER от нашего DHCP-сервера. Допустим, мак-адрес Zabbix-сервера 01:02:03:04:05:06, а ip-адрес, который нужно выдавать – 10.0.0.5. Это реализуется примерно такими строками в dhcpd.conf:
host zabbix { hardware ethernet 01:02:03:04:05:06; fixed-address 10.0.0.5; }
Теперь скачиваем исходники последней версии DHCP-клиента с официального сайта Internet Systems Consortium. Распаковываем tar.gz-архив.
Вносим мелкие исправления в исходный файл client/dhclient.c, чтобы интерфейс на время DHCP-проверки не падал, а сразу после получения пакета DHCPOFFER – завершался. Ведь больше нам ничего не нужно – DHCP-сервер реагирует, и слава богу. Итак, исправления вносятся согласно следующему diff:
# diff -c dhclient.c.orig dhclient.c *** dhclient.c.orig 2011-01-21 05:46:45.000000000 +0600 --- dhclient.c 2011-03-16 17:58:22.996064000 +0600 *************** *** 520,526 **** "alias_", ip->client->alias); } ! script_go(ip->client); } } --- 520,526 ---- "alias_", ip->client->alias); } ! // script_go(ip->client); } } *************** *** 971,976 **** --- 971,980 ---- client -> first_sending = cur_time; client -> interval = client -> config -> initial_interval; + unsigned char * addr = picked->address.iabuf; + printf("DHCPOFFER %d.%d.%d.%d",addr[0],addr[1],addr[2],addr[3]); + exit(0); + /* Make a DHCPREQUEST packet from the lease we picked. */ make_request (client, picked); client -> xid = client -> packet.xid; *************** *** 1781,1786 **** --- 1785,1792 ---- /* If we're past the panic timeout, call the script and tell it we haven't found anything for this interface yet. */ if (interval > client -> config -> timeout) { + printf("No DHCPOFFERS received."); + exit(0); state_panic (client); return; }
И выполняем такие команды (в этот момент мы находимся в каталоге с исходниками):
# make # mkdir -p /usr/local/etc/zabbix/externalscripts # cp client/dhclient /usr/local/etc/zabbix/externalscripts/dhcptest # chmod +s /usr/local/etc/zabbix/externalscripts/dhcptest
Создаем файл /usr/local/etc/zabbix/externalscripts/dhcptest.sh следующего содержания:
#!/bin/sh /usr/local/etc/zabbix/externalscripts/dhcptest eth0
Здесь eth0 – сетевой интерфейс, через который должно идти общение с DHCP-сервером.
На данном этапе должно работать выполнение скрипта dhcptest.sh от имени любого пользователя. В случае успеха скрипт говорит DHCPOFFER 10.0.0.5, а если адрес получить не удается – No DHCPOFFERS received..
Теперь задействуем все это хозяйство в мониторинге Zabbix следующим образом. Item можно прикрепить к конкретному хосту, или к шаблону (как на скриншоте) – как вам удобнее:
Также по желанию можно включить триггер:
Теперь пробуем выключить DHCP-сервер, и наш мониторинг должен в течение 30 секунд нас проинформировать.
Огромное спасибо! Воспользовался Вашим решением для мониторинга, всё отлично. Правда, от имени пользователя у меня почему-то не работает – просто ничего не выводит.
почему не выложил готовый файл? сейчас файлы dhcpclient уже сильно отличаются от того что было…