LINUX.ORG.RU

python, snmp и типы данных

 


0

1

Хочу получить с коммутатора информацию по портам, вланам и их взаимоотношениям. Телнет не хочу.

Начинаю так:

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

import netsnmp

host = '1.2.3.4'
community = 'CommunityName'

def getlist(a,b,request):
    vars = netsnmp.VarList(netsnmp.Varbind('ifIndex',),netsnmp.Varbind('ifDescr',),netsnmp.Varbind('ifOperStatus',))
    print vars
    print type(vars)
    print session.getbulk(a, b, (vars))

session = netsnmp.Session(Version   = 2,
                          DestHost  = host,
                          Community = community)

getlist (0,5,('ifIndex','ifDescr','ifOperStatus'))

Внутри функции getlist хочу составить netsnmp.VarList из полученного параметра. Но не знаю как. Выполнение в таком виде возвращает:

[<netsnmp.client.Varbind object at 0x7ffbd9d21390>, <netsnmp.client.Varbind object at 0x7ffbd9d21410>, <netsnmp.client.Varbind object at 0x7ffbd9d21450>]
<class 'netsnmp.client.VarList'>
('1', 'Ethernet1/0/1', '1', '2', 'Ethernet1/0/2', '1', '3', 'Ethernet1/0/3', '1', '4', 'Ethernet1/0/4', '1', '5', 'Ethernet1/0/5', '1')

То есть, type говорит что var это class. Попытался сделать append, но внезапно не вышло.

Хотелось бы перебрать request и добавить элементы в var. Как это следует делать?

★★★★★

Внутри функции getlist хочу составить netsnmp.VarList из полученного параметра.

Вот так что ли?

def getlist(a,b,request):

    results = []

    for parameter in request:
        vars = netsnmp.VarList(netsnmp.Varbind(parameter))
        results.append(session.getbulk(a, b, (vars)))

    return results

print getlist(0,5,('ifIndex','ifDescr','ifOperStatus'))
micronekodesu ★★★ ()

Попытался сделать append, но внезапно не вышло.

ась?

>>> import netsnmp
>>> vars = netsnmp.VarList(netsnmp.Varbind('ifIndex',))
>>> vars.append(netsnmp.Varbind('ifDescr',))
>>> print(vars)
[<netsnmp.client.Varbind object at 0x7f42567a5ad0>, <netsnmp.client.Varbind object at 0x7f42567a5b90>]
>>>
hizel ★★★★★ ()

пока не закопался в вялый netsnmp, посмотри на pysnmp, там асинхронность и все такое

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

Спасибо, да, так работает. Возвращает правда не один список (или это массив, чёрт их разберёт) а три, но возможно так даже лучше.

[('1', '2', '3', '4', '5'), ('Ethernet1/0/1', 'Ethernet1/0/2', 'Ethernet1/0/3', 'Ethernet1/0/4', 'Ethernet1/0/5'), ('1', '1', '1', '1', '1')]
sin_a ★★★★★ ()
Ответ на: комментарий от hizel

Хочу всё искаропки, а yum находит только это. Но думаю мне асинхронность не сильно понадобится. Не мониторинг а актуализация описания раз в сутки.

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

Ну да, это один список, в котором три списка значений для 'ifIndex', 'ifDescr' и 'ifOperStatus'. Можно переделать в словарь чтоб было понятнее (типа {'ifIndex': (1, 2, 3, 4, 5), 'ifDescr': ('Ethernet1/0/1', 'Ethernet1/0/2' и так далее)}) или смапить их что было что-то типа [{'ifIndex': 1, 'ifDescr': 'Ethernet1/0/1', 'ifOperStatus': 1}, <и дальше остальные интерфейсы>]. В общем тут лучше смотреть что хочется получить в результате (с чем проще будет работать).

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

Хм, хотя нет, невнимательно прочитал. Это три бульки^W обращения snmp а хотелось бы обойтись одним.

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

Так это с самого начала было, в ответ возвращался список (ну вот это в скобках круглых это tuple, что по сути просто список, который нельзя изменять) с информацией о каждом интерфейсе в порядке тех параметров, которые были переданы в запросе, то есть

(
  '1', # Это ifIndex первого интерфейса
  'Ethernet1/0/1', # Это ifDescr первого интерфейса
  '1', # Это ifOperStatus первого интерфейса
  '2', # Это ifIndex второго интерфейса
  'Ethernet1/0/2', # Это ifDescr второго интерфейса
  '1' # Это ifOperStatus первого интерфейса
# <ну и так далее по всем интерфейсам>
)
micronekodesu ★★★ ()
Последнее исправление: micronekodesu (всего исправлений: 1)
Ответ на: комментарий от hizel

Отож, спасибо, оказывается append действительно работает...

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

А вот всё же, прошу прощения, ещё такой вопрос. Что такое vars? Type говорит что class. К ним применим append (и что вообще такое, класс) или это на самом деле список (или массив), просто назвали классом?

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

посмотри в /usr/lib64/python2.7/site-packages/netsnmp/client.py

объект, может быть не полностью, реализующий список

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