vector-uefi/fd/tool/chipsec/module.py
#CHIPSEC: Platform Security Assessment Framework
#Copyright (c) 2010-2014, Intel Corporation
#
#This program is free software; you can redistribute it and/or
#modify it under the terms of the GNU General Public License
#as published by the Free Software Foundation; Version 2.
#
#This program is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
#GNU General Public License for more details.
#
#You should have received a copy of the GNU General Public License
#along with this program; if not, write to the Free Software
#Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
#Contact information:
#chipsec@intel.com
#
import os
import sys
import re
import traceback
import chipsec.logger
from chipsec.module_common import ModuleResult
_importlib = True
try:
import importlib
except ImportError:
_importlib = False
MODPATH_RE = re.compile("^\w+(\.\w+)*$")
class Module():
def __init__(self,name):
self.logger = chipsec.logger.logger()
self.name = name
self.module = None
self.mod_obj = None
def get_name(self):
return self.name
def do_import(self):
loaded = False
if not MODPATH_RE.match(self.get_name()):
self.logger.error( "Invalid module path: %s" % self.name )
else:
try:
if _importlib:
self.module = importlib.import_module( self.name )
# Support for older Python < 2.5
#else:
# #module = __import__(module_path)
# exec ('import ' + self.name)
loaded = True
except BaseException, msg:
self.logger.error( "Exception occurred during import of %s: '%s'" % (self.name, str(msg)) )
if self.logger.VERBOSE: self.logger.log_bad(traceback.format_exc())
return loaded
def run( self, module_argv ):
result = self.get_module_object()
if self.mod_obj != None and result == ModuleResult.PASSED:
if module_argv is not None:
self.logger.log( "[*] Module arguments (%d):" % len(module_argv) )
self.logger.log( module_argv )
else:
module_argv = []
if isinstance(self.mod_obj,chipsec.module_common.BaseModule):
result = self.mod_obj.run(module_argv)
return result
def get_module_object(self):
result = ModuleResult.PASSED
if self.mod_obj == None :
try:
if _importlib:
pkg = getattr( self.module, "__package__" )
class_name = getattr( self.module, "__name__" )
if pkg:
class_name = class_name.replace(pkg,'')
if class_name.startswith('.'): class_name = class_name.replace('.','')
self.mod_obj = getattr(self.module,class_name.lower())()
# Support for older Python < 2.5
#else:
# exec ('import ' + self.name)
# exec ( 'pkg = ' + self.name + '.__package__')
# exec ( 'class_name = ' + self.name + '.__name__')
# if pkg:
# class_name = class_name.replace(pkg,'')
# if class_name.startswith('.'): class_name = class_name.replace('.','')
# exec ('self.mod_obj = ' + self.name + '.' + class_name + '()')
except AttributeError, ae:
result = ModuleResult.DEPRECATED
return result
def get_location(self):
myfile = ''
try:
if _importlib:
myfile = getattr( self.module, "__file__" )
# Support for older Python < 2.5
#else:
# exec ('import ' + self.name)
# exec ( 'file = ' + self.name + '.__file__')
except :
pass
return myfile
def get_tags(self):
module_tags=[]
try:
if _importlib:
module_tags = getattr( self.module, 'TAGS' )
# Support for older Python < 2.5
#else:
# exec ('module_tags = ' +self.get_name() + '.TAGS')
except:
#self.logger.log(module_path)
#self.logger.log_bad(traceback.format_exc())
pass
return module_tags
def __str__(self):
return self.get_name()