summaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
Diffstat (limited to 'tools')
-rw-r--r--tools/module_manager.py81
1 files changed, 71 insertions, 10 deletions
diff --git a/tools/module_manager.py b/tools/module_manager.py
index 39ad5cf4..565bac51 100644
--- a/tools/module_manager.py
+++ b/tools/module_manager.py
@@ -1,4 +1,4 @@
-# Copyright 2015 Intel Corporation.
+# Copyright 2015-2016 Intel Corporation.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
@@ -14,11 +14,13 @@
"""Simple kernel module manager implementation.
"""
-
+import os
import subprocess
import logging
+
from tools import tasks
+_LOGGER = logging.getLogger(__name__)
class ModuleManager(object):
"""Simple module manager which acts as system wrapper for Kernel Modules.
"""
@@ -28,7 +30,7 @@ class ModuleManager(object):
def __init__(self):
"""Initializes data
"""
- self._modules = None
+ self._modules = []
def insert_modules(self, modules):
"""Method inserts list of modules. In case that module name ends
@@ -37,9 +39,9 @@ class ModuleManager(object):
:returns: None
"""
- self._modules = modules
+
for module in modules:
- if ModuleManager.is_module_inserted(module):
+ if self.is_module_inserted(module):
continue
try:
@@ -49,17 +51,39 @@ class ModuleManager(object):
else:
tasks.run_task(['sudo', 'modprobe', module], self._logger,
'Modprobe module \'%s\'...' % module, True)
-
+ _LOGGER.info("Inserted Module %s", module)
+ self._modules.append(module)
except subprocess.CalledProcessError:
self._logger.error('Unable to insert module \'%s\'.', module)
raise # fail catastrophically
+ def insert_module_group(self, module_group, group_path_prefix):
+ """Ensure all modules in a group are inserted into the system.
+
+ :param module_group: A name of configuration item containing a list
+ of module names
+ """
+ for module in module_group:
+ # first check if module is loaded
+ if self.is_module_inserted(module[1]):
+ continue
+
+ try:
+ mod_path = os.path.join(group_path_prefix, module[0],
+ '%s.ko' % module[1])
+ tasks.run_task(['sudo', 'insmod', mod_path], _LOGGER,
+ 'Inserting module \'%s\'...' % module[1], True)
+ self._modules.append(module)
+ except subprocess.CalledProcessError:
+ _LOGGER.error('Unable to insert module \'%s\'.', module[1])
+ raise # fail catastrophically
+
def remove_modules(self):
- """Removes all modules that have been previously instereted.
+ """Removes all modules that have been previously inserted.
"""
for module in self._modules:
# first check if module is loaded
- if not ModuleManager.is_module_inserted(module):
+ if not self.is_module_inserted(module):
continue
try:
@@ -67,16 +91,19 @@ class ModuleManager(object):
# with .ko suffix
tasks.run_task(['sudo', 'rmmod', module], self._logger,
'Removing module \'%s\'...' % module, True)
+ self._modules.remove(module)
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.
"""
+ if module.endswith('.ko'):
# get module base name, i.e strip path and .ko suffix if possible
- module_base_name = module.split('.')[0].split('/').pop()
+ module_base_name = os.path.basename(os.path.splitext(module)[0])
+ else:
+ module_base_name = module
# get list of modules from kernel
with open('/proc/modules') as mod_file:
@@ -87,3 +114,37 @@ class ModuleManager(object):
if line.startswith(module_base_name):
return True
return False
+
+ def remove_module(self, module):
+ """Removes a single module.
+ """
+ if self.is_module_inserted(module):
+ # get module base name, i.e strip path and .ko suffix if possible
+ module_base_name = os.path.basename(os.path.splitext(module)[0])
+
+ try:
+ # rmmod supports both simple module name and full module path
+ # with .ko suffix
+ tasks.run_task(['sudo', 'rmmod', module_base_name], self._logger,
+ 'Removing module \'%s\'...' % module, True)
+ self._modules.remove(module)
+ except subprocess.CalledProcessError:
+ self._logger.error('Unable to remove module \'%s\'.', module_base_name)
+
+ def remove_module_group(self, module_group):
+ """Removes all modules in the modules group.
+ """
+ for module in module_group:
+ if not self.is_module_inserted(module[1]):
+ continue
+ # get module base name, i.e strip path and .ko suffix if possible
+ module_base_name = os.path.basename(os.path.splitext(module)[0])
+
+ try:
+ # rmmod supports both simple module name and full module path
+ # with .ko suffix
+ tasks.run_task(['sudo', 'rmmod', module_base_name], self._logger,
+ 'Removing module \'%s\'...' % module, True)
+ self._modules.remove(module)
+ except subprocess.CalledProcessError:
+ self._logger.error('Unable to remove module \'%s\'.', module_base_name)