Jump to content
Калькуляторы

Perl: Get FDB from D-Link Switches

Потребовалась утилитка на Perl, которая бы могла брать с DES-3526/3028/3612 таблицу MAC-адресов сопоставлять ее с номерами портов и VLAN и в выводить все это в примерно таком виде:

 

PORT MAC VID

 

 

Попробовал сделать сам, поискал примеры, чет ничего не получается, может у кого есть примеры решения такой задачи? Помогите пожалуйста!

Share this post


Link to post
Share on other sites

забираем по SNMP?

если так, то там выборка по VLAN ID идёт, отдаёт мак - порт

 

а что не получается? вы сами что-то писали, на чём затык?

Edited by terrible

Share this post


Link to post
Share on other sites

Когда-то писал скрипт для выполнения кучи однотипных команд на куче DES-3526 через телнет. Переделать под себя не сложно будет. Если интересно - пишите куда скинуть.

 

Share this post


Link to post
Share on other sites

вот кусочек кода:

my ($session, $error) = Net::SNMP->session(
        -version     => '2c',
        -timeout     => 10,
        -retries     => 3,
        -hostname    => $ARGV[0],
        -community   => 'public',
        -port        => 161
);

if (!defined($session)) {
        printf("ERROR: %s.\n", $error);
        exit 1;
}

my $macTable =".1.3.6.1.2.1.17.7.1.2.2.1.2";

foreach my $oid (oid_lex_sort(keys(%{$session->var_bind_list}))) {
        if ($oid =~ /^$macTable\.[\d]+\.([\d]+)\.([\d]+)\.([\d]+)\.([\d]+)\.([\d]+)\.([\d]+)$/) {
                        my $mac = join ':', map((sprintf '%.2x', $_), ($1, $2, $3, $4, $5, $6));
                        my $port = $session->var_bind_list->{$oid};
                        print "mac: $mac\tport: $port\n";
        }
}

 

вроде корректно скопировал.

Share this post


Link to post
Share on other sites

Когда-то писал скрипт для выполнения кучи однотипных команд на куче DES-3526 через телнет. Переделать под себя не сложно будет. Если интересно - пишите куда скинуть.

Очень интересно! Даже не только для этой цели. Сейчас планирую прописывать QoS и прочие шаблонные радости на куче 3526 и 3028, было бы очень кстати!

 

Можно на почту? hi11er@mail.ru

Edited by hiller

Share this post


Link to post
Share on other sites

забираем по SNMP?

если так, то там выборка по VLAN ID идёт, отдаёт мак - порт

 

а что не получается? вы сами что-то писали, на чём затык?

Мешает плохое знакомство с Perl, да и с программированием вообше.

 

Что по VID я знаю. Т.е. логика должна быть такой: сначала смотрим какие есть VLANы, потом ищем в них MACи.

 

Я нашел несколько примеров скриптов для этих целей, но все они не учитывали специфику D-Link'a с VID. Отдавали MACи только дефолтного VLANa. Да и MACи печаталь вида 0x0004d79dc100.

 

 

вот кусочек кода:

foreach my $oid (oid_lex_sort(keys(%{$session->var_bind_list}))) {

 

вроде корректно скопировал.

Этот пример самый элегантный из тех, что мне доводилось видеть. Но не работает, ругается на процитированную выше строку "Can't use an undefined value as a HASH reference at ./getfdb5.pl line 21.".

 

Запускаю с параметром - IP свича. :(

Share this post


Link to post
Share on other sites

вот кусочек кода:

foreach my $oid (oid_lex_sort(keys(%{$session->var_bind_list}))) {

 

вроде корректно скопировал.

Этот пример самый элегантный из тех, что мне доводилось видеть. Но не работает, ругается на процитированную выше строку "Can't use an undefined value as a HASH reference at ./getfdb5.pl line 21.".

 

Запускаю с параметром - IP свича. :(

 

эхххх никто и не обратил внимания ято запрос-то и не выполняется:

пропустил я кусочек скрипта:

my $macTable =".1.3.6.1.2.1.17.7.1.2.2.1.2";

$result = $session->get_table(
        -baseoid        => $macTable,
        -maxrepetitions => 25
);

 

Net::SNMP подключен так:

use Net::SNMP qw(:snmp);

Edited by XeonVs

Share this post


Link to post
Share on other sites

Можно на почту? hi11er@mail.ru

отправил

Огромное спасибо!

 

Какраз то что нужно! Many many THANX :)

 

вот кусочек кода:

foreach my $oid (oid_lex_sort(keys(%{$session->var_bind_list}))) {

 

вроде корректно скопировал.

Этот пример самый элегантный из тех, что мне доводилось видеть. Но не работает, ругается на процитированную выше строку "Can't use an undefined value as a HASH reference at ./getfdb5.pl line 21.".

 

Запускаю с параметром - IP свича. :(

 

эхххх никто и не обратил внимания ято запрос-то и не выполняется:

пропустил я кусочек скрипта:

my $macTable =".1.3.6.1.2.1.17.7.1.2.2.1.2";

$result = $session->get_table(
        -baseoid        => $macTable,
        -maxrepetitions => 25
);

 

Net::SNMP подключен так:

use Net::SNMP qw(:snmp);

Теперь все работает! Огромное спасибо! Буду пытаться переработать, чтобы сначала брался список VLANов, а затем маки в каждом отдельном VLANе.

Не уверен, что справлюсь, но надо попробовать.

Share this post


Link to post
Share on other sites

Получилось!

 

foreach my $oid (oid_lex_sort(keys(%{$session->var_bind_list}))) {

if ($oid =~ /^$macTable\.([\d]+)\.([\d]+)\.([\d]+)\.([\d]+)\.([\d]+)\.([\d]+)\.([\d]+)$/) {

my $vlan = $1;

my $mac = join ':', map((sprintf '%.2x', $_), ($2, $3, $4, $5, $6, $7));

my $port = $session->var_bind_list->{$oid};

print " mac: $mac\tport: $port\t vlan: $vlan\n";

}

Share this post


Link to post
Share on other sites

Ну и замечательно.

Огромнейшее спасибо!

Нет проблем!

Будут еще похожие вопросы по длинкам, могу подсказать.

Share this post


Link to post
Share on other sites

Хм... А интересно, Вам не приходилось решать задачу с автоматическим сохранением конфигов свичей в случае, если в них есть отличия?

 

У меня пока есть две мысли на этот счет:

 

1. Хочу SNMP или Telnet пробегаться по свичам, говорить им залить конфигурацию на tftp. Потом директорию с конфигами commit'ить в какой нибудь репазитория, аля cvs, svn и т.п.

 

2. Забирать конфиг по телнету, сравнивать его с предыдущим, если файлы разные, переименовывать старый вариант в name_%d-%m-%y.cfg, отсылать diff админу и/или писать в базу.

 

Второй вариант мне больше нравится т.к. более гибок и не использует svn.

Буду пробывать реализовать, но велосипед изобретать совершенно не хочется :)

 

Share this post


Link to post
Share on other sites

Хм... А интересно, Вам не приходилось решать задачу с автоматическим сохранением конфигов свичей в случае, если в них есть отличия?

 

У меня пока есть две мысли на этот счет:

 

1. Хочу SNMP или Telnet пробегаться по свичам, говорить им залить конфигурацию на tftp. Потом директорию с конфигами commit'ить в какой нибудь репазитория, аля cvs, svn и т.п.

 

2. Забирать конфиг по телнету, сравнивать его с предыдущим, если файлы разные, переименовывать старый вариант в name_%d-%m-%y.cfg, отсылать diff админу и/или писать в базу.

 

Второй вариант мне больше нравится т.к. более гибок и не использует svn.

Буду пробывать реализовать, но велосипед изобретать совершенно не хочется :)

пример решения задачи

http://wiki.sirmax.noname.com.ua/index.php...k_config_backup

Share this post


Link to post
Share on other sites

тут рядом есть тема про программу NOC... Смотрите туда.

Да, я видел. У меня есть необходимость интегрирования обсуждаемых здесь функций в существующую систему, поэтому NOC не совсем подходит :(

 

пример решения задачи

http://wiki.sirmax.noname.com.ua/index.php...k_config_backup

Хороший пример, перепишу его на perl и маленько модернизирую под свои задачи, если выйдет чтото толковое, здесь выложу результат. Спасибо!

 

NOC'ом так же можно получить vlan'ы и mac-адреса со свича.

Хм... Пойду смотреть, как это там реализовано, может чего нового подчерпну...

Share this post


Link to post
Share on other sites

тут рядом есть тема про программу NOC... Смотрите туда.

Да, я видел. У меня есть необходимость интегрирования обсуждаемых здесь функций в существующую систему, поэтому NOC не совсем подходит :(

Все функции service activation можно дергать по XML-RPC.

 

Share this post


Link to post
Share on other sites

XML-RPC я представляю только в теории. На практике не приходилось сталкиваться, ну кроме платежных терминалов наверно. Спасибо за совет, обращу внимание...

Share this post


Link to post
Share on other sites

XML-RPC я представляю только в теории. На практике не приходилось сталкиваться, ну кроме платежных терминалов наверно. Спасибо за совет, обращу внимание...
Там ничего даже в теории представлять не надо. На python оно выглядит в несколько строк

http://trac.nocproject.org/trac/browser/sa/views.py#L32 (см. get_result)

На Perl примерно так же

Share this post


Link to post
Share on other sites

Привет всем!

А можно мне на почту тоже прогу на перле которая по telnet нужные вещи делает. Спасибо.

toropovsn@ya.ru

 

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.