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

На баше это реально.

Не забудьте только VCS использовать и поделиться с обществом кодом на github'e.

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

Я бы всё же не заморачивался на баш, а сделал на перле.

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

d

Edited by XuHT
deleted

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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now