PySNMP+gevent多任务

import datetime

from gevent import monkey
from gevent.pool import Pool
monkey.patch_all()
import pysnmp.hlapi as hlapi

#用于解析返回值,采用匿名函数的方式,较为复杂的需要独立函数解析
Ana_map = {
    'numbers': lambda v: v.asNumbers(),
    'hex': lambda v: v.asOctets().hex(),
    'raw': lambda v: v,
    'bin': lambda v: v.asOctets(),
    'int': lambda v: int(v),
    'preview': lambda v: str(v),
    'ascii': lambda v: v.asOctets().decode('ascii'),
    'str': lambda v: v.asOctets().decode(v.encoding),
    'utf8': lambda v: v.asOctets().decode('utf8'),
    'gbk': lambda v: v.asOctets().decode('gbk'),
}


class SnmpScanController:

    def __init__(self, hosts, oids, Community='public', User='', authKey='', privKey='', privProtocol=hlapi.usmAesCfb128Protocol,
                 Version='v2c', pool_size=100):

        self.result = {}
        self.hosts = hosts
        self.oids = oids
        self.pool_size = pool_size
        self.Community = Community
        self.User = User
        self.authkey = authKey
        self.privKey = privKey
        self.privProtocol = privProtocol
        self.Version = Version

    def snmp_walk(self, host, oid, format='raw'):
        result = {}
        if self.Version == 'v2c':
            UsmDate = hlapi.CommunityData(self.Community)
        elif self.Version == 'v3':
            UsmDate = hlapi.UsmUserData(self.User, authKey=self.auThkey, privKey=self.privKey,
                                        authProtocol=hlapi.usmHMACSHAAuthProtocol,
                                        privProtocol=self.privProtocol)
        iterator = hlapi.nextCmd(hlapi.SnmpEngine(),
                                       UsmDate,
                                       hlapi.UdpTransportTarget((host, 161), timeout=10, retries=2),
                                       hlapi.ContextData(),
                                       hlapi.ObjectType(hlapi.ObjectIdentity(oid)),
                                       lookupMib=False,
                                       lexicographicMode=False)  # lexicographicMode = True时打印所有oid
        for errorIndication, errorStatus, errorIndex, varBinds in iterator:
            if errorIndication:
                raise ConnectionError(f'SNMP error: "{str(errorIndication)}". Status={str(errorStatus)}')
            elif errorStatus:
                raise ConnectionError('errorStatus: %s at %s' % (
                    errorStatus.prettyPrint(), errorIndex and varBinds[int(errorIndex) - 1][0] or '?'))
            else:
                for x in varBinds:
                    k, v = x
                    # print(k, v)
                    k = str(k)[len(str(oid)) + 1:]
                    if format in Ana_map:
                        try:
                            result[str(k)] = Ana_map[format](v)
                        except:
                            result[str(k)] = '0x' + Ana_map['hex'](v)
        self.result[oid] = result

    def StartSNMP(self):
        pool = Pool(self.pool_size)
        for host in self.hosts:
            for oid, format in self.oids.items():
                pool.spawn(self.snmp_walk, host, oid, format)
        pool.join()




if __name__ == '__main__':
    start = datetime.datetime.now()
    ips = ['10.48.24.45']
    oids = {'1.3.6.1.2.1.17.4.3.1.2': 'int', '1.3.6.1.2.1.17.1.4.1.2': 'int', '1.3.6.1.2.1.31.1.1.1.1': 'str',
            '1.3.6.1.2.1.17.4.3.1.1': 'hex', '1.3.6.1.2.1.17.7.1.4.5.1.1': 'int', '1.3.6.1.4.1.2011.5.25.42.1.1.1.3.1.19': 'str'}
    snmp_cla = SnmpScanController(ips, oids)
    snmp_cla.StartSNMP()
    for i in snmp_cla.result.items():
        print(i)
    print(datetime.datetime.now()-start)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值