mirror of
https://github.com/chipsec/chipsec
synced 2026-06-08 13:31:00 +00:00
18827a8574
Signed-off-by: BrentHoltsclaw <brent.holtsclaw@intel.com>
131 lines
4.5 KiB
Python
131 lines
4.5 KiB
Python
#CHIPSEC: Platform Security Assessment Framework
|
|
#Copyright (c) 2010-2019, 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: {}".format(self.name) )
|
|
else:
|
|
try:
|
|
if _importlib:
|
|
self.module = importlib.import_module( self.name )
|
|
loaded = True
|
|
if self.logger.DEBUG: self.logger.log_good( "imported: {}".format(self.name) )
|
|
except BaseException as msg:
|
|
self.logger.error( "Exception occurred during import of {}: '{}'".format(self.name, str(msg)) )
|
|
if self.logger.DEBUG: self.logger.log_bad(traceback.format_exc())
|
|
raise msg
|
|
return loaded
|
|
|
|
def run( self, module_argv ):
|
|
result = self.get_module_object()
|
|
|
|
if self.mod_obj is not None and result == ModuleResult.PASSED:
|
|
if module_argv is not None:
|
|
self.logger.log( "[*] Module arguments ({:d}):".format(len(module_argv)) )
|
|
self.logger.log( module_argv )
|
|
else:
|
|
module_argv = []
|
|
|
|
if isinstance(self.mod_obj,chipsec.module_common.BaseModule):
|
|
if self.mod_obj.is_supported() :
|
|
result = self.mod_obj.run(module_argv)
|
|
else:
|
|
if self.mod_obj.res == ModuleResult.NOTAPPLICABLE:
|
|
result = ModuleResult.NOTAPPLICABLE
|
|
self.logger.log("Skipping module {} since it is not supported in this platform".format(self.name))
|
|
else:
|
|
result = ModuleResult.SKIPPED
|
|
self.logger.log("Skipping module {} since it is not supported in this platform".format(self.name))
|
|
|
|
return result
|
|
|
|
def get_module_object(self):
|
|
result = ModuleResult.PASSED
|
|
if self.mod_obj is 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('.','')
|
|
for iname, iref in self.module.__dict__.items():
|
|
if isinstance(iref, type):
|
|
if issubclass(iref, chipsec.module_common.BaseModule):
|
|
if iname.lower() == class_name.lower():
|
|
self.mod_obj = iref()
|
|
if self.mod_obj is None:
|
|
result = ModuleResult.DEPRECATED
|
|
except (AttributeError, TypeError) as ae:
|
|
result = ModuleResult.DEPRECATED
|
|
return result
|
|
|
|
def get_location(self):
|
|
myfile = ''
|
|
try:
|
|
if _importlib:
|
|
myfile = getattr( self.module, "__file__" )
|
|
except :
|
|
pass
|
|
return myfile
|
|
|
|
|
|
def get_tags(self):
|
|
module_tags=[]
|
|
try:
|
|
if _importlib:
|
|
module_tags = getattr( self.module, '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()
|