def transform_mibs_to_json(self, specific_mibs: object = None, exclude_mibs: object = []) -> object: mib_names = [] if specific_mibs is None: for filename in os.listdir(self.local_mib_dir): try: filename.rindex('.my', -3) except: continue mib_names.append(filename) else: mib_names = specific_mibs.copy() logging.info('Compiling MIBs to JSON.') try: mib_compiler = MibCompiler( SmiV1CompatParser(), JsonCodeGen(), FileWriter(self.local_json_dir).setOptions(suffix='.json')) mib_compiler.addSources( FileReader(self.local_mib_dir, recursive=True)) mib_stubs = JsonCodeGen.baseMibs searchers = [ AnyFileSearcher( self.local_json_dir).setOptions(exts=['.json']), StubSearcher(*mib_stubs) ] mib_compiler.addSearchers(*searchers) if not os.path.isdir(self.local_json_dir): os.makedirs(self.local_json_dir) processed = mib_compiler.compile( *mib_names, **dict(noDeps=False, rebuild=True, genTexts=True, writeMibs=True, ignoreErrors=True)) mib_compiler.buildIndex(processed, ignoreErrors=True) except error.PySmiError: logging.error('ERROR: %s', str(sys.exc_info()[1])) sys.exit(1) logging.info('Finished compiling MIBs to JSON.')
mibCompiler.addBorrowers(*borrowers) processed = mibCompiler.compile( *inputMibs, **dict(noDeps=nodepsFlag, rebuild=rebuildFlag, dryRun=dryrunFlag, genTexts=genMibTextsFlag, textFilter=keepTextsLayout and (lambda symbol, text: text) or None, writeMibs=writeMibsFlag, ignoreErrors=ignoreErrorsFlag) ) if buildIndexFlag: mibCompiler.buildIndex( processed, dryRun=dryrunFlag, ignoreErrors=ignoreErrorsFlag ) except error.PySmiError: sys.stderr.write('ERROR: %s\r\n' % sys.exc_info()[1]) sys.exit(EX_SOFTWARE) else: if verboseFlag: sys.stderr.write('%sreated/updated MIBs: %s\r\n' % (dryrunFlag and 'Would be c' or 'C', ', '.join( ['%s%s' % (x, x != processed[x].alias and ' (%s)' % processed[x].alias or '') for x in sorted(processed) if processed[x] == 'compiled']))) sys.stderr.write('Pre-compiled MIBs %sborrowed: %s\r\n' % (dryrunFlag and 'Would be ' or '', ', '.join( ['%s (%s)' % (x, processed[x].path) for x in sorted(processed) if processed[x] == 'borrowed'])))
def storeMib(config, mib, mibdir=None, fetchRemote=False): """ A function to compile, store new mibs Mostly got the code from https://raw.githubusercontent.com/etingof/pysmi/master/scripts/mibdump.py """ cacheDir = '/tmp/' log.debug("Collecting MIB resources") mibSearchers = defaultMibPackages log.debug("Searches") mibStubs = [x for x in baseMibs if x not in fakeMibs] log.debug("Stubs") mibSources = ["file://{}".format(x) for x in config["mibs"]["locations"]] log.debug("MIB sources from config") if mibdir != None: mibSources.append("file://{}".format(mibdir)) log.debug("MIB source from param") # if "mib" is a path, add it to the sources. if os.path.sep in mib: mibSources.append(os.path.abspath(os.path.dirname(mib))) log.debug("MIB source from '{}'".format(mib)) if fetchRemote: mibSources.append('http://mibs.snmplabs.com/asn1/@mib@') log.debug("Added remote mib source.") log.info("Using MIB sources: [{}]".format(", ".join(mibSources))) log.info("Using dest: {}".format(config['mibs']['compiled'])) log.info("Initialize compiler") try: mibCompiler = MibCompiler( parserFactory(**smiV1Relaxed)(tempdir=cacheDir), PySnmpCodeGen(), PyFileWriter(config['mibs']['compiled']).setOptions( pyCompile=True, pyOptimizationLevel=0)) print(mibSources) except Exception as e: log.error("Exception! {}".format(e)) log.debug("Adding sources to compiler") try: mibCompiler.addSources( *getReadersFromUrls(*mibSources, **dict(fuzzyMatching=True))) mibCompiler.addSearchers(PyFileSearcher(config['mibs']['compiled'])) for mibSearcher in mibSearchers: mibCompiler.addSearchers(PyPackageSearcher(mibSearcher)) mibCompiler.addSearchers(StubSearcher(*mibStubs)) log.debug("Starting compilation of {}".format(mib)) processed = mibCompiler.compile( *[mib], **dict(noDeps=False, rebuild=False, dryRun=False, genTexts=False, ignoreErrors=False)) mibCompiler.buildIndex(processed, dryRun=False, ignoreErrors=False) except smiError.PySmiError as e: log.error("Compilation failed: {}".format(e)) raise exceptions.MibCompileError(e) errors = [(x, processed[x].error) for x in sorted(processed) if processed[x] == 'failed'] compiled = [(x, processed[x].alias) for x in sorted(processed) if processed[x] == 'compiled'] missing = [x for x in sorted(processed) if processed[x] == 'missing'] for mib in compiled: log.info("Compiled {} ({})".format(mib[0], mib[1])) if len(errors) > 0 or len(missing) > 0: for error in errors: log.error("Could not process {} MIB: {}".format( error[0], error[1])) for mis in missing: log.error("Could not find {}".format(mis)) raise exceptions.MibCompileFailed(errors) log.info("Done without errors") print(processed)
mibCompiler.addBorrowers( *[ PyFileBorrower(x[1], genTexts=mibBorrowers[x[0]][1]) for x in enumerate(getReadersFromUrls(*[m[0] for m in mibBorrowers], **dict(lowcaseMatching=False))) ] ) processed = mibCompiler.compile(*inputMibs, **dict(noDeps=nodepsFlag, rebuild=rebuildFlag, dryRun=dryrunFlag, genTexts=genMibTextsFlag, ignoreErrors=ignoreErrorsFlag)) if buildIndexFlag: mibCompiler.buildIndex( processed, dryRun=dryrunFlag, ignoreErrors=ignoreErrorsFlag ) except error.PySmiError: sys.stderr.write('ERROR: %s\r\n' % sys.exc_info()[1]) sys.exit(-1) else: if verboseFlag: sys.stderr.write('%sreated/updated MIBs: %s\r\n' % (dryrunFlag and 'Would be c' or 'C', ', '.join(['%s%s' % (x,x != processed[x].alias and ' (%s)' % processed[x].alias or '') for x in sorted(processed) if processed[x] == 'compiled']))) sys.stderr.write('Pre-compiled MIBs %sborrowed: %s\r\n' % (dryrunFlag and 'Would be ' or '', ', '.join(['%s (%s)' % (x,processed[x].path) for x in sorted(processed) if processed[x] == 'borrowed']))) sys.stderr.write('Up to date MIBs: %s\r\n' % ', '.join(['%s' % x for x in sorted(processed) if processed[x] == 'untouched'])) sys.stderr.write('Missing source MIBs: %s\r\n' % ', '.join(['%s' % x for x in sorted(processed) if processed[x] == 'missing'])) sys.stderr.write('Ignored MIBs: %s\r\n' % ', '.join(['%s' % x for x in sorted(processed) if processed[x] == 'unprocessed'])) sys.stderr.write('Failed MIBs: %s\r\n' % ', '.join(['%s (%s)' % (x,processed[x].error) for x in sorted(processed) if processed[x] == 'failed']))