LINUX.ORG.RU

Скрипт опрашивающий группу свитчей одновременно

 


0

2

Пишу вопрос в Development потому что задача скорее на программирование, а не на сисадминство.
Короче есть сеть провайдерская на управляемых свитчах D-Link, централизованного управления свитчами нет, есть система мониторинга «The Dude v.4», заморачиваться со сложными системами вроде zabbix не хочу пока, на первое время можно обойтись и простенькими костылями.
Все свитчи доступны по telnet с одной и той же связкой логин-пароль и модели одни и те же. Допустим у меня есть текстовый файл с ip-адресами свитчей. Нужен скрипт, который на всех свитчах запустит команду «show vlan» (ну самая элементарная задача для первого раза) и распарсит вывод. Программировать ни на чём не умею, ну на bash чуть-чуть. В какую сторону копать?

★★★★★

Последнее исправление: sunny1983 (всего исправлений: 1)

Что подразумевается под «распарсит вывод»? Лучше с примерами данных и желаемого результата. От этого зависит - хватит ли bash или нужен язык

GPFault ★★
()

В сторону ssh на свитчах и rsh, сильно зависит от модели ещё, у некоторых функционал шелла убог невыносимо, возможно что и невозможно.

Jameson ★★★★★
()

В теории длинки должны уметь снмп. Лучше забиксом собери по снмп все данные, меньше велосипедить и меньше шанс завесить все свичи разом.

stave ★★★★★
()

у D-Link для их-же d-link`ов была софтинка для мониторинга с «блекджеком и девами» зовётся d-view. Начните с неё

А потом можно приручить любую хрень понимающую snmp.

MKuznetsov ★★★★★
()
Ответ на: комментарий от tailgunner

Правда, нужно немного программировать .

Причём на tcl.

Программировать ни на чём не умею, ну на bash чуть-чуть.

Наверное, ему будет проще разобраться с expect-lite.

ABW ★★★★★
()
Ответ на: комментарий от Jameson

В сторону ssh на свитчах и rsh, сильно зависит от модели ещё, у некоторых функционал шелла убог невыносимо, возможно что и невозможно.

А вот этого лучше не делать. Начнет играться с ссш, свичи в себя напрочь уйдут. Одно дело переваривать человеков, а другое неконтролируемый поток команд с роботов.

stave ★★★★★
()
Ответ на: комментарий от GPFault

Что подразумевается под «распарсит вывод»? Лучше с примерами данных и желаемого результата. От этого зависит - хватит ли bash или нужен язык

Ну скажем обнаруживает в выводе группы строк, содержащих символосочетание «VID» и выводит для каждой группы (включая строку, содержащую символосочетание) строки 1,5,6. После в каждой строке обнаруживает двоеточие, следующий за ним пробел и следующие за ним символы и удаляет всё что после этих символов. Получится конструкция:

VID             : 2
Current Tagged Ports  : 16
Current Untagged Ports: 1-6,8
Дальше нужно что-то сделать, чтобы строка «1-6,8» превратилась в «1,2,3,4,5,6,8»
Далее, если опрашивался свитч 172.16.5.5, то должны сформироваться два массива:
tagged-2-172.16.5.5-2="16"
untagged-2-172.16.5.5-2="1,2,3,4,5,6,8"
Ну а дальше, после того как будут опрошены все свитчи, можно будет придумать как это выводить.
Но для начала мне хотя бы понять как передать в telnet: логин, пароль и команду, а потом завершить сеанс.

sunny1983 ★★★★★
() автор топика
Последнее исправление: sunny1983 (всего исправлений: 2)

+1 на вариант с SNMP

Получить список vlan-ов, их тип и состояние совсем просто.

А вот какой порт в каком vlan-е чуть сложнее, т.к. у длинка нет единого стандарта.

DES-3526, DES-3028(52), DES-3200, DGS-3024, DGS-3120, DGS-1210ME, DXS-1210 используют одинаковый способ описания vlan-ов

DGS-3200 отличается.

Списки oid-ов практически у всех отличаются, но мибы все есть.

vel ★★★★★
()

SCADA-система на Erlang, которая посылает SNMP-запросы или пингует через ICMP. Правила работы с каждым устройством скачиваются из PostgreSQL - sql генерит sql, который генерит правила для свичта. Парк оборудования примерно из 5 тысяч управляемых свитчей, комбинация из примерно 20 прошивой и их ревизий. Если надо будет - съест и 50000 свитчей без особых проблем, запас прочности колоссальный.

outtaspace ★★★
()

В какую сторону копать?

В сторону SNMP

robot12 ★★★★★
()
Ответ на: комментарий от MKuznetsov

Второй день гуглю, не могу понять как мне поможет snmp. Не работал никогда с этим протоколам. Пока понял только то, что snmp позволяет, не нагружая сеть, быстро опросить свитчи по UDP-протоколу, при этом smnp не позволит получить доступ к самим командам свитча, smnp-агенты общаются с устройствами на каком-то своём языке. Но в будущем у меня возникнет потребность не только опрашивать свитчи, но и менять их конфигурацию.
d-view пока не копал. Она под винду и использовать в linux-сриптах её не получится.

sunny1983 ★★★★★
() автор топика
Ответ на: комментарий от sunny1983

накати сразу librenms там автоматом все добавляеться и как бы в коде можешь посмотреть что отсылаеться

pinachet ★★★★★
()

я вот так делал н а python когда нужно было спарсить со всех свичей связки ip-mac binding

#!/usr/bin/env python
# -*- coding: utf-8 -*-

''' автологин на cisco, d'link, huawei
    с детектированием вендора
'''

# импортируем необходимые модули
import pexpect
import re
from sys import argv
#https://pythex.org/
class Dlink(object):

    login='user'
    password='pass'

    command_show_ip_mac_all = 'show address_binding ip_mac all'
    pattern_username = "([Uu]ser ?[Nn]ame|[Ll]ogin):"
    pattern_password = "[Pp]ass[Ww]ord:"
    pattern_unpriveleged_prompt = r"^\S+:(3|6|user|operator)#"
    pattern_syntax_error = r"(Available commands|Next possible completions|Ambiguous token):"
    pattern_prompt = r"[^|\p](?P<hostname>\S+(:\S+)*)#"
    pattern_more = "CTRL\+C.+?a.+?All"
    pattern_total = re.compile(r"[^|\p]Total Entries\s?:\s+(?P<total>\d+)")
    command_more = "a"

    #IP Address                              MAC Address       M  ACL Ports
    #--------------------------------------- ----------------- -- -- ---------------
    #192.168.1.1                           00-13-34-CF-BF-6F S  I  1              

    
    #3526 pattern
    #192.168.1.1  00-13-34-CF-BF-6F 4                              ARP
    #192.168.1.2   00-13-34-CF-BF-6F 24                             ARP
    #192.168.1.3   00-13-34-CF-BF-6F 7                             
    #CTRL+C ESC q Quit SPACE n Next Page ENTER Next Entry a All       
    
    pattern_ip_mac = re.compile(r"(?P<ip>[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)\s+(?P<mac>\S+)\s+(?P<mode>\S+)\s+(?P<acl>\S+)\s+(?P<port>\S+)\s*(\s+\S+\s)?$",re.MULTILINE)
    def get_mac_list(self, ip_addr):
    # принимаем ip адрес аргументом командной строки
        p=pexpect.spawn('telnet %s' % ip_addr)

        mac_list=''
        total=0
        try:
            i = p.expect(['.D-Link.','login:','Username:'])

            if i == 0:
#               print ('D-Link detected')
                p.expect([self.pattern_username])
#               print("Sending login")
                p.sendline(self.login)
                p.expect([self.pattern_password])
#               print("Sending pass")
                p.sendline(self.password)
                rx_promt = re.compile(self.pattern_prompt)
                i = p.expect(rx_promt)
                if i == 1:
                    print('Login Failed')
                else:
                    p.sendline(self.command_show_ip_mac_all)
                    rx_error = re.compile(self.pattern_syntax_error)
                    i = p.expect([self.pattern_prompt,rx_error, self.pattern_more])
                    if i==1:
                        print("Syntax error")
                    elif i == 2:    
                        print("call more")
                        p.sendline(self.command_more)
                        mac_list = p.before
                        i = p.expect([self.pattern_prompt,rx_error, self.pattern_more])     
#                   print('Answer:')
#                   print(p.before)
                    mac_list += p.before
                    total_list = self.pattern_total.findall(mac_list)
                    if len(total_list):
                        total=int(total_list[0])
                    r = []
                    for match in self.pattern_ip_mac.finditer(mac_list):
                        r += [{
                          "ip" : match.group("ip"),
                          "mac" : match.group("mac"),
                          "port" : match.group("port"),
                          }]
#                   print(r)
                if total != len(r):
                    print("Error, entries count doesnt match: parsed ", total, "matched: ", len(r), "host", ip_addr)
                else:
                    print(ip_addr, " : OK, total: ", total)
        except pexpect.EOF:
            print("Not D-Link switch or no route to host", ip_addr, "\n", p.before)
        p.sendline("logout")
        p.close()
        
def main():
    switch = Dlink()
    for line in open('switches.txt','r').readlines():
        switch.get_mac_list(line)
        
if  __name__ =='__main__':main()

список ip адресов задается в switches.txt просто по ip адресу на строку вроде

127.0.0.1
127.0.0.2
127.0.0.3

спарсенное записывал в sqlite базу для дальнейшей сверки с биллингом. По аналогии можно сделать парсинг VID и всего что выводится по telnet. Если сравнивать с snmp, то по telnet гораздо проще сделать парсер при наличии разных моделей коммутаторов, интерфейс telnet у длинк от модели к модели гораздо больше похож чем snmp. То же самое делал на snmp, там получалось минимум 3 разных набора oid, причем по свежим моделям и прошивкам их надо выпрашивать в техподдержке.

P.S. отталкивался от этого скрипта https://habrahabr.ru/post/127748/

HighwayStar ★★★★★
()
Последнее исправление: HighwayStar (всего исправлений: 1)

На следующей неделе еду на семинар по dlink-ам, а после уже приму решение: либо нанимать фрилансера для писания скриптов на python или perl, либо копать в сторону D-view, с которой как и с SNMP так и не разобрался. Может кто-нибудь вообще пояснить что вообще SNMP такое и с чем его едят. Понятно только , что это такой UDP-протокол, поэтому опрашивание происходит быстро. А конкретно: что из себя представляет SNMP-запрос, это какая-то система команд или что, какой у них синтаксис? Похожи ли эти команды на обычные команды D-link или нет?

sunny1983 ★★★★★
() автор топика

не на программирование, а не на сисадминство

Мой парсер поломался

есть сеть провайдерская

говоришь странно ты, верно иноземец? Но Загорск прописан в профиле у тебя.

peregrine ★★★★★
()

Реализовывал недавно похожую задачу, вот написал на руби скрипт который ходит по адресам из бд, подключается через telnet, дергает нужную информацию и пишет в бд. Вот он http://pastebin.com/B3yPNzEz Переделать для работы с текстом не сложно, писалось чисто для dlink des и dgs. Если будут вопросы, пиши на мыло hikoseuro@gmail.com, могу поправить под твои задачи. За код прошу не пинать, на руби писал третий раз в жизни, но зато работает

djbaian
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.