def set_by_name(self, obj_name, value, idx=(0, )): """Does a SNMP SET request. See `Get` for more information on possible OID notations. Automatic converting to the SNMP type expected by the remote system is only supported for OIDs for which there is a MIB describing it. If you want to use an OID which is not described by a MIB, you'll have to use the `Set XXX`-keyword or `Convert To XXX`-keyword. The optional `idx` is appended to the OID (defaults to `.0`). Example: | Set | SNMPv2::sysDescr | New System Description | """ if self._active_connection is None: raise RuntimeError('No transport host set') mibViewCtl = view.MibViewController(self._active_connection.builder) objIdentity = ObjectIdentity(self.DTM_MIB_LIB_NAME, obj_name) objIdentity.resolveWithMib(mibViewCtl) oid = '.' + str(objIdentity.getOid()) idx = utils.parse_idx(idx) oid = utils.parse_oid(oid) + idx self._set((oid, value))
def get_oid_by_name(self, *names): """get oid from custom names. """ if len(names): self._info('get_oid_by_name %s' % ' '.join(list(names))) mibViewCtl = view.MibViewController( self._active_connection.builder) objIdentity = ObjectIdentity(*names) objIdentity.resolveWithMib(mibViewCtl) return '.' + str(objIdentity.getOid())
def get_value_by_name2(self, idx, *names): """get value from custom names direcly. """ if len(names): self._info('get_oid_by_name %s' % ' '.join(list(names))) mibViewCtl = view.MibViewController( self._active_connection.builder) objIdentity = ObjectIdentity(*names) objIdentity.resolveWithMib(mibViewCtl) oid = '.' + str(idx) + '.' + str(objIdentity.getOid()) return self._get(oid)
def set_many_by_name(self, *name_value_pairs): """ Does a SNMP SET request with multiple values. Set one or more values simultaneously. See `Set` for more information about the OID and possible value. After each value, you can give an index (`idx`, see example below) which is appended to the OIDs. By default the index is `.0`. Examples: | Set Many | SNMPv2::sysDescr | New System Description | | | ... | SNMPv2-MIB::sysName | New System Name | | | Set Many | IF-MIB::ifDescr | IF1 Description | idx=1 | | ... | IF-MIB::ifDescr | IF2 Description | idx=2 | """ if self._active_connection is None: raise RuntimeError('No transport host set') args = list(name_value_pairs) oid_values = list() try: while len(args): obj_name = args.pop(0) mibViewCtl = view.MibViewController( self._active_connection.builder) objIdentity = ObjectIdentity(self.DTM_MIB_LIB_NAME, obj_name) objIdentity.resolveWithMib(mibViewCtl) oid = '.' + str(objIdentity.getOid()) value = args.pop(0) possible_idx = args[0] if len(args) > 0 else '' if possible_idx.startswith('idx='): idx = args.pop(0)[4:] else: idx = (0, ) idx = utils.parse_idx(idx) oid = utils.parse_oid(oid) + idx oid_values.append((oid, value)) except IndexError: raise RuntimeError('Invalid Object Name/value(/index) format') if len(oid_values) < 1: raise RuntimeError( 'You must specify at least one Object Name/value pair') self._set(*oid_values)
def get_by_name(self, obj_name, idx=(0, )): """Does a SNMP GET request for the specified 'obj_name'. The optional `idx` can be specified as tuple or as a string and defaults to `.0`. Examples: | ${value}= | Get | SNMPv2-MIB::sysDescr | | | ${value}= | Get | .1.3.6.1.2.1.1.1 | | | ${value}= | Get | .iso.org.6.internet.2.1.1.1 | | | ${value}= | Get | sysDescr | | | ${value}= | Get | ifDescr | 2 | """ mibViewCtl = view.MibViewController(self._active_connection.builder) objIdentity = ObjectIdentity(self.DTM_MIB_LIB_NAME, obj_name) objIdentity.resolveWithMib(mibViewCtl) oid = '.' + str(objIdentity.getOid()) return self._get(oid, idx)
config.addSocketTransport(snmpEngine, udp.domainName, udp.UdpSocketTransport().openClientMode()) config.addTargetAddr(snmpEngine, 'tgt', udp.domainName, agentUDPv4Endpoint, 'pms', timeout, retryCount) log.info('Querying UDP/IPv4 agent at %s:%s' % agentUDPv4Endpoint) log.info('Agent response timeout: %.2f secs, retries: %s' % (timeout / 100, retryCount)) if (isinstance(startOID, ObjectIdentity) or isinstance(stopOID, ObjectIdentity)): compiler.addMibCompiler(snmpEngine.getMibBuilder(), sources=mibSources or defaultMibSources) mibViewController = view.MibViewController(snmpEngine.getMibBuilder()) if isinstance(startOID, ObjectIdentity): startOID.resolveWithMib(mibViewController) if isinstance(stopOID, ObjectIdentity): stopOID.resolveWithMib(mibViewController) # Variation module initialization if variationModule: log.info('Initializing variation module...') for x in ('init', 'record', 'shutdown'): if x not in variationModule: log.error('missing "%s" handler at variation module "%s"' % (x, variationModuleName)) sys.exit(-1) try: variationModule['init'](snmpEngine=snmpEngine, options=variationModuleOptions,
'SNMPv2-SMI', 'MibScalar', 'MibTable', 'MibTableRow', 'MibTableColumn' ) mibViewController = view.MibViewController(mibBuilder) compiler.addMibCompiler( mibBuilder, sources=mibSources or defaultMibSources ) try: if isinstance(startOID, ObjectIdentity): startOID.resolveWithMib(mibViewController) if isinstance(stopOID, ObjectIdentity): stopOID.resolveWithMib(mibViewController) except error.PySnmpError: sys.stderr.write('ERROR: %s\r\n' % sys.exc_info()[1]) sys.exit(-1) output = [] # MIBs walk for modName in modNames: if verboseFlag: sys.stderr.write( '# MIB module: %s, from %s till '
class SnmpResponse(object): def __init__(self, oid, value, snmp_engine, logger): self._raw_oid = oid self._snmp_mib_translator = CommandGeneratorVarBinds.getMibViewController( snmp_engine) self._logger = logger self._mib_id = None self._mib_name = None self._index = None self._raw_value = value self._object_id = ObjectIdentity(self._raw_oid) self._object_type = ObjectType(self._object_id, self._raw_value) @property def _object_identity(self): if not self._object_id.isFullyResolved(): self._object_id.resolveWithMib(self._snmp_mib_translator) return self._object_id @property def object_type(self): if not self._object_type.isFullyResolved(): self._object_type.resolveWithMib(self._snmp_mib_translator) return self._object_type @property def raw_value(self): return self._raw_value @property def oid(self): return self._object_identity.getOid() @property def mib_name(self): if not self._mib_name: self._get_oid() return self._mib_name @property def mib_id(self): if not self._mib_id: self._get_oid() return self._mib_id @property def index(self): if not self._index: self._get_oid() return self._index @property def safe_value(self): result = "" try: result = self.value or "" except TranslateSNMPException: pass return result @property def value(self): try: if self._raw_value is None or not self.object_type: return if hasattr(self.object_type[1], "prettyPrint"): value = self.object_type[1].prettyPrint() else: value = str(self.object_type[1]) if value.lower().startswith("0x"): value = str(self._raw_value) return value except (PySnmpError, SmiError): raise TranslateSNMPException("Error parsing snmp response") def _get_oid(self): oid = self._object_identity.getMibSymbol() self._mib_name = oid[0] self._mib_id = oid[1] if isinstance(oid[-1], tuple): self._index = ".".join(map(lambda x: x.prettyPrint(), oid[-1])) def __str__(self): return self.safe_value def __repr__(self): return self.__str__()