From 1c43f7c48212980f973b9bd71c968e020e0b28df Mon Sep 17 00:00:00 2001 From: Pilou Date: Mon, 26 Feb 2018 11:07:51 +0100 Subject: [PATCH] FreeIPA inventory (ipalib 4.6.2): avoid exception (#34356) Workaround for https://pagure.io/freeipa/issue/7345. mentions: - IPA_CONFDIR environment variable when directory doesn't exist - domain, xmlrpc_uri or jsonrpc_uri parameters when one is missing Exception was: $ IPA_CONFDIR=/path/to/empty/dir ./ansible/contrib/inventory/freeipa.py --list Traceback (most recent call last): File "./ansible/contrib/inventory/freeipa.py", line 95, in api = initialize() File "./ansible/contrib/inventory/freeipa.py", line 18, in initialize api.finalize() File "local/lib/python2.7/site-packages/ipalib/plugable.py", line 738, in finalize self.__do_if_not_done('load_plugins') File "local/lib/python2.7/site-packages/ipalib/plugable.py", line 425, in __do_if_not_done getattr(self, name)() File "local/lib/python2.7/site-packages/ipalib/plugable.py", line 618, in load_plugins for package in self.packages: File "local/lib/python2.7/site-packages/ipalib/__init__.py", line 949, in packages ipaclient.remote_plugins.get_package(self), File "local/lib/python2.7/site-packages/ipaclient/remote_plugins/__init__.py", line 120, in get_package server_info = ServerInfo(api) File "local/lib/python2.7/site-packages/ipaclient/remote_plugins/__init__.py", line 26, in __init__ hostname = DNSName(api.env.server).ToASCII() AttributeError: 'Env' object has no attribute 'server' --- contrib/inventory/freeipa.py | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/contrib/inventory/freeipa.py b/contrib/inventory/freeipa.py index 7efc05e3d83..8dac3382a01 100755 --- a/contrib/inventory/freeipa.py +++ b/contrib/inventory/freeipa.py @@ -3,8 +3,11 @@ # GNU General Public License v3.0+ (see COPYING or https://www.gnu.org/licenses/gpl-3.0.txt) import argparse +from distutils.version import LooseVersion import json -from ipalib import api, errors +import os +import sys +from ipalib import api, errors, __version__ as IPA_VERSION from six import u @@ -12,10 +15,29 @@ def initialize(): ''' This function initializes the FreeIPA/IPA API. This function requires no arguments. A kerberos key must be present in the users keyring in - order for this to work. + order for this to work. IPA default configuration directory is /etc/ipa, + this path could be overridden with IPA_CONFDIR environment variable. ''' api.bootstrap(context='cli') + + if not os.path.isdir(api.env.confdir): + print("WARNING: IPA configuration directory (%s) is missing. " + "Environment variable IPA_CONFDIR could be used to override " + "default path." % api.env.confdir) + + if LooseVersion(IPA_VERSION) >= LooseVersion('4.6.2'): + # With ipalib < 4.6.0 'server' and 'domain' have default values + # ('localhost:8888', 'example.com'), newer versions don't and + # DNS autodiscovery is broken, then one of jsonrpc_uri / xmlrpc_uri is + # required. + # ipalib 4.6.0 is unusable (https://pagure.io/freeipa/issue/7132) + # that's why 4.6.2 is explicitely tested. + if 'server' not in api.env or 'domain' not in api.env: + sys.exit("ERROR: ('jsonrpc_uri' or 'xmlrpc_uri') or 'domain' are not " + "defined in '[global]' section of '%s' nor in '%s'." % + (api.env.conf, api.env.conf_default)) + api.finalize() try: api.Backend.rpcclient.connect()