Мониторинг 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
Требуется отредактировать массивы $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 °C / "; } $s = $session->walk("1.3.6.1.4.1.534.1.6.5.0", TRUE); foreach ($s as $val) { $pr.= " $val °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 °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 °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 запрещен)
• Рассуждать на темы политики
• Нарушать установленные правила Пикабу