]> git.ipfire.org Git - thirdparty/kmod.git/blob - libkmod/python/kmod/kmod.pyx
configure: Check that provided paths are absolute
[thirdparty/kmod.git] / libkmod / python / kmod / kmod.pyx
1 # Copyright (C) 2012 Red Hat, Inc.
2 # W. Trevor King <wking@tremily.us>
3 #
4 # This file is part of python-kmod.
5 #
6 # python-kmod is free software: you can redistribute it and/or modify it under
7 # the terms of the GNU Lesser General Public License version 2.1 as published
8 # by the Free Software Foundation.
9 #
10 # python-kmod is distributed in the hope that it will be useful, but WITHOUT
11 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12 # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
13 # details.
14 #
15 # You should have received a copy of the GNU Lesser General Public License
16 # along with python-kmod. If not, see <http://www.gnu.org/licenses/>.
17
18 "Define the Kmod class"
19
20 cimport cython as _cython
21 cimport _libkmod_h
22 from error import KmodError as _KmodError
23 cimport module as _module
24 import module as _module
25 cimport list as _list
26 import list as _list
27
28
29 cdef class Kmod (object):
30 "Wrap a struct kmod_ctx* item"
31 def __cinit__(self):
32 self._kmod_ctx = NULL
33 self.mod_dir = None
34
35 def __dealloc__(self):
36 self._cleanup()
37
38 def __init__(self, mod_dir=None):
39 self.set_mod_dir(mod_dir=mod_dir)
40
41 def set_mod_dir(self, mod_dir=None):
42 self.mod_dir = mod_dir
43 self._setup()
44
45 def _setup(self):
46 cdef char *mod_dir = NULL
47 self._cleanup()
48 if self.mod_dir:
49 mod_dir = self.mod_dir
50 self._kmod_ctx = _libkmod_h.kmod_new(mod_dir, NULL);
51 if self._kmod_ctx is NULL:
52 raise _KmodError('Could not initialize')
53 _libkmod_h.kmod_load_resources(self._kmod_ctx)
54
55 def _cleanup(self):
56 if self._kmod_ctx is not NULL:
57 _libkmod_h.kmod_unload_resources(self._kmod_ctx);
58 self._kmod_ctx = NULL
59
60 def loaded(self):
61 "iterate through currently loaded modules"
62 cdef _list.ModList ml = _list.ModList()
63 cdef _list.ModListItem mli
64 err = _libkmod_h.kmod_module_new_from_loaded(self._kmod_ctx, &ml.list)
65 if err < 0:
66 raise _KmodError('Could not get loaded modules')
67 for item in ml:
68 mli = <_list.ModListItem> item
69 mod = _module.Module()
70 mod.from_mod_list_item(item)
71 yield mod
72
73 def lookup(self, alias_name, flags=_libkmod_h.KMOD_PROBE_APPLY_BLACKLIST):
74 "iterate through modules matching `alias_name`"
75 cdef _list.ModList ml = _list.ModList()
76 cdef _list.ModListItem mli
77 if hasattr(alias_name, 'encode'):
78 alias_name = alias_name.encode('ascii')
79 err = _libkmod_h.kmod_module_new_from_lookup(
80 self._kmod_ctx, alias_name, &ml.list)
81 if err < 0:
82 raise _KmodError('Could not modprobe')
83 for item in ml:
84 mli = <_list.ModListItem> item
85 mod = _module.Module()
86 mod.from_mod_list_item(item)
87 yield mod
88
89 @_cython.always_allow_keywords(True)
90 def module_from_name(self, name):
91 cdef _module.Module mod = _module.Module()
92 if hasattr(name, 'encode'):
93 name = name.encode('ascii')
94 err = _libkmod_h.kmod_module_new_from_name(
95 self._kmod_ctx, name, &mod.module)
96 if err < 0:
97 raise _KmodError('Could not get module')
98 return mod
99
100 def list(self):
101 "iterate through currently loaded modules and sizes"
102 for mod in self.loaded():
103 yield (mod.name, mod.size)
104
105 def modprobe(self, name, quiet=False, *args, **kwargs):
106 """
107 Load a module (or alias) and all modules on which it depends.
108 The 'quiet' option defaults to False; set to True to mimic the behavior
109 of the '--quiet' commandline option.
110 """
111 mods = list(self.lookup(alias_name=name))
112
113 if not mods and not quiet:
114 raise _KmodError('Could not modprobe %s' % name)
115
116 for mod in mods:
117 mod.insert(*args, **kwargs)
118
119 def rmmod(self, module_name, *args, **kwargs):
120 """
121 remove module from current tree
122 e.g. km.rmmod("thinkpad_acpi")
123 """
124 mod = self.module_from_name(name=module_name)
125 mod.remove(*args, **kwargs)