Change the way helper loading is done

Signed-off-by: Nathaniel Mitchell <nathaniel.p.mitchell@intel.com>
This commit is contained in:
Nathaniel Mitchell
2023-04-25 14:58:48 -07:00
parent 814995e345
commit 4b9ab99839
9 changed files with 57 additions and 34 deletions
-2
View File
@@ -25,10 +25,8 @@
##################################################################################
import sys
from chipsec.helper.oshelper import avail_helpers
if 'itpii' in sys.modules:
__all__ = ['dalhelper']
avail_helpers.append("dalhelper")
else:
__all__ = []
+1 -2
View File
@@ -26,9 +26,8 @@
##################################################################################
import sys
from chipsec.helper.oshelper import avail_helpers
if sys.platform.startswith('uefi') or sys.platform.startswith('EFI'):
__all__ = ["efihelper"]
avail_helpers.append("efihelper")
else:
__all__ = []
+1 -2
View File
@@ -18,6 +18,5 @@
# chipsec@intel.com
#
from chipsec.helper.oshelper import avail_helpers
__all__ = ["filehelper"]
avail_helpers.append("filehelper")
+1 -2
View File
@@ -26,9 +26,8 @@
##################################################################################
import platform
from chipsec.helper.oshelper import avail_helpers
if "linux" == platform.system().lower():
__all__ = ["linuxhelper"]
avail_helpers.append("linuxhelper")
else:
__all__ = []
+49 -18
View File
@@ -25,14 +25,17 @@ Abstracts support for various OS/environments, wrapper around platform specific
import os
import re
import errno
import importlib
import platform
import traceback
import sys
from ctypes import Array
from typing import Tuple, List, Dict, Optional, AnyStr, TYPE_CHECKING
if TYPE_CHECKING:
from chipsec.library.types import EfiVariableType
import chipsec.file
from chipsec.file import get_main_dir, TOOLS_DIR
from chipsec.logger import logger
from chipsec.helper.basehelper import Helper
from chipsec.exceptions import UnimplementedAPIError, OsHelperError
avail_helpers = []
@@ -48,7 +51,7 @@ def map_modname_zip(x: str) -> str:
def get_tools_path() -> str:
return os.path.normpath(os.path.join(chipsec.file.get_main_dir(), chipsec.file.TOOLS_DIR))
return os.path.normpath(os.path.join(get_main_dir(), TOOLS_DIR))
import chipsec.helper.helpers as chiphelpers
@@ -60,11 +63,11 @@ import chipsec.helper.helpers as chiphelpers
class OsHelper:
def __init__(self):
self.helper = None
self.avail_helpers = {}
self.loadHelpers()
self.filecmds = None
self.helper = self.getDefaultHelper()
if (not self.helper):
import platform
os_system = platform.system()
raise OsHelperError("Could not load any helpers for '{}' environment (unsupported environment?)".format(os_system), errno.ENODEV)
else:
@@ -80,22 +83,50 @@ class OsHelper:
self.os_machine = self.helper.os_machine
def loadHelpers(self) -> None:
for helper in avail_helpers:
helper_dir = os.path.join(get_main_dir(), "chipsec", "helper")
helpers = [os.path.basename(f) for f in os.scandir(helper_dir)
if f.is_dir() and not os.path.basename(f).startswith("__")]
for helper in helpers:
helper_path = ''
try:
self.helper = getattr(chiphelpers, helper).get_helper()
break
except OsHelperError:
raise
except:
if logger().DEBUG:
logger().log("Unable to load helper: {}".format(helper))
helper_path = f'chipsec.helper.{helper}.{helper}helper'
hlpr = importlib.import_module(helper_path)
self.avail_helpers[f'{helper}helper'] = hlpr
except ImportError as msg:
logger().log_debug(f"Unable to load helper: {helper}")
def getHelper(self, name: str) -> any:
ret = None
if name in self.avail_helpers:
ret = self.avail_helpers[name].get_helper()
return ret
def getAvailableHelpers(self) -> List[str]:
return self.avail_helpers.keys()
def getBaseHelper(self):
return Helper()
def getDefaultHelper(self):
ret = None
if self.is_linux():
ret = self.getHelper("linuxhelper")
elif self.is_windows():
ret = self.getHelper("windowshelper")
elif self.is_efi():
ret = self.getHelper("efihelper")
elif self.is_dal():
ret = self.getHelper("dalhelper")
if ret is None:
ret = self.getBaseHelper()
return ret
def start(self, start_driver: bool, driver_exists: Optional[bool] = None, to_file: Optional[bool] = None, from_file: Optional[bool] = False) -> None:
if to_file is not None:
from chipsec.helper.file.filehelper import FileCmds
self.filecmds = FileCmds(to_file)
if driver_exists is not None:
for name in avail_helpers:
for name in self.avail_helpers:
if name == driver_exists:
self.helper = getattr(chiphelpers, name).get_helper()
try:
@@ -136,23 +167,23 @@ class OsHelper:
return self.helper.use_native_api()
def is_dal(self) -> bool:
return ('itpii' in sys.modules)
return 'itpii' in sys.modules
def is_efi(self) -> bool:
return self.os_system.lower().startswith('efi') or self.os_system.lower().startswith('uefi')
return platform.system().lower().startswith('efi') or platform.system().lower().startswith('uefi')
def is_linux(self) -> bool:
return ('linux' == self.os_system.lower())
return 'linux' == platform.system().lower()
def is_windows(self) -> bool:
return ('windows' == self.os_system.lower())
return 'windows' == platform.system().lower()
def is_win8_or_greater(self) -> bool:
win8_or_greater = self.is_windows() and (self.os_release.startswith('8') or ('2008Server' in self.os_release) or ('2012Server' in self.os_release))
return win8_or_greater
def is_macos(self) -> bool:
return ('darwin' == self.os_system.lower())
return 'darwin' == platform.system().lower()
#################################################################################################
# Actual OS helper functionality accessible to HAL components
+1 -2
View File
@@ -13,9 +13,8 @@
#
import platform
from chipsec.helper.oshelper import avail_helpers
if 'darwin' == platform.system().lower():
__all__ = ["osxhelper"]
avail_helpers.append("osxhelper")
else:
__all__ = []
-2
View File
@@ -26,10 +26,8 @@
##################################################################################
import platform
from chipsec.helper.oshelper import avail_helpers
if "windows" == platform.system().lower():
__all__ = ["windowshelper"]
avail_helpers.append("windowshelper")
else:
__all__ = []
+2 -2
View File
@@ -47,7 +47,7 @@ import chipsec.result_deltas
from chipsec import defines
from chipsec import module_common
from chipsec import chipset
from chipsec.helper import oshelper
from chipsec.helper.oshelper import helper
from chipsec.logger import logger
from chipsec.banner import print_banner, print_banner_properties
from chipsec.testcase import ExitCode, TestCase, ChipsecResults
@@ -92,7 +92,7 @@ def parse_args(argv: Sequence[str]) -> Optional[Dict[str, Any]]:
adv_options.add_argument('--deltas', dest='_deltas_file', help='specifies a JSON log file to compute result deltas from')
adv_options.add_argument('--record', dest='_to_file', help='run chipsec and clone helper results into JSON file')
adv_options.add_argument('--replay', dest='_from_file', help='replay a chipsec run with JSON file')
adv_options.add_argument('--helper', dest='_driver_exists', help='specify OS Helper', choices=[i for i in oshelper.avail_helpers])
adv_options.add_argument('--helper', dest='_driver_exists', help='specify OS Helper', choices=[i for i in helper().getAvailableHelpers()])
adv_options.add_argument('-nb', '--no_banner', dest='_show_banner', action='store_false', help="chipsec won't display banner information")
adv_options.add_argument('--skip_config', dest='_load_config', action='store_false', help='skip configuration and driver loading')
+2 -2
View File
@@ -30,7 +30,7 @@ import importlib
import argparse
from typing import Sequence, Optional, Dict, Any
from chipsec.helper import oshelper
from chipsec.helper.oshelper import helper
from chipsec.logger import logger, level
from chipsec.banner import print_banner, print_banner_properties
from chipsec.exceptions import UnknownChipsetError
@@ -108,7 +108,7 @@ def parse_args(argv: Sequence[str]) -> Optional[Dict[str, Any]]:
help="chipsec won't need kernel mode functions so don't load chipsec driver")
options.add_argument('-i', '--ignore_platform', dest='_unknownPlatform', action='store_false',
help='run chipsec even if the platform is not recognized')
options.add_argument('--helper', dest='_driver_exists', help='specify OS Helper', choices=[i for i in oshelper.avail_helpers])
options.add_argument('--helper', dest='_driver_exists', help='specify OS Helper', choices=[i for i in helper().getAvailableHelpers()])
options.add_argument('_cmd', metavar='Command', nargs='?', choices=sorted(cmds.keys()), type=str.lower, default="help",
help="Util command to run: {{{}}}".format(','.join(sorted(cmds.keys()))))
options.add_argument('_cmd_args', metavar='Command Args', nargs=argparse.REMAINDER, help=global_usage)