faq обучение настройка
Текущее время: Ср июл 30, 2025 15:37

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу 1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: Вс июн 24, 2007 03:17 
Не в сети

Зарегистрирован: Пн янв 08, 2007 15:38
Сообщений: 215
Откуда: Norilsk
PHP скрипты управления по типу Telnet с использование БД Mysql

По многочисленым прозьбам , и в виду альтернативы отсутствия WiKi, а также как и обещал.
Выкладываю скрипты которые уже успешно работают. ( проверено на моделях DES 3526 & DGS 3324SR )
Немного описания , что и с чем едят.
Данные скрипты запускаются путем запуска BaseDemon.php из под консоли ( у меня он запускается как служба).
Работают с Mysql базой откуда берут команды , а также пишут логи о выполнении. Почему имено Mysql? -> ответ очевиден скрипты работают совместно с самописным биллингом , он в свою очередь и создаёт список команд.

Данное решение себя оправдывает , т.к не использует ни системные файлы ( как было в других решениях , типа telnet и прочего ) , не использует SNMP ( было уже доказано , что работает он немного медленее , а также нельзя многово выполнить ).
Т.е практически все что можно выполнять из под консоли можно выполнять и тут.
( неумею я расписывать описания и прочие , кто знает PHP тот всё поймёт надеюсь =) )

для начала нам необходимо создать 2 таблицы в Mysql ( можно и одну если логи не нужны )
если внимательно посмотреть то будет понятно , специально оставляю кусочек логов и одну из комманд ( ps свичи привязаны по dns поэтому их ip нет )
Mysql Таблица с командами.
Код:
CREATE TABLE `nbotu_comander` (
  `id` int(100) unsigned NOT NULL auto_increment,
  `comanda` text,
  `action` varchar(255) default '0',
  `router` varchar(80) default '0',
  `router_ip` varchar(15) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

INSERT INTO `nbotu_comander` (`id`, `comanda`, `action`, `router`, `router_ip`) VALUES("218208", "config access_profile profile_id 100 delete access_id 2149 ", "Удаление ACL <b>2149</b> с маком <b>00-15-58-3E-79-51</b> port 9", "sw.pm14.lan", "172.22.5.254");

Таблица с логами.
Код:
 
CREATE TABLE `nbotu_comand_complete` (
  `id` int(100) unsigned NOT NULL auto_increment,
  `comanda` text,
  `action` text,
  `router` varchar(80) default NULL,
  `time` varchar(15) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

INSERT INTO `nbotu_comand_complete` (`id`, `comanda`, `action`, `router`, `time`) VALUES("9709", NULL, "Command: config access_profile profile_id 100 delete access_id 717 --> Success.   ", "sw.pm14.lan", "1182602051");
INSERT INTO `nbotu_comand_complete` (`id`, `comanda`, `action`, `router`, `time`) VALUES("9710", NULL, "Command: save --> Saving all configurations to NV-RAM...   0 % 35 % 45 % 70 % 70 % 85 % 95 %100 %100 %Done. ", "sw.pm14.lan", "1182602177");
INSERT INTO `nbotu_comand_complete` (`id`, `comanda`, `action`, `router`, `time`) VALUES("9732", NULL, "Command: clear arptable\n --> Success.                                                          \n", "sw.core.lan", "1182641341");


далее сами скрипты , попорядку :

Демон который мы запускаем , он читает базу каждый раз и передаёт команды управляющему скрипту ( он ниже ).

PHP Демон. BaseDemon.php
Код:
 
<?php
/*
================================================================================
//                           O.S.D. PHP Bot
================================================================================
// Script name:                 PHP BASE DEAMON Bot
//
//      This program is free software. You can redistribute it and/or modify
//      it under the terms of the GNU General Public License as published by
//                  the Free Software Foundation.
//
//              Перед запуском положите скрипт в папку с php
//      Запуск бота происходит из коммандной оболочки примерно так:
//                    e:\servers\php\php.exe bot.php
================================================================================
//
//                  Powered by OSD Team (c) 2004-2006
//
================================================================================
*/
include "mysql.php";

$DB = new mysql;

include "swbot.php";

class Daemon
{

   private $sw_on = true;

   // переменые для подклюений к mysql

   private $timeout_sw_data = 60;
   private $lasttime_sw_data = 0;
   public $lasttime = 0;
   private $timeout = 30;

   public $save_lasttime = array();
   public $save_timeout = 7200;

   // Переменные для работы с памятью и базой.
   private $last_id = 0;
   private $time = 1;
   
   public $debug = false;
   
   public function _construct()
   {
      $this->lastitme = time();
      $this->lasttimedata = time();
   }
   
   public function run()
   {
      global  $DB;
      
      print "\n\n
+-----------------+
|   NBOTU DAEMON  |
|-----------------|
|   Powered by:   |
|    Kair.Net     |
|-----------------|
| (c) 2005-2007   |
+-----------------+
      ";
         
      $exit = 0;
      echo "start While \n";
      while($exit==0)
      {
         
            set_time_limit(2400);
            $lt = $this->lasttime+$this->timeout;
            $t = time();
            if($lt < $t)
            {
               $this->lasttime = time();
            //   $this->GetARP_Data();
            //   $this->GetDHCP_Data();
            //   $this->GetDNS_Data();
               $this->GetSW_Data();
               //    $this->sysmsg($read);
            }
            $DB->close_db();
            sleep($this->timeout);   
      }
      echo "End While \n";
      $DB->close_db();
      sleep(10);   
      
   }

//=====================================================


private function GetSW_Data()
   {
      global $DB,$SWBOT;
            $lt = $this->save_lasttime['sw.core.lan']+$this->save_timeout;
                     $t = time();
                     if($lt < $t)
                     {
                           $this->save_lasttime['sw.core.lan'] = time();
                           echo "start Insert ".$this->save_lasttime['sw.core.lan']." \n";
                           $DB->query("INSERT INTO nbotu_comander (comanda, action, router) values ('clear arptable \n','clear arptable','sw.core.lan')");
                     }

            $lt = $this->lasttime_sw_data+$this->timeout_sw_data;
            $t = time();
            if($lt < $t)
            {
               $this->lasttime_sw_data = time();
               if(!$DB->ping())
               {
                  $this->sysmsg("Reconect DB");
                  $DB->obj = array(   'sql_host'     => "nbotu.billing",
                                 'sql_user'     => "billing",
                                 'sql_password' => "password",
                                 'sql_db'       => "nbotu"
                              );
                  $DB->connect();
               }               
            }
      if($DB->ping() && $lt < $t && $this->sw_on)
      {
         $query = $DB->query("SELECT * FROM `nbotu_comander` Where router LIKE 'sw.%.lan' GROUP by router ORDER BY id ASC ");
      
         if($DB->num_rows($query) != 0)
         {
            $n=0;
            $shel_while="";
             while ($row = $DB->fetch_array($query))
               {
                  $cmd = '';
                  $swip = $row['router'];
                  set_time_limit(180);
                  $SWBOT = new Bot();
                  $SWBOT->ip = $swip;
                  $q = $DB->query("SELECT * FROM `nbotu_comander` Where router = '{$swip}' ORDER BY id ASC ");
                  while ($res = $DB->fetch_array($q))
                  {
                  $cmd .= $res['comanda']."\n";
                  $n++;
                  $SWBOT->qid[]=$res['id'];
                  //$DB->query("DELETE FROM nbotu_comander WHERE id=$res[id]");
                  }
                     $lt = $this->save_lasttime[$swip]+$this->save_timeout;
                     $t = time();
                     if($lt < $t)
                     {
                           $this->save_lasttime[$swip] = time();
                           echo "start Insert ".$this->save_lasttime[$swip]." \n";
                           $DB->query("INSERT INTO nbotu_comander (comanda, action, router) values ('save \n','save cf ".time()."','{$row['router']}')");
                     }

                     
                  $out=$SWBOT->run($cmd);
                  unset($SWBOT);
               }
               
            $this->sysmsg("Исполнение $n SW запросов");
            $actions = 'Обработка '.$n.' SW записей'."\n";               
         }
         $this->sysmsg("SW аписей нет");
      }
   }

   public  function sysmsg($msg)
   {
      echo date("[H:i:s]").": ". convert_cyr_string($msg, 'w - windows-1251','d - x-cp866' )."\n";
   }
   
}

$Daemon = new Daemon();

$Daemon->run();

?>


собственно сам управляющий скрипт , получает команды , подключается к свичам ( авторизуется ) , исполняет команды и пишет в лог.
Скрипт подключения к свичу. swbot.php
Код:
 
<?php

//include "mysql.php";
//$DB = new mysql;

class Bot
{
   
   // Основные свойства.
   public  $login = 'admin';        // логин
   public  $pass = 'password';       // пароль
   
   // Открытые свойства для работы с сокетами.
   public $host = '';
   public $port = 23;
   public $ip = '';
   public $qid=array();
   
   // Закрытые свойства для работы с сокетами.
   private $sock;
   private $buffer = '';
   private $lenght = 0;
   private $soctimeout = 600;
   
   // Переменные для работы с памятью и базой.
   private $time = 1;
   private $lasttime = 0;
   public $debug =false; //true ; //
   
   public function _construct()
   {
      $this->lastitme = time();
      $this->lasttimetopicconec = time();
   }
   
   public function run($acl)
   {
      global  $DB;
      
      print "\n\n
+-----------------+
| Switch PHP Bot  |
|-----------------|
|   Powered by:   |
|      Vano™      |
|-----------------|
|   (c) 2007     |
+-----------------+
      ";
      
      if($this->connect()!=false)
      {
      
      $exit = 0;
      while($exit==0)
      {
         sleep(1);
         if(!$this->Login())
         {
            print "FAIL! \n";
            break;
         }
         $this->SockWrite("disable clipaging \n");
/* //пример ACL
$acl ='
config access_profile profile_id 100 add access_id 10 ethernet source_mac 00-E0-91-0B-2B-D3 port 24 permit
config access_profile profile_id 100 delete access_id 10
config access_profile profile_id 100 delete access_id 23
';*/
                $this->SockWrite($acl."\n");
                $this->SockWrite("logout \n");
                sleep(90);
                set_time_limit(60);
                $read = @socket_read($this->sock,10240,PHP_BINARY_READ);
                echo "start While \n";
               
                $this->sysmsg($read);
                $this->get_console($read);
                //$GetCmd->GetServerCMD($read);
                sleep(1);

                foreach($this->qid as $k=>$v)
                {       
                $DB->query("DELETE FROM nbotu_comander WHERE id=$v");
                }
            echo "end  \n";
        break;
               
        }
    //$DB->close_db();   
        $this->SockClose();
        }
        else{echo "Not Connect \n";}
    }
    //=====================================================
    private function connect()
    {
        $this->SockCreate() or die('Cant Create');   
    //=====================PRINT===========================           
        print "-------------------\nConnecting to server... ({$this->ip}:{$this->port})\n-------------------\n";
    //=====================================================               
        if(!$this->SockConnect()) return false;
        sleep(3);
        $read = $this->SockRead(1024,PHP_BINARY_READ);
    //=====================PRINT===========================
        print "----Server:--------\n{$read}\n-------------------\n\n";
    //=====================================================   
        print "Ready.\n";
        echo "-------------------\n";
    return true;       
    }
   
    private function SockCreate()
    {
        $this->sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
        socket_set_option($this->sock,SOL_SOCKET,SO_RCVTIMEO,array("sec"=>$this->soctimeout,"usec"=>0));
        return $this->sock;   
    }
   
    private function SockBind()
    {
        $this->sock = socket_bind($this->sock,'172.22.100.1',6667);
    }
   
    private function SockConnect()
    {
        return @socket_connect($this->sock, $this->ip, $this->port);
    }
   
    private function SockRead($limit,$flag)
    {
        $read = socket_read($this->sock,$limit,$flag);   
        return trim($read);
    }
   
    public  function SockWrite($buffer)
    {
        $this->buffer = $buffer;
        $this->lenght = strlen($this->buffer);
        return socket_write($this->sock, $this->buffer,$this->lenght);
    }
   
    private function SockClose()
    {
        return socket_close($this->sock);
    }
   
    private  function Login()
    {
        $this->SockWrite("{$this->login}\n");
        while($read = @socket_read($this->sock,1024,PHP_BINARY_READ))
        {
         
            $readarr = explode("\r",$read);
            foreach($readarr as $nread)
            {   
                $parent ="/^(username|password|fail!|^D[EG]S-[0-9SR]{4,6}):?[0-9]*#?/is";
                if(preg_match_all($parent,$nread, $matches))
                {
                switch(strtolower($matches[1][0]))
                    {
                        case 'username':
                            $this->SockWrite("{$this->login}\n");
                            print "----LOGIN:--------\n";
                            break;
                        case 'password':
                            $this->SockWrite("{$this->pass}\n");
                            print "----PASS:---------\n";
                            break;
                        case 'fail!':
                            print "----Fail Login:--------\n";
                            $if++;
                            if($if==3){return false;}
                            break;
                        case 'des-3526':
                        case 'des-3550':
                        case 'dgs-3324sr':   
                            print "----Login OK:--------\n";   
                            return true ;
                            break;
                        default:
                            break;
                    }
                }
            }
        }
    }
   
    public  function get_console($msg)
    {
        global $DB;

        $parent ="/([A-Z0-9\-]+\:[\d]?#)/is";
        $msg = preg_replace($parent,'[razdelitel]',$msg);
        $cmdarray = explode('[razdelitel]',$msg);
       
        foreach($cmdarray as $k=>$v)
        {
            //echo $v."-------------------------------------";
            $subarray = explode("\r",$v);
            foreach($subarray as $k=>$v)
            {
                $v = str_replace("\r",'',$v);
                $v = str_replace("\n",'',$v);
                if($v=='') unset($subarray[$k]);
            }
           
            $newsubarray = '';
            foreach($subarray as $k=>$v) $newsubarray[] = $subarray[$k];
            $cnt = count($newsubarray);
            $cnt--;
           
            $out[] = array($newsubarray[$cnt-1],$newsubarray[$cnt]);
        }
        unset($out[count($out)-1]);
        unset($out[count($out)-1]);
        unset($out[0]);
        foreach($out as $k=>$v)
            if($v[0]=='' && $v[1]=='') unset($out[$k]);

        foreach($out as $k=>$v)
        {       
        $DB->query("INSERT INTO `nbotu_comand_complete` ( `action`,`router`,`time`) values ('{$v[0]} --> {$v[1]}','{$this->ip}','".time()."')");
        //    return $v[0].' --> '.$v[1]."\n";
        }
           
    }

    public  function sysmsg($msg)
    {
        echo date("[H:i:s]").": ". convert_cyr_string($msg, 'w - windows-1251','d - x-cp866' )."\n";
    }
}
//$SWBOT = new Bot();

?>


На всякий случай наипростейший mysql клас.
Mysql класс. mysql.php
Код:
<?php

/*
================================================================================
//                   Powered by OSD Team Web Portal System v 1.0.2
================================================================================
// Script name:                 MySQL file
// Script file name:            mysql.php
// Script Author:               Dexter
// Date:                        02/03/2005
//
//      This program is free software. You can redistribute it and/or modify
//      it under the terms of the GNU General Public License as published by
//                  the Free Software Foundation.
//
//
//        На территории Российской Федерации порядок воспроизведения,
//     распространения и модификации программного обеспечения регулируется
//  Законом РФ "О правовой охране программ для ЭВМ и баз данных" от 23.09.1992г.
//   N 3523-1 и Законом РФ "Об авторском праве и смежных правах" от 09.07.1993г.
//                                N 5351-1.
//
================================================================================
//
//                   Powered by OSD Team (c) 2004-2006
//
================================================================================
*/

//==============================================================================
//                  Класс для работы с базой данных MySQL приделан к Daemon PHPBOT
//==============================================================================

class mysql
{

    var $obj=array( 'sql_host' => "",
                    'sql_user' => "root",
                    'sql_password' => "",
                    'sql_db' => ""
                   );
    var $connection_id = "";
    var $query_str = "";
    var $f_array = array();
    var $f_row = array();
    var $total_query = "0";


    //--------------------------------------------------------------------------
    //              Функция для подключения к базе данных MySQL
    //--------------------------------------------------------------------------

    function connect()
    {
       global $Daemon;

        $this->connection_id = @mysql_connect( $this->obj["sql_host"],
                                              $this->obj["sql_user"],
                                              $this->obj["sql_password"]
                                             );

        if ( !@mysql_select_db($this->obj['sql_db'], $this->connection_id) )
        {

           $Daemon->sysmsg( "ОШИБКА: Не могу присоединится к базе ".$this->obj['sql_db'] );

        }

    }
   
    public function ping()
    {
       return @mysql_ping($this->connection_id);
    }


    //--------------------------------------------------------------------------
    //                  Функция запроса к базе данных MySQL
    //--------------------------------------------------------------------------

    function query( $query )
    {
       global $Daemon;

        $this->query_str = @mysql_query( $query , $this->connection_id );

        $this->total_query = $this->total_query + 1;


        if( !$this->query_str )
        {

            $Daemon->sysmsg( "ОШИБКА: Не могу выполнить запрос ".$this->query_str.mysql_error()."\n Запрос: ".$query );

        }

        return $this->query_str;

    }


    //--------------------------------------------------------------------------
    //                  Функция получения массива результата
    //--------------------------------------------------------------------------

    function fetch_array($query_str = "")
    {

       if ($query_str == "")
       {

          $query_str = $this->query_str;

       }

            $this->f_array = mysql_fetch_array($query_str);

        return $this->f_array;

    }

    //--------------------------------------------------------------------------
    //           Функция получения массива результата без имен.
    //--------------------------------------------------------------------------

    function row($query_str = "")
    {

       if ($query_str == "")
       {

          $query_str = $this->query_str;

       }

            $this->f_row = mysql_fetch_row($query_str);

        return $this->f_row;

    }


    //--------------------------------------------------------------------------
    //                  Функция получения кол-ва полей таблицы
    //--------------------------------------------------------------------------

    function num_rows()
    {

       return mysql_num_rows( $this->query_str );

    }

    //--------------------------------------------------------------------------
    //             Функция получения последнего уникального ID
    //--------------------------------------------------------------------------

    function insert_id()
    {

       return mysql_insert_id();

    }


    //--------------------------------------------------------------------------
    //                      Функция для отключения от MySQL
    //--------------------------------------------------------------------------

    function close_db()
    {

        return @mysql_close($this->connection_id);

    }

}

?>




Вобщемто пока всё , выложил как есть , хотя хотел доработать.
Если кто-то хочет помочь в разработке всегда рад , а также если вы хотите внести изменения , напишите какие и для чего , возможно я вам не дам наступить на уже существующие грабли, а также хочу развить проект до нормального состояния и возмжно даже статьи для Faq.
Напишу сразу Использовать PHP 5 !!!!
На вопросы у меня не работает отвечу , неверю т.к см. строку №3 данного сообщения !


Последний раз редактировалось Vano™ Пн июл 02, 2007 07:20, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вс июн 24, 2007 13:00 
Не в сети
Сотрудник D-LINK
Сотрудник D-LINK

Зарегистрирован: Пт май 13, 2005 15:49
Сообщений: 20616
Откуда: D-Link, Moscow
Я думаю безусловно полезная информация и можно будет в дальнейшем сделать FAQ. Будем рады посотрудничать!


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн июн 25, 2007 12:00 
Не в сети

Зарегистрирован: Вс фев 22, 2004 01:26
Сообщений: 79
Откуда: Moscow
Через Веб что-то подобное не пробовали?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн июн 25, 2007 20:38 
Не в сети
Сотрудник D-LINK
Сотрудник D-LINK

Зарегистрирован: Пт май 13, 2005 15:49
Сообщений: 20616
Откуда: D-Link, Moscow
Всмысле через WEB?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн июн 25, 2007 21:05 
Не в сети

Зарегистрирован: Сб дек 02, 2006 18:13
Сообщений: 101
Откуда: Новосибирск
Demin Ivan писал(а):
Всмысле через WEB?

Наверное имеется в виду создание какого-либо интерфейса на сайте куда бы разрабочики могли складывать свои разработки.
Типа Wiki что-то надо.
Например как тут http://wiki.adslclub.ru/wakka.php?wakka=FirstPage


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт июн 26, 2007 07:38 
Не в сети

Зарегистрирован: Пн янв 08, 2007 15:38
Сообщений: 215
Откуда: Norilsk
Я уже предлогал в одинх из тем создать разделы к примеру прям на форуме.
Темы которые бы хотелось видеть.
Разработка своих приложений ( с подразделами ) - в котором и можно было бы описывать придуманые скрипты и прочие.
А также раздел с тестывыми прошивками и их глюками ( так сказать вынести эти темы отдельно ).

PS в не темы:
а самое правельное это доработать данный форум , т.к даный форум имеет кучу возможностей если его правельно дорабтать и наиболее удобный из всех. тут нехватает , создание бесконечно вложеных подкатегорий , дополнительное оформление тесктов сообщений , вложение файлов и многое другое.
С момента создание домашней сети стоит подобный форум еще с 2003 года , добавленно куча модов , зделана портальная система и ето не предел его возможностей , даже самый распространёный IPB обзавидуется возможностям ( а главное он бесплатен ). Я даже смогу помочь в воплащении даныйх возможностей , хотя могу и своё ядро отдать со всеми модами ( единственое там вид другой ), показать некак не могу, т.к стоит только внутри сети ( но если будет ярое желание смогу на некоторое время пробросить его в интернет )


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт июн 26, 2007 19:23 
Не в сети
Сотрудник D-LINK
Сотрудник D-LINK

Зарегистрирован: Пт май 13, 2005 15:49
Сообщений: 20616
Откуда: D-Link, Moscow
Давайте вернёмся к этому разговору чуть позже. Сейчас очень много других задач. А так естественно в общем и целом приветствуется.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт июн 28, 2007 21:24 
Не в сети

Зарегистрирован: Пн янв 08, 2007 15:38
Сообщений: 215
Откуда: Norilsk
Кто нибудь уже испробывал у себя ? Мне просто хочется знать ваше мнение , а также если у вас есть другие модели , могли бы на них проверить.
Чтобы скрипты обрабатывали и другие модели , нужно правельно авторизоватся на свиче , в данном варианте , это последоватеность ввода логина и пароля и дожидания строки готовности свича , т.е авторизация производится не более 3-х раз ( 3 попытки на ввод ).
чтобы расширить ряд для других моделий необходимо дописать строку готовности с моделью .
находим
Код:
switch(strtolower($matches[1][0]))
               {
                  case 'username':
                  echo "----LOGIN:--------\n";
                  $this->SockWrite("{$this->login}\n");
                  break;
                  case 'password':
                  echo "----PASS:--------\n";
                  $this->SockWrite("{$this->pass}\n");
                  break;   
                  case 'des-3526':                   
                  echo "----Login OK:--------\n";   
                  return true ;
                  break;
                  case 'dgs-3324sr':                   
                  echo "----Login OK:--------\n";   
                  return true ;
                  break;
                  case 'Fail':
                  echo "----Fail Login:--------\n";
                  $if++;
                  if($if==3){return false;}
                  break;
                  default:
                  break;
               }


и приводим к виду , к примеру для DES 3550
Код:
switch(strtolower($matches[1][0]))
               {
                  case 'username':
                  echo "----LOGIN:--------\n";
                  $this->SockWrite("{$this->login}\n");
                  break;
                  case 'password':
                  echo "----PASS:--------\n";
                  $this->SockWrite("{$this->pass}\n");
                  break;   
                  case 'des-3526':                   
                  echo "----Login OK:--------\n";   
                  return true ;
                  break;
                  case 'des-3550':                   
                  echo "----Login OK:--------\n";   
                  return true ;
                  break;
                  case 'dgs-3324sr':                   
                  echo "----Login OK:--------\n";   
                  return true ;
                  break;
                  case 'Fail':
                  echo "----Fail Login:--------\n";
                  $if++;
                  if($if==3){return false;}
                  break;
                  default:
                  break;
               }


я немогу испробывать на других моделях , т.к у меня всего 2 модели ( валяющийся 2108 не всчет :) ) , это DGS 3324SR и кучка DES 3526.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт июн 29, 2007 15:07 
Не в сети

Зарегистрирован: Пн сен 27, 2004 18:18
Сообщений: 1642
Откуда: Vault 13
Vano™ писал(а):
Данное решение себя оправдывает , т.к не использует ни системные файлы ( как было в других решениях , типа telnet и прочего ) , не использует SNMP ( было уже доказано , что работает он немного медленее , а также нельзя многово выполнить ).
это правда? неужели SNMP медленнее telnet? я еще не проводил тестов, но... действительно ли это так?
Vano™ писал(а):
На всякий случай наипростейший mysql клас.
очень рекомендую обратить внимание на DbSimple ну или хотя бы на mysql_qw() ... удобство написания увеличится в разы и не надо будет писать простенькие обертки под стандартные мускульные ф-ции ;)
Vano™ писал(а):
Напишу сразу Использовать PHP 5
из за его реализации ООП? ;)
Vano™ писал(а):
Мне просто хочется знать ваше мнение
тема затронута нужная и важная, сам сейчас занимаюсь написанием чего-то подобного... именно поэтому меня и интересует вопрос - действительно ли использование telnet оправданнее SNMP?
Vano™ писал(а):
Чтобы скрипты обрабатывали и другие модели , нужно правельно авторизоватся на свиче , в данном варианте , это последоватеность ввода логина и пароля и дожидания строки готовности свича , т.е авторизация производится не более 3-х раз ( 3 попытки на ввод ).
чтобы расширить ряд для других моделий необходимо дописать строку готовности с моделью .

... скип ...

я немогу испробывать на других моделях , т.к у меня всего 2 модели ( валяющийся 2108 не всчет :) ) , это DGS 3324SR и кучка DES 3526.
не знаю как у Вас, но у меня с 3526
Код:
              DES-3526 Fast Ethernet Switch Command Line Interface

                            Firmware: Build 4.01-B42
          Copyright(C) 2000-2004 D-Link Corporation. All rights reserved.
username:
password:

DES-3526:4#
и с 3627
Код:
                       DGS-3627 Gigabit Ethernet Switch
                            Command Line Interface

                           Firmware: Build 1.00-B66
        Copyright(C) 2004-2007 D-Link Corporation. All rights reserved.
UserName:
PassWord:

DGS-3627:4#
приглашение прекрасно можно поймать вот таким регекспом
Код:
^D[EG]S-[0-9]{4}:?[0-9]*#$
который, IMHO, все же более подходит под "приглашение" (Ваш слишком много матчей дает) и поставив на него preg_match() можно ловить приглашения практически любых свичей не раздувая switch() до безобразия дописывая его под каждую модель... я правда не уверен насчет восклицательного знака, присутствующего в Вашем регекспе
Код:
^([A-Z0-9\-]+)[4\#\:\!]+?$
возможно он есть на некоторых моделях, если это так, то добавить его в мой регексп не сложно ;)

если Вы не против, то... можно придраться? IMHO упомянутый Вами switch()
Код:
switch(strtolower($matches[1][0]))
   {
      case 'username':
      echo "----LOGIN:--------\n";
      $this->SockWrite("{$this->login}\n");
      break;
      case 'password':
      echo "----PASS:--------\n";
      $this->SockWrite("{$this->pass}\n");
      break;
      case 'des-3526':
      echo "----Login OK:--------\n";
      return true ;
      break;
      case 'dgs-3324sr':
      echo "----Login OK:--------\n";
      return true ;
      break;
      case 'Fail':
      echo "----Fail Login:--------\n";
      $if++;
      if($if==3){return false;}
      break;
      default:
      break;
   }
выглядел бы лучше будучи например таким:
Код:
switch(strtolower($matches[1][0])) {
    case 'username':
        echo "----LOGIN:--------\n";
        $this->SockWrite("{$this->login}\n");
        break;
    case 'password':
        echo "----PASS:--------\n";
        $this->SockWrite("{$this->pass}\n");
        break;
    case 'des-3526':
        echo "----Login OK:--------\n";
        return true ;
        break;
    case 'dgs-3324sr':
        echo "----Login OK:--------\n";
        return true ;
        break;
    case 'Fail':
        echo "----Fail Login:--------\n";
        $if++;
        if ($if == 3) {
            return false;
        }
        break;
    default:
        break;
}
Ваш программер читал правила оформления php кода? стандарт PEAR - это уже в принципе повсеместно стандарт... IMHO функционал - это одно, а вот читабельность для других - это совсем другое ;)

так или иначе - СПАСИБО Вам огромное за предоставленный материал!

/me ушел размышлять на тему сабжа


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт июн 29, 2007 15:31 
Не в сети

Зарегистрирован: Чт сен 28, 2006 12:07
Сообщений: 220
Откуда: Москва
snark писал(а):
Vano™ писал(а):
Данное решение себя оправдывает , т.к не использует ни системные файлы ( как было в других решениях , типа telnet и прочего ) , не использует SNMP ( было уже доказано , что работает он немного медленее , а также нельзя многово выполнить ).
это правда? неужели SNMP медленнее telnet? я еще не проводил тестов, но... действительно ли это так?

у меня telnet скрипты отрабатывают быстрее
да и удобнее они как-то

snark писал(а):
приглашение прекрасно можно поймать вот таким регекспом
Код:
^D[EG]S-[0-9]{4}:?[0-9]*#$
который, IMHO, все же более подходит под "приглашение"

кстати, я засылаю свои команды из файлов простым NC
не ловлю приглашений.
скрипты отрабатывают каждые 15 минут уже больше месяца (3828 и 3612). пока ни на одном не было случаев, что авторизация или одна из команд не прошла


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт июн 29, 2007 17:07 
Не в сети

Зарегистрирован: Пн сен 27, 2004 18:18
Сообщений: 1642
Откуда: Vault 13
kapa писал(а):
у меня telnet скрипты отрабатывают быстрее
да и удобнее они как-то
спасибо, учту
kapa писал(а):
я засылаю свои команды из файлов простым NC
не ловлю приглашений.
скрипты отрабатывают каждые 15 минут уже больше месяца (3828 и 3612). пока ни на одном не было случаев, что авторизация или одна из команд не прошла
м-м-м... извините конечно, но... Вы разницу между
Код:
^([A-Z0-9\-]+)[4\#\:\!]+?$
и
Код:
^D[EG]S-[0-9]{4}:?[0-9]*#$
улавливаете? если Вы не знакомы с регекспами, то попытаюсь объяснить...
1-й вариант ловит
Код:
все буквы от A до Z, цифры от 0 до 9 и знак тире (буквы, цифры и тире - неважно в каком порядке, неважно все сразу или нет но это все должно повториться от одного раза и до бесконечности), цифру 4, решетку, двоеточие, восклицательный знак (неважно в каком порядке, неважно все или нет, но от одного раза и до бесконечности)
т.е. строки DES-3526:4# и A-# или 0-! с точки зрения данного регекспа идеинтичны и правильны
2-й вариант ловит
Код:
буквы D и S, букву E или G между ними (т.е. DES или DGS), тире, цифры от 0 до 9 (неважно в каком порядке но цифры должны повториться ровно 4 раза), двоеточие (может повториться от нуля до одного раза), цифры от 0 до 9 (неважно в каком порядке но они могут повториться от одного раза до бесконечности) и знак решетки
т.е. строки DES-3526:4# и DGS-3627:4# верны, а вот варианты A-# или 0-! с точки зрения данного регекспа неверны
IMHO второй вариант более приближен к тому что выдает свич в своем "приглашении"


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт июн 29, 2007 17:40 
Не в сети

Зарегистрирован: Чт сен 28, 2006 12:07
Сообщений: 220
Откуда: Москва
snark писал(а):
kapa писал(а):
я засылаю свои команды из файлов простым NC
не ловлю приглашений.
скрипты отрабатывают каждые 15 минут уже больше месяца (3828 и 3612). пока ни на одном не было случаев, что авторизация или одна из команд не прошла
м-м-м... извините конечно, но... Вы разницу между
Код:
^([A-Z0-9\-]+)[4\#\:\!]+?$
и
Код:
^D[EG]S-[0-9]{4}:?[0-9]*#$
улавливаете? если Вы не знакомы с регекспами, то попытаюсь объяснить...
1-й вариант ловит
Код:
все буквы от A до Z, цифры от 0 до 9 и знак тире (буквы, цифры и тире - неважно в каком порядке, неважно все сразу или нет но это все должно повториться от одного раза и до бесконечности), цифру 4, решетку, двоеточие, восклицательный знак (неважно в каком порядке, неважно все или нет, но от одного раза и до бесконечности)
т.е. строки DES-3526:4# и A-# или 0-! с точки зрения данного регекспа идеинтичны и правильны
2-й вариант ловит
Код:
буквы D и S, букву E или G между ними (т.е. DES или DGS), тире, цифры от 0 до 9 (неважно в каком порядке но цифры должны повториться ровно 4 раза), двоеточие (может повториться от нуля до одного раза), цифры от 0 до 9 (неважно в каком порядке но они могут повториться от одного раза до бесконечности) и знак решетки
т.е. строки DES-3526:4# и DGS-3627:4# верны, а вот варианты A-# или 0-! с точки зрения данного регекспа неверны
IMHO второй вариант более приближен к тому что выдает свич в своем "приглашении"

это я всё понял.
я к тому, что вообще не ловлю приглашений, когда работаю через nc
т.е.
Код:
nc IP_of_the_switch 23 < ./filename

а в файле
Цитата:
login
password
delete access_profile profile_id ...
create access_profile profile_id ...
и так далее куча строк с командами


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт июн 29, 2007 20:53 
Не в сети

Зарегистрирован: Пн сен 27, 2004 18:18
Сообщений: 1642
Откуда: Vault 13
kapa писал(а):
это я всё понял.
я к тому, что вообще не ловлю приглашений, когда работаю через nc
т.е.
Код:
nc IP_of_the_switch 23 < ./filename
а в файле
Цитата:
login
password
delete access_profile profile_id ...
create access_profile profile_id ...
и так далее куча строк с командами
ну дык Вы ж netcat-у (nc == netcat или я не прав?) скармливаете файл с логином и паролем, вот он ничего и не спрашивает, а пхп скрипт зайдя на свич вбивает логин и пароль (т.е. иммитирует Ваши нажатия на кнопки клавиатуры), и перед тем как ему начать вбивать команды ему надо дождаться того самого "приглашения" CLI чтобы начать действовать дальше...


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб июн 30, 2007 03:02 
Не в сети

Зарегистрирован: Пн янв 08, 2007 15:38
Сообщений: 215
Откуда: Norilsk
придиратся можно я не против , но с самого начало когда писал в режиме теста не придал значения а после не оформлял =)
внёс и у себя пару красивостей для наглядности , пусть будет похожим на стандарты , но я их всерано не читал ( ведь мы на dll претендовать ведь не будем =) )
Код:
switch(strtolower($matches[1][0])) {
       case 'username':
           echo "----LOGIN:--------\n";
           $this->SockWrite("{$this->login}\n");
           break;
       case 'password':
           echo "----PASS:--------\n";
           $this->SockWrite("{$this->pass}\n");
           break;
       case 'des-3526':
           echo "----Login OK:--------\n";
           return true ;
           break;
       case 'dgs-3324sr':
           echo "----Login OK:--------\n";
           return true ;
           break;
       case 'Fail':
           echo "----Fail Login:--------\n";
           $if++;
           if ($if == 3) {
               return false;
           }
           break;
       default:
           break;
}

(я не виноват , насамом деле код читабельный , но почемуто на форуме он таким не выглядит :( )
по поводу регов , немного обьясню , опять таки наполовину изучал чтоже всетаки отдаёт свичь в каком порядке , и что будет если будут беспорядки .

Код:
^D[EG]S-[0-9]{4}:?[0-9]*#$

данный рег может и пойдёт но не в беспорядках , а сейчас замечу некоторые тонкости которые вы не учли.
написаный ранее мной :
Код:
^([A-Z0-9\-]+)[4\#\:\!]+?$

распишу детально ([A-Z0-9\-]+) я захватываю что находится в скобках , а не просто пропускаю как есть .
далее исходя их этого и делаю case.
по поводу от A-Z и [4\#\:\!] , присмотритесь , скрипт ждёт также login и password , а также может ожидать Fail!
именно в этом случаи нужны другие символы , и все буквы вначале , можно было бы повыбирать , но думаю нестоит и может в дальнейшем пригодится.
то что рег проходит много раз , это не критично и микросекунды мерять не будем .

немного про telnet & SNMP :
SNMP: удобен для снятия данных , работает быстро когда нужно получить данные , а не записать на свичь.
было описано что свичь при получении SNMP переводит их в Comand(telnet) и после исполняет , на что требуется чуть больше времени и заметна загрузка CPU.
поэтому оставим SNMP для снятия данных со свича ( к примеру рисую графики по загрузкам каналов и CPU ).
Telnet: для свича более понятны комманды, не грузит CPU так сильно , можно выполнять практически все комманды , ненужно думать о преобразовании IP MAC ип рочего для внесения.
Команды для консолии наиболее понятны и читабельны , их проще генерировать и преобразовывать.
а в момент устанокии и старта биллинга, свичам пришлось обрабатывать по 500 записей сразу ( несколько минут и всё ок ) , про SNMP писали что уходит до 20-30 минут на такое кол-во.

Думаю дальше расписывать нестоит и так будет понятно недостатки и приемущества отдельных методов.
Выбирать вам что использовать и для каких целей.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Сб июн 30, 2007 09:37 
Не в сети

Зарегистрирован: Пн сен 27, 2004 18:18
Сообщений: 1642
Откуда: Vault 13
Vano™ писал(а):
ведь мы на dll претендовать ведь не будем =)
ну а вдруг? ;) вдруг тот же самописный биилинх в паблик выложить решите, думаю мало кто откажется пощупать ;)
Vano™ писал(а):
я не виноват , насамом деле код читабельный , но почемуто на форуме он таким не выглядит :(
это потому что Вы отбивали ТАВ-ами, а если бы отбивали пробелами - этого бы небыло ;) я сам так делал сначала, пока не понял что то что мне прекрасно понятно люди разобрать не могут ну и начал писать по стандартам, а потом это вошло в привычку...
Vano™ писал(а):
замечу некоторые тонкости которые вы не учли.
...
скрипт ждёт также login и password , а также может ожидать Fail!
oh shit! про запросы логина и пароля я совсем забыл :( но Вы уже наверное поняли что я своличь... ага... порядочная... я ж Вам предложу подумать над чем нить в духе
Код:
^(?:username:|password:|Fail!|^D[EG]S-[0-9]{4}:?[0-9]*#$)$
иначе ж буду мучиться :)
Vano™ писал(а):
было описано что свичь при получении SNMP переводит их в Comand(telnet) и после исполняет , на что требуется чуть больше времени и заметна загрузка CPU.
поэтому оставим SNMP для снятия данных со свича ( к примеру рисую графики по загрузкам каналов и CPU ).
Telnet: для свича более понятны комманды, не грузит CPU так сильно , можно выполнять практически все комманды , ненужно думать о преобразовании IP MAC ип рочего для внесения.
Команды для консолии наиболее понятны и читабельны , их проще генерировать и преобразовывать.
а в момент устанокии и старта биллинга, свичам пришлось обрабатывать по 500 записей сразу ( несколько минут и всё ок ) , про SNMP писали что уходит до 20-30 минут на такое кол-во.
о-о-о... ПРЕОГРОМНОЕ Вам за эту инфу СПАСИБО!!! сам, повторюсь тесты пока не проводил, но лучше поверю Вам чем буду с секундомером в руках сидеть...


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 36 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB