Перейти к содержимому
Калькуляторы

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

Привет! 

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

Есть необходимость стягивать по 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 :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

 

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

 

К примеру. 

Свитч возвращает 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

 

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

 

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

0 - 0000

F - 1111

C - 1100

0 - 0000

Изменено пользователем MATPOC

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

d

Изменено пользователем XuHT
deleted

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

+---------------------------------------+
| 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
 

Изменено пользователем XuHT

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.