Мониторинг UPS APC и EATON

В предыдущемпосте была показана реализация аппаратной riktak-коробочки на esp8266 со smart протоколом для APC. По реакции мнения разделились: Кто-то сказал "купи сетевую плату за 3 рубля" или добавь еще что-то, или "нафига это, когда есть то". Но в общем есть, то что есть. И да, по работе мне приходится мониторить бесперебойники, и да, в них есть сетевые карты - они разные и не все идеально работают.

Сейчас хотелось бы поделиться скриптом на PHP для мониторинга бесперебойников APC и EATON по snmp.

Предупреждая комментарии, я знаю что такое ZABBIX и также им всё мониторю и я знаю, что такое APC powerChute - это всё громоздко и ресурсоёмко. Свести визуально воедино ни заббиксом и чем-то другим не получилось.

Скрипт написал для собственного удобства - может кому-то сгодится.

Требования: apache/nginx + php + php-snmp и включенный snmp1 на чтение в устройствах.

Возможности:

1- показ состояния бесперебойников, всяких температур, напряжений, оставшегося времени в одной таблице - красоту сами наводите.

2 - с аргументом dailyreport отправляет на почту (нужное исрпавить).

Должно получиться примерно следующее

Мониторинг UPS APC и EATON Apc, PHP, Системное администрирование, Длиннопост

Мониторинг UPS APC и EATON

Требуется отредактировать массивы $urls и $urls2, добавив список свйих УПС, а также почтовые адреса, если нужны рассылки.

Сильно не пинайте, чукча - не чукча и тд..

Источник или немного кода ниже:

<?php

// apt-get install php-snmp

// snmp 1 public readonly

$urls = array( // eatons

"192.168.1.55",
"192.168.1.57",
"192.168.1.16",
"192.168.1.60"
);

$urls2 = array( // APC

"192.168.1.25", "192.168.1.239",
"192.168.1.230",
"192.168.1.231" );

$pr="<html><body><table width= \"100%\" border=\"1\" cellpadding='5' cellspacing=\"0\"> <tr bgcolor=\"#ddd\" style=\"background-color:#ddd\"> <td>IP</td> <td>Расположение</td> <td>Модель</td> <td>Источник питания</td> <td>Нагрузка<br />%</td> <td>Зарядка<br />%</td> <td>Оставшееся<br>время</td> <td>Состояние<br />батареи</td> <td>Температура <br />(вн/нар)/Влажн.</td> </tr>";

for ($i = 0; $i<count($urls); $i++)

{

$pr.="<tr><td><a href=\"http://".$urls[$i]."/\" target=\"_blank\">".$urls[$i]."</a></td>";

$session = new SNMP(SNMP::VERSION_1, $urls[$i], "public");

$session->valueretrieval = SNMP_VALUE_PLAIN; $s = $session->walk("1.3.6.1.2.1.1.5.0", TRUE);

foreach ($s as $val)

{

$pr.= "<td><b>$val</b></td>";

}

$s = $session->walk("1.3.6.1.2.1.33.1.1.2.0", TRUE);

foreach ($s as $val)

{

$pr.= "<td><b><font color=\"#00f\" style=\"color:#00f;\">$val</font></b></td>"; }

$s = $session->walk("1.3.6.1.4.1.534.1.3.4.1.2.1", TRUE);

foreach ($s as $val) { $pr.= "<td>$val Volt</b></td>"; }

$s = $session->walk("1.3.6.1.4.1.534.1.4.1.0", TRUE); foreach ($s as $val) { $pr.= "<td align='right'></b>$val %</td>"; }

$s = $session->walk("1.3.6.1.4.1.534.1.2.4.0", TRUE); foreach ($s as $val) { $pr.= "<td align='right'>$val %</td>"; } $s = $session->walk("1.3.6.1.4.1.534.1.2.1.0", TRUE); foreach ($s as $val) {

$pr.= "<td>".round($val/60)." min</td>"; }

$s = $session->walk("1.3.6.1.4.1.705.1.5.9.0", TRUE); foreach ($s as $val) if($val=="2") $res1 = 2; else $res1 = 1; $s = $session->walk("1.3.6.1.4.1.705.1.5.15.0", TRUE); foreach ($s as $val) if($val=="2") $res2 = 2; else $res2 = 1; $s = $session->walk("1.3.6.1.4.1.705.1.5.11.0", TRUE); foreach ($s as $val) if($val=="2") $res3 = 2; else $res3 = 1; if($res1==2 && $res2==2 && $res3==2)

$pr.="<td bgcolor=\"#9d9\" style=\"background-color:#9d9\">OK</td>";

else

$pr.="<td bgcolor=\"#d99\" style=\"background-color:#d99\">fault</td>"; $s = $session->walk("1.3.6.1.4.1.534.1.6.1.0", TRUE); foreach ($s as $val) { $pr.= "<td>$val &deg;C / "; } $s = $session->walk("1.3.6.1.4.1.534.1.6.5.0", TRUE); foreach ($s as $val) { $pr.= " $val &deg;C /"; } $s = $session->walk("1.3.6.1.4.1.534.1.6.6.0", TRUE); foreach ($s as $val) { $pr.= " $val %</td>"; }

$session->close();

$pr.="</tr>\r\n";

}

for ($i = 0; $i<count($urls2); $i++)

{

$pr.="<tr><td><a href=\"http://".$urls2[$i]."/\" target=\"_blank\">".$urls2[$i]."</a></td>";

$session = new SNMP(SNMP::VERSION_1, $urls2[$i], "public");

$session->valueretrieval = SNMP_VALUE_PLAIN; $s = $session->walk("1.3.6.1.4.1.318.1.1.1.1.1.2.0", TRUE); foreach ($s as $val)

{

$pr.= "<td><b>$val</font></b></td>"; }

$s = $session->walk("1.3.6.1.4.1.318.1.1.1.1.1.1.0", TRUE); foreach ($s as $val) { $pr.= "<td><b><font color=\"#f00\" style=\"color:#f00;\">$val</font></b></td>"; }

$s = $session->walk("1.3.6.1.4.1.318.1.1.1.3.2.1.0", TRUE); foreach ($s as $val) { $pr.= "<td>$val Volt</b></td>"; }

$s = $session->walk("1.3.6.1.4.1.318.1.1.1.4.2.3.0", TRUE); foreach ($s as $val) { $pr.= "<td align='right'></b>$val %</td>"; }

$s = $session->walk("1.3.6.1.4.1.318.1.1.1.2.2.1.0", TRUE); foreach ($s as $val) { $pr.= "<td align='right'>$val %</td>"; } $s = $session->walk("1.3.6.1.4.1.318.1.1.1.2.2.3.0", TRUE); foreach ($s as $val)

{ $pr.= "<td>".($val/100/60)." min</td>"; }

$s = $session->walk("1.3.6.1.4.1.318.1.1.1.2.2.4.0", TRUE); foreach ($s as $val) if($val=="1")

{ $pr.= "<td bgcolor=\"#9d9\" style=\"background-color:#9d9\">OK</td>"; }

else

{ $pr.= "<td bgcolor=\"#d99\" style=\"background-color:#d99\">fault</td>"; }

$s = $session->walk("1.3.6.1.4.1.318.1.1.1.2.2.2.0", TRUE); foreach ($s as $val) { $pr.= "<td>$val &deg;C /"; }

$s = $session->walk("1.3.6.1.4.1.318.1.1.25.1.2.1.6", TRUE); foreach ($s as $val) { $pr.= "$val &deg;C /"; }

$s = $session->walk("1.3.6.1.4.1.318.1.1.25.1.2.1.7", TRUE); foreach ($s as $val) { $pr.= "$val %</td>"; }

$s = $session->walk("1.3.6.1.4.1.318.1.1.1.3.2.5.0", TRUE);

foreach ($s as $val)

{ $pr.= "<td>LTtB:$val</td>"; }

$session->close();

$pr.="</tr>\r\n";

}

$pr.="</table>";

$pr.="<br /><font color=\"#00f\" style=\"color:#00f;\">EATON</font> <font color=\"#f00\" style=\"color:#f00;\">APC</font><br />";

$pr.="APC reason for last transfer (LTtB) to battery power<br /> <p>1 No events<br /> 2 High line voltage<br /> 3 Brownout<br /> 4 Loss of mains power<br /> 5 Small temporary power drop<br /> 6 Large temporary power drop<br /> 7 Small spike<br /> 8 Large spike<br /> 9 UPS self test<br /> 10 Excessive input voltage fluctuation</p><br /> <a href=\"#\">Обновить скрипт УПС</a></body></html>";

if($act=='') echo $pr;

if($act=='dailyreport')

{

$to="admin@domain.ru";

$subject="UPSs daily report";

$body="$pr";

$headers = "Content-type: text/html; charset=utf-8\r\n"; $headers .= "From: ups@domain.ru ";

mail($to, $subject, $body, $headers);

}

?>

Arduino & Pi

1.4K постов20.6K подписчик

Добавить пост

Правила сообщества

В нашем сообществе запрещается:

• Добавлять посты не относящиеся к тематике сообщества, либо не несущие какой-либо полезной нагрузки (флуд)

• Задавать очевидные вопросы в виде постов, не воспользовавшись перед этим поиском

• Выкладывать код прямо в посте - используйте для этого сервисы ideone.com, gist.github.com или схожие ресурсы (pastebin запрещен)

• Рассуждать на темы политики

• Нарушать установленные правила Пикабу