def walk( self, oid: OID, section_name: Optional[SectionName] = None, table_base_oid: Optional[OID] = None, context_name: Optional[SNMPContextName] = None, ) -> SNMPRowInfo: if oid.startswith("."): oid = oid[1:] if oid.endswith(".*"): oid_prefix = oid[:-2] dot_star = True else: oid_prefix = oid dot_star = False host_cache = snmp_cache.host_cache() try: lines = host_cache[self.config.hostname] except KeyError: path = cmk.utils.paths.snmpwalks_dir + "/" + self.config.hostname console.vverbose(" Loading %s from %s\n" % (oid, path)) try: lines = StoredWalkSNMPBackend.read_walk_data(path) except IOError: raise MKSNMPError("No snmpwalk file %s" % path) host_cache[self.config.hostname] = lines begin = 0 end = len(lines) hit = None while end - begin > 0: current = (begin + end) // 2 parts = lines[current].split(None, 1) comp = parts[0] hit = StoredWalkSNMPBackend._compare_oids(oid_prefix, comp) if hit == 0: break if hit == 1: # we are too low begin = current + 1 else: end = current if hit != 0: return [] # not found rowinfo = StoredWalkSNMPBackend._collect_until(oid, oid_prefix, lines, current, -1) rowinfo.reverse() rowinfo += StoredWalkSNMPBackend._collect_until( oid, oid_prefix, lines, current + 1, 1) if dot_star: return [rowinfo[0]] return rowinfo
def walk(self, oid: OID, check_plugin_name: Optional[CheckPluginNameStr] = None, table_base_oid: Optional[OID] = None, context_name: Optional[SNMPContextName] = None) -> SNMPRowInfo: if oid.startswith("."): oid = oid[1:] if oid.endswith(".*"): oid_prefix = oid[:-2] dot_star = True else: oid_prefix = oid dot_star = False if snmp_cache.host_cache_contains(self.config.hostname): lines = snmp_cache.host_cache_get(self.config.hostname) else: path = cmk.utils.paths.snmpwalks_dir + "/" + self.config.hostname console.vverbose(" Loading %s from %s\n" % (oid, path)) try: lines = open(path).readlines() except IOError: raise MKSNMPError("No snmpwalk file %s" % path) snmp_cache.host_cache_set(self.config.hostname, lines) begin = 0 end = len(lines) hit = None while end - begin > 0: current = (begin + end) // 2 # skip over values including newlines to the next oid while not lines[current].startswith(".") and current < end: current += 1 parts = lines[current].split(None, 1) comp = parts[0] hit = StoredWalkSNMPBackend._compare_oids(oid_prefix, comp) if hit == 0: break if hit == 1: # we are too low begin = current + 1 else: end = current if hit != 0: return [] # not found rowinfo = StoredWalkSNMPBackend._collect_until(oid, oid_prefix, lines, current, -1) rowinfo.reverse() rowinfo += StoredWalkSNMPBackend._collect_until( oid, oid_prefix, lines, current + 1, 1) if dot_star: return [rowinfo[0]] return rowinfo