# # This file is part of pysmi software. # # Copyright (c) 2015-2019, Ilya Etingof # License: http://snmplabs.com/pysmi/license.html # import os import sys import time import struct try: import importlib try: SOURCE_SUFFIXES = importlib.machinery.SOURCE_SUFFIXES BYTECODE_SUFFIXES = importlib.machinery.BYTECODE_SUFFIXES except Exception: raise ImportError() except ImportError: import imp SOURCE_SUFFIXES = [s[0] for s in imp.get_suffixes() if s[2] == imp.PY_SOURCE] BYTECODE_SUFFIXES = [s[0] for s in imp.get_suffixes() if s[2] == imp.PY_COMPILED] from pysmi.searcher.base import AbstractSearcher from pysmi.compat import decode from pysmi import debug from pysmi import error class PyFileSearcher(AbstractSearcher): """Figures out if given Python file (source or bytecode) exists at given location. """ def __init__(self, path): """Create an instance of *PyFileSearcher* bound to specific directory. Args: path (str): path to local directory """ self._path = os.path.normpath(decode(path)) def __str__(self): return '%s{"%s"}' % (self.__class__.__name__, self._path) def fileExists(self, mibname, mtime, rebuild=False): if rebuild: debug.logger & debug.flagSearcher and debug.logger('pretend %s is very old' % mibname) return mibname = decode(mibname) pyfile = os.path.join(self._path, mibname) for pySfx in BYTECODE_SUFFIXES: f = pyfile + pySfx if not os.path.exists(f) or not os.path.isfile(f): debug.logger & debug.flagSearcher and debug.logger('%s not present or not a file' % f) continue try: fp = open(f, 'rb') pyData = fp.read(8) fp.close() except IOError: raise error.PySmiSearcherError('failure opening compiled file %s: %s' % (f, sys.exc_info()[1]), searcher=self) if pyData[:4] == imp.get_magic(): pyData = pyData[4:] pyTime = struct.unpack('= mtime: raise error.PySmiFileNotModifiedError() else: raise error.PySmiFileNotFoundError('older file %s exists' % mibname, searcher=self) else: debug.logger & debug.flagSearcher and debug.logger('bad magic in %s' % f) continue for pySfx in SOURCE_SUFFIXES: f = pyfile + pySfx if not os.path.exists(f) or not os.path.isfile(f): debug.logger & debug.flagSearcher and debug.logger('%s not present or not a file' % f) continue try: pyTime = os.stat(f)[8] except OSError: raise error.PySmiSearcherError('failure opening compiled file %s: %s' % (f, sys.exc_info()[1]), searcher=self) debug.logger & debug.flagSearcher and debug.logger( 'found %s, mtime %s' % (f, time.strftime("%a, %d %b %Y %H:%M:%S GMT", time.gmtime(pyTime)))) if pyTime >= mtime: raise error.PySmiFileNotModifiedError() raise error.PySmiFileNotFoundError('no compiled file %s found' % mibname, searcher=self)