diff options
Diffstat (limited to 'scripts/lib/wic')
-rw-r--r-- | scripts/lib/wic/engine.py | 6 | ||||
-rw-r--r-- | scripts/lib/wic/help.py | 4 | ||||
-rw-r--r-- | scripts/lib/wic/partition.py | 6 | ||||
-rw-r--r-- | scripts/lib/wic/plugin.py | 83 | ||||
-rw-r--r-- | scripts/lib/wic/plugins/imager/direct.py | 4 |
5 files changed, 47 insertions, 56 deletions
diff --git a/scripts/lib/wic/engine.py b/scripts/lib/wic/engine.py index c29924b781..98e7b9526e 100644 --- a/scripts/lib/wic/engine.py +++ b/scripts/lib/wic/engine.py | |||
@@ -32,7 +32,7 @@ import logging | |||
32 | import os | 32 | import os |
33 | 33 | ||
34 | from wic import WicError | 34 | from wic import WicError |
35 | from wic.plugin import pluginmgr | 35 | from wic.plugin import PluginMgr |
36 | from wic.utils.misc import get_bitbake_var | 36 | from wic.utils.misc import get_bitbake_var |
37 | 37 | ||
38 | logger = logging.getLogger('wic') | 38 | logger = logging.getLogger('wic') |
@@ -139,7 +139,7 @@ def list_source_plugins(): | |||
139 | """ | 139 | """ |
140 | List the available source plugins i.e. plugins available for --source. | 140 | List the available source plugins i.e. plugins available for --source. |
141 | """ | 141 | """ |
142 | plugins = pluginmgr.get_source_plugins() | 142 | plugins = PluginMgr.get_source_plugins() |
143 | 143 | ||
144 | for plugin in plugins: | 144 | for plugin in plugins: |
145 | print(" %s" % plugin) | 145 | print(" %s" % plugin) |
@@ -185,7 +185,7 @@ def wic_create(wks_file, rootfs_dir, bootimg_dir, kernel_dir, | |||
185 | os.makedirs(options.outdir) | 185 | os.makedirs(options.outdir) |
186 | 186 | ||
187 | pname = 'direct' | 187 | pname = 'direct' |
188 | plugin_class = pluginmgr.get_plugins('imager').get(pname) | 188 | plugin_class = PluginMgr.get_plugins('imager').get(pname) |
189 | if not plugin_class: | 189 | if not plugin_class: |
190 | raise WicError('Unknown plugin: %s' % pname) | 190 | raise WicError('Unknown plugin: %s' % pname) |
191 | 191 | ||
diff --git a/scripts/lib/wic/help.py b/scripts/lib/wic/help.py index 47e3d1666b..4aba12de75 100644 --- a/scripts/lib/wic/help.py +++ b/scripts/lib/wic/help.py | |||
@@ -28,7 +28,7 @@ | |||
28 | import subprocess | 28 | import subprocess |
29 | import logging | 29 | import logging |
30 | 30 | ||
31 | from wic.plugin import pluginmgr, PLUGIN_TYPES | 31 | from wic.plugin import PluginMgr, PLUGIN_TYPES |
32 | 32 | ||
33 | logger = logging.getLogger('wic') | 33 | logger = logging.getLogger('wic') |
34 | 34 | ||
@@ -68,7 +68,7 @@ def get_wic_plugins_help(): | |||
68 | result = wic_plugins_help | 68 | result = wic_plugins_help |
69 | for plugin_type in PLUGIN_TYPES: | 69 | for plugin_type in PLUGIN_TYPES: |
70 | result += '\n\n%s PLUGINS\n\n' % plugin_type.upper() | 70 | result += '\n\n%s PLUGINS\n\n' % plugin_type.upper() |
71 | for name, plugin in pluginmgr.get_plugins(plugin_type).items(): | 71 | for name, plugin in PluginMgr.get_plugins(plugin_type).items(): |
72 | result += "\n %s plugin:\n" % name | 72 | result += "\n %s plugin:\n" % name |
73 | if plugin.__doc__: | 73 | if plugin.__doc__: |
74 | result += plugin.__doc__ | 74 | result += plugin.__doc__ |
diff --git a/scripts/lib/wic/partition.py b/scripts/lib/wic/partition.py index 8e531e4dcc..f8d4274bcd 100644 --- a/scripts/lib/wic/partition.py +++ b/scripts/lib/wic/partition.py | |||
@@ -30,7 +30,7 @@ import tempfile | |||
30 | 30 | ||
31 | from wic import WicError | 31 | from wic import WicError |
32 | from wic.utils.misc import exec_cmd, exec_native_cmd, get_bitbake_var | 32 | from wic.utils.misc import exec_cmd, exec_native_cmd, get_bitbake_var |
33 | from wic.plugin import pluginmgr | 33 | from wic.plugin import PluginMgr |
34 | 34 | ||
35 | logger = logging.getLogger('wic') | 35 | logger = logging.getLogger('wic') |
36 | 36 | ||
@@ -154,7 +154,7 @@ class Partition(): | |||
154 | break | 154 | break |
155 | return | 155 | return |
156 | 156 | ||
157 | plugins = pluginmgr.get_source_plugins() | 157 | plugins = PluginMgr.get_source_plugins() |
158 | 158 | ||
159 | if self.source not in plugins: | 159 | if self.source not in plugins: |
160 | raise WicError("The '%s' --source specified for %s doesn't exist.\n\t" | 160 | raise WicError("The '%s' --source specified for %s doesn't exist.\n\t" |
@@ -176,7 +176,7 @@ class Partition(): | |||
176 | "do_configure_partition": None | 176 | "do_configure_partition": None |
177 | } | 177 | } |
178 | 178 | ||
179 | methods = pluginmgr.get_source_plugin_methods(self.source, | 179 | methods = PluginMgr.get_source_plugin_methods(self.source, |
180 | partition_methods) | 180 | partition_methods) |
181 | methods["do_configure_partition"](self, srcparams_dict, creator, | 181 | methods["do_configure_partition"](self, srcparams_dict, creator, |
182 | cr_workdir, oe_builddir, bootimg_dir, | 182 | cr_workdir, oe_builddir, bootimg_dir, |
diff --git a/scripts/lib/wic/plugin.py b/scripts/lib/wic/plugin.py index ac55ecf545..7632c3acd3 100644 --- a/scripts/lib/wic/plugin.py +++ b/scripts/lib/wic/plugin.py | |||
@@ -22,8 +22,6 @@ import logging | |||
22 | from wic import pluginbase, WicError | 22 | from wic import pluginbase, WicError |
23 | from wic.utils.misc import get_bitbake_var | 23 | from wic.utils.misc import get_bitbake_var |
24 | 24 | ||
25 | __ALL__ = ['PluginMgr', 'pluginmgr'] | ||
26 | |||
27 | PLUGIN_TYPES = ["imager", "source"] | 25 | PLUGIN_TYPES = ["imager", "source"] |
28 | 26 | ||
29 | PLUGIN_DIR = "/lib/wic/plugins" # relative to scripts | 27 | PLUGIN_DIR = "/lib/wic/plugins" # relative to scripts |
@@ -31,32 +29,22 @@ SCRIPTS_PLUGIN_DIR = "scripts" + PLUGIN_DIR | |||
31 | 29 | ||
32 | logger = logging.getLogger('wic') | 30 | logger = logging.getLogger('wic') |
33 | 31 | ||
34 | class PluginMgr(): | 32 | class PluginMgr: |
35 | plugin_dirs = {} | 33 | plugin_dirs = {} |
36 | 34 | wic_path = os.path.dirname(__file__) | |
37 | # make the manager class as singleton | 35 | eos = wic_path.rfind('scripts') + len('scripts') |
38 | _instance = None | 36 | scripts_path = wic_path[:eos] |
39 | def __new__(cls, *args, **kwargs): | 37 | plugin_dir = scripts_path + PLUGIN_DIR |
40 | if not cls._instance: | 38 | layers_path = None |
41 | cls._instance = super(PluginMgr, cls).__new__(cls, *args, **kwargs) | 39 | |
42 | 40 | @classmethod | |
43 | return cls._instance | 41 | def _build_plugin_dir_list(cls, plugin_dir, ptype): |
44 | 42 | if cls.layers_path is None: | |
45 | def __init__(self): | 43 | cls.layers_path = get_bitbake_var("BBLAYERS") |
46 | wic_path = os.path.dirname(__file__) | ||
47 | eos = wic_path.rfind('scripts') + len('scripts') | ||
48 | scripts_path = wic_path[:eos] | ||
49 | self.scripts_path = scripts_path | ||
50 | self.plugin_dir = scripts_path + PLUGIN_DIR | ||
51 | self.layers_path = None | ||
52 | |||
53 | def _build_plugin_dir_list(self, plugin_dir, ptype): | ||
54 | if self.layers_path is None: | ||
55 | self.layers_path = get_bitbake_var("BBLAYERS") | ||
56 | layer_dirs = [] | 44 | layer_dirs = [] |
57 | 45 | ||
58 | if self.layers_path is not None: | 46 | if cls.layers_path is not None: |
59 | for layer_path in self.layers_path.split(): | 47 | for layer_path in cls.layers_path.split(): |
60 | path = os.path.join(layer_path, SCRIPTS_PLUGIN_DIR, ptype) | 48 | path = os.path.join(layer_path, SCRIPTS_PLUGIN_DIR, ptype) |
61 | layer_dirs.append(path) | 49 | layer_dirs.append(path) |
62 | 50 | ||
@@ -65,25 +53,28 @@ class PluginMgr(): | |||
65 | 53 | ||
66 | return layer_dirs | 54 | return layer_dirs |
67 | 55 | ||
68 | def append_dirs(self, dirs): | 56 | @classmethod |
57 | def append_dirs(cls, dirs): | ||
69 | for path in dirs: | 58 | for path in dirs: |
70 | self._add_plugindir(path) | 59 | cls._add_plugindir(path) |
71 | 60 | ||
72 | # load all the plugins AGAIN | 61 | # load all the plugins AGAIN |
73 | self._load_all() | 62 | cls._load_all() |
74 | 63 | ||
75 | def _add_plugindir(self, path): | 64 | @classmethod |
65 | def _add_plugindir(cls, path): | ||
76 | path = os.path.abspath(os.path.expanduser(path)) | 66 | path = os.path.abspath(os.path.expanduser(path)) |
77 | 67 | ||
78 | if not os.path.isdir(path): | 68 | if not os.path.isdir(path): |
79 | return | 69 | return |
80 | 70 | ||
81 | if path not in self.plugin_dirs: | 71 | if path not in cls.plugin_dirs: |
82 | self.plugin_dirs[path] = False | 72 | cls.plugin_dirs[path] = False |
83 | # the value True/False means "loaded" | 73 | # the value True/False means "loaded" |
84 | 74 | ||
85 | def _load_all(self): | 75 | @classmethod |
86 | for (pdir, loaded) in self.plugin_dirs.items(): | 76 | def _load_all(cls): |
77 | for (pdir, loaded) in cls.plugin_dirs.items(): | ||
87 | if loaded: | 78 | if loaded: |
88 | continue | 79 | continue |
89 | 80 | ||
@@ -91,12 +82,11 @@ class PluginMgr(): | |||
91 | for mod in [x[:-3] for x in os.listdir(pdir) if x.endswith(".py")]: | 82 | for mod in [x[:-3] for x in os.listdir(pdir) if x.endswith(".py")]: |
92 | if mod and mod != '__init__': | 83 | if mod and mod != '__init__': |
93 | if mod in sys.modules: | 84 | if mod in sys.modules: |
94 | #self.plugin_dirs[pdir] = True | ||
95 | logger.warning("Module %s already exists, skip", mod) | 85 | logger.warning("Module %s already exists, skip", mod) |
96 | else: | 86 | else: |
97 | try: | 87 | try: |
98 | pymod = __import__(mod) | 88 | pymod = __import__(mod) |
99 | self.plugin_dirs[pdir] = True | 89 | cls.plugin_dirs[pdir] = True |
100 | logger.debug("Plugin module %s:%s imported", | 90 | logger.debug("Plugin module %s:%s imported", |
101 | mod, pymod.__file__) | 91 | mod, pymod.__file__) |
102 | except ImportError as err: | 92 | except ImportError as err: |
@@ -105,30 +95,33 @@ class PluginMgr(): | |||
105 | 95 | ||
106 | del sys.path[0] | 96 | del sys.path[0] |
107 | 97 | ||
108 | def get_plugins(self, ptype): | 98 | @classmethod |
99 | def get_plugins(cls, ptype): | ||
109 | """ the return value is dict of name:class pairs """ | 100 | """ the return value is dict of name:class pairs """ |
110 | 101 | ||
111 | if ptype not in PLUGIN_TYPES: | 102 | if ptype not in PLUGIN_TYPES: |
112 | raise WicError('%s is not valid plugin type' % ptype) | 103 | raise WicError('%s is not valid plugin type' % ptype) |
113 | 104 | ||
114 | plugins_dir = self._build_plugin_dir_list(self.plugin_dir, ptype) | 105 | plugins_dir = cls._build_plugin_dir_list(cls.plugin_dir, ptype) |
115 | 106 | ||
116 | self.append_dirs(plugins_dir) | 107 | cls.append_dirs(plugins_dir) |
117 | 108 | ||
118 | return pluginbase.get_plugins(ptype) | 109 | return pluginbase.get_plugins(ptype) |
119 | 110 | ||
120 | def get_source_plugins(self): | 111 | @classmethod |
112 | def get_source_plugins(cls): | ||
121 | """ | 113 | """ |
122 | Return list of available source plugins. | 114 | Return list of available source plugins. |
123 | """ | 115 | """ |
124 | plugins_dir = self._build_plugin_dir_list(self.plugin_dir, 'source') | 116 | plugins_dir = cls._build_plugin_dir_list(cls.plugin_dir, 'source') |
125 | 117 | ||
126 | self.append_dirs(plugins_dir) | 118 | cls.append_dirs(plugins_dir) |
127 | 119 | ||
128 | return self.get_plugins('source') | 120 | return cls.get_plugins('source') |
129 | 121 | ||
130 | 122 | ||
131 | def get_source_plugin_methods(self, source_name, methods): | 123 | @classmethod |
124 | def get_source_plugin_methods(cls, source_name, methods): | ||
132 | """ | 125 | """ |
133 | The methods param is a dict with the method names to find. On | 126 | The methods param is a dict with the method names to find. On |
134 | return, the dict values will be filled in with pointers to the | 127 | return, the dict values will be filled in with pointers to the |
@@ -136,7 +129,7 @@ class PluginMgr(): | |||
136 | None is returned. | 129 | None is returned. |
137 | """ | 130 | """ |
138 | return_methods = None | 131 | return_methods = None |
139 | for _source_name, klass in self.get_plugins('source').items(): | 132 | for _source_name, klass in cls.get_plugins('source').items(): |
140 | if _source_name == source_name: | 133 | if _source_name == source_name: |
141 | for _method_name in methods: | 134 | for _method_name in methods: |
142 | if not hasattr(klass, _method_name): | 135 | if not hasattr(klass, _method_name): |
@@ -147,5 +140,3 @@ class PluginMgr(): | |||
147 | methods[_method_name] = func | 140 | methods[_method_name] = func |
148 | return_methods = methods | 141 | return_methods = methods |
149 | return return_methods | 142 | return return_methods |
150 | |||
151 | pluginmgr = PluginMgr() | ||
diff --git a/scripts/lib/wic/plugins/imager/direct.py b/scripts/lib/wic/plugins/imager/direct.py index 6d1ed8c205..b93273e877 100644 --- a/scripts/lib/wic/plugins/imager/direct.py +++ b/scripts/lib/wic/plugins/imager/direct.py | |||
@@ -35,7 +35,7 @@ from time import strftime | |||
35 | from wic import WicError | 35 | from wic import WicError |
36 | from wic.filemap import sparse_copy | 36 | from wic.filemap import sparse_copy |
37 | from wic.ksparser import KickStart, KickStartError | 37 | from wic.ksparser import KickStart, KickStartError |
38 | from wic.plugin import pluginmgr | 38 | from wic.plugin import PluginMgr |
39 | from wic.pluginbase import ImagerPlugin | 39 | from wic.pluginbase import ImagerPlugin |
40 | from wic.utils.misc import get_bitbake_var, exec_cmd, exec_native_cmd | 40 | from wic.utils.misc import get_bitbake_var, exec_cmd, exec_native_cmd |
41 | 41 | ||
@@ -198,7 +198,7 @@ class DirectPlugin(ImagerPlugin): | |||
198 | disk_name = self.parts[0].disk | 198 | disk_name = self.parts[0].disk |
199 | if source_plugin: | 199 | if source_plugin: |
200 | name = "do_install_disk" | 200 | name = "do_install_disk" |
201 | methods = pluginmgr.get_source_plugin_methods(source_plugin, | 201 | methods = PluginMgr.get_source_plugin_methods(source_plugin, |
202 | {name: None}) | 202 | {name: None}) |
203 | methods["do_install_disk"](self._image, disk_name, self, self.workdir, | 203 | methods["do_install_disk"](self._image, disk_name, self, self.workdir, |
204 | self.oe_builddir, self.bootimg_dir, | 204 | self.oe_builddir, self.bootimg_dir, |