diff options
Diffstat (limited to 'ipaclient/remote_plugins/compat.py')
-rw-r--r-- | ipaclient/remote_plugins/compat.py | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/ipaclient/remote_plugins/compat.py b/ipaclient/remote_plugins/compat.py new file mode 100644 index 000000000..40521af45 --- /dev/null +++ b/ipaclient/remote_plugins/compat.py @@ -0,0 +1,76 @@ +# +# Copyright (C) 2016 FreeIPA Contributors see COPYING for license +# + +from distutils.version import LooseVersion +import importlib +import os +import re +import sys + +import six + +from ipaclient.frontend import ClientCommand, ClientMethod +from ipalib.frontend import Object + +if six.PY3: + unicode = str + + +class CompatCommand(ClientCommand): + @property + def forwarded_name(self): + return self.name + + +class CompatMethod(ClientMethod, CompatCommand): + pass + + +class CompatObject(Object): + pass + + +def get_package(api, client): + if not client.isconnected(): + client.connect(verbose=False) + + env = client.forward(u'env', u'api_version', version=u'2.0') + try: + server_version = env['result']['api_version'] + except KeyError: + ping = client.forward(u'ping', u'api_version', version=u'2.0') + try: + match = re.search(u'API version (2\.[0-9]+)', ping['summary']) + except KeyError: + match = None + if match is not None: + server_version = match.group(1) + else: + server_version = u'2.0' + server_version = LooseVersion(server_version) + + package_names = {} + base_name = __name__.rpartition('.')[0] + base_dir = os.path.dirname(__file__) + for name in os.listdir(base_dir): + package_dir = os.path.join(base_dir, name) + if name.startswith('2_') and os.path.isdir(package_dir): + package_version = name.replace('_', '.') + package_names[package_version] = '{}.{}'.format(base_name, name) + + package_version = None + for version in sorted(package_names, key=LooseVersion): + if (package_version is None or + LooseVersion(package_version) < LooseVersion(version)): + package_version = version + if LooseVersion(version) >= server_version: + break + + package_name = package_names[package_version] + try: + package = sys.modules[package_name] + except KeyError: + package = importlib.import_module(package_name) + + return package |