Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

poluchenie_tablicy_mac-adresov_s_ustrojstva [2013/10/23 15:14] (текущий)
Строка 1: Строка 1:
 +====== Получение таблицы MAC-адресов с устройства ======
  
 +===== Преамбула =====
 +Zabbix пока не умеет получать таблицу в качестве айтема. Посему получаем просто список mac-адресов строкой
 +Для этого используем 2 ветки SNMP:
 +  * **.1.3.6.1.2.1.17.4.3.1.1** - Выдает пул mac-адресов <code bash>
 +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
 +...
 +</​code>​
 +  * **.1.3.6.1.2.1.17.4.3.1.2** - Выдает список портов на устройстве <code bash>
 +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
 +</​code>​
 +Осталось только найти соответствие между номерами OIDов, и мы увидим,​ что OIDы, оканчивающиеся на 12.7.172.8 дадут нам mac и номер порта, на котором этот mac висит.
 +
 +===== Скрипт для получения MAC-адресов на порту устройства =====
 +Формат вызова:​
 +<code bash>
 +perl mac-address.pl <​IP-адрес устройства>​ <​Номер порта на устройстве>​
 +</​code>​
 +Скрипт выдает список mac-адресов,​ разделенных занятыми. Если параметры указаны неверно или на порту не зарегистрировано адресов - скрипт выдает **null**
 +
 +<file perl 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;
 + 
 + 
 +</​file>​
 +
 +===== Настраиваем zabbix для получения mac-адресов =====
 +
 +  * Правим **/​etc/​zabbix/​zabbix-server.conf** <code ini>
 +# Таймаут опроса SNMP-датчика
 +Timeout=5
 +# Где лежат скрипты
 +ExternalScripts=/​usr/​share/​zabbix/​scripts/​
 +</​code>​
 +  * Размещаем скрипт **mac-table.pl** в **/​usr/​share/​zabbix/​scripts/​**
 +  * Настраиваем датчик:​ \\ {{:​ee718467.png|}}
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 Яндекс.Метрика