+ self._modules = []
+
+ def insert_module(self, module, auto_remove=True):
+ """Method inserts given module.
+
+ In case that module name ends with .ko suffix then insmod will
+ be used for its insertion. Otherwise modprobe will be called.
+
+ :param module: a name of kernel module
+ :param auto_remove: if True (by default), then module will be
+ automatically removed by remove_modules() method
+ """
+ module_base_name = os.path.basename(os.path.splitext(module)[0])
+
+ if self.is_module_inserted(module):
+ self._logger.info('Module already loaded \'%s\'.', module_base_name)
+ # add it to internal list, so we can try to remove it at the end
+ if auto_remove:
+ self._modules.append(module)
+ return
+
+ try:
+ if module.endswith('.ko'):
+ # load module dependecies first, but suppress automatic
+ # module removal at the end; Just for case, that module
+ # depends on generic module
+ for depmod in self.get_module_dependecies(module):
+ self.insert_module(depmod, auto_remove=False)
+
+ tasks.run_task(['sudo', 'insmod', module], self._logger,
+ 'Insmod module \'%s\'...' % module_base_name, True)
+ else:
+ tasks.run_task(['sudo', 'modprobe', module], self._logger,
+ 'Modprobe module \'%s\'...' % module_base_name, True)
+ if auto_remove:
+ self._modules.append(module)
+ except subprocess.CalledProcessError:
+ # in case of error, show full module name
+ self._logger.error('Unable to insert module \'%s\'.', module)
+ raise # fail catastrophically