diff options
Diffstat (limited to 'tools/module_manager.py')
-rw-r--r-- | tools/module_manager.py | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/tools/module_manager.py b/tools/module_manager.py new file mode 100644 index 00000000..6ed80e93 --- /dev/null +++ b/tools/module_manager.py @@ -0,0 +1,97 @@ +# Copyright 2015 Intel Corporation. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Simple kernel module manager implementation. +""" + +import subprocess +import logging +from tools import tasks + +class KernelModuleInsertMode(object): + """Module manager type of insert definition. + """ + MODPROBE = 1 + INSMOD = 2 #NOT IMPLEMENTED + +class ModuleManager(object): + """Simple module manager which acts as system wrapper for Kernel Modules. + """ + + _logger = logging.getLogger(__name__) + + def __init__(self, insert_mode=KernelModuleInsertMode.MODPROBE): + """Initializes data and sets insert mode. + + :param insert_mode: insert mode defines how modules are going to + be inserted in system. + """ + self._modules = None + self._insert_mode = insert_mode + + def insert_modules(self, modules): + """Method inserts list of modules using defined insert mode. + + :param modules: list of modules to be inserted. Each element on + list should represent format which is expected + by KernelModuleInsertMode (e.g. for MODPROBE it + would be module name). + + :returns: None + """ + self._modules = modules + for module in modules: + if ModuleManager.is_module_inserted(module): + continue + + try: + if self._insert_mode == KernelModuleInsertMode.MODPROBE: + tasks.run_task(['sudo', 'modprobe', module], self._logger, + 'Inserting module \'%s\'...' % module, True) + else: + self._logger.error( + "Kernel module insert mode NOT IMPLEMENTED.") + raise + + except subprocess.CalledProcessError: + self._logger.error('Unable to insert module \'%s\'.', module) + raise # fail catastrophically + + def remove_modules(self): + """Removes all modules that have been previously instereted. + """ + for module in self._modules: + # first check if module is loaded + if not ModuleManager.is_module_inserted(module): + continue + + try: + tasks.run_task(['sudo', 'rmmod', module], self._logger, + 'Removing module \'%s\'...' % module, True) + except subprocess.CalledProcessError: + self._logger.error('Unable to remove module \'%s\'.', module) + continue + + @staticmethod + def is_module_inserted(module): + """Check if a module is inserted on system. + """ + with open('/proc/modules') as mod_file: + loaded_mods = mod_file.readlines() + + # first check if module is loaded + for line in loaded_mods: + if line.startswith(module): + return True + return False |