class SnmpQueryBuilder: def __init__(self, tableOidOffset): self.queryElements = TreeSet(OffsetBasedComparator()) self.tableOidOffset = tableOidOffset def addQueryElement(self, offset, name, type='string'): queryElement = QueryElement(offset, name, type) self.queryElements.add(queryElement) def __buildQueryParts(self, productOidBase, queryElements): ''' Build query parts and returns base query part and parts for each query element (OID) @types: str, java.util.TreeSet -> tuple(str, list(str))''' if productOidBase: tableOidBase = self.__glue_(productOidBase, self.tableOidOffset, '.') else: tableOidBase = self.tableOidOffset iterator = self.queryElements.iterator() queryElement = iterator.next() oidNoType = self.__glue_(tableOidBase, queryElement.offset, '.') surrogateOid = self.__glue_(tableOidBase, queryElement.offset + 1, '.') oidNoType = self.__glue_(oidNoType, surrogateOid) queryBase = self.__glue_(oidNoType, queryElement.type) oidParts = [] while iterator.hasNext(): queryElement = iterator.next() oidNoType = self.__glue_(tableOidBase, queryElement.offset, '.') oid = self.__glue_(oidNoType, queryElement.type) oidParts.append(oid) return queryBase, oidParts def produceQuery(self, productOidBase): '@types: str -> str' queryBase, oidParts = self.__buildQueryParts(productOidBase, self.queryElements) # make single query where query base is joined with parts related to # each query element return reduce(self.__glue_, (queryBase, ) + tuple(oidParts)) def producePartialQueries(self, productOidBase): queryBase, oidParts = self.__buildQueryParts(productOidBase, self.queryElements) # zi = zip(queryBase * len(oidParts), oidParts) # return map(lambda pair, _ = self: _.__glue_(pair[0], pair[1]), zi) queries = [] for elementPart in oidParts: queries.append(self.__glue_(queryBase, elementPart)) return queries def parseResults(self, resultSet): table = resultSet.asTable() return self.produceResults(table) def produceResults(self, table): resultItems = [] for rowIndex in range(len(table)): columnIndex = 1 resultItem = ResultItem() iterator = self.queryElements.iterator() while iterator.hasNext(): queryElement = iterator.next() name = queryElement.name setattr(resultItem, name, table[rowIndex][columnIndex]) columnIndex += 1 try: setattr(resultItem, 'meta_data', table[rowIndex][0]) except: pass resultItems.append(resultItem) return resultItems def mergeAndParseResults(self, resultSets): resultTable = [] numberOfResults = len(resultSets) if numberOfResults > 0: firstTable = resultSets[0].asTable() numberOfRows = len(firstTable) for rowIndex in xrange(numberOfRows): resultTable.append([ firstTable[rowIndex][0], firstTable[rowIndex][1], firstTable[rowIndex][2] ]) if numberOfResults > 1: for i in xrange(1, numberOfResults): table = resultSets[i].asTable() for rowIndex in xrange(numberOfRows): resultTable[rowIndex].append(table[rowIndex][2]) return self.produceResults(resultTable) def __glue_(self, base, offset, separator=','): return ('%s%s%s') % (base, separator, offset)
class SnmpQueryBuilder: def __init__(self, tableOidOffset): self.queryElements = TreeSet(OffsetBasedComparator()) self.tableOidOffset = tableOidOffset def addQueryElement(self, offset, name, type='string'): queryElement = QueryElement(offset, name, type) self.queryElements.add(queryElement) def __buildQueryParts(self, productOidBase, queryElements): ''' Build query parts and returns base query part and parts for each query element (OID) @types: str, java.util.TreeSet -> tuple(str, list(str))''' if productOidBase: tableOidBase = self.__glue_(productOidBase, self.tableOidOffset, '.') else: tableOidBase = self.tableOidOffset iterator = self.queryElements.iterator() queryElement = iterator.next() oidNoType = self.__glue_(tableOidBase, queryElement.offset, '.') surrogateOid = self.__glue_(tableOidBase, queryElement.offset + 1, '.') oidNoType = self.__glue_(oidNoType, surrogateOid) queryBase = self.__glue_(oidNoType, queryElement.type) oidParts = [] while iterator.hasNext(): queryElement = iterator.next() oidNoType = self.__glue_(tableOidBase, queryElement.offset, '.') oid = self.__glue_(oidNoType, queryElement.type) oidParts.append(oid) return queryBase, oidParts def produceQuery(self, productOidBase): '@types: str -> str' queryBase, oidParts = self.__buildQueryParts(productOidBase, self.queryElements) # make single query where query base is joined with parts related to # each query element return reduce(self.__glue_, (queryBase,) + tuple(oidParts)) def producePartialQueries(self, productOidBase): queryBase, oidParts = self.__buildQueryParts(productOidBase, self.queryElements) # zi = zip(queryBase * len(oidParts), oidParts) # return map(lambda pair, _ = self: _.__glue_(pair[0], pair[1]), zi) queries = [] for elementPart in oidParts: queries.append(self.__glue_(queryBase, elementPart)) return queries def parseResults(self, resultSet): table = resultSet.asTable() return self.produceResults(table) def produceResults(self, table): resultItems = [] for rowIndex in range(len(table)): columnIndex = 1 resultItem = ResultItem() iterator = self.queryElements.iterator() while iterator.hasNext(): queryElement = iterator.next() name = queryElement.name setattr(resultItem, name, table[rowIndex][columnIndex]) columnIndex += 1 try: setattr(resultItem, 'meta_data', table[rowIndex][0]) except: pass resultItems.append(resultItem) return resultItems def mergeAndParseResults(self, resultSets): resultTable = [] numberOfResults = len(resultSets) if numberOfResults > 0: firstTable = resultSets[0].asTable() numberOfRows = len(firstTable) for rowIndex in xrange(numberOfRows): resultTable.append([firstTable[rowIndex][0], firstTable[rowIndex][1], firstTable[rowIndex][2]]) if numberOfResults > 1: for i in xrange(1, numberOfResults): table = resultSets[i].asTable() for rowIndex in xrange(numberOfRows): resultTable[rowIndex].append(table[rowIndex][2]) return self.produceResults(resultTable) def __glue_(self, base, offset, separator=','): return ('%s%s%s') % (base, separator, offset)