Blame roles/ipaclient/module_utils/ansible_ipa_client.py

Packit 8cb997
# -*- coding: utf-8 -*-
Packit 8cb997
Packit 8cb997
# Authors:
Packit 8cb997
#   Thomas Woerner <twoerner@redhat.com>
Packit 8cb997
#
Packit 8cb997
# Based on ipa-client-install code
Packit 8cb997
#
Packit 8cb997
# Copyright (C) 2017  Red Hat
Packit 8cb997
# see file 'COPYING' for use and warranty information
Packit 8cb997
#
Packit 8cb997
# This program is free software; you can redistribute it and/or modify
Packit 8cb997
# it under the terms of the GNU General Public License as published by
Packit 8cb997
# the Free Software Foundation, either version 3 of the License, or
Packit 8cb997
# (at your option) any later version.
Packit 8cb997
#
Packit 8cb997
# This program is distributed in the hope that it will be useful,
Packit 8cb997
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 8cb997
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit 8cb997
# GNU General Public License for more details.
Packit 8cb997
#
Packit 8cb997
# You should have received a copy of the GNU General Public License
Packit 8cb997
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit 8cb997
Packit 8cb997
__all__ = ["gssapi", "version", "ipadiscovery", "api", "errors", "x509",
Packit 8cb997
           "constants", "sysrestore", "certmonger", "certstore",
Packit 8cb997
           "delete_persistent_client_session_data", "ScriptError",
Packit 8cb997
           "CheckedIPAddress", "validate_domain_name", "normalize_hostname",
Packit 8cb997
           "validate_hostname", "services", "tasks", "CalledProcessError",
Packit 8cb997
           "write_tmp_file", "ipa_generate_password", "DN", "kinit_keytab",
Packit 8cb997
           "kinit_password", "GSSError", "CLIENT_INSTALL_ERROR",
Packit 8cb997
           "is_ipa_client_installed", "CLIENT_ALREADY_CONFIGURED",
Packit 8cb997
           "nssldap_exists", "remove_file", "check_ip_addresses",
Packit 8cb997
           "print_port_conf_info", "configure_ipa_conf", "purge_host_keytab",
Packit 8cb997
           "configure_sssd_conf", "realm_to_suffix", "run", "timeconf",
Packit 8cb997
           "serialization", "configure_krb5_conf", "get_ca_certs",
Packit 8cb997
           "SECURE_PATH", "get_server_connection_interface",
Packit 8cb997
           "disable_ra", "client_dns",
Packit 8cb997
           "configure_certmonger", "update_ssh_keys",
Packit 8cb997
           "configure_openldap_conf", "hardcode_ldap_server",
Packit 8cb997
           "get_certs_from_ldap", "save_state", "create_ipa_nssdb",
Packit 8cb997
           "configure_nisdomain", "configure_ldap_conf",
Packit 8cb997
           "configure_nslcd_conf", "nosssd_files", "configure_ssh_config",
Packit 8cb997
           "configure_sshd_config", "configure_automount",
Packit 8cb997
           "configure_firefox", "sync_time", "check_ldap_conf",
Packit 8cb997
           "sssd_enable_ifp"]
Packit 8cb997
Packit 8cb997
from ipapython.version import NUM_VERSION, VERSION
Packit 8cb997
Packit 8cb997
if NUM_VERSION < 30201:
Packit 8cb997
    # See ipapython/version.py
Packit 8cb997
    IPA_MAJOR, IPA_MINOR, IPA_RELEASE = [int(x) for x in VERSION.split(".", 2)]
Packit 8cb997
    IPA_PYTHON_VERSION = IPA_MAJOR*10000 + IPA_MINOR*100 + IPA_RELEASE
Packit 8cb997
else:
Packit 8cb997
    IPA_PYTHON_VERSION = NUM_VERSION
Packit 8cb997
Packit 8cb997
Packit 8cb997
class installer_obj(object):
Packit 8cb997
    def __init__(self):
Packit 8cb997
        pass
Packit 8cb997
Packit 8cb997
    def set_logger(self, logger):
Packit 8cb997
        self.logger = logger
Packit 8cb997
Packit 8cb997
    # def __getattribute__(self, attr):
Packit 8cb997
    #    value = super(installer_obj, self).__getattribute__(attr)
Packit 8cb997
    #    if not attr.startswith("--") and not attr.endswith("--"):
Packit 8cb997
    #        logger.debug(
Packit 8cb997
    #            "  <-- Accessing installer.%s (%s)" % (attr, repr(value)))
Packit 8cb997
    #    return value
Packit 8cb997
Packit 8cb997
    # def __getattr__(self, attr):
Packit 8cb997
    #    # logger.info("  --> ADDING missing installer.%s" % attr)
Packit 8cb997
    #    self.logger.warn("  --> ADDING missing installer.%s" % attr)
Packit 8cb997
    #    setattr(self, attr, None)
Packit 8cb997
    #    return getattr(self, attr)
Packit 8cb997
Packit 8cb997
    # def __setattr__(self, attr, value):
Packit 8cb997
    #    logger.debug("  --> Setting installer.%s to %s" % (attr, repr(value)))
Packit 8cb997
    #    return super(installer_obj, self).__setattr__(attr, value)
Packit 8cb997
Packit 8cb997
    def knobs(self):
Packit 8cb997
        for name in self.__dict__:
Packit 8cb997
            yield self, name
Packit 8cb997
Packit 8cb997
Packit 8cb997
# Initialize installer settings
Packit 8cb997
installer = installer_obj()
Packit 8cb997
# Create options
Packit 8cb997
options = installer
Packit 8cb997
options.interactive = False
Packit 8cb997
options.unattended = not options.interactive
Packit 8cb997
Packit 8cb997
if NUM_VERSION >= 40400:
Packit 8cb997
    # IPA version >= 4.4
Packit 8cb997
Packit 8cb997
    import sys
Packit 8cb997
    import inspect
Packit 8cb997
    import gssapi
Packit 8cb997
    import logging
Packit 8cb997
Packit 8cb997
    from ipapython import version
Packit 8cb997
    try:
Packit 8cb997
        from ipaclient.install import ipadiscovery
Packit 8cb997
    except ImportError:
Packit 8cb997
        from ipaclient import ipadiscovery
Packit 8cb997
    from ipalib import api, errors, x509
Packit 8cb997
    from ipalib import constants
Packit 8cb997
    try:
Packit 8cb997
        from ipalib.install import sysrestore
Packit 8cb997
    except ImportError:
Packit 8cb997
        from ipapython import sysrestore
Packit 8cb997
    try:
Packit 8cb997
        from ipalib.install import certmonger
Packit 8cb997
    except ImportError:
Packit 8cb997
        from ipapython import certmonger
Packit 8cb997
    try:
Packit 8cb997
        from ipalib.install import certstore
Packit 8cb997
    except ImportError:
Packit 8cb997
        from ipalib import certstore
Packit 8cb997
    from ipalib.rpc import delete_persistent_client_session_data
Packit 8cb997
    from ipapython import certdb, ipautil
Packit 8cb997
    from ipapython.admintool import ScriptError
Packit 8cb997
    from ipapython.ipautil import CheckedIPAddress
Packit 8cb997
    from ipalib.util import validate_domain_name, normalize_hostname, \
Packit 8cb997
        validate_hostname
Packit 8cb997
    from ipaplatform import services
Packit 8cb997
    from ipaplatform.paths import paths
Packit 8cb997
    from ipaplatform.tasks import tasks
Packit 8cb997
    try:
Packit 8cb997
        from cryptography.hazmat.primitives import serialization
Packit 8cb997
    except ImportError:
Packit 8cb997
        serialization = None
Packit 8cb997
    from ipapython.ipautil import CalledProcessError, write_tmp_file, \
Packit 8cb997
        ipa_generate_password
Packit 8cb997
    from ipapython.dn import DN
Packit 8cb997
    try:
Packit 8cb997
        from ipalib.install.kinit import kinit_keytab, kinit_password
Packit 8cb997
    except ImportError:
Packit 8cb997
        from ipapython.ipautil import kinit_keytab, kinit_password
Packit 8cb997
    from ipapython.ipa_log_manager import standard_logging_setup
Packit 8cb997
    from gssapi.exceptions import GSSError
Packit 8cb997
    try:
Packit 8cb997
        from ipaclient.install.client import configure_krb5_conf, \
Packit 8cb997
            get_ca_certs, SECURE_PATH, get_server_connection_interface, \
Packit 8cb997
            disable_ra, client_dns, \
Packit 8cb997
            configure_certmonger, update_ssh_keys, configure_openldap_conf, \
Packit 8cb997
            hardcode_ldap_server, get_certs_from_ldap, save_state, \
Packit 8cb997
            create_ipa_nssdb, configure_ssh_config, configure_sshd_config, \
Packit 8cb997
            configure_automount, configure_firefox, configure_nisdomain, \
Packit 8cb997
            CLIENT_INSTALL_ERROR, is_ipa_client_installed, \
Packit 8cb997
            CLIENT_ALREADY_CONFIGURED, nssldap_exists, remove_file, \
Packit 8cb997
            check_ip_addresses, print_port_conf_info, configure_ipa_conf, \
Packit 8cb997
            purge_host_keytab, configure_sssd_conf, configure_ldap_conf, \
Packit 8cb997
            configure_nslcd_conf, nosssd_files
Packit 8cb997
        get_ca_cert = None
Packit 8cb997
    except ImportError:
Packit 8cb997
        # Create temporary copy of ipa-client-install script (as
Packit 8cb997
        # ipa_client_install.py) to be able to import the script easily
Packit 8cb997
        # and also to remove the global finally clause in which the
Packit 8cb997
        # generated ccache file gets removed. The ccache file will be
Packit 8cb997
        # needed in the next step.
Packit 8cb997
        # This is done in a temporary directory that gets removed right
Packit 8cb997
        # after ipa_client_install has been imported.
Packit 8cb997
        import shutil
Packit 8cb997
        import tempfile
Packit 8cb997
        temp_dir = tempfile.mkdtemp(dir="/tmp")
Packit 8cb997
        sys.path.append(temp_dir)
Packit 8cb997
        temp_file = "%s/ipa_client_install.py" % temp_dir
Packit 8cb997
Packit 8cb997
        with open("/usr/sbin/ipa-client-install", "r") as f_in:
Packit 8cb997
            with open(temp_file, "w") as f_out:
Packit 8cb997
                for line in f_in:
Packit 8cb997
                    if line.startswith("finally:"):
Packit 8cb997
                        break
Packit 8cb997
                    f_out.write(line)
Packit 8cb997
        import ipa_client_install
Packit 8cb997
Packit 8cb997
        shutil.rmtree(temp_dir, ignore_errors=True)
Packit 8cb997
        sys.path.remove(temp_dir)
Packit 8cb997
Packit 8cb997
        argspec = inspect.getargspec(ipa_client_install.configure_krb5_conf)
Packit 8cb997
        if argspec.keywords is None:
Packit 8cb997
            def configure_krb5_conf(
Packit 8cb997
                    cli_realm, cli_domain, cli_server, cli_kdc, dnsok,
Packit 8cb997
                    filename, client_domain, client_hostname, force=False,
Packit 8cb997
                    configure_sssd=True):
Packit 8cb997
                global options
Packit 8cb997
                options.force = force
Packit 8cb997
                options.sssd = configure_sssd
Packit 8cb997
                return ipa_client_install.configure_krb5_conf(
Packit 8cb997
                    cli_realm, cli_domain, cli_server, cli_kdc, dnsok, options,
Packit 8cb997
                    filename, client_domain, client_hostname)
Packit 8cb997
        else:
Packit 8cb997
            configure_krb5_conf = ipa_client_install.configure_krb5_conf
Packit 8cb997
        if NUM_VERSION < 40100:
Packit 8cb997
            get_ca_cert = ipa_client_install.get_ca_cert
Packit 8cb997
            get_ca_certs = None
Packit 8cb997
        else:
Packit 8cb997
            get_ca_cert = None
Packit 8cb997
            get_ca_certs = ipa_client_install.get_ca_certs
Packit 8cb997
        SECURE_PATH = ("/bin:/sbin:/usr/kerberos/bin:/usr/kerberos/sbin:"
Packit 8cb997
                       "/usr/bin:/usr/sbin")
Packit 8cb997
Packit 8cb997
        get_server_connection_interface = \
Packit 8cb997
            ipa_client_install.get_server_connection_interface
Packit 8cb997
        disable_ra = ipa_client_install.disable_ra
Packit 8cb997
        client_dns = ipa_client_install.client_dns
Packit 8cb997
        configure_certmonger = ipa_client_install.configure_certmonger
Packit 8cb997
        update_ssh_keys = ipa_client_install.update_ssh_keys
Packit 8cb997
        configure_openldap_conf = ipa_client_install.configure_openldap_conf
Packit 8cb997
        hardcode_ldap_server = ipa_client_install.hardcode_ldap_server
Packit 8cb997
        get_certs_from_ldap = ipa_client_install.get_certs_from_ldap
Packit 8cb997
        save_state = ipa_client_install.save_state
Packit 8cb997
Packit 8cb997
        create_ipa_nssdb = certdb.create_ipa_nssdb
Packit 8cb997
Packit 8cb997
        argspec = inspect.getargspec(ipa_client_install.configure_nisdomain)
Packit 8cb997
        if len(argspec.args) == 3:
Packit 8cb997
            configure_nisdomain = ipa_client_install.configure_nisdomain
Packit 8cb997
        else:
Packit 8cb997
            def configure_nisdomain(options, domain, statestore=None):
Packit 8cb997
                return ipa_client_install.configure_nisdomain(options, domain)
Packit 8cb997
Packit 8cb997
        configure_ldap_conf = ipa_client_install.configure_ldap_conf
Packit 8cb997
        configure_nslcd_conf = ipa_client_install.configure_nslcd_conf
Packit 8cb997
        nosssd_files = ipa_client_install.nosssd_files
Packit 8cb997
Packit 8cb997
        configure_ssh_config = ipa_client_install.configure_ssh_config
Packit 8cb997
        configure_sshd_config = ipa_client_install.configure_sshd_config
Packit 8cb997
        configure_automount = ipa_client_install.configure_automount
Packit 8cb997
        configure_firefox = ipa_client_install.configure_firefox
Packit 8cb997
Packit 8cb997
    from ipapython.ipautil import realm_to_suffix, run
Packit 8cb997
Packit 8cb997
    try:
Packit 8cb997
        from ipaclient.install import timeconf
Packit 8cb997
        time_service = "chronyd"
Packit 8cb997
    except ImportError:
Packit 8cb997
        try:
Packit 8cb997
            from ipaclient.install import ntpconf as timeconf
Packit 8cb997
        except ImportError:
Packit 8cb997
            from ipaclient import ntpconf as timeconf
Packit 8cb997
        time_service = "ntpd"
Packit 8cb997
Packit 8cb997
    try:
Packit 8cb997
        from ipaclient.install.client import sync_time
Packit 8cb997
    except ImportError:
Packit 8cb997
        sync_time = None
Packit 8cb997
Packit 8cb997
    try:
Packit 8cb997
        from ipaclient.install.client import check_ldap_conf
Packit 8cb997
    except ImportError:
Packit 8cb997
        check_ldap_conf = None
Packit 8cb997
Packit 8cb997
    try:
Packit 8cb997
        from ipaclient.install.client import sssd_enable_ifp
Packit 8cb997
    except ImportError:
Packit 8cb997
        sssd_enable_ifp = None
Packit 8cb997
Packit 8cb997
    logger = logging.getLogger("ipa-client-install")
Packit 8cb997
    root_logger = logger
Packit 8cb997
Packit 8cb997
else:
Packit 8cb997
    # IPA version < 4.4
Packit 8cb997
Packit 8cb997
    raise Exception("freeipa version '%s' is too old" % VERSION)
Packit 8cb997
Packit 8cb997
Packit Service 0f71a7
def setup_logging():
Packit Service 0f71a7
    standard_logging_setup(
Packit Service 0f71a7
        paths.IPACLIENT_INSTALL_LOG, verbose=False, debug=False,
Packit Service 0f71a7
        filemode='a', console_format='%(message)s')
Packit Service 0f71a7
Packit Service 0f71a7
Packit 8cb997
def ansible_module_get_parsed_ip_addresses(ansible_module,
Packit 8cb997
                                           param='ip_addresses'):
Packit 8cb997
    ip_addresses = ansible_module.params.get(param)
Packit 8cb997
    if ip_addresses is None:
Packit 8cb997
        return None
Packit 8cb997
Packit 8cb997
    ip_addrs = []
Packit 8cb997
    for ip in ip_addresses:
Packit 8cb997
        try:
Packit 8cb997
            ip_parsed = ipautil.CheckedIPAddress(ip)
Packit 8cb997
        except Exception as e:
Packit 8cb997
            ansible_module.fail_json(msg="Invalid IP Address %s: %s" % (ip, e))
Packit 8cb997
        ip_addrs.append(ip_parsed)
Packit 8cb997
    return ip_addrs