faq обучение настройка
Текущее время: Пт апр 19, 2024 23:11

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




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: DES-3200-28 мониторинг по порту.
СообщениеДобавлено: Вс дек 27, 2015 11:55 
Не в сети

Зарегистрирован: Вс дек 27, 2015 11:46
Сообщений: 3
Здравствуйте! Появилась необходимость написать скрипт, который будет отслеживать состояние порта на свитче и в случае падения будет отправлять письмо на почту. Может что-то есть из штатных средств, которые облегчат задачу? как это вообще можно реализовать, подскажите пожалуйста.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: DES-3200-28 мониторинг по порту.
СообщениеДобавлено: Пн дек 28, 2015 14:41 
Не в сети

Зарегистрирован: Пн дек 28, 2015 12:01
Сообщений: 17
Добрый день.
Одного порта или вообще портов? На чем будет работать скрипт - win\linux?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: DES-3200-28 мониторинг по порту.
СообщениеДобавлено: Чт дек 31, 2015 15:53 
Не в сети

Зарегистрирован: Вс дек 27, 2015 11:46
Сообщений: 3
Одного порта, на ubuntu server 12.04


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: DES-3200-28 мониторинг по порту.
СообщениеДобавлено: Чт дек 31, 2015 21:40 
Не в сети

Зарегистрирован: Пн дек 28, 2015 12:01
Сообщений: 17
варианта два:
- первый вариант - это использовать rsyslogd и фильтровать по номеру порта.. что-то типа
Код:
2015-12-31T17:47:20+03:00 [192.168.168.34] local0.info<134> INFO: Port 9 link down
2015-12-31T17:47:22+03:00 [192.168.168.34] local0.info<134> INFO: Port 9 link up, 1000Mbps FULL duplex

- второй - использовать SNMP и его трапы. Хотя можно и по CRONу периодически дергать snmp-get на определенный порт:
Код:
snmpget -v 2c -c public 192.168.168.15 .1.3.6.1.2.1.2.2.1.8.5
, где последняя 5 это номер порта
на выходе получим INTEGER 1 - link UP, 2 - link DOWN
насчет OID лучше уточнить по конкретной модели коммутатора. Если использовать в shell скрипте, то добавить параметр -Oqv
но я бы использовал snmptrapd

С НОВЫМ ГОДОМ! Будут вопросы - пишите, будем пробовать решить.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: DES-3200-28 мониторинг по порту.
СообщениеДобавлено: Ср янв 06, 2016 11:26 
Не в сети

Зарегистрирован: Чт авг 26, 2010 16:34
Сообщений: 514
Откуда: North KZ south Kokchetav
Цитата:
rsyslogd

Цитата:
по CRONу периодически дергать snmp-get

Извращенец
Цитата:
но я бы использовал snmptrapd

+1, примерно вот эдак:
Код:
#!/usr/bin/perl -w

use Switch;
use threads;
use warnings;
use strict;
use Net::SNMPTrapd;

use constant THREADS_COUNT => 4;

use constant DEBUG              => 0;
use constant GLOBAL_OID         => '1.3.6.1.6.3.1.1.4.1.0';
use constant LINKDOWN_OID       => '1.3.6.1.6.3.1.1.5.3';

my $log_filename = "/var/log/snmptraps.log";

open(STDIN,  "+>/dev/null") or die "Can't open STDIN: $!\n";
open(STDOUT, "+>/dev/null") or die "Can't open STDOUT: $!\n";
open(STDERR, "+>>$log_filename") or die "Can't open STDERR: $!\n";

my $obj = Net::SNMPTrapd->new(Family=>'ipv4', LocalAddr=>'1.1.1.1', LocalPort=>162, timeout=>3) or die "Error: ", Net::SNMPTrapd->error;

for my $i (1..(THREADS_COUNT - 1)) { threads->create(\&request_loop, $obj); }
request_loop($obj);

sub request_loop {
  my $snmptrapd = shift;
  my $tid = threads->tid(); # thread ID
  logX($tid, 'START');
  my ($ip, $found, $p, $trap);
  while (1) {
        $trap = $snmptrapd->get_trap();
        if (!defined($trap)) {
                logX($tid, Net::SNMPTrapd->error);
                next;
        }
        next if ($trap == 0);
        if (!defined($trap->process_trap())) { logX($tid, Net::SNMPTrapd->error); }
        else {
                $ip = $trap->remoteaddr;
                $found = 0;
                $p = "";
                for my $vals (@{$trap->varbinds}) {
                        for (keys(%{$vals})) {
                                $p .= sprintf "%s: %s; ", $_, $vals->{$_};
                                switch ($_) {
                                        case GLOBAL_OID {
                                                switch($vals->{$_}){
                                                        case LINKDOWN_OID { $found = 2; }
                                                }
                                                last;
                                        } else {
                                                if ($found == 2) {
                                                        logX($tid, "$ip down port $vals->{$_}");
                                                        $found = 1;
                                                }
                                        }
                                }
                        }
                        last if ($found == 1);
                }
                logX($tid, "[$ip] $p") if (DEBUG == 1);
        }
  }
}

sub logX
{
  my ($tid, $msg) = @_;
  my $now =  POSIX::strftime("%d.%m.%Y %H:%M:%S", localtime);
  open hFile, ">>", $log_filename;
  print hFile "$now Thread ($tid): $msg\n";
  close hFile;
}


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

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


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

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


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

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