import os, sysjson
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()