Blame roles/ipaclient/library/ipaclient_get_facts.py

Packit 8cb997
#!/usr/bin/python
Packit 8cb997
# -*- coding: utf-8 -*-
Packit 8cb997
Packit 8cb997
import os
Packit 8cb997
import re
Packit 8cb997
import six
Packit 8cb997
try:
Packit 8cb997
    from six.moves.configparser import RawConfigParser
Packit 8cb997
except ImportError:
Packit 8cb997
    from ConfigParser import RawConfigParser
Packit 8cb997
Packit 8cb997
from ansible.module_utils.basic import AnsibleModule
Packit 8cb997
Packit 8cb997
# pylint: disable=unused-import
Packit 8cb997
try:
Packit Service 0f71a7
    from ipalib import api  # noqa: F401
Packit 8cb997
except ImportError:
Packit 8cb997
    HAS_IPALIB = False
Packit 8cb997
else:
Packit 8cb997
    HAS_IPALIB = True
Packit 8cb997
    from ipaplatform.paths import paths
Packit 8cb997
    try:
Packit 8cb997
        # FreeIPA >= 4.5
Packit 8cb997
        from ipalib.install import sysrestore
Packit 8cb997
    except ImportError:
Packit 8cb997
        # FreeIPA 4.4 and older
Packit 8cb997
        from ipapython import sysrestore
Packit 8cb997
Packit 8cb997
try:
Packit Service 0f71a7
    import ipaserver  # noqa: F401
Packit 8cb997
except ImportError:
Packit 8cb997
    HAS_IPASERVER = False
Packit 8cb997
else:
Packit 8cb997
    HAS_IPASERVER = True
Packit 8cb997
Packit 8cb997
SERVER_SYSRESTORE_STATE = "/var/lib/ipa/sysrestore/sysrestore.state"
Packit 8cb997
NAMED_CONF = "/etc/named.conf"
Packit 8cb997
VAR_LIB_PKI_TOMCAT = "/var/lib/pki/pki-tomcat"
Packit 8cb997
Packit 8cb997
Packit 8cb997
def is_ntpd_configured():
Packit 8cb997
    # ntpd is configured when sysrestore.state contains the line
Packit 8cb997
    # [ntpd]
Packit Service 0f71a7
    ntpd_conf_section = re.compile(r'^\s*\[ntpd\]\s*$')
Packit 8cb997
Packit 8cb997
    try:
Packit 8cb997
        with open(SERVER_SYSRESTORE_STATE) as f:
Packit 8cb997
            for line in f.readlines():
Packit 8cb997
                if ntpd_conf_section.match(line):
Packit 8cb997
                    return True
Packit 8cb997
        return False
Packit 8cb997
    except IOError:
Packit 8cb997
        return False
Packit 8cb997
Packit 8cb997
Packit 8cb997
def is_dns_configured():
Packit 8cb997
    # dns is configured when /etc/named.conf contains the line
Packit 8cb997
    # dyndb "ipa" "/usr/lib64/bind/ldap.so" {
Packit Service 0f71a7
    bind_conf_section = re.compile(r'^\s*dyndb\s+"ipa"\s+"[^"]+"\s+{$')
Packit 8cb997
Packit 8cb997
    try:
Packit 8cb997
        with open(NAMED_CONF) as f:
Packit 8cb997
            for line in f.readlines():
Packit 8cb997
                if bind_conf_section.match(line):
Packit 8cb997
                    return True
Packit 8cb997
        return False
Packit 8cb997
    except IOError:
Packit 8cb997
        return False
Packit 8cb997
Packit 8cb997
Packit 8cb997
def is_dogtag_configured(subsystem):
Packit 8cb997
    # ca / kra is configured when the directory
Packit 8cb997
    # /var/lib/pki/pki-tomcat/[ca|kra] # exists
Packit 8cb997
    available_subsystems = {'ca', 'kra'}
Packit 8cb997
    assert subsystem in available_subsystems
Packit 8cb997
Packit 8cb997
    return os.path.isdir(os.path.join(VAR_LIB_PKI_TOMCAT, subsystem))
Packit 8cb997
Packit 8cb997
Packit 8cb997
def is_ca_configured():
Packit 8cb997
    return is_dogtag_configured('ca')
Packit 8cb997
Packit 8cb997
Packit 8cb997
def is_kra_configured():
Packit 8cb997
    return is_dogtag_configured('kra')
Packit 8cb997
Packit 8cb997
Packit 8cb997
def is_client_configured():
Packit 8cb997
    # IPA Client is configured when /etc/ipa/default.conf exists
Packit 8cb997
    # and /var/lib/ipa-client/sysrestore/sysrestore.state exists
Packit 8cb997
Packit 8cb997
    fstore = sysrestore.FileStore(paths.IPA_CLIENT_SYSRESTORE)
Packit 8cb997
    return (os.path.isfile(paths.IPA_DEFAULT_CONF) and fstore.has_files())
Packit 8cb997
Packit 8cb997
Packit 8cb997
def is_server_configured():
Packit 8cb997
    # IPA server is configured when /etc/ipa/default.conf exists
Packit 8cb997
    # and /var/lib/ipa/sysrestore/sysrestore.state exists
Packit 8cb997
    return (os.path.isfile(paths.IPA_DEFAULT_CONF) and
Packit 8cb997
            os.path.isfile(SERVER_SYSRESTORE_STATE))
Packit 8cb997
Packit 8cb997
Packit 8cb997
def get_ipa_conf():
Packit 8cb997
    # Extract basedn, realm and domain from /etc/ipa/default.conf
Packit 8cb997
    parser = RawConfigParser()
Packit 8cb997
    parser.read(paths.IPA_DEFAULT_CONF)
Packit 8cb997
    basedn = parser.get('global', 'basedn')
Packit 8cb997
    realm = parser.get('global', 'realm')
Packit 8cb997
    domain = parser.get('global', 'domain')
Packit 8cb997
    return dict(
Packit 8cb997
        basedn=basedn,
Packit 8cb997
        realm=realm,
Packit 8cb997
        domain=domain
Packit 8cb997
        )
Packit 8cb997
Packit 8cb997
Packit 8cb997
def get_ipa_version():
Packit 8cb997
    try:
Packit 8cb997
        from ipapython import version
Packit 8cb997
    except ImportError:
Packit 8cb997
        return None
Packit 8cb997
    else:
Packit 8cb997
        version_info = []
Packit 8cb997
        for part in version.VERSION.split('.'):
Packit 8cb997
            # DEV versions look like:
Packit 8cb997
            # 4.4.90.201610191151GITd852c00
Packit 8cb997
            # 4.4.90.dev201701071308+git2e43db1
Packit 8cb997
            # 4.6.90.pre2
Packit 8cb997
            if part.startswith('dev') or part.startswith('pre') or \
Packit 8cb997
               'GIT' in part:
Packit 8cb997
                version_info.append(part)
Packit 8cb997
            else:
Packit 8cb997
                version_info.append(int(part))
Packit 8cb997
Packit 8cb997
        return dict(
Packit 8cb997
            api_version=version.API_VERSION,
Packit 8cb997
            num_version=version.NUM_VERSION,
Packit 8cb997
            vendor_version=version.VENDOR_VERSION,
Packit 8cb997
            version=version.VERSION,
Packit 8cb997
            version_info=version_info
Packit 8cb997
            )
Packit 8cb997
Packit 8cb997
Packit 8cb997
def main():
Packit 8cb997
    module = AnsibleModule(
Packit 8cb997
        argument_spec=dict(),
Packit 8cb997
        supports_check_mode=True
Packit 8cb997
    )
Packit 8cb997
Packit 8cb997
    # The module does not change anything, meaning that
Packit 8cb997
    # check mode is supported
Packit 8cb997
Packit 8cb997
    facts = dict(
Packit 8cb997
        packages=dict(
Packit 8cb997
            ipalib=HAS_IPALIB,
Packit 8cb997
            ipaserver=HAS_IPASERVER,
Packit 8cb997
        ),
Packit 8cb997
        configured=dict(
Packit 8cb997
            client=False,
Packit 8cb997
            server=False,
Packit 8cb997
            dns=False,
Packit 8cb997
            ca=False,
Packit 8cb997
            kra=False,
Packit 8cb997
            ntpd=False
Packit 8cb997
        )
Packit 8cb997
    )
Packit 8cb997
Packit 8cb997
    if HAS_IPALIB:
Packit 8cb997
        if is_client_configured():
Packit 8cb997
            facts['configured']['client'] = True
Packit 8cb997
Packit 8cb997
            facts['version'] = get_ipa_version()
Packit 8cb997
            for key, value in six.iteritems(get_ipa_conf()):
Packit 8cb997
                facts[key] = value
Packit 8cb997
Packit 8cb997
    if HAS_IPASERVER:
Packit 8cb997
        if is_server_configured():
Packit 8cb997
            facts['configured']['server'] = True
Packit 8cb997
            facts['configured']['dns'] = is_dns_configured()
Packit 8cb997
            facts['configured']['ca'] = is_ca_configured()
Packit 8cb997
            facts['configured']['kra'] = is_kra_configured()
Packit 8cb997
            facts['configured']['ntpd'] = is_ntpd_configured()
Packit 8cb997
Packit 8cb997
    module.exit_json(
Packit 8cb997
        changed=False,
Packit 8cb997
        ansible_facts=dict(ipa=facts)
Packit 8cb997
        )
Packit 8cb997
Packit 8cb997
Packit 8cb997
if __name__ == '__main__':
Packit 8cb997
    main()