faq обучение настройка
Текущее время: Пт июл 18, 2025 22:44

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




Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
СообщениеДобавлено: Вс фев 04, 2007 19:01 
Не в сети

Зарегистрирован: Вт ноя 07, 2006 19:11
Сообщений: 17
Предлгаю создать тему по обмену опытом написания маленьких полезных прикладух по мониторингу и управлению DES-3526.

Первый пример - мониторинг работы (обычный пинг)
Код:
use Net::Ping;

$err_сnt_ping=3; # Количество попыток проверки
$err_cnt_seq=2;  # Инкремент увеличения таймаута ожидания ответа при следующей попытке проверки
$icmp_timeout=1; # Начальное значение времени ожидания

# Получение временнОго штампа системы
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
$dt=sprintf("%04d.%02d.%02d %02d:%02d:%02d",$year+1900,$mon+1,$mday,$hour,$min,$sec);

# Получение текущего каталога (для Windows)
open(FH,"dir |");
  while(<FH>){
    $_=~s/\n//;
    $_=~s/\r//;
    if($_ && $_=~/ Directory of (.+)/){
      $dir=$1; # Сохраняем значение в переменную
    }
  }
close(FH);

$p = Net::Ping->new("icmp"); # Создаем объект
unlink "$dir\\err_out.txt";  # Удаляем предыдущий файл-отчет                   

# Открываем файл со списком хостов
# Формат файла: IP   LEVEL   SEGMENT   EQUIPMENT   ADDRESS
# Пример:       10.200.76.152   1   03   des3526-0001   Moscow, Kremlin
# Разделитель полей: tab (\t)
open(FH,"$dir\\hosts.txt");
 while(defined($fh=<FH>))
 {
   $fh=~s/\n//;
   $fh=~s/\r//;
   if ($fh!~/^#/) # Проверяем не закомменторована ли строка
   {
     @host=split(/\t/,$fh);
     $ping_ok=$p->ping($host[0],$icmp_timeout);
     $i=0;
     # Если свитч сильно перегружен, то первая проверка может окончиться неудачей
     # повторяем проверку столько раз, сколько это определено в переменной $err_сnt_ping
     # увеличивая таймаут ожидания на значение переменной $err_cnt_seq
     unless($ping_ok==1 || $i==$err_cnt_ping)
     {
       $icmp_timeout=$icmp_timeout+$err_cnt_seq;
       $ping_ok=$p->ping($host[0],$icmp_timeout);
       $i++;
     }
     # В случае, если свитч так и не ответил - заносим результат в отчет
     if ($ping_ok!=1)
     {
         $str=$host[2]." ".$host[0]." ".$host[4]."\n";
         push(@err_out,$str);
     }
   }
 }
close(FH);
$p->close();

# Печатаем результаты по неответившим свитчам в файл
if(@err_out){
  open(FH,">$dir\\err_out.txt");
    print FH "HOST's unreacheable ($dt): \n";
    foreach $e(@err_out){
      print FH $e;
    }
  close(FH);
}
undef @err_out;


Второй пример - попытка реализовать наиболее частые операции по управлению свитчем (сохранение конфигов, обновление firmware, изменение acl):
Код:
use Net::Telnet;
use Net::Ping;

$username="username";
$passwd="password";
$prompt='/#$/';
$debug=1; # Режим отладки
$batch=0; # Пакетное выполение команд из файла commands.txt
$err_сnt_ping=3; # Количество попыток проверки
$err_cnt_seq=2;  # Инкремент увеличения таймаута ожидания ответа при следующей попытке проверки
$icmp_timeout=1; # Начальное значение времени ожидания

# IP-адрес используемого TFTP-сервера
$tftp="XXX.XXX.XXX.XXX";
#############################
# список используемых файлов
$dir="C:\\Perl\\scripts\\Telnet";
$dump_log="$dir\\dump.log";
$input_log="$dir\\input.log";
$hosts="$dir\\hosts.txt";
$commands="$dir\\commands.txt";
##############################
unlink $dump_log;
unlink $input_log;

# Команда для единичного выполнения
#$cmd="config time ".$dt;
#$cmd="upload configuration ";
###################################

$p = Net::Ping->new("icmp");

if ($debug==1)
{
  $t = new Net::Telnet(Dump_Log  => $dump_log,
                       Input_log => $input_log,
                       Prompt    => $prompt
                      );
}
else
{
  $t = new Net::Telnet(Prompt    => $prompt
                      );
}

open(FH,$commands);
 while(defined($fh=<FH>)){
   $fh=~s/\n//;
   $fh=~s/\r//;
   push(@commands, $fh);
 }
close(FH);

# Открываем файл со списком хостов
# Формат файла: IP   LEVEL   SEGMENT   EQUIPMENT   ADDRESS
# Пример:       10.200.76.152   1   03   des3526-0001   Moscow, Kremlin
# Разделитель полей: tab (\t)
open(FH,$hosts);
 while(defined($fh=<FH>))
 {
   $fh=~s/\n//;
   $fh=~s/\r//;
   if ($fh!~/^#/)
   {
     @host=split(/\t/,$fh);
     print "Check segment $host[2], host: $host[0]";
     $ping_ok=$p->ping($host[0],$icmp_timeout);
     $i=0;
     unless($ping_ok==1 || $i==$err_cnt_ping)
     {
       $icmp_timeout=$icmp_timeout+$err_cnt_seq;
       $ping_ok=$p->ping($host[0],$icmp_timeout);
       $i++;
     }
    if ($ping_ok!=1){
       print "      -- status: !!! UNREACHABLE !!!\n";
     }else{
       print "      -- status: OK\n";
       if ($host[3]=~/^des3526-/)
       {
         $t->open($host[0]);
         $t->login($username, $passwd);
         $t->print("");
         $t->waitfor($prompt);
         if($batch==1)
         {
           foreach $comm(@commands)
           {
             print "";           
           }
         }else
         {
           &my_save_cfg;
#           &my_dwn_fw;
#           &my_acl;
         }
       }
     }
   }
   undef $ping_ok;
 }
close(FH);


$t->close;

# Получение временнОго штампа
sub my_date{
  ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
  $dt_batch=sprintf("%02d%02d%04d %02d:%02d:%02d",$mday,$mon+1,$year+1900,$hour,$min,$sec);
  $dt_singl=sprintf("%02d%02d%04d_%02d%02d%02d",$mday,$mon+1,$year+1900,$hour,$min,$sec);
}

# Сохраняем конфигурации свитчей
sub my_save_cfg{
  &my_date;
  $cmd="upload configuration $tftp $host[0]"."_"."$dt_singl.cfg"; # Сохраняем конфигурации
  print "Config: $host[0] - $cmd \n";
  $t->cmd($cmd);
}

# Процедура обновления firmware
sub my_dwn_fw{
  $firmware="DES3526_401B36.had"; # Наименование файла прошивки

  $cmd="download firmware $tftp $firmware";
  $timeout=600;
  $t->cmd(String=>$cmd, Timeout=>$timeout);

  $cmd="reset\ny\n";
  $t->cmd(String=>$cmd, Timeout=>$timeout);

  $cmd="download configuration $tftp $host[0]"."_"."$dt_singl.cfg";
  $t->cmd(String=>$cmd, Timeout=>$timeout);

  $cmd="reboot\ny\n";
  $t->cmd($cmd);
}

# Обновление ACL
sub my_acl{
  $timeout=600;
  $cmd="delete access_profile profile_id 20\ndelete access_profile profile_id 25\ndelete access_profile profile_id 26\ndelete access_profile profile_id 27";
  $t->cmd(String=>$cmd, Timeout=>$timeout);
}


Модернизация, комментарии и обмен знаними приветствуются. Надеюсь, что кому-нибудь они пригодятся.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн фев 05, 2007 09:10 
Не в сети

Зарегистрирован: Ср апр 20, 2005 16:27
Сообщений: 39
Откуда: St. Petersburg
Karamultuk писал(а):
Код:
$debug=1; # Режим отладки
$batch=0; # Пакетное выполение команд из файла commands.txt



Вот это поподробнее... Не совсем понятно...

Karamultuk писал(а):
Код:
# Обновление ACL
sub my_acl{
  $timeout=600;
  $cmd="delete access_profile profile_id 20\ndelete access_profile profile_id 25\ndelete access_profile profile_id 26\ndelete access_profile profile_id 27";
  $t->cmd(String=>$cmd, Timeout=>$timeout);
}


А вот тут не проще команды с текстового файлика брать?


Большое спасибо!


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

Зарегистрирован: Пн окт 02, 2006 12:44
Сообщений: 25
Откуда: LT
Na schiot ping:

Код:
use Net::Ping::External qw(ping);

if (ping($host)) {

} else {

}

sub ping {
  return ping(host => $_[0], timeout => 2) || 0;
}


Menshe pozhyraet resursov PC.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Пн фев 05, 2007 17:12 
Не в сети

Зарегистрирован: Вт ноя 07, 2006 19:11
Сообщений: 17
kosmas писал(а):
Karamultuk писал(а):
Код:
$debug=1; # Режим отладки
$batch=0; # Пакетное выполение команд из файла commands.txt



Вот это поподробнее... Не совсем понятно...


для $batch=1 не дописал скрипт, это действительно планировалось использовать, если брать команды из файла. Я еще не писал и не отлаживал. При $debug=1 в корне каталоге, где исполняется скрипт должны появляться 2 файла dump.log и input.log, которые задаются для отладки в коде:
Код:
if ($debug==1)
{
  $t = new Net::Telnet(Dump_Log  => $dump_log,
                       Input_log => $input_log,
                       Prompt    => $prompt
                      );
}
else
{
  $t = new Net::Telnet(Prompt    => $prompt
                      );
}



kosmas писал(а):
Karamultuk писал(а):
Код:
# Обновление ACL
sub my_acl{
  $timeout=600;
  $cmd="delete access_profile profile_id 20\ndelete access_profile profile_id 25\ndelete access_profile profile_id 26\ndelete access_profile profile_id 27";
  $t->cmd(String=>$cmd, Timeout=>$timeout);
}


А вот тут не проще команды с текстового файлика брать?


Большое спасибо!


Конечно проще, только я не сделал еще.

Кстати, когда я общался со старшими товарищами, мне сказали, что обновление конфигурации по SNMP требует много ресурсов свитча, соответственно при большом трафике (мульткаст, к примеру) свитч может пропадать на некоторое время (ну и видео начинает лагать), соответственно и сеть лагает серьезно. Объяснили это тем, что команды подаваемые через SNMP необходимо преобразовать в последовательности нулей и единиц для ASIC'ов (интерпретировать), на что тратятся ресурсы. Не знаю насколько это есть правда, т.к. сам не проверял, зато сразу сказали, что по telnet такой проблемы не наблюдается. Это кстати критично, если ACL меняются в течение дня достаточно часто.[/code]


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

Зарегистрирован: Вт ноя 07, 2006 19:11
Сообщений: 17
А вот, например, как можно реализовать синхронизацию часов свитчей с локальной машиной без ntp.

Код:
sub my_time{
  $timeout=22;
  &my_date;
  $cmd="config time $dt_batch\nsave\n";
  $t->cmd(String=>$cmd, Timeout=>$timeout);
}


и вставить вызов процедуры сюда:
Код:
         if($batch==1)
         {
           foreach $comm(@commands)
           {
             print "";           
           }
         }else
         {
           &my_save_cfg;
           &my_time;
         }


теперь, в случае, если настроен сислог на локальной машине (к примеру Kiwi), то записи будут литься более менее синхронно.


Вернуться наверх
 Профиль  
 
СообщениеДобавлено: Вт фев 06, 2007 15:15 
Не в сети

Зарегистрирован: Пн апр 03, 2006 15:28
Сообщений: 67
Откуда: SPb
Karamultuk писал(а):
Предлгаю создать тему по обмену опытом написания маленьких полезных прикладух по мониторингу и управлению DES-3526.

Модернизация, комментарии и обмен знаними приветствуются. Надеюсь, что кому-нибудь они пригодятся.


Мысль хороша, но можно для этого к примеру:
. создать одельный сайт или лучше проект к примеру на sf.net
. код должен быть чистым и корректным
. код должен касаться именно творений dlink. Потому как различных групповых ping'ов итак туева хуча написана.

Если касаться твоего кода, то он, к сожалениию, не вполне удобоварим. Начиная от того, что в header'е скрипта нужно иметь
Код:
#!/usr/bin/perl -w
use strict;
с описанием в теле скрипта всех переменных до реализации группового пинга.

Да и групповым пингом не грех в параллель заниматься...


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

Зарегистрирован: Пн янв 08, 2007 15:38
Сообщений: 215
Откуда: Norilsk
Я за ! идею по выведению сайта или хотяб отдельной ветки форума .
и нестоит зацикливатся на perl , не все тут юниксоиды =)
предлагаю также использовать PHP в связке с сокетами .
имеется кусок недоработаного PHP IRC бота работающим напрямую через сокеты , думаю и telnet справится , главное праельно реализовать.


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

Зарегистрирован: Пн янв 02, 2006 15:20
Сообщений: 63
Откуда: Москва
Вот скрипт который:
1. делает автоматическую настройку ip-mac на порту
2. блокирует доступ пользователям с отрицательным балансом ко всему кроме выделенной подсети (доступ к биллингу для активации карты).

Код:
#!/usr/bin/perl

# Привязка IP-MAC на порт

use Net::SNMP qw(:snmp DEBUG_ALL TRANSLATE_NONE  TRANSLATE_ALL);
use Net::Telnet ();
use Data::Dumper;
use Net::IP qw(:PROC);
use DBI;

use strict;

use vars qw($SCRIPT $VERSION %OPTS);

$SCRIPT  = 'des_control';
$VERSION = '0.0.0.3';

# Необходимо чтобы эти правила были уже установлены в свиче
#create access_profile ip source_ip_mask 255.255.255.255 profile_id 10
#create access_profile ip source_ip_mask 255.255.255.255 destination_ip_mask 255.255.255.0 profile_id 30
#create access_profile ip destination_ip_mask 0.0.0.0 profile_id 40

# параметры достпа к базе mysql в которой хранятся параметры доступа к свичам
my $db_host = "localhost";
my $db_user = "root";
my $db_passwd = "";
my $db_name = "devices";

# параметры доступа к базе биллинга
my $db_billing_host = "10.0.0.1";
my $db_billing_user = "billing";
my $db_billing_passwd = "billing";
my $db_billing_name = "billing";

my $bind_ip_profile_id = "10";
my $deny_profile_id = "30";
my $denyall_profile_id = "40";
my $MAX_ACCESS_ID = 800;

# моя подсеть к которой я даю доступ в любом случае в независимости от статуса пользователя
my $server_net = '10.10.0.0';

my $access_ids_oid = ".1.3.6.1.4.1.171.12.9.2.2.1.2.";
my $src_ip_oid   = ".1.3.6.1.4.1.171.12.9.2.2.1.4.";
my $dst_ip_oid   = ".1.3.6.1.4.1.171.12.9.2.2.1.4.";
my $port_oid      = ".1.3.6.1.4.1.171.12.9.2.2.1.21.";

my $debug = 0;

# Init Telnet-connection
my $t = new Net::Telnet (
  Timeout => 5,
  Prompt => '/DES-3526:4#.*$/'
);

my ($session, $error);

my @good_boys;
my @bad_boys;

my $dbh = DBI->connect("DBI:mysql:$db_name:$db_host", $db_user, $db_passwd);
unless($dbh) {
  exit -1;
}

my $dbh_bill = DBI->connect("DBI:mysql:$db_billing_name:$db_billing_host", $db_billing_user, $db_billing_passwd);
unless($dbh) {
  exit -1;
}

my $query = "SELECT id, host, login, passwd, community FROM device";
my $sth = $dbh->prepare($query);
$sth->execute();

while(my @row = $sth->fetchrow_array()) {
  eval {
    process_host($row[0], $row[1], $row[2], $row[3], $row[4]);
  };

  if ($@) {
    print "Error while process host " . $row[1] . " :: " . $@ . "\n";
  }
}

sub process_host {
   my $host_id = shift;
   my $host_ip = shift;
   my $login = shift;
   my $passwd = shift;
   my $community = shift;
   
   _log("Process host:: $host_ip");
   
   load_host_users($host_ip);
   
   if($#good_boys < 0 && $#bad_boys < 0) {
      return;
   }
   
   ($session, $error) = snmp_init($host_ip, $community);
   telnet_init($t, $host_ip, $login, $passwd);

   test_good_boys();
   deny_bad_boys();
   
   close_telnet($t);
   close_snmp($session);
   
   _log("Finish process");
}

sub load_host_users {
   my $host_ip = shift;
   
   my $query = "
                SELECT
                        c.id AS id,
                        c.title,
                        a.addr AS ip,    IP хранится в INT-представлении
                        cs.`status` AS gate_status,
                        ug.port AS port,
                        g.host,
                        g.`comment`
                FROM
                        ***
                WHERE
                        host = ?
      ";
               
   my $sth = $dbh_bill->prepare($query);
   $sth->execute($host_ip);
   
   while(my $row = $sth->fetchrow_hashref()) {
      if($row->{gate_status} != 0) {
         add_to_array(\@bad_boys, , conver_ip($row->{ip}), $server_net, $row->{port}, $row->{id});
      } else {
         add_to_array(\@good_boys, , conver_ip($row->{ip}), $server_net, $row->{port}, $row->{id});
      }
   }   
}

sub conver_ip {
   my $bigintip = shift;
   my $binip = ip_inttobin($bigintip, 4);
   return ip_bintoip ($binip, 4);
}

sub snmp_init {
   my $host_ip = shift;
   my $community = shift;
   
   my ($session,$error) = Net::SNMP->session(
      -hostname => $host_ip,
      -community => $community,
      -version => 'snmpv2c',
   );
   
   if (!defined($session)) {
      _exit($error);
   }
   return ($session, $error);
}

sub telnet_init {
   my $t = shift;
   my $host_ip = shift;
   my $login = shift;
   my $passwd = shift;
   
   $t->open($host_ip);
   $t->waitfor('/username:.*$/');
   $t->print($login);
   $t->waitfor('/password:.*$/');
   $t->print($passwd);
}

sub close_telnet {
   my $t = shift;
   $t->close();
}

sub close_snmp {
   my $session = shift;
   $session->close();
}


sub test_good_boys {
   process('10', \@good_boys, {'test_src' => 1, 'test_port' => 1, 'action' => 'permit'});
}

sub deny_bad_boys {
   process('30', \@bad_boys, {'test_src' => 1, 'test_dst' => 1, 'test_port' => 1, 'action' => 'permit'});
   process('40', \@bad_boys, {'test_src' => 0, 'test_dst' => 1, 'test_port' => 1, 'action' => 'deny'});
}


sub process {
   my $profile_id = shift;
   my $users = shift;
   my $actions = shift; # {test_src => 1/0, test_dst => 1/0, test_port => 1/0, action => deny/permit}
   
   my @tested;
   my @access_ids = snmp_walk($access_ids_oid . $profile_id);
   
   foreach my $access_id (@access_ids) {
      my $_src_ip_oid = $src_ip_oid . $profile_id . '.' . $access_id->{value};
      my $_dst_ip_oid = $dst_ip_oid . $profile_id . '.' . $access_id->{value};
      my $_port_oid = $port_oid . $profile_id . '.' . $access_id->{value};
      
      my $src_ip = snmp_get($_src_ip_oid);
      my $dst_ip = snmp_get($_dst_ip_oid);
      my $port = get_port_from_hex(snmp_get($_port_oid));
      
      if(!check_user($users, $src_ip->{value}, $dst_ip->{value}, $port, $actions)) {
         remove_access_id($profile_id, $access_id->{value});
      } else {
         push(@tested, $port);
         _log("Nothing to do. Profile $profile_id, access " . $access_id->{value} . " skip port $port. ");
      }
   }
   
   my $new_records = get_new_records($users, \@tested);
   foreach my $record (@$new_records) {
      add_access_id($profile_id, $record, $actions);
   }
}

sub add_access_id {
   my $profile_id = shift;
   my $record = shift;
   my $actions = shift;
   
   my $access_id = get_free_access_id($profile_id);
   
   my $cmd = "config access_profile profile_id $profile_id add access_id $access_id ip ";
   
   $cmd .= ' source_ip ' . $record->{src_ip} . ' ' if($actions->{test_src});
   $cmd .= ' destination_ip ' . $record->{dst_ip} . ' ' if($actions->{test_dst});
   $cmd .= ' port ' . $record->{port} . ' ' if($actions->{test_port});
   $cmd .= $actions->{action};
   
   my @lines = $t->cmd($cmd);
   _log($cmd);
}

sub remove_access_id {
   my $profile_id = shift;
   my $access_id = shift;
   
   my $cmd = "config access_profile profile_id $profile_id delete access_id $access_id";
   
   my @lines = $t->cmd($cmd);
   _log($cmd);
}


sub check_user {
   my $users = shift;
   my $src_ip = shift;
   my $dst_ip = shift;
   my $port = shift;
   my $actions = shift;
   my $result = 0;
   
   foreach my $usr (@$users) {
      if($usr->{port} != $port) { next; }
      if($actions->{test_src}) {
         if($usr->{src_ip} eq $src_ip) {
            $result = 1;
         } else {
            $result = 0;
         }
      }
      if($actions->{test_dst}) {
         if($usr->{dst_ip} eq $dst_ip) {
            $result = 1;
         } else {
            $result = 0;
         }
      }
      if($actions->{test_port}) {
         if($usr->{port} eq $port) {
            $result = 1;
         } else {
            $result = 0;
         }
      }
      last;
   }
   return $result
}

sub get_port_from_hex {
   my $hex_str = shift;
   my $result = 0;
   my $number = hex($hex_str->{value});

   for(my $i = 2147483648; $i >=1; $i/=2) {
      $result++;
      if($i == $number) { last; }
   }
   #print "HEX: $hex_str->{value}, DEC: $number, RES: $result\n";
   return $result;
}

sub get_new_records {
   my $input_array = shift;
   my $tested_ports = shift;
   my @result;

   my %seen = ();
   foreach my $item (@$tested_ports) { $seen{$item} = 1 }
   
   foreach my $obj (@$input_array) {
      unless ($seen{$obj->{port}}) {
         push(@result, $obj);
      }
   }
   return \@result;
}

sub get_free_access_id {
   my $profile_id = shift;
   my $result;
   
   my @seen;
   my @access_ids = snmp_walk($access_ids_oid . $profile_id);
   foreach my $access_id (@access_ids) {
      $seen[$access_id->{value}] = 1;
   }

   for(my $i = 1; $i <= $MAX_ACCESS_ID; $i++) {
      if($seen[$i] != 1) {
         $result = $i;
         last;
      }
   }
   return $result;
}

sub snmp_walk {
   my $_oid = shift;
   my $oid;
   my @result;
   my @args = (-varbindlist   => [$_oid] );

   while (defined($session->get_next_request(@args))) {
      $oid = ($session->var_bind_names())[0];
      if (!oid_base_match($_oid,  $oid)) { last;}
      my %hash;
      $hash{'oid'} = $oid;
      $hash{'type'} = snmp_type_ntop($session->var_bind_types()->{$oid});
      $hash{'value'} = $session->var_bind_list()->{$oid};
       push( @result, \%hash);
      @args = (-varbindlist => [$oid]);
   }
   return @result;    
}

sub snmp_get {
   my $_oid = shift;
   my $debug = shift;
   
   $session->translate(TRANSLATE_NONE);
   my $result = $session->get_request(-varbindlist => [$_oid]);
   my %hash;
   $hash{'oid'} = $_oid;
   $hash{'type'} = snmp_type_ntop($session->var_bind_types()->{$_oid});
   $hash{'value'} = sprintf('0x%s', unpack('H*', $result->{$_oid}));
   $session->translate(TRANSLATE_ALL);
   return \%hash;
}

sub add_to_array {
   my $array = shift;
   my $src_ip = shift;
   my $dst_ip = shift;
   my $port = shift;
   my $id = shift;
   
   push(@$array, {'port' => $port, 'src_ip' => $src_ip, 'dst_ip' => $dst_ip, 'id' => $id });
}

sub _exit {
   printf join('', sprintf("%s: ", $SCRIPT), shift(@_), ".\n"), @_;
   exit 1;
}

sub _log {
   my $msg = shift;
   print $msg . "\n" if ($debug);
}



Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн май 18, 2009 10:26 
Не в сети

Зарегистрирован: Ср мар 25, 2009 19:35
Сообщений: 16
Скрипт был написан для конвигурирования свитчей для юзерский портов
Код:
<?php
$id_now=$_GET['id_now'];//начальный порт
$id_end=$_GET['id_end'];//конечныйй порт
if (($id_now!=0)&($id_end!=0))
echo "
#loopdetect включаем на всех портах <br/>\n
<br/>\n
enable loopdetect<br/>\n
config loopdetect ports ".$id_now."-".$id_end." state enabled<br/>\n
config loopdetect recover_timer 60 interval 10 mode port-based<br/>\n
<br/>\n
#Настраиваем мультикаст<br/>\n
#включаем фильтрацию мультикаста на свитче протокол фильтрации<br/>\n 
# IGMP — Internet Group Management Protocol<br/>\n
<br/>\n
config igmp_snooping all state enable<br/>\n
config igmp_snooping querier all state enable<br/>\n
enable igmp_snooping <br/>\n
<br/>\n
#Говорим о том что в определенном вилане запрешены мультикаст роуторы на определеных портах<br/>\n
<br/>\n
config router_ports_forbidden  User`s add ".$id_now."-".$id_end."<br/>\n
<br/>\n
#конфигурим мултикаст собственно включаем фильтрацию по группам для определенных портов в данном случае присваем унрегистрет групп<br/>\n
<br/>\n
config multicast port_filtering_mode ".$id_now."-".$id_end." filter_unregistered_groups<br/>\n
<br/>\n
#создаем группу в которой описывается айпишники все по протоколу<br/>\n
<br/>\n
create multicast_range mult_deny from 224.0.0.1 to 239.255.255.254 <br/>\n
<br/>\n
#добавляем эту группу  в лимитирование в отношение определеных портов<br/>\n
<br/>\n
config limited_multicast_addr ports ".$id_now."-".$id_end." add multicast_range mult_deny <br/>\n
<br/>\n
#включаем лимиты в отношение этих портов<br/>\n
<br/>\n
config limited_multicast_addr ports ".$id_now."-".$id_end." state enable <br/>\n
<br/>\n
#настраиваем vpn разрешаем нужное<br/>\n
<br/>\n
create access_profile ip vlan destination_ip_mask 255.255.255.255 tcp dst_port_mask 0xFFFF profile_id 1<br/>\n
config access_profile profile_id 1 add access_id 1 ip vlan User`s destination_ip чч.0.0.ччч tcp dst_port 1723  port ".$id_now."-".$id_end." permit<br/>\n
config access_profile profile_id 1 add access_id ".(2+($id_end-$id_now))." ip vlan Corporate destination_ip чч.ччч.ч.ччч tcp dst_port 1723 port ".$id_now."-".$id_end." permit<br/>\n
config access_profile profile_id 1 add access_id ".(3+2*($id_end-$id_now))." ip vlan User`s destination_ip чч.ч.ч.ч tcp dst_port 1723 port ".$id_now."-".$id_end." permit<br/>\n
<br/>\n
#разрешаем наш DHCP<br/>\n
<br/>\n
create access_profile ip vlan source_ip_mask 255.255.255.255 udp src_port_mask 0xFFFF profile_id 3<br/>\n
config access_profile profile_id 3 add access_id 1 ip vlan User`s source_ip чч.ч.ч.ччч udp src_port 67  port ".$id_now."-".$id_end." permit<br/>\n
config access_profile profile_id 3 add access_id ".(2+($id_end-$id_now))." ip vlan Corporate source_ip чч.ччч.чч.чч udp src_port 67  port ".$id_now."-".$id_end." permit<br/>\n
<br/>\n
#Убираем netbios and windows share for User`s<br/>\n
<br/>\n
create access_profile ip tcp dst_port_mask 0xFFFF profile_id 4<br/>\n
config access_profile profile_id 4 add access_id 1 ip  tcp dst_port 135  port ".$id_now."-".$id_end." deny<br/>\n
config access_profile profile_id 4 add access_id ".(2+($id_end-$id_now))." ip  tcp dst_port 139  port ".$id_now."-".$id_end." deny<br/>\n
config access_profile profile_id 4 add access_id ".(1+2*(1+$id_end-$id_now))." ip  tcp dst_port 445  port ".$id_now."-".$id_end." deny<br/>\n
<br/>\n
#udp туда же<br/>\n
<br/>\n
create access_profile ip vlan udp dst_port_mask 0xffff profile_id 5<br/>\n
config access_profile profile_id 5 add access_id  1 ip  udp dst_port         137 port ".$id_now."-".$id_end." deny<br/>\n
config access_profile profile_id 5 add access_id  ".(2+($id_end-$id_now))." ip  udp dst_port         138 port ".$id_now."-".$id_end." deny<br/>\n
config access_profile profile_id 5 add access_id  ".(1+2*(1+$id_end-$id_now))." ip   udp dst_port         445 port ".$id_now."-".$id_end."  deny<br/>\n
<br/>\n
#Запрешаем все чужие DHCP<br/>\n
<br/>\n
create access_profile ip vlan source_ip_mask 0.0.0.0 udp src_port_mask 0xFFFF profile_id 6 <br/>\n
config access_profile profile_id 6 add access_id 1 ip vlan User`s source_ip 0.0.0.0  udp src_port 67 port ".$id_now."-".$id_end." deny<br/>\n
config access_profile profile_id 6 add access_id ".(2+($id_end-$id_now))." ip vlan Corporate source_ip 0.0.0.0  udp src_port 67 port ".$id_now."-".$id_end." deny<br/>\n
<br/>\n
#Запрешаем все чужие VPN<br/>\n
<br/>\n
create access_profile ip vlan destination_ip_mask 0.0.0.0 tcp dst_port_mask 0xFFFF profile_id 7<br/>\n
config access_profile profile_id 7 add access_id 1 ip vlan User`s destination_ip 0.0.0.0 tcp dst_port 1723 port ".$id_now."-".$id_end." deny<br/>\n
config access_profile profile_id 7 add access_id ".(2+($id_end-$id_now))." ip vlan Corporate destination_ip 0.0.0.0 tcp dst_port 1723 port ".$id_now."-".$id_end." deny<br/>\n
<br/>\n
# Создаём профиль ACL для запрещения всех PPPoE-пакетов<br/>\n
<br/>\n
create access_profile  ethernet ethernet_type profile_id 8<br/>\n
<br/>\n
# Запрещаем все  PPPoE пакеты<br/>\n
<br/>\n
config access_profile profile_id 8 add access_id 1 ethernet ethernet_type 0x8863 port ".$id_now."-".$id_end." deny<br/>\n
config access_profile profile_id 8 add access_id ".(2+($id_end-$id_now))." ethernet ethernet_type 0x8864 port ".$id_now."-".$id_end." deny<br/>\n";
?>


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн май 18, 2009 15:26 
Не в сети

Зарегистрирован: Вт мар 06, 2007 12:22
Сообщений: 94
люди ни у кого нету скрипта который бы вытаскивал in и out битрейт с порта коммутатора?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн май 18, 2009 21:02 
Не в сети

Зарегистрирован: Пн янв 08, 2007 15:38
Сообщений: 215
Откуда: Norilsk
romanse писал(а):
люди ни у кого нету скрипта который бы вытаскивал in и out битрейт с порта коммутатора?

ну вот на вскидку
Код:
<?php

$ipSW='10.90.90.90';
$comunity='public';

//$time_o = microtime(1);
$time_o = snmp2_get($ipSW,$comunity,'.1.3.6.1.2.1.1.3.0');
if(eregi('([0-9]{3,12})',$time_o,$tim_o)) $time_o = $tim_o[1]/100;

for ($i = 1; $i <= 24; $i++)
    {
       //входящий трафик
       $in_o = snmp2_get($ipSW,$comunity,'.1.3.6.1.2.1.2.2.1.10.'.$i);
           if(eregi('([0-9]{3,32})',$in_o,$var))    $in_byte_o[$i]= $var[1];
       //исходящий трафик
       $out_o = snmp2_get($ipSW,$comunity,'.1.3.6.1.2.1.2.2.1.16.'.$i);
           if(eregi('([0-9]{3,32})',$out_o,$var))    $out_byte_o[$i]= $var[1];
    }
//sleep(1); // можно ввести задержку между запросами
//$time_l = microtime(1);
$time_l = snmp2_get($ipSW,$comunity,'.1.3.6.1.2.1.1.3.0');
if(eregi('([0-9]{3,12})',$time_l,$tim_l)) $time_l = $tim_l[1]/100;

for ($i = 1; $i <= 24; $i++)
    {
   //входящий трафик
       $in_l = snmp2_get($ipSW,$comunity,'.1.3.6.1.2.1.2.2.1.10.'.$i);
           if(eregi('([0-9]{3,32})',$in_l,$var))    $in_byte_l[$i]= $var[1];
   //исходящий трафик
       $out_l = snmp2_get($ipSW,$comunity,'.1.3.6.1.2.1.2.2.1.16.'.$i);
           if(eregi('([0-9]{3,32})',$out_l,$var))    $out_byte_l[$i]= $var[1];
    }

$time = $time_l-$time_o;

for ($i = 1; $i <= 24; $i++)
    {
        $in_byte[$i] = round((($in_byte_l[$i]-$in_byte_o[$i])/1000/1000*8)/$time);
        $out_byte[$i] = round((($out_byte_l[$i]-$out_byte_o[$i])/1000/1000*8)/$time);
        print 'Port '.$i.' IN - '.$in_byte[$i].' mbit/s : OUT - '.$out_byte[$i]." mbit/s \n";
    }

    print 'time getting '.$time.'sec';
?>

_________________
Люблю писать с ошибками.....
D-Link User: DGS-3627G, DGS-3324SR, DES-3526, DES-1024D, DES-1016D, DWL-2100AP, DEM-310GT,DEM-330, DCS-950.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

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


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

Сейчас этот форум просматривают: Google [Bot] и гости: 221


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

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