Для решения проблемы я завязал Apache + php + mysql + net-snmp.
В БД лежат IP девайсов, php через внешние запросы отрисовывает состояния портов.
Скрипт получился такой:
- Код: Выделить всё
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
<title>CISCO MONITOR</title>
</head>
<body>
<?php
$db_host=""; // сервер.
$db_user=""; //логин
$db_pass=""; //пароль
$db_name=""; //имя БД
mysql_connect($db_host, $db_user, $db_pass) or die ("Connection Error");
mysql_select_db($db_name) or die ("Database not found");
exec("/bin/echo -n '' > /usr/local/www/cisco/switches.txt ");
$QUERY="SELECT switch_ip FROM `CISCO-3548`;";
$RES = mysql_query($QUERY) or die(mysql_error);
function getCiscoStatus($ip) {
exec("/bin/echo -n ".$ip."' '"." >> /usr/local/www/cisco/switches.txt ");
exec("/bin/echo `/usr/local/bin/snmpwalk -v 2c -c public ".$ip." sysName.0 | /usr/bin/awk '{print $4}' ` >> /usr/local/www/cisco/switches.txt ");
exec("/bin/echo `/usr/local/bin/snmpwalk -v 2c -c public ".$ip." ifAdminStatus | /usr/bin/awk '{print $4}' ` >> /usr/local/www/cisco/switches.txt ");
exec("/bin/echo `/usr/local/bin/snmpwalk -v 2c -c public ".$ip." ifOperStatus | /usr/bin/awk '{print $4}' ` >> /usr/local/www/cisco/switches.txt ");
exec("/bin/echo `/usr/local/bin/snmpwalk -v 2c -c public ".$ip." ifSpeed | /usr/bin/awk '{print $4}' ` >> /usr/local/www/cisco/switches.txt ");
}
function getCiscoStatusExt($ip, $port) {
exec("/bin/echo -n '' > /usr/local/www/cisco/switch_info.txt ");
exec("/usr/local/bin/snmpwalk -v 2c -c public ".$ip." system >> /usr/local/www/cisco/switch_info.txt ");
exec("/usr/local/bin/snmpwalk -v 2c -c public ".$ip." mib-2.16.19.6 >> /usr/local/www/cisco/switch_info.txt ");
if (isset($port)) {
exec("/bin/echo -n '' > /usr/local/www/cisco/port_info.txt ");
exec("/usr/local/bin/snmpget -v 2c -c public ".$ip." ifAdminStatus.".$port." >> /usr/local/www/cisco/port_info.txt ");
exec("/usr/local/bin/snmpget -v 2c -c public ".$ip." ifOperStatus.".$port." >> /usr/local/www/cisco/port_info.txt ");
exec("/usr/local/bin/snmpget -v 2c -c public ".$ip." ifSpeed.".$port." >> /usr/local/www/cisco/port_info.txt ");
exec("/usr/local/bin/snmpget -v 2c -c public ".$ip." ifDescr.".$port." >> /usr/local/www/cisco/port_info.txt ");
exec("/usr/local/bin/snmpget -v 2c -c public ".$ip." ifPhysAddress.".$port." >> /usr/local/www/cisco/port_info.txt ");
exec("/usr/local/bin/snmpget -v 2c -c public ".$ip." ifInErrors.".$port." >> /usr/local/www/cisco/port_info.txt ");
exec("/usr/local/bin/snmpget -v 2c -c public ".$ip." ifOutErrors.".$port." >> /usr/local/www/cisco/port_info.txt ");
}
}
if (isset($_GET["ip"])) {
getCiscoStatus($_GET["ip"]);
getCiscoStatusExt($_GET["ip"], $_GET["port"]);
}
else {
while($row = mysql_fetch_array($RES)) {
getCiscoStatus($row['switch_ip']);
}
}
function parseMib($fileName)
{
$name = "";
$descript = "";
if (isset($_GET["ip"])) {
$fp = fopen($fileName, 'rt');
if ($fp) {
echo "<TABLE border = 1 cellpadding = 4 cellspacing = 0>";
while (!feof($fp)) {
$mytext = fgets($fp, 999);
if (($x=strpos($mytext, "::")) > 0) {
if ($name !="") {
echo "<TR>";
echo "<TD>$name</TD> <TD>$descript</TD>";
echo "</TR>";
}
$x1 = strpos($mytext, ":", $x + 2);
$name = substr($mytext, $x + 2, $x1 - $x - 2);
$name = substr($name, 0, strpos($name, " = ") - 2);
$descript = substr($mytext, $x1 + 1);
if (substr($name, 0, 7) == "ifSpeed") {
$descript /= 1000000;
$descript .= " Mbit/s";
}
}
else {
$descript .= $mytext."<BR>";
}
}
if ($name !="") {
echo "<TR>";
echo "<TD>$name</TD> <TD>$descript</TD>";
echo "</TR>";
}
echo "</TABLE>";
}
else
echo "Ошибка при открытии файла<br>";
fclose($fp);
}
}
function parseString($s) {
$last = 0;
$x = 0;
while (($pos = strpos($s, " ", $last)) > 0) {
$str = substr($s, $last, $pos - $last);
if (strlen($str) > 2 ) {
if ($str == "up(1)")
$ret[$x++] = 1;
elseif ($str == "down(2)")
$ret[$x++] = 0;
elseif ($str == "10000000")
$ret[$x++] = 2;
elseif ($str == "100000000")
$ret[$x++] = 3;
}
$last = $pos + 1;
}
return $ret;
}
if (isset($_GET["ip"])) {
echo "<A href = \"index.php\">К общему списку</A><BR><BR>";
}
$fp = fopen('switches.txt', 'rt');
$strType = 0;
if ($fp) {
while (!feof($fp)) {
$mytext = fgets($fp, 999);
if ($strType == 0 && $mytext != "") {
$ip = substr($mytext, 0, strpos($mytext, " "));
if (!isset($_GET["ip"])) echo "<A href = \"index.php?ip=$ip\">";
echo $mytext;
if (!isset($_GET["ip"])) echo "</A><br>";
}
if ($strType == 1) {
$adminStatus = parseString($mytext);
}
if ($strType == 2) {
$operStatus = parseString($mytext);
}
if ($strType == 3) {
$Speed = parseString($mytext);
echo "<TABLE>";
echo "<TR>";
for ($i = 1; $i < count($adminStatus) && $i < count($operStatus) && $i < count($Speed) && $i < 49; $i++) {
$color = "white";
if ($adminStatus[$i] == 1 && $operStatus[$i] == 1) $color = "green";
if ($adminStatus[$i] == 1 && $operStatus[$i] == 0) $color = "red";
if ($adminStatus[$i] == 0 && $operStatus[$i] == 0) $color = "gray";
if ($operStatus[$i] == 1 && $Speed[$i] == 2) $color = "orange";
echo "<TD ALIGN=center BGCOLOR=\"$color\"> ";
if (isset($_GET["ip"]) && ($i+1) != $_GET["port"]) {
echo "<A href = \"index.php?ip=$ip&port=" . ($i+1) . "\">$i</A>";
}
else {
echo $i;
}
echo " </TD>";
if ($i == 24) echo "</TR><TR>";
}
echo "</TR>";
echo "</TABLE><BR><BR>";
}
$strType = ($strType+1) % 4;
}
}
else
echo "Ошибка при открытии файла<br>";
fclose($fp);
if (isset($_GET["ip"])) {
echo "<B>Параметры устройства</B><BR>";
parseMib('switch_info.txt');
}
if (isset($_GET["port"])) {
echo "<BR><B>Параметры порта ". ($_GET["port"] - 1) . "</B><BR>";
parseMib("port_info.txt");
}
?>
</body>
</html>
Таблица БД:
- Код: Выделить всё
CREATE TABLE `CISCO-3548` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`switch_ip` varchar(255) NOT NULL,
`switch_model` varchar(255) NOT NULL,
`community` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=419 DEFAULT CHARSET=latin1;
В таблицу добавил поле community. Пока не стал использовать, т.к. пока у меня все community являются public, но, думаю, переписать не долго.
Прошу сильно не пинать.
ЗЫ. При разработке можно было бы использовать /usr/ports/net-mgmt/php52-snmp .