python從snmp取出數據以json格式寫入指定ZMQ

 import os, sys

import socket
import random
import re
import json
import time
import zmq
from struct import pack, unpack
from datetime import datetime as dt
 
from pysnmp.entity.rfc3413.oneliner import cmdgen
from pysnmp.proto.rfc1902 import Integer, IpAddress, OctetString
 
hosts=['192.168.1.1','192.168.1.2']
community='public'
oids=[(1,3,6,1,2,1,2,2,1,2),(1,3,6,1,2,1,2,2,1,8),(1,3,6,1,4,1,9,2,2,1,1,6),(1,3,6,1,4,1,9,2,2,1,1,8),(1,3,6,1,4,1,9,2,1,58),(1,3,6,1,4,1,9,9,48,1,1,1,5),(1,3,6,1,4,1,9,9,48,1,1,1,6)]
def main():
        for host in hosts:
                global info , APPS , data
                sw={}
                info={}
                data = {}
                for oid in oids:
                        generator = cmdgen.CommandGenerator()
                        comm_data = cmdgen.CommunityData('server', community, 1) # 1 means version SNMP v2c
                        transport = cmdgen.UdpTransportTarget((host, 161))
                        real_fun = getattr(generator, 'nextCmd')
                        res = (errorIndication, errorStatus, errorIndex, varBinds)\
                        = real_fun(comm_data, transport, oid)
                        if not errorIndication is None  or errorStatus is True:
                                print "Error: %s %s %s %s" % res
                        else:
                                mem=varBinds
                                patport = re.compile(r"\[\(ObjectName\(1.3.6.1.2.1.2.2.1.2.(\d{2,})\)\,\s+OctetString\(\'([A-Za-z]*Ethernet\d\/\d+)")
                                patstatus = re.compile(r"\[\(ObjectName\(1.3.6.1.2.1.2.2.1.8.(\d{2,})\)\,\s+Integer\((\d+)\)\)")
                                patin = re.compile(r"\[\(ObjectName\(1.3.6.1.4.1.9.2.2.1.1.6.(\d{2,})\)\,\s+Integer\((\d+)\)\)")
                                patout = re.compile(r"\[\(ObjectName\(1.3.6.1.4.1.9.2.2.1.1.8.(\d{2,})\)\,\s+Integer\((\d+)\)\)")
                                patcpu = re.compile(r"\[\(ObjectName\(1.3.6.1.4.1.9.2.1.58.0\)\,\s+Integer\((\d+)\)\)")
                                patmemuse = re.compile(r"\[\(ObjectName\(1.3.6.1.4.1.9.9.48.1.1.1.5.1\)\,\s+Gauge32\((\d+)\)\)")
                                patmemfree = re.compile(r"\[\(ObjectName\(1.3.6.1.4.1.9.9.48.1.1.1.6.1\)\,\s+Gauge32\((\d+)\)\)")
                                for v in mem:
                                        s = str(v)
#                                       m = re.match(patport,s)
#                                       n = re.match(patstatus,s)
                                        if re.match(patport,s) :
                                                port_info = re.match(patport,s).groups(1)
                                                id = int(port_info[0])
                                                port = port_info[1]
                                                if id in sw:
                                                        sw[id]['port']=port
                                                else:
                                                        sw[id]={}
                                                        sw[id]['port']=port
                                        elif re.match(patstatus,s) :
                                                linkstatus_info = re.match(patstatus,s).groups()
                                                linkstatus = linkstatus_info[1]
                                                id = int(linkstatus_info[0])
                                                if id in sw:
                                                        sw[id]['linkstatus']=linkstatus
                                                #else:
                                                #        sw[id]={}
                                        elif re.match(patin,s) :
                                                linkin_info = re.match(patin,s).groups()
                                                linkin = linkin_info[1]
                                                id = int(linkin_info[0])
                                                if id in sw:
                                                        sw[id]['linkin']=linkin
                                                #else:
                                                #        sw[id]={}
                                                #       sw[id]['linkin']=linkin
                                        elif re.match(patout,s) :
                                                linkout_info = re.match(patout,s).groups()
                                                linkout = linkout_info[1]
                                                id = int(linkout_info[0])
                                                if id in sw:
                                                        sw[id]['linkout']=linkout
                                                #else:
                                                #        sw[id]={}
                                                #        sw[id]['linkout']=linkout
                                        elif re.match(patcpu,s) :
                                                cpu_info = re.match(patcpu,s).groups()
                                                totalNum = cpu_info[0]
                                                utime = time.time()
                                                info['totalNum']=totalNum
                                                info['utime']=utime
                                        elif re.match(patmemfree,s) :
                                                memfree_info = re.match(patmemfree,s).groups()
                                                memfree = memfree_info[0]
                                                data['memfree']=memfree
                                        elif re.match(patmemuse,s) :
                                                memuse_info = re.match(patmemuse,s).groups()
                                                memuse =memuse_info[0]
                                                data['memuse']=memuse
                        info['entityType'] = 'sw'
                info['entityId'] = host
                info['entityOwner'] = 'system'
                times = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
                APPS = " %s APPS sw.%s" %(times,host)
                get_dict(sw)
                get_json(info)
#               print data
def get_dict(sw):
        list=sw.values()
        data_info = "[%s]" %data
        r=[]
        for v in list:
                m="{'port' : '%s', 'linkstatus' : %s, 'linkin' : %s, 'linkout' : %s}" %(v['port'],v['linkstatus'],v['linkin'],v['linkout'])
                r.append(m)
        info['event'] = r
        info['data'] = data_info
def get_json(sw):
        sw_json = json.dumps(sw)
        sw_info = "%s %s" %(APPS,sw_json)
        context = zmq.Context()
        topic = 'rtm-ceptop'
        socket = context.socket(zmq.PUB)
        socket.connect('tcp://192.168.1.10:5555')
        print "%s %s" % (topic, sw_info)
        socket.send_multipart([topic , sw_info])
main()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章