Получение таблицы MAC-адресов с устройства

Преамбула

Zabbix пока не умеет получать таблицу в качестве айтема. Посему получаем просто список mac-адресов строкой Для этого используем 2 ветки SNMP:

  • .1.3.6.1.2.1.17.4.3.1.1 - Выдает пул mac-адресов
    17.4.3.1.1.0.0.12.7.172.8 = Hex: 00 00 0C 07 AC 08
    17.4.3.1.1.0.1.2.27.80.145 = Hex: 00 01 02 1B 50 91
    17.4.3.1.1.0.1.3.72.77.90 = Hex: 00 01 03 48 4D 5A
    17.4.3.1.1.0.1.3.72.221.191 = Hex: 00 01 03 48 DD BF
    ...
    
  • .1.3.6.1.2.1.17.4.3.1.2 - Выдает список портов на устройстве
    17.4.3.1.2.0.0.12.7.172.8 = 13
    17.4.3.1.2.0.1.2.27.80.128 = 13
    17.4.3.1.2.0.1.2.27.80.145 = 13
    17.4.3.1.2.0.1.2.163.145.225 = 13
    

Осталось только найти соответствие между номерами OIDов, и мы увидим, что OIDы, оканчивающиеся на 12.7.172.8 дадут нам mac и номер порта, на котором этот mac висит.

Скрипт для получения MAC-адресов на порту устройства

Формат вызова:

perl mac-address.pl <IP-адрес устройства> <Номер порта на устройстве>

Скрипт выдает список mac-адресов, разделенных занятыми. Если параметры указаны неверно или на порту не зарегистрировано адресов - скрипт выдает null

mac-address.pl
#! /usr/bin/perl
#====================================================================
#
#                   QUERY MAC ADDRESSES FROM 3COM SWITCH FROM SELECTED PORT
#====================================================================
 
 
use strict;
use Net::SNMP qw(snmp_dispatcher oid_lex_sort);
 
my $show_vendor = 1;
my $script = "/usr/share/zabbix/scripts/mac.sh -s";
my $debug = 0;
my $file_name = "/tmp/$ARGV[0]-getmac.tmp";
my $interval = 90; #refresh rate
my $new = 0;
my @list;
my $write_secs = (stat($file_name))[9];
if ($debug == 1){
        print "file $file_name updated at ", scalar(localtime($write_secs)), "\n";
};
if ($write_secs + $interval < time) {    #file updated less then $interval seconds ago
        if ($debug == 1){print "generating new mac table \n";} 
        $new = 1;        
        open FH, ">$file_name" or die "can't open '$file_name': $!";
}else {
        if ($debug == 1){print "using old mac table \n";} 
        open FR, "<$file_name" or die "can't open '$file_name': $!";
        while(my $line = <FR>) {
                chomp($line);
                my ($p, $m) = split/;/, $line;
                @list[$p] = "@list[$p]$m, ";
        }
}
#=====================================
my $session;
my $error;
my $port = $ARGV[1];
if($new == 1) {
        #=== Setup session to remote host ===
        ($session, $error) = Net::SNMP->session(
        -hostname  => $ARGV[0] || 'localhost',
        -community => 'public',
        -version => '2c',
        -translate   => [-octetstring => 0],
        -port      => 161
        );
        #=== Was the session created? ===
        if (!defined($session)) {
                printf("ERROR: %s\n", $error);
                exit 1;
        }
};
#==================================
 
#=== OIDs queried to retrieve information ====
my $TpFdbAddress = '1.3.6.1.2.1.17.4.3.1.1';
my $TpFdbPort    = '1.3.6.1.2.1.17.4.3.1.2';
#=============================================
my $result;
my @tmp;
my $x;
if($new == 1) {
        if (defined($result = $session->get_table($TpFdbAddress))) {
                foreach (oid_lex_sort(keys(%{$result}))) {
                        $x = unpack('H*',$result->{$_});
                        $x =~ s/(..(?!\Z))/\1:/g;
                        push( @tmp, $x);
                }
        }else {
                if($debug == 1) {
                        printf("ERROR: %s\n\n", $session->error());
                }
        }
#==========================================
#=== Print the returned MAC ports ===
        $result;
        if (defined($result = $session->get_table(-baseoid => $TpFdbPort))) {
                my $i = 0;
                my $out = "";
                my $res = 0;
                my $tmp_port;
                my $tmp_mac_list = "";
                foreach (oid_lex_sort(keys(%{$result}))) { 
                        if($result->{$_} == $port) {
                                $res = 1;
                                if( $show_vendor == 1) {        
                                        $out = `$script $tmp[$i]`;
                                        printf("%s(%s)", $tmp[$i], $out);
                                }else {
                                        printf("%s", $tmp[$i]);
                                };
                                print ", ";
                        };
                        if( $show_vendor == 1) {        
                                $out = `$script $tmp[$i]`;
                                printf FH ("%s;%s(%s)\n", $result->{$_}, $tmp[$i], $out);
                        }else {
                                printf FH ("%s;%s\n", $result->{$_}, $tmp[$i]);
                        };
                $i++;
                }
                if ($res == 0) {
                        print "null";
                };
        }else {
                if($debug == 1) {
                        printf("ERROR: %s\n\n", $session->error());
                }else {
                        print "null";
                };
        }
}else {
        if(@list[$port]) {        
                print "@list[$port]";
        }else {
                print "null";
        };
}
print "\n";
#=============================================
#=== Close the session and exit the program ===
if($new == 1) {
        $session->close;
        close FH;
}else {
        close FR;
}
exit 0;
 
 

Настраиваем zabbix для получения mac-адресов

  • Правим /etc/zabbix/zabbix-server.conf
    # Таймаут опроса SNMP-датчика
    Timeout=5
    # Где лежат скрипты
    ExternalScripts=/usr/share/zabbix/scripts/
    
  • Размещаем скрипт mac-table.pl в /usr/share/zabbix/scripts/
  • Настраиваем датчик:
poluchenie_tablicy_mac-adresov_s_ustrojstva.txt · Последние изменения: 2013/10/23 15:14 (внешнее изменение)
GNU Free Documentation License 1.3
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0 Яндекс.Метрика