Комментарии 29
Спасибо за приложение! Планируется ли переезд на GitHub? (На GitHub легче отправлять pull request)
Без исходников?
del
И еще не плохо бы видеть статус интерфейса up/down. И чтобы можно было отключать шапку таблицы. Т.е. вывод выглядел бы по маске: ||ifDescription|\n. Было бы совсем круто.
Будет сделано!
Да и еще обнаружил что ifDescription режется. В варианте без шапки снять ограничение на длину дескприпшена и убрать не значившийся пробелы. Была бы клевая утиля для нагиособразных утилит.
Понял, рассмотрим. Если что напишу в личку.
Добавлено в новой версии:
аргумент -l может принимать значения
<wtraf HOST -l> — минимальный листинг без шапки
<wtraf HOST -lt> — минимальный листинг с шапкой
<wtraf HOST -l++> — больше информации без шапки
<wtraf HOST -lt+> — больше информации с шапкой, в т.ч. up/down
аргумент -l может принимать значения
<wtraf HOST -l> — минимальный листинг без шапки
<wtraf HOST -lt> — минимальный листинг с шапкой
<wtraf HOST -l++> — больше информации без шапки
<wtraf HOST -lt+> — больше информации с шапкой, в т.ч. up/down
Про up/down хорошо подмечено!
Спасибо за программу! проверил с mikrotik работает:)
Мне идея утилиты понравилась. Но показалась, что она работает несколько медленно по крайней мере с опцией -l. Я тут пораскинул умишком и на коленках изобразил одну из возможностей Вашей утили на perl. Реализована опция только -l. Представляю на суд общественности свою версию. В моем случае Ваша утилита работает 18 секунд, а моя 4 секунды
#!/usr/bin/perl -w
#
use strict;
#
#OIDS
use Net::SNMP qw(:snmp);
use Data::Dumper qw(Dumper);
use vars qw($OURVAR);
#
#Debug mode
my $debug=0;
my $log_file="/usr/share/cacti/log/test_query_juniper_rsvp_pl.log";
my $log_open = 0;
my $verbose=1;
my $xml_delimiter=':';
#
my ($snmp_auth,$snmp_community,$snmp_version,$snmp_port,$timeout,$snmp_user,$snmp_pw);
my ($result,$session,$error);
my $retries=1;
#
#SNMP OIDS;
my $ifIndex =".1.3.6.1.2.1.2.2.1.1";
my $ifStatus = ".1.3.6.1.2.1.2.2.1.8";
my $ifDescription = ".1.3.6.1.2.1.2.2.1.2";
my $ifName = ".1.3.6.1.2.1.31.1.1.1.1";
my $ifAlias = ".1.3.6.1.2.1.31.1.1.1.18";
my $ifType = ".1.3.6.1.2.1.2.2.1.3";
my $ifSpeed = ".1.3.6.1.2.1.2.2.1.5";
my $ifHWaddress = ".1.3.6.1.2.1.2.2.1.6";
my $ifInOctets = ".1.3.6.1.2.1.2.2.1.10";
my $ifOutOctets = ".1.3.6.1.2.1.2.2.1.16";
my $ifOutOctets64 = ".1.3.6.1.2.1.31.1.1.1.10";
my $FcIdName = ".1.3.6.1.4.1.2636.3.15.3.1.2";
my $FabricPriority = ".1.3.6.1.4.1.2636.3.15.3.1.3";
#
sub usage()
{
print «Usage: wtraf.pl -cCommunity -v(1|2) -l ip_device\n»;
}
#
#Main
#
#
my ($command,$i,$option,$ip,$list,$short)=0;
$snmp_version=1;
$snmp_community=«public»;
$timeout=1;
if ($#ARGV == -1 ){usage();exit;}
else{$i=0;
foreach $option (@ARGV)
{
chomp ($option);
if (($option =~ m/^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/) and ($i == $#ARGV)){$ip=$option;print «IPV4: $option\n»;}
elsif (($option =~ m/^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/) and ($i != $#ARGV)){
print «Wrong command line ip address must be last.\n»;
usage; exit;}
elsif ($option =~ m/\-l/){$command=$option;print «Option: $list\n»;$list=1;}
elsif ($option =~ m/^\-c\w+?$/) {
$snmp_community=$option;$snmp_community =~ s/^\-c//;
print«Community:$snmp_community\n»;}
elsif ($option =~ m/(^\-v\d$)/) {
$snmp_version=$option;
$snmp_version =~ s/^\-v//;
print«Version:$snmp_version\n»;}
$i++;
}
if ($command eq "-l"){print«List intrefaces:\n»}
print «Command line options:\nipv4:$ip\ncomunity:$snmp_community\nversion:$snmp_version\n»;
}
my %index_table;
if ($list==1){
($session,$error) = Net::SNMP->session(
-hostname => $ip,
-community => $snmp_community,
-version => $snmp_version,
-timeout => $timeout,
-retries=> 1,
-nonblocking => 0,
);
if ( !defined $session) { printf «ERROR: %s.\n», $error; exit 1}
####ifIndex
my $request_oid=$ifIndex;
$result = $session->get_table(
-baseoid => $request_oid,
-maxrepetitions => 10,
);
my %ifIndex=();
my %table=%{$result};
foreach my $key (keys %table)
{
my $data= $table{$key};
if ($key =~ /\.(\d+)$/)
{$key=$1;}
$ifIndex{$key}=$data;
}
####ifName
$request_oid=$ifName;
$result = $session->get_table(
-baseoid => $request_oid,
-maxrepetitions => 10,
);
if (!defined $result) { printf «ERROR: %s\n», $session->error(); $session->close(); exit 1; }
my %ifName=();
%table=%{$result};
foreach my $key (keys %table)
{
my $data= $table{$key};
if ($key =~ /\.(\d+)$/)
{$key=$1;}
$ifName{$key}=$data;
}
####ifAlias
$request_oid=$ifAlias;
$result = $session->get_table(
-baseoid => $request_oid,
-maxrepetitions => 10,
);
if (!defined $result) { printf «ERROR: %s\n», $session->error(); $session->close(); exit 1; }
my %ifAlias=();
%table=%{$result};
foreach my $key (keys %table)
{
my $data= $table{$key};
if ($key =~ /\.(\d+)$/)
{$key=$1;}
$ifAlias{$key}=$data;
}
####ifStatus
$request_oid=$ifStatus;
$result = $session->get_table(
-baseoid => $request_oid,
-maxrepetitions => 10,
);
if (!defined $result) { printf «ERROR: %s\n», $session->error(); $session->close(); exit 1; }
my %ifStatus=();
%table=%{$result};
foreach my $key (keys %table)
{
my $data= $table{$key};
if ($key =~ /\.(\d+)$/)
{$key=$1;}
$ifStatus{$key}=$data;
}
###############################
snmp_dispatcher();
$session->close();
my data="";
foreach my $key (sort keys %ifIndex)
{
print "$ifIndex{$key}|$ifName{$key}|$ifAlias{$key}|$ifStatus{$key}\n";
}
}
#End
#!/usr/bin/perl -w
#
use strict;
#
#OIDS
use Net::SNMP qw(:snmp);
use Data::Dumper qw(Dumper);
use vars qw($OURVAR);
#
#Debug mode
my $debug=0;
my $log_file="/usr/share/cacti/log/test_query_juniper_rsvp_pl.log";
my $log_open = 0;
my $verbose=1;
my $xml_delimiter=':';
#
my ($snmp_auth,$snmp_community,$snmp_version,$snmp_port,$timeout,$snmp_user,$snmp_pw);
my ($result,$session,$error);
my $retries=1;
#
#SNMP OIDS;
my $ifIndex =".1.3.6.1.2.1.2.2.1.1";
my $ifStatus = ".1.3.6.1.2.1.2.2.1.8";
my $ifDescription = ".1.3.6.1.2.1.2.2.1.2";
my $ifName = ".1.3.6.1.2.1.31.1.1.1.1";
my $ifAlias = ".1.3.6.1.2.1.31.1.1.1.18";
my $ifType = ".1.3.6.1.2.1.2.2.1.3";
my $ifSpeed = ".1.3.6.1.2.1.2.2.1.5";
my $ifHWaddress = ".1.3.6.1.2.1.2.2.1.6";
my $ifInOctets = ".1.3.6.1.2.1.2.2.1.10";
my $ifOutOctets = ".1.3.6.1.2.1.2.2.1.16";
my $ifOutOctets64 = ".1.3.6.1.2.1.31.1.1.1.10";
my $FcIdName = ".1.3.6.1.4.1.2636.3.15.3.1.2";
my $FabricPriority = ".1.3.6.1.4.1.2636.3.15.3.1.3";
#
sub usage()
{
print «Usage: wtraf.pl -cCommunity -v(1|2) -l ip_device\n»;
}
#
#Main
#
#
my ($command,$i,$option,$ip,$list,$short)=0;
$snmp_version=1;
$snmp_community=«public»;
$timeout=1;
if ($#ARGV == -1 ){usage();exit;}
else{$i=0;
foreach $option (@ARGV)
{
chomp ($option);
if (($option =~ m/^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/) and ($i == $#ARGV)){$ip=$option;print «IPV4: $option\n»;}
elsif (($option =~ m/^(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/) and ($i != $#ARGV)){
print «Wrong command line ip address must be last.\n»;
usage; exit;}
elsif ($option =~ m/\-l/){$command=$option;print «Option: $list\n»;$list=1;}
elsif ($option =~ m/^\-c\w+?$/) {
$snmp_community=$option;$snmp_community =~ s/^\-c//;
print«Community:$snmp_community\n»;}
elsif ($option =~ m/(^\-v\d$)/) {
$snmp_version=$option;
$snmp_version =~ s/^\-v//;
print«Version:$snmp_version\n»;}
$i++;
}
if ($command eq "-l"){print«List intrefaces:\n»}
print «Command line options:\nipv4:$ip\ncomunity:$snmp_community\nversion:$snmp_version\n»;
}
my %index_table;
if ($list==1){
($session,$error) = Net::SNMP->session(
-hostname => $ip,
-community => $snmp_community,
-version => $snmp_version,
-timeout => $timeout,
-retries=> 1,
-nonblocking => 0,
);
if ( !defined $session) { printf «ERROR: %s.\n», $error; exit 1}
####ifIndex
my $request_oid=$ifIndex;
$result = $session->get_table(
-baseoid => $request_oid,
-maxrepetitions => 10,
);
my %ifIndex=();
my %table=%{$result};
foreach my $key (keys %table)
{
my $data= $table{$key};
if ($key =~ /\.(\d+)$/)
{$key=$1;}
$ifIndex{$key}=$data;
}
####ifName
$request_oid=$ifName;
$result = $session->get_table(
-baseoid => $request_oid,
-maxrepetitions => 10,
);
if (!defined $result) { printf «ERROR: %s\n», $session->error(); $session->close(); exit 1; }
my %ifName=();
%table=%{$result};
foreach my $key (keys %table)
{
my $data= $table{$key};
if ($key =~ /\.(\d+)$/)
{$key=$1;}
$ifName{$key}=$data;
}
####ifAlias
$request_oid=$ifAlias;
$result = $session->get_table(
-baseoid => $request_oid,
-maxrepetitions => 10,
);
if (!defined $result) { printf «ERROR: %s\n», $session->error(); $session->close(); exit 1; }
my %ifAlias=();
%table=%{$result};
foreach my $key (keys %table)
{
my $data= $table{$key};
if ($key =~ /\.(\d+)$/)
{$key=$1;}
$ifAlias{$key}=$data;
}
####ifStatus
$request_oid=$ifStatus;
$result = $session->get_table(
-baseoid => $request_oid,
-maxrepetitions => 10,
);
if (!defined $result) { printf «ERROR: %s\n», $session->error(); $session->close(); exit 1; }
my %ifStatus=();
%table=%{$result};
foreach my $key (keys %table)
{
my $data= $table{$key};
if ($key =~ /\.(\d+)$/)
{$key=$1;}
$ifStatus{$key}=$data;
}
###############################
snmp_dispatcher();
$session->close();
my data="";
foreach my $key (sort keys %ifIndex)
{
print "$ifIndex{$key}|$ifName{$key}|$ifAlias{$key}|$ifStatus{$key}\n";
}
}
#End
Спасибо, как раз ранее был написан скрипт на perl.
Для автономности решено было собрать статические библиотеки net-snmp, pdcurses(ncurses) и boost. И написать утилитку на c++.
Ввиду сырости программы такая пока скорость, буду улучшать.
Для сбора информации по интерфейсам использую функцию библиотеки net-snmp:
«netsnmp_query_walk(hrprload_var, sess_handle);»
Для автономности решено было собрать статические библиотеки net-snmp, pdcurses(ncurses) и boost. И написать утилитку на c++.
Ввиду сырости программы такая пока скорость, буду улучшать.
Для сбора информации по интерфейсам использую функцию библиотеки net-snmp:
«netsnmp_query_walk(hrprload_var, sess_handle);»
Эх, ещё бы совместимость с arm…
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Кроссплатформенная утилита мониторинга SNMP-трафика без зависимостей и наличия GUI