Поставили мне недавно цель – мониторить аптаймы всех коммутаторов в реальном времени и обязательно с удобным интерфейсом. Так как свитчи уже мониторились с помощью Cacti, то и копать я начал в эту сторону. Увы, сам Cacti хоть и получает SNMP-Uptime коммутаторов, но вот выводит его только в странице самого устройства, а когда таких устройств хотя бы больше 100, открывать страницу каждого становится неудобно. Надо свести их в единую таблицу. Для этого пригодиться плагин monitor. Сам по себе он умеет только отслеживать есть ли связь с устройством или нет, и когда оно последний раз отключалось. Гугл на все мои запросы относительно плагинов, расширяющих сей функционал выдавал только плагин monitor_uptime, который, в общем-то, должен был подойти, и тогда статьи бы не было, но, увы, он не подошел (а точнее из-за него переставал отображаться весь Cacti) и мне пришлось дописывать нужный функционал в код самого плагина monitor.
Код плагина написан на PHP, потому особых сложностей в редактировании не представляет. Для получения данных с оборудования были использованы стандартные PHP функции snmpget и snmp2_get, которым в качество аргументов передаются параметры хоста из БД Cacti, OID аптайма и таймаут ожидания. В итоге код получения аптайма вышел такой:
Была мысль вынести его в отдельную функцию и вызывать в нужном месте, но, в итоге решил не морочиться и просто интегрировал его в функцию render_host_tiles, которая, собственно, и рисует сводную таблицу всех устройств. Также в саму таблицу добавим строку
После этого сохраняем, открываем Cacti и да здравствует uptime в реальном времени и удобном отображении
P.S. Первый раз после доработки страница плагина может грузиться несколько минут(пока опросит все оборудование), в дальнейшем работает резво и комфортно. В итоге выходит вот такая красота:

Код плагина написан на PHP, потому особых сложностей в редактировании не представляет. Для получения данных с оборудования были использованы стандартные PHP функции snmpget и snmp2_get, которым в качество аргументов передаются параметры хоста из БД Cacti, OID аптайма и таймаут ожидания. В итоге код получения аптайма вышел такой:
$snmp_uptime = " N\A";
include("../../include/config.php");
mysql_connect($database_hostname,$database_username,$database_password) OR DIE(mysql_error());
mysql_select_db($database_default) OR DIE(mysql_error());
$sql="SELECT * FROM `host` where `id`=$id";
$sql_res=mysql_query($sql) OR DIE(mysql_error());
while ($host=mysql_fetch_array($sql_res)){
if ($host["snmp_version"] == '1'){
$snmp_uptime = snmpget($host["hostname"],$host["snmp_community"],".1.3.6.1.2.1.1.3.0",55000);}
else if ($host["snmp_version"] == '2'){
$snmp_uptime =snmp2_get($host["hostname"],$host["snmp_community"],".1.3.6.1.2.1.1.3.0",55000);}
$str=strpos($snmp_uptime, ")");
$snmp_uptime = substr($snmp_uptime,$str+1);}
Была мысль вынести его в отдельную функцию и вызывать в нужном месте, но, в итоге решил не морочиться и просто интегрировал его в функцию render_host_tiles, которая, собственно, и рисует сводную таблицу всех устройств. Также в саму таблицу добавим строку
<tr bgcolor='#eeeeee'>
<td><strong>Uptime:</strong></td>
<td><strong>$snmp_uptime</strong></td>
</tr>
После этого сохраняем, открываем Cacti и да здравствует uptime в реальном времени и удобном отображении
P.S. Первый раз после доработки страница плагина может грузиться несколько минут(пока опросит все оборудование), в дальнейшем работает резво и комфортно. В итоге выходит вот такая красота:
