1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 import os
18 import sys
19
20 from spacewalk.common.rhnLog import log_debug, log_error
21
22
24
25 _imports = {}
26
27 - def load(self, dir, interface_signature='rpcClasses'):
28
29 root_dir = "/usr/share/rhn"
30 key = (dir, root_dir, interface_signature)
31
32 if key in self._imports:
33 return self._imports[key]
34
35 dirname = "%s/%s" % (root_dir, dir)
36
37
38 if root_dir is not None and root_dir not in sys.path:
39 sys.path.append(root_dir)
40
41 fromcomps = dir.split('/')
42 _imports = {}
43
44
45
46 modules = []
47
48 for module in os.listdir(dirname):
49 log_debug(5, "Attempting to load module %s from %s %s" % (
50 module, '.'.join(fromcomps), dirname))
51 if module[0] in ('_', '.'):
52
53 log_debug(6, "Ignoring module %s" % module)
54 continue
55
56
57
58 module = module.split('.', 1)[0]
59 if module in modules:
60 log_debug(6, "Already tried to load Module %s" % (module, ))
61 continue
62
63
64 modules.append(module)
65
66
67 fromclause = '.'.join(fromcomps + [module])
68
69
70 try:
71 m = __import__(fromclause, {}, {}, [module])
72 except ImportError:
73 e = sys.exc_info()[1]
74 log_error("Error importing %s: %s" % (module, e))
75 log_debug(6, "Details: sys.path: %s" % (sys.path, ))
76 continue
77
78 if not hasattr(m, interface_signature):
79
80 log_error("Module %s doesn't support our API" % (module, ))
81 continue
82 log_debug(5, "Module %s loaded" % (module, ))
83
84 _imports[module] = getattr(m, interface_signature)
85
86 self._imports[key] = _imports
87 return _imports
88
89
90 -def load(dir, root_dir=None, interface_signature='rpcClasses'):
91 """
92 Load modules (handlers) beneath the handlers/ tree.
93
94 root_dir: which directory to use as a top-level directory
95 """
96
97 l = Loader()
98 return l.load(dir, interface_signature=interface_signature)
99