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

Скрипт всех вланов на порту

Привет! 

Ищу совета в написании скрипта на баше.

Есть необходимость стягивать по SNMP наличие вланов с порта с коммутаторов D-LINK, ZyXEL, CISCO. 

В общем как все происходит

1) Стягиваю со свитча все вланы

2) Вычисляю по каждому влану присутствие на порту и untagged 

Свитч мне возвращает это в хексе. 

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

 

member ports
1 =  00 00 00 00 00 00 00 00
3 =  C0 00 00 00 00 00 00 00
10 =  FF C0 00 00 00 00 00 00

 

Untagged ports

1 =  00 00 00 00 00 00 00 00
3 =  00 00 00 00 00 00 00 00
10 =  FF 00 00 00 00 00 00 00

 

В принципе не сложно скриптом перевести в бинарник, отсеяв лишние нули

 

Но как это потом сопоставить с номерами портов? Необходимо вывести информацию в виде (ну или примерно так) 

 

1 = Tag 3: Un 10

2 = Tag 3: Un 10

3 = Un 10

4 = Un 10

5 = Un 10

6 = Un 10

7 = Un 10

8 = Un 10

9 = Tag: 10

10 = Tag: 10

 

В баше это вообще реально? Или лучше использовать PHP, perl? 

Если что, в программировании я 0 :)

 

Share this post


Link to post
Share on other sites

На баше много чего реально.

Но я бы использовал Perl.

И скрипт получится проще, и не будет проблемы подключить библиотеку и сделать что-то более сложное.

Share this post


Link to post
Share on other sites

Ну пусть то перл или еще что, у меня не хватает навыка, что бы понять, как мне 10000001 11000000 0000000 000000000 сопоставить с номерами портов. Причем таких записей может быть несколько..

 

 

Может есть скрипт на php?

Share this post


Link to post
Share on other sites

в инернете же куча инфы как считается хекс для вланов, ну

у меня живых примеров нету, а по моему коду вы нихера не поймете ибо там своя логика

Share this post


Link to post
Share on other sites

20 часов назад, XuHT сказал:

Ну пусть то перл или еще что, у меня не хватает навыка, что бы понять, как мне 10000001 11000000 0000000 000000000 сопоставить с номерами портов. Причем таких записей может быть несколько..

 

 

Может есть скрипт на php?

можно стягивать по telnet/ssh и парсить текст, правда представление разное на разных коммутаторах

Share this post


Link to post
Share on other sites

В 24.02.2018 в 02:15, XuHT сказал:

В принципе не сложно скриптом перевести в бинарник, отсеяв лишние нули

 

Но как это потом сопоставить с номерами портов? Необходимо вывести информацию в виде (ну или примерно так) 

Заполняете массив разрядами получившегося bin (например, как строку по-символьно). Имя массива соответствует номеру влана (для удобства), элементы массива это номера портов, ну и 0/1 в зависимости от членства в влане.

Share this post


Link to post
Share on other sites

Кое что получилось, но столкнулся  с нюансом. 

При конвертировании в хекса в бинарник, обрезаются первые нули. Соответственно нумерация портов начинается со сдвигом.

 

К примеру. 

Свитч возвращает Hex-STRING: 0F C0 00 00 00 00 00 00, вырезаю с помощью awk нужные 0FC00000, подставляю для перевода через bc (самый простой вариант)

echo "obase=2; ibase=16; 0FC00000" | bc

Получаю

1111110000000000000000000000

Первых 4 нулей у меня нет. Соответственно, первые четыре порта пропущены. В итоге нумерация портов начинается с 1 :(

VLAN 777 is tagged on port 1
VLAN 777 is tagged on port 2
VLAN 777 is tagged on port 3
VLAN 777 is tagged on port 4
 

А по факту 

VID             : 777

Member Ports    : 5-8

 

 

Как конвертнуть в бинарник без обрезания нулей? :)

 

Share this post


Link to post
Share on other sites

10 часов назад, XuHT сказал:

Свитч возвращает Hex-STRING: 0F C0 00 00 00 00 00 00

Такие вещи, действительно, проще делать на перле. Или питоне. Или другом языке высокого уровня, где есть развитые средства работы со строками.

 

В шестнадцатеричной цифре 16 значений, один раз строите хэш (словарь), где каждому значению соответствует текстовая строка нулей и единиц. И потом для каждой цифры получаете значение. Например, первые четыре цифры из вашего примера:

0 - 0000

F - 1111

C - 1100

0 - 0000

Edited by MATPOC

Share this post


Link to post
Share on other sites

Решил свою проблему. 

Я bc скармливаю дополнительные FF, а после вывода обрезаю первые 8 символов.

echo "ibase=16; obase=2; FF$var" | bc | cut -c 9-

 

Как это называется в программировании? - костыли? )

 

Share this post


Link to post
Share on other sites

Ну вроде как, почти доделал скрипт 

Получилось как то так. 

+---------------------------------------+
| DES-3200-10/C1 Fast Ethernet Switch   |
+---------------------------------------+
|PORT NUM       |       PVID            |
+=======================================+
|           Tagged vlan                 |
+---------------------------------------+
|1              | 3 666 777             |
|2              | 3 666 777             |
|3              | 777                   |
|4              | 777                   |
|6              | 777                   |
|7              | 777                   |
|8              | 777                   |
|9              | 666 777 888 999       |
+---------------------------------------+
|            Unagged vlan               |
+---------------------------------------+
|1              | 666                   |
|2              | 666                   |
|3              | 777                   |
|4              | 777                   |
|6              | 777                   |
|7              | 777                   |
|8              | 777                   |
+---------------------------------------+

Единственное, пока не могу придумать, как вывести одну таблицу - порт и вллан как таггед, так и антаггед. 

Например:

+---------------------------------------+
|1              | T: 3 777 U: 666       |
|2              | T: 3 777 U: 666       |
|3              | U: 777                |
|4              | U: 777                |
|6              | U: 777                |
|7              | U: 777                |
|8              | U: 777                |
|9              | T: 666 777 888 999    |
+---------------------------------------+

У меня в скрипте, номер порта это массив. Как можно сравнить массивы в цикле между собой? 

Если сравнивать по отдельности каждый массив, типо вот так:

if [[ "${#tagged_port[1]}" == "${#untagged_port[1]}" ]]
        then
        	echo U: "${untagged_port[1]}"
        else [[ "${tagged_port[1]}" != "${untagged_port[1]}" ]]
        	echo T: "${tagged_port[1]}" | sed 's/'"${untagged_port[1]}"'//g'
        	echo U: "${untagged_port[1]}"
fi

 

То все ок, и отображает 

T:  3 777
U:  666
 

Edited by XuHT

Share this post


Link to post
Share on other sites

Выкладываю на все общее обозрение https://gitlab.com/0x2cafe/get_vlan/blob/ead3face8e9b22c0f9eb44f32bdc98a511dad00f/get_vlan.sh

Есть небольшая недоработка - когда на одном порту может отобразить влан с тегом и без тега. 

Share this post


Link to post
Share on other sites

Думаю вы не учли часть конфига (normal, fixed, forbidden), а именно (для zyxel GS-4012F):

vlan xxx
  name blablabla
  normal "" 
  fixed "" 
  forbidden 1-12 
  untagged 1-12 
  inactive 
Dlink-ов нету, но думаю там что-то похожее. Надо еще фильтр по разрешенным и запрещенным на порту вланам делать. То есть еще tag/untag фильтровать по fixed, forbidden.

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.