2015-02-26 4 views
0

Мне нужно разобрать вывод Pysnmp. Я хочу запустить сценарий из веб-браузера. Таким образом, код выглядит следующим образом:Parsing Pysnmp с регулярным выражением

#! /usr/bin/python 
# 
print "Content-Type: text/html\n\n" 
print '<html><head><meta content="text/html; charset=UTF-8" />' 
print '<title>Interface searcher</title><p>' 

import re 

from pysnmp.entity.rfc3413.oneliner import cmdgen 

cmdGen = cmdgen.CommandGenerator() 

errorIndication, errorStatus, errorIndex, varBindTable = cmdGen.nextCmd(
    cmdgen.CommunityData('blablablabla'), 
    cmdgen.UdpTransportTarget(('x.x.x.x', 161)), 
    'iso.3.6.1.2.1.2.2.1.2', 
) 

if errorIndication: 
    print(errorIndication) 
else: 
    if errorStatus: 
     print('%s at %s' % (
      errorStatus.prettyPrint(), 
      errorIndex and varBindTable[-1][int(errorIndex)-1] or '?' 
      ) 
     ) 
    else: 
     for varBindTableRow in varBindTable: 
      for name, val in varBindTableRow: 
       for line in val: 
        if re.search("(xe|ae)[^.]*$", line): 
         print line 

print "</p></body></html>" 

Он не производит вывод, если вы запускаете этот скрипт из веб-браузера.

Если изменить последнюю петлю на:

else: 
    for varBindTableRow in varBindTable: 
     for name, val in varBindTableRow: 
      print(val) 

Она производит на веб-браузере следующим образом:

fxp0 lsi dsc lo0 tap gre ipip pime pimd mtun fxp0.0 lo0.0 em0 em0.0 lo0.16384 lo0.16385 em1 em1.0 cbp0 demux0 irb pip0 pp0 ae0 ae1 ae2 ae3 ae1.0 ae2.109 ae2.110 lsi.0 ae2.196 ae2.234 ae2.236 ae2.311 ae2.313 ae2.314 lsi.1 ae2.452 ae2.507 ae2.557 ae2.649 ae2.735 ae2.803 ae2.804 ae2.977 ae2.1097 ae2.1108 ae2.1194 ae2.1197 ae1 ae2.1306 ae2.1328 ae2.1435 ae2.1463 ae2 ae2.1503 ae2.1596 ae2.2020 ae2.2345 ae2.2465 ae2.32767 ae3.0 ae2.1801 ae2.1446 ae2.2420 ae2.2421 ae2.2422 lc-4/0/0 lc-4/0/0.32769 lc-4/1/0 lc-4/1/0.32769 lc-4/2/0 lc-4/2/0.32769 lc-4/3/0 lc-4/3/0.32769 pfh-4/0/0 pfh-4/0/0.16383 pfe-4/0/0 pfe-4/0/0.16383 pfe-4/1/0 pfe-4/1/0.16383 pfe-4/2/0 pfe-4/2/0.16383 pfe-4/3/0 pfe-4/3/0.16383 lc-5/0/0 lc-5/0/0.32769 lc-5/1/0 lc-5/1/0.32769 lc-5/2/0 lc-5/2/0.32769 lc-5/3/0 lc-5/3/0.32769 pfh-5/0/0 pfh-5/0/0.16383 pfe-5/0/0 pfe-5/0/0.16383 pfe-5/1/0 pfe-5/1/0.16383 pfe-5/2/0 pfe-5/2/0.16383 pfe-5/3/0 pfe-5/3/0.16383 xe-5/0/0 xe-5/0/1 xe-5/0/2 xe-5/0/3 lsi.1048838 xe-5/0/3.0 xe-5/1/0 xe-5/1/1 xe-5/1/2 xe-5/1/3 xe-5/2/0 xe-5/2/1 xe-5/2/2 xe-5/2/3 xe-5/3/0 xe-5/3/1 xe-5/3/2 xe-5/3/3 xe-5/3/3.0 xe-4/0/0 xe-4/0/1 xe-4/0/0.32767 xe-4/0/2 xe-4/0/3 lsi.1048839 xe-4/0/0.2465 lsi.1048840 xe-4/0/0.2422 xe-4/0/0.2421 xe-4/0/0.2420 xe-4/0/0.2345 xe-4/0/0.2020 xe-4/0/0.1801 xe-4/0/0.1596 xe-4/0/0.1503 xe-4/0/0.1463 xe-4/0/0.1446 xe-4/0/0.1435 xe-4/0/0.1328 xe-4/0/0.1306 xe-4/0/0.1293 xe-4/0/0.1197 xe-4/0/0.1194 xe-4/0/0.1108 xe-4/0/0 lsi.1048841 

, но если я бегу мой сценарий внутри оболочки он печатает построчно следующим образом:

xe-4/1/3.3219 
xe-4/2/1.1304 
xe-4/2/1.250 
gr-5/0/0.11 
ae2 
ae2.3461 
xe-4/0/0.3462 
xe-4/0/0.3461 
xe-4/0/1 
xe-4/0/1.3461 
xe-4/0/2.3462 
xe-4/0/2.3461 
xe-4/0/3.3462 
xe-4/0/3.3461 
xe-4/2/1.1514 
xe-4/2/1.1634 

Я хочу, чтобы мой скрипт получал данные с моего устройства, которое работает нормально, но я хочу разобрать o utput с регулярным выражением так, что он печатает на веб-браузер все интерфейсы без точки, например, те - Àe2, хе-4/0/0 и печатает каждый интерфейс построчно следующим образом:

ae2 
xe-4/0/0 
etc. 

I проверили мое регулярное выражение на regexr.com, и оно соответствует строкам, которые я хочу. См. Его в действии http://regexr.com/3agof Любой вход будет оценен.

Большое спасибо

ответ

0
if re.search("(xe|ae)[^.]*$", line): 
    print line.split('.')[0] + "\n" 

Это должно сделать это для вас в браузере.

0

Скорее всего, механизм regexp не соответствует значениям pysnmp, поскольку то, что pysnmp возвращает в var-binds, не является простой строкой Python. Скорее это объект pyasn1, который иногда может быть безопасным str() в строку Python, но не всегда.

Чтобы получить все исходные данные октетной строки SNMP (введите «str» в Python 2 или «bytes» в Python 3), вы можете использовать метод OctetString.asOctets() (например, line.asOctets()). Это имеет смысл только для значений OctetString, а не для целых или других типов SNMP.

Смежные вопросы