summaryrefslogtreecommitdiffstats
path: root/minion/module_loader.py
diff options
context:
space:
mode:
Diffstat (limited to 'minion/module_loader.py')
-rwxr-xr-xminion/module_loader.py104
1 files changed, 104 insertions, 0 deletions
diff --git a/minion/module_loader.py b/minion/module_loader.py
new file mode 100755
index 0000000..4d7c816
--- /dev/null
+++ b/minion/module_loader.py
@@ -0,0 +1,104 @@
+#!/usr/bin/python
+
+## func
+##
+## Copyright 2007, Red Hat, Inc
+## See AUTHORS
+##
+## This software may be freely redistributed under the terms of the GNU
+## general public license.
+##
+## You should have received a copy of the GNU General Public License
+## along with this program; if not, write to the Free Software
+## Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+##
+##
+
+
+import distutils.sysconfig
+import os
+import sys
+import glob
+from rhpl.translate import _, N_, textdomain, utf8
+
+
+def module_walker(topdir):
+ module_files = []
+ for root, dirs, files in os.walk(topdir):
+ # we should get here for each subdir
+ for filename in files:
+ # ASSUMPTION: all module files will end with .py, .pyc, .pyo
+ if filename[-3:] == ".py" or filename[-4:] == ".pyc" or filename[-4:] == ".pyo":
+ # we don't really care about __init__ files, though we do requure them
+ if filename[:8] == "__init__":
+ continue
+ # the normpath is important, since we (since we what?! -RN)
+ module_files.append(os.path.normpath("%s/%s" % (root, filename)))
+
+
+ return module_files
+
+def load_modules(blacklist=None):
+
+ module_file_path="%s/func/minion/modules/" % distutils.sysconfig.get_python_lib()
+ mod_path="%s/func/minion/" % distutils.sysconfig.get_python_lib()
+
+ sys.path.insert(0, mod_path)
+ mods = {}
+
+ filenames = module_walker(module_file_path)
+
+ # FIXME: this is probably more complicated than it needs to be -akl
+ for fn in filenames:
+ # aka, everything after the module_file_path
+ module_name_part = fn[len(module_file_path):]
+ dirname, basename = os.path.split(module_name_part)
+
+ if basename == "__init__.py":
+ continue
+ if basename[-3:] == ".py":
+ modname = basename[:-3]
+ elif basename[-4:] in [".pyc", ".pyo"]:
+ modname = basename[:-4]
+
+ pathname = modname
+ if dirname != "":
+ pathname = "%s/%s" % (dirname, modname)
+
+ mod_imp_name = pathname.replace("/", ".")
+
+ if mods.has_key(mod_imp_name):
+ # If we've already imported mod_imp_name, don't import it again
+ continue
+
+ try:
+ blip = __import__("modules.%s" % ( mod_imp_name), globals(), locals(), [mod_imp_name])
+ if not hasattr(blip, "register_rpc"):
+ errmsg = _("%(module_path)s%(modname)s module not a proper module")
+ print errmsg % {'module_path': module_file_path, 'modname':mod_imp_name}
+ continue
+ mods[mod_imp_name] = blip
+ except ImportError, e:
+ # A module that raises an ImportError is (for now) simply not loaded.
+ errmsg = _("Could not load %s module: %s")
+ print errmsg % (mod_imp_name, e)
+
+ continue
+
+ return mods
+
+
+if __name__ == "__main__":
+
+ module_file_path = "/usr/lib/python2.5/site-packages/func/minion/modules/"
+ bar = module_walker(module_file_path)
+ print bar
+ for f in bar:
+ print f
+ print os.path.basename(f)
+ print os.path.split(f)
+ g = f[len(module_file_path):]
+ print g
+ print os.path.split(g)
+
+ print load_modules()