CISCO Webviewer

Скрипты PHP, PERL и т.п. помогающие управлять сетью

CISCO Webviewer

Сообщение Андрей » 05 июл 2010, 05:32

Привет всем. Столкнулся с проблемкой - как мониторить порты CISCO 3548 (Админский статус, текущий статус и т.п.). Согласитесь, что не удобно просматривать состояние свитча через текстовый документ, особенно когда это все выложено в ряд с 1 по 50 порт?
Для решения проблемы я завязал 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\">&nbsp;";
          if (isset($_GET["ip"]) && ($i+1) != $_GET["port"]) {
            echo "<A href = \"index.php?ip=$ip&port=" . ($i+1) . "\">$i</A>";
          }
          else {
            echo $i;
          }
          echo "&nbsp;</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 :).
.ı|ı..ı|ı.
Андрей
местный житель
 
Сообщения: 1028
Зарегистрирован: 14 янв 2009, 13:37
Откуда: Оренбургская область

Re: CISCO Webviewer

Сообщение root » 05 июл 2010, 11:17

1. от комъюнити по дефолту (public - чтение, private - запись) нужно избавляться, не секъюрно это
2. не совсем поянтно зачем текстовые файлы если все можно отрисовывать на экран налету
С уважением, root

Изображение
------------
www.mega-net.ru - IT аутсорсинг
Аватара пользователя
root
Site Admin
 
Сообщения: 1872
Зарегистрирован: 11 июн 2008, 13:05
Откуда: Moscow, Russia

Re: CISCO Webviewer

Сообщение Андрей » 05 июл 2010, 13:43

root писал(а):2. не совсем поянтно зачем текстовые файлы если все можно отрисовывать на экран налету

У меня парсится конечный файл.
В моем случае на экран отрисовывается данные обовсех свитчах.
Как на лету отрисовывать не знаю. Да и, ИМХО, парсить фал быстрее будет (хотя спорить не буду).
.ı|ı..ı|ı.
Андрей
местный житель
 
Сообщения: 1028
Зарегистрирован: 14 янв 2009, 13:37
Откуда: Оренбургская область

Re: CISCO Webviewer

Сообщение root » 06 июл 2010, 14:47

Андрей писал(а):Да и, ИМХО, парсить фал быстрее будет (хотя спорить не буду).

и не спорь, не быстрее, т.к. в файл записать сначала надо

Андрей писал(а):Как на лету отрисовывать не знаю.

php`ой и отрисовывать
получил данные, обработал и сразу вывел на экран
отображаем статус линка на порту, в виде текста и картинки:
Код: Выделить всё
$port="11";
$sw_ip="10.10.10.10";
$sw_com_ro="ro_community";
 $snmp_stat=@snmpget($sw_ip,$sw_com_ro,sprintf("1.3.6.1.2.1.2.2.1.8.%d",$port));     
//INTEGER: up(1) INTEGER: down(2)
if (preg_match("/^INTEGER:\s+(\S+)\((\d{1})\)/",$snmp_stat,$match)){
                            if ($match[1]=="up"&&$match[2]=="1"){
                                printf("[Статус порта: Link up <img src=\"%s/images/up.gif\" alt=\"Link up\" title=\"Link up\">]<BR>",$_SERVER['HTTP_HOST']);
                            }elseif($match[1]=="down"&&$match[2]=="2"){
                                printf("[Статус порта: Link down <img src=\"%s/images/down.gif\" alt=\"Link down\" title=\"Link down\">]<BR>",$_SERVER['HTTP_HOST']);
                            }else{
                                print "Статус порта неизвестен<BR>";
                            }
}

тоже самое и по admin статусу порта, тока OID другой:
1.3.6.1.2.1.2.2.1.7.PORT_NUM
С уважением, root

Изображение
------------
www.mega-net.ru - IT аутсорсинг
Аватара пользователя
root
Site Admin
 
Сообщения: 1872
Зарегистрирован: 11 июн 2008, 13:05
Откуда: Moscow, Russia

Re: CISCO Webviewer

Сообщение Андрей » 06 июл 2010, 19:17

Хм. Достаточно интересный подход.
Вот только с MIB/OID разбираться надо. Просто хочется выдать все из девайса, а не получается. walk не сделать, да и портов, судя по MIB на порядок больше.
.ı|ı..ı|ı.
Андрей
местный житель
 
Сообщения: 1028
Зарегистрирован: 14 янв 2009, 13:37
Откуда: Оренбургская область

Re: CISCO Webviewer

Сообщение lehisnoe » 07 июл 2010, 08:20

Андрей писал(а):Просто хочется выдать все из девайса, а не получается. walk не сделать, да и портов, судя по MIB на порядок больше.

Советую поглядеть на SNMP-навигатор от циско (линк на него и на другие полезные вещи есть у нас на сайте в разделе Полезные ссылки).
No users
No troubles
No money
------------
www.mega-net.ru - IT аутсорсинг
Аватара пользователя
lehisnoe
Site Admin
 
Сообщения: 537
Зарегистрирован: 11 июн 2008, 14:09
Откуда: Moscow

Re: CISCO Webviewer

Сообщение Андрей » 07 июл 2010, 09:27

lehisnoe писал(а):Советую поглядеть на SNMP-навигатор от циско (линк на него и на другие полезные вещи есть у нас на сайте в разделе Полезные ссылки).

не помогает. :(
Проблема в другом. Выполняю snmpwalk. Получаю листинг. В нем есть пункт:
IfOperStatus.N, где N - числа от 1 до 52. Не приятная вещь в следующем:
IfOperStatus.1 - Это VLAN1
IfOperStatus.2 - Это FastEthrtnet.0/1
IfOperStatus.49 - Это FastEthrtnet.0/48
Потом гибики идут. Но есть ифейс, на нем даже скорость ifSpeed.52=4294967295.

Что за порт - не ясно. Быть может шина.
.ı|ı..ı|ı.
Андрей
местный житель
 
Сообщения: 1028
Зарегистрирован: 14 янв 2009, 13:37
Откуда: Оренбургская область

Re: CISCO Webviewer

Сообщение lehisnoe » 07 июл 2010, 10:29

Но есть ифейс, на нем даже скорость ifSpeed.52=4294967295.

Глянь ifDescr.52 - оно напишет тебе, что это за ифейс
No users
No troubles
No money
------------
www.mega-net.ru - IT аутсорсинг
Аватара пользователя
lehisnoe
Site Admin
 
Сообщения: 537
Зарегистрирован: 11 июн 2008, 14:09
Откуда: Moscow

Re: CISCO Webviewer

Сообщение Андрей » 07 июл 2010, 11:01

lehisnoe писал(а):
Но есть ифейс, на нем даже скорость ifSpeed.52=4294967295.

Глянь ifDescr.52 - оно напишет тебе, что это за ифейс

NULL0
.ı|ı..ı|ı.
Андрей
местный житель
 
Сообщения: 1028
Зарегистрирован: 14 янв 2009, 13:37
Откуда: Оренбургская область

Re: CISCO Webviewer

Сообщение lehisnoe » 07 июл 2010, 11:54

Null0 - всегда присутствует на железках от циско ;-).
И хотя по
Код: Выделить всё
sh run
ты его не увидишь, тем не менее, возможно увидеть его статус и стату по
Код: Выделить всё
sh int null0
No users
No troubles
No money
------------
www.mega-net.ru - IT аутсорсинг
Аватара пользователя
lehisnoe
Site Admin
 
Сообщения: 537
Зарегистрирован: 11 июн 2008, 14:09
Откуда: Moscow

След.

Вернуться в Программинг и сети

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

cron