snmpLib.py
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
from easysnmp import snmp_walk, snmp_get
class SNMP(object):
def __init__(self, hostname, community, port, version=2):
self.data = {}
self.port = port
self.hostname = hostname
self.community = community
self.version = version
self()
def __call__(self):
try:
self._get_port_id()
self._get_policy()
self._get_behavior_id()
self._get_speed()
except Exception as e:
raise ValueError('SNMP 连接失败: %s' % e)
def _get_param(self, oid):
return {'oids': oid, 'hostname': self.hostname, 'community': self.community, 'version': self.version}
def _get_port_id(self):
param = self._get_param('IF-MIB::ifDescr')
data = [_port.oid_index for _port in snmp_walk(**param) if _port.value == self.port]
port_id = ''.join(data if data else [])
self.port_id = port_id
def _get_policy(self):
param = self._get_param('SNMPv2-SMI::enterprises.25506.2.65.2.1.4.1.1.3.%s.1' % self.port_id)
data = snmp_get(**param)
policy = data.value if data else ''
self.data['policy'] = policy
self.data['behavior'] = policy
# def _get_policy_id(self):
# param = self._get_param('SNMPv2-SMI::enterprises.25506.2.65.2.1.3.2.1.2')
# data = [_policy.oid for _policy in snmp_walk(**param) if _policy.value == self.data.get('policy')]
# policy_id = ''.join(data if data else []).split('.')[-1]
# self.data['policy_id'] = policy_id
# def _get_behavior(self):
# param = self._get_param('SNMPv2-SMI::enterprises.25506.2.65.2.1.3.3.1.5.%s.1' % self.data.get('policy_id'))
# data = snmp_get(**param)
# behavior = data.value if data else ''
# self.data['behavior'] = behavior
def _get_behavior_id(self):
param = self._get_param('SNMPv2-SMI::enterprises.25506.2.65.2.1.2.2.1.2')
data = [_behavior.oid for _behavior in snmp_walk(**param) if _behavior.value == self.data.get('behavior')]
behavior_id = ''.join(data if data else []).split('.')[-1]
self.behavior_id = behavior_id
def _get_speed(self):
param = self._get_param('SNMPv2-SMI::enterprises.25506.2.65.2.1.2.3.1.1.%s' % self.behavior_id)
data = snmp_get(**param)
if data.value == 'NOSUCHINSTANCE':
speed = -1
else:
speed = int(data.value) // 1000
self.data['speed'] = speed
def get_all(self):
return self.data
def get_data(self):
return self.data
def get_policy(self):
return self.data.get('policy', None)
def get_behavior(self):
return self.data.get('behavior', None)
def get_speed(self):
return self.data.get('speed', None)
if __name__ == '__main__':
snmp = SNMP('xxx', 'snmp_string', 'xxx')
print(snmp.get_speed())