Мониторинг UPS APC и EATON
Не секрет, что ПО для мониторинга состояния UPS тяжеловесно и не бесплатно.
Ниже представлен скрипт мониторинга APC и EATON, оснащенных сетевыми платами посредством SNMP.
Требуется установленный Apache и PHP с модулем php-snmp.
Отредактируйте массивы $urls для еатонов и $urls2 для APC, разрешите SNMP-1 public на чтение и настройте крон для отправки ежедневных писем.
-
<?php
-
// apt-get install php5-snmp
-
// snmp 1 public readonly
-
-
$urls = array( // eatons
-
# "10.10.10.25",
-
"10.10.10.55",
-
"10.10.10.57",
-
"10.10.10.54",
-
"10.10.10.58",
-
"10.10.10.56",
-
"10.10.10.225",
-
"10.10.10.224",
-
"10.10.10.232",
-
"10.10.10.222",
-
"10.10.10.226",
-
"10.10.10.227",
-
"10.10.10.228",
-
"10.10.10.220",
-
# "10.10.10.221",
-
"10.10.10.234",
-
"192.168.0.60"
-
-
);
-
$urls2 = array( // APC
-
"192.168.0.25",
-
"10.10.10.61",
-
"10.10.10.233",
-
"10.10.10.59",
-
"10.10.10.231",
-
# "10.10.10.229",
-
"10.10.10.230"
-
-
);
-
-
// APC OIDs:
-
// https://www.opsview.com/resources/monitoring/blog/monitoring-apc-ups-useful-oids
-
// https://wiki.it-kb.ru/apc/apc-nmc-oids-for-snmp-monitoring
-
// EATON OIDs
-
// https://wiki.it-kb.ru/eaton/eaton-powerware-nmc-oids-for-snmp-monitoring
-
-
// if(isset($_GET['act'])) $act=$_GET["act"]; else $act='';
-
$act=$argv[1];
-
-
-
#$db = new SQLite3(dirname(__FILE__).'/phpliteadmin/stats.db');
-
$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); // Reason for last transfer
-
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 />
-
-
if($act=='') echo $pr;
-
if($act=='dailyreport')
-
{
-
$to="st@mycompany.ru"; // Адрес получателя
-
$subject="UPSs daily report";
-
$body="$pr";
-
$headers = "Content-type: text/html; charset=utf-8\r\n";
-
$headers .= "From: ups@mycompany.ru ";
-
mail($to, $subject, $body, $headers);
-
}
-
-
?>
-
Lisolog (C) / 2019