Blame roles/ipaserver/library/ipaserver_test.py

Packit Service 0a38ef
# -*- coding: utf-8 -*-
Packit Service 0a38ef
Packit Service 0a38ef
# Authors:
Packit Service 0a38ef
#   Thomas Woerner <twoerner@redhat.com>
Packit Service 0a38ef
#
Packit Service 0a38ef
# Based on ipa-client-install code
Packit Service 0a38ef
#
Packit Service 0a38ef
# Copyright (C) 2017  Red Hat
Packit Service 0a38ef
# see file 'COPYING' for use and warranty information
Packit Service 0a38ef
#
Packit Service 0a38ef
# This program is free software; you can redistribute it and/or modify
Packit Service 0a38ef
# it under the terms of the GNU General Public License as published by
Packit Service 0a38ef
# the Free Software Foundation, either version 3 of the License, or
Packit Service 0a38ef
# (at your option) any later version.
Packit Service 0a38ef
#
Packit Service 0a38ef
# This program is distributed in the hope that it will be useful,
Packit Service 0a38ef
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 0a38ef
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 0a38ef
# GNU General Public License for more details.
Packit Service 0a38ef
#
Packit Service 0a38ef
# You should have received a copy of the GNU General Public License
Packit Service 0a38ef
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
Packit Service 0a38ef
Packit Service 0a38ef
ANSIBLE_METADATA = {
Packit Service 0a38ef
    'metadata_version': '1.0',
Packit Service 0a38ef
    'supported_by': 'community',
Packit Service 0a38ef
    'status': ['preview'],
Packit Service 0a38ef
}
Packit Service 0a38ef
Packit Service 0a38ef
DOCUMENTATION = '''
Packit Service 0a38ef
---
Packit Service 0a38ef
module: ipaserver_test
Packit Service 0a38ef
short description: IPA server test
Packit Service 0a38ef
description: IPA server test
Packit Service 0a38ef
options:
Packit Service 0a38ef
  force:
Packit Service 0a38ef
    description: Installer force parameter
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  dm_password:
Packit Service 0a38ef
    description: Directory Manager password
Packit Service 0a38ef
    required: no
Packit Service 0a38ef
  password:
Packit Service 0a38ef
    description: Admin user kerberos password
Packit Service 0a38ef
    required: no
Packit Service 0a38ef
  master_password:
Packit Service 0a38ef
    description: kerberos master password (normally autogenerated)
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  domain:
Packit Service 0a38ef
    description: Primary DNS domain of the IPA deployment
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  realm:
Packit Service 0a38ef
    description: Kerberos realm name of the IPA deployment
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  hostname:
Packit Service 0a38ef
    description: Fully qualified name of this host
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  ca_cert_files:
Packit Service 0a38ef
    description:
Packit Service 0a38ef
      List of files containing CA certificates for the service certificate
Packit Service 0a38ef
      files
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  no_host_dns:
Packit Service 0a38ef
    description: Do not use DNS for hostname lookup during installation
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  pki_config_override:
Packit Service 0a38ef
    description: Path to ini file with config overrides
Packit Service 0a38ef
    required: yes
Packit Service a166ed
  skip_mem_check:
Packit Service a166ed
    description: Skip checking for minimum required memory
Packit Service a166ed
    required: yes
Packit Service 0a38ef
  setup_adtrust:
Packit Service 0a38ef
    description: Configure AD trust capability
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  setup_kra:
Packit Service 0a38ef
    description: Configure a dogtag KRA
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  setup_dns:
Packit Service 0a38ef
    description: Configure bind with our zone
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  idstart:
Packit Service 0a38ef
    description: The starting value for the IDs range (default random)
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  idmax:
Packit Service 0a38ef
    description: The max value for the IDs range (default idstart+199999)
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  no_pkinit:
Packit Service 0a38ef
    description: Disable pkinit setup steps
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  dirsrv_config_file:
Packit Service 0a38ef
    description:
Packit Service 0a38ef
      The path to LDIF file that will be used to modify configuration of
Packit Service 0a38ef
      dse.ldif during installation of the directory server instance
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  dirsrv_cert_files:
Packit Service 0a38ef
    description:
Packit Service 0a38ef
      Files containing the Directory Server SSL certificate and private key
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  http_cert_files:
Packit Service 0a38ef
    description:
Packit Service 0a38ef
      File containing the Apache Server SSL certificate and private key
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  pkinit_cert_files:
Packit Service 0a38ef
    description:
Packit Service 0a38ef
      File containing the Kerberos KDC SSL certificate and private key
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  dirsrv_pin:
Packit Service 0a38ef
    description: The password to unlock the Directory Server private key
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  http_pin:
Packit Service 0a38ef
    description: The password to unlock the Apache Server private key
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  pkinit_pin:
Packit Service 0a38ef
    description: The password to unlock the Kerberos KDC private key
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  dirsrv_cert_name:
Packit Service 0a38ef
    description: Name of the Directory Server SSL certificate to install
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  http_cert_name:
Packit Service 0a38ef
    description: Name of the Apache Server SSL certificate to install
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  pkinit_cert_name:
Packit Service 0a38ef
    description: Name of the Kerberos KDC SSL certificate to install
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  ntp_servers:
Packit Service 0a38ef
    description: ntp servers to use
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  ntp_pool:
Packit Service 0a38ef
    description: ntp server pool to use
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  no_ntp:
Packit Service 0a38ef
    description: Do not configure ntp
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  external_ca:
Packit Service 0a38ef
    description: External ca setting
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  external_ca_type:
Packit Service 0a38ef
    description: Type of the external CA
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  external_ca_profile:
Packit Service 0a38ef
    description:
Packit Service 0a38ef
      Specify the certificate profile/template to use at the external CA
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  external_cert_files:
Packit Service 0a38ef
    description:
Packit Service 0a38ef
      File containing the IPA CA certificate and the external CA certificate
Packit Service 0a38ef
      chain
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  subject_base:
Packit Service 0a38ef
    description:
Packit Service 0a38ef
      The certificate subject base (default O=<realm-name>).
Packit Service 0a38ef
      RDNs are in LDAP order (most specific RDN first).
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  ca_subject:
Packit Service 0a38ef
    description: The installer ca_subject setting
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  allow_zone_overlap:
Packit Service 0a38ef
    description: Create DNS zone even if it already exists
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  reverse_zones:
Packit Service 0a38ef
    description: The reverse DNS zones to use
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  no_reverse:
Packit Service 0a38ef
    description: Do not create new reverse DNS zone
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  auto_reverse:
Packit Service 0a38ef
    description: Create necessary reverse zones
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  zonemgr:
Packit Service 0a38ef
    description: DNS zone manager e-mail address. Defaults to hostmaster@DOMAIN
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  forwarders:
Packit Service 0a38ef
    description: Add DNS forwarders
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  no_forwarders:
Packit Service 0a38ef
    description: Do not add any DNS forwarders, use root servers instead
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  auto_forwarders:
Packit Service 0a38ef
    description: Use DNS forwarders configured in /etc/resolv.conf
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  forward_policy:
Packit Service 0a38ef
    description: DNS forwarding policy for global forwarders
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  no_dnssec_validation:
Packit Service 0a38ef
    description: Disable DNSSEC validation
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  enable_compat:
Packit Service 0a38ef
    description: Enable support for trusted domains for old clients
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  netbios_name:
Packit Service 0a38ef
    description: NetBIOS name of the IPA domain
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  rid_base:
Packit Service 0a38ef
    description: Start value for mapping UIDs and GIDs to RIDs
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
  secondary_rid_base:
Packit Service 0a38ef
    description:
Packit Service 0a38ef
      Start value of the secondary range for mapping UIDs and GIDs to RIDs
Packit Service 0a38ef
    required: yes
Packit Service 0a38ef
author:
Packit Service 0a38ef
    - Thomas Woerner
Packit Service 0a38ef
'''
Packit Service 0a38ef
Packit Service 0a38ef
EXAMPLES = '''
Packit Service 0a38ef
'''
Packit Service 0a38ef
Packit Service 0a38ef
RETURN = '''
Packit Service 0a38ef
'''
Packit Service 0a38ef
Packit Service 0a38ef
import os
Packit Service 0a38ef
import sys
Packit Service 0a38ef
import six
Packit Service 0a38ef
import inspect
Packit Service 0a38ef
import random
Packit Service 0a38ef
from shutil import copyfile
Packit Service 0a38ef
Packit Service 0a38ef
from ansible.module_utils.basic import AnsibleModule
Packit Service 0a38ef
from ansible.module_utils._text import to_native
Packit Service 0a38ef
from ansible.module_utils.ansible_ipa_server import (
Packit Service 0a38ef
    AnsibleModuleLog, setup_logging, options, adtrust_imported, kra_imported,
Packit Service 0a38ef
    PKIIniLoader, MIN_DOMAIN_LEVEL, MAX_DOMAIN_LEVEL, check_zone_overlap,
Packit Service 0a38ef
    redirect_stdout, validate_dm_password, validate_admin_password,
Packit Service 0a38ef
    NUM_VERSION, is_ipa_configured, sysrestore, paths, bindinstance,
Packit Service 0a38ef
    read_cache, ca, tasks, check_ldap_conf, timeconf, httpinstance,
Packit Service 0a38ef
    check_dirsrv, ScriptError, get_fqdn, verify_fqdn, BadHostError,
Packit Service 0a38ef
    validate_domain_name, load_pkcs12, IPA_PYTHON_VERSION,
Packit Service a166ed
    encode_certificate, check_available_memory
Packit Service 0a38ef
)
Packit Service 0a38ef
Packit Service 0a38ef
if six.PY3:
Packit Service 0a38ef
    unicode = str
Packit Service 0a38ef
Packit Service 0a38ef
Packit Service 0a38ef
def main():
Packit Service 0a38ef
    ansible_module = AnsibleModule(
Packit Service 0a38ef
        argument_spec=dict(
Packit Service 0a38ef
            # basic
Packit Service 0a38ef
            force=dict(required=False, type='bool', default=False),
Packit Service 0a38ef
            dm_password=dict(required=True, no_log=True),
Packit Service 0a38ef
            password=dict(required=True, no_log=True),
Packit Service 0a38ef
            master_password=dict(required=False, no_log=True),
Packit Service 0a38ef
            domain=dict(required=False),
Packit Service 0a38ef
            realm=dict(required=False),
Packit Service 0a38ef
            hostname=dict(required=False),
Packit Service 0a38ef
            ca_cert_files=dict(required=False, type='list', default=[]),
Packit Service 0a38ef
            no_host_dns=dict(required=False, type='bool', default=False),
Packit Service 0a38ef
            pki_config_override=dict(required=False),
Packit Service a166ed
            skip_mem_check=dict(required=False, type='bool', default=False),
Packit Service 0a38ef
            # server
Packit Service 0a38ef
            setup_adtrust=dict(required=False, type='bool', default=False),
Packit Service 0a38ef
            setup_kra=dict(required=False, type='bool', default=False),
Packit Service 0a38ef
            setup_dns=dict(required=False, type='bool', default=False),
Packit Service 0a38ef
            idstart=dict(required=False, type='int'),
Packit Service 0a38ef
            idmax=dict(required=False, type='int'),
Packit Service 0a38ef
            # no_hbac_allow
Packit Service 0a38ef
            no_pkinit=dict(required=False, type='bool', default=False),
Packit Service 0a38ef
            # no_ui_redirect
Packit Service 0a38ef
            dirsrv_config_file=dict(required=False),
Packit Service 0a38ef
            # ssl certificate
Packit Service 0a38ef
            dirsrv_cert_files=dict(required=False, type='list', default=None),
Packit Service 0a38ef
            http_cert_files=dict(required=False, type='list', default=None),
Packit Service 0a38ef
            pkinit_cert_files=dict(required=False, type='list', default=None),
Packit Service 0a38ef
            dirsrv_pin=dict(required=False),
Packit Service 0a38ef
            http_pin=dict(required=False),
Packit Service 0a38ef
            pkinit_pin=dict(required=False),
Packit Service 0a38ef
            dirsrv_cert_name=dict(required=False),
Packit Service 0a38ef
            http_cert_name=dict(required=False),
Packit Service 0a38ef
            pkinit_cert_name=dict(required=False),
Packit Service 0a38ef
            # client
Packit Service 0a38ef
            # mkhomedir
Packit Service 0a38ef
            ntp_servers=dict(required=False, type='list', default=None),
Packit Service 0a38ef
            ntp_pool=dict(required=False, default=None),
Packit Service 0a38ef
            no_ntp=dict(required=False, type='bool', default=False),
Packit Service 0a38ef
            # ssh_trust_dns
Packit Service 0a38ef
            # no_ssh
Packit Service 0a38ef
            # no_sshd
Packit Service 0a38ef
            # no_dns_sshfp
Packit Service 0a38ef
            # certificate system
Packit Service 0a38ef
            external_ca=dict(required=False, type='bool', default=False),
Packit Service 0a38ef
            external_ca_type=dict(required=False),
Packit Service 0a38ef
            external_ca_profile=dict(required=False),
Packit Service 0a38ef
            external_cert_files=dict(required=False, type='list',
Packit Service 0a38ef
                                     default=None),
Packit Service 0a38ef
            subject_base=dict(required=False),
Packit Service 0a38ef
            ca_subject=dict(required=False),
Packit Service 0a38ef
            # ca_signing_algorithm
Packit Service 0a38ef
            # dns
Packit Service 0a38ef
            allow_zone_overlap=dict(required=False, type='bool',
Packit Service 0a38ef
                                    default=False),
Packit Service 0a38ef
            reverse_zones=dict(required=False, type='list', default=[]),
Packit Service 0a38ef
            no_reverse=dict(required=False, type='bool', default=False),
Packit Service 0a38ef
            auto_reverse=dict(required=False, type='bool', default=False),
Packit Service 0a38ef
            zonemgr=dict(required=False),
Packit Service 0a38ef
            forwarders=dict(required=False, type='list', default=[]),
Packit Service 0a38ef
            no_forwarders=dict(required=False, type='bool', default=False),
Packit Service 0a38ef
            auto_forwarders=dict(required=False, type='bool', default=False),
Packit Service 0a38ef
            forward_policy=dict(default=None, choices=['first', 'only']),
Packit Service 0a38ef
            no_dnssec_validation=dict(required=False, type='bool',
Packit Service 0a38ef
                                      default=False),
Packit Service 0a38ef
            # ad trust
Packit Service 0a38ef
            enable_compat=dict(required=False, type='bool', default=False),
Packit Service 0a38ef
            netbios_name=dict(required=False),
Packit Service 0a38ef
            rid_base=dict(required=False, type='int', default=1000),
Packit Service 0a38ef
            secondary_rid_base=dict(required=False, type='int',
Packit Service 0a38ef
                                    default=100000000),
Packit Service 0a38ef
            # additional
Packit Service 0a38ef
        ),
Packit Service 0a38ef
        supports_check_mode=True,
Packit Service 0a38ef
    )
Packit Service 0a38ef
Packit Service 0a38ef
    ansible_module._ansible_debug = True
Packit Service 0a38ef
    setup_logging()
Packit Service 0a38ef
    ansible_log = AnsibleModuleLog(ansible_module)
Packit Service 0a38ef
Packit Service 0a38ef
    # set values ############################################################
Packit Service 0a38ef
Packit Service 0a38ef
    # basic
Packit Service 0a38ef
    options.force = ansible_module.params.get('force')
Packit Service 0a38ef
    options.dm_password = ansible_module.params.get('dm_password')
Packit Service 0a38ef
    options.admin_password = ansible_module.params.get('password')
Packit Service 0a38ef
    options.master_password = ansible_module.params.get('master_password')
Packit Service 0a38ef
    options.domain_name = ansible_module.params.get('domain')
Packit Service 0a38ef
    options.realm_name = ansible_module.params.get('realm')
Packit Service 0a38ef
    options.host_name = ansible_module.params.get('hostname')
Packit Service 0a38ef
    options.ca_cert_files = ansible_module.params.get('ca_cert_files')
Packit Service 0a38ef
    options.no_host_dns = ansible_module.params.get('no_host_dns')
Packit Service 0a38ef
    options.pki_config_override = ansible_module.params.get(
Packit Service 0a38ef
        'pki_config_override')
Packit Service a166ed
    options.skip_mem_check = ansible_module.params.get('skip_mem_check')
Packit Service 0a38ef
    # server
Packit Service 0a38ef
    options.setup_adtrust = ansible_module.params.get('setup_adtrust')
Packit Service 0a38ef
    options.setup_dns = ansible_module.params.get('setup_dns')
Packit Service 0a38ef
    options.setup_kra = ansible_module.params.get('setup_kra')
Packit Service 0a38ef
    options.idstart = ansible_module.params.get('idstart')
Packit Service 0a38ef
    options.idmax = ansible_module.params.get('idmax')
Packit Service 0a38ef
    # no_hbac_allow
Packit Service 0a38ef
    options.no_pkinit = ansible_module.params.get('no_pkinit')
Packit Service 0a38ef
    # no_ui_redirect
Packit Service 0a38ef
    options.dirsrv_config_file = ansible_module.params.get(
Packit Service 0a38ef
        'dirsrv_config_file')
Packit Service 0a38ef
    # ssl certificate
Packit Service 0a38ef
    options.dirsrv_cert_files = ansible_module.params.get('dirsrv_cert_files')
Packit Service 0a38ef
    options.http_cert_files = ansible_module.params.get('http_cert_files')
Packit Service 0a38ef
    options.pkinit_cert_files = ansible_module.params.get('pkinit_cert_files')
Packit Service 0a38ef
    options.dirsrv_pin = ansible_module.params.get('dirsrv_pin')
Packit Service 0a38ef
    options.http_pin = ansible_module.params.get('http_pin')
Packit Service 0a38ef
    options.pkinit_pin = ansible_module.params.get('pkinit_pin')
Packit Service 0a38ef
    options.dirsrv_cert_name = ansible_module.params.get('dirsrv_cert_name')
Packit Service 0a38ef
    options.http_cert_name = ansible_module.params.get('http_cert_name')
Packit Service 0a38ef
    options.pkinit_cert_name = ansible_module.params.get('pkinit_cert_name')
Packit Service 0a38ef
    # client
Packit Service 0a38ef
    # mkhomedir
Packit Service 0a38ef
    options.ntp_servers = ansible_module.params.get('ntp_servers')
Packit Service 0a38ef
    options.ntp_pool = ansible_module.params.get('ntp_pool')
Packit Service 0a38ef
    options.no_ntp = ansible_module.params.get('no_ntp')
Packit Service 0a38ef
    # ssh_trust_dns
Packit Service 0a38ef
    # no_ssh
Packit Service 0a38ef
    # no_sshd
Packit Service 0a38ef
    # no_dns_sshfp
Packit Service 0a38ef
    # certificate system
Packit Service 0a38ef
    options.external_ca = ansible_module.params.get('external_ca')
Packit Service 0a38ef
    options.external_ca_type = ansible_module.params.get('external_ca_type')
Packit Service 0a38ef
    options.external_ca_profile = ansible_module.params.get(
Packit Service 0a38ef
        'external_ca_profile')
Packit Service 0a38ef
    options.external_cert_files = ansible_module.params.get(
Packit Service 0a38ef
        'external_cert_files')
Packit Service 0a38ef
    options.subject_base = ansible_module.params.get('subject_base')
Packit Service 0a38ef
    options.ca_subject = ansible_module.params.get('ca_subject')
Packit Service 0a38ef
    # ca_signing_algorithm
Packit Service 0a38ef
    # dns
Packit Service 0a38ef
    options.allow_zone_overlap = ansible_module.params.get(
Packit Service 0a38ef
        'allow_zone_overlap')
Packit Service 0a38ef
    options.reverse_zones = ansible_module.params.get('reverse_zones')
Packit Service 0a38ef
    options.no_reverse = ansible_module.params.get('no_reverse')
Packit Service 0a38ef
    options.auto_reverse = ansible_module.params.get('auto_reverse')
Packit Service 0a38ef
    options.zonemgr = ansible_module.params.get('zonemgr')
Packit Service 0a38ef
    options.forwarders = ansible_module.params.get('forwarders')
Packit Service 0a38ef
    options.no_forwarders = ansible_module.params.get('no_forwarders')
Packit Service 0a38ef
    options.auto_forwarders = ansible_module.params.get('auto_forwarders')
Packit Service 0a38ef
    options.forward_policy = ansible_module.params.get('forward_policy')
Packit Service 0a38ef
    options.no_dnssec_validation = ansible_module.params.get(
Packit Service 0a38ef
        'no_dnssec_validation')
Packit Service 0a38ef
    # ad trust
Packit Service 0a38ef
    options.enable_compat = ansible_module.params.get('enable_compat')
Packit Service 0a38ef
    options.netbios_name = ansible_module.params.get('netbios_name')
Packit Service 0a38ef
    options.rid_base = ansible_module.params.get('rid_base')
Packit Service 0a38ef
    options.secondary_rid_base = ansible_module.params.get(
Packit Service 0a38ef
        'secondary_rid_base')
Packit Service 0a38ef
Packit Service 0a38ef
    # additional
Packit Service 0a38ef
    options.kasp_db_file = None
Packit Service 0a38ef
Packit Service 0a38ef
    # version specific ######################################################
Packit Service 0a38ef
Packit Service 0a38ef
    if options.setup_adtrust and not adtrust_imported:
Packit Service 0a38ef
        # if "adtrust" not in options._allow_missing:
Packit Service 0a38ef
        ansible_module.fail_json(msg="adtrust can not be imported")
Packit Service 0a38ef
        # else:
Packit Service 0a38ef
        #   options.setup_adtrust = False
Packit Service 0a38ef
        #   ansible_module.warn(msg="adtrust is not supported, disabling")
Packit Service 0a38ef
Packit Service 0a38ef
    if options.setup_kra and not kra_imported:
Packit Service 0a38ef
        # if "kra" not in options._allow_missing:
Packit Service 0a38ef
        ansible_module.fail_json(msg="kra can not be imported")
Packit Service 0a38ef
        # else:
Packit Service 0a38ef
        #   options.setup_kra = False
Packit Service 0a38ef
        #   ansible_module.warn(msg="kra is not supported, disabling")
Packit Service 0a38ef
Packit Service 0a38ef
    if options.pki_config_override is not None:
Packit Service 0a38ef
        if PKIIniLoader is None:
Packit Service 0a38ef
            ansible_module.warn("The use of pki_config_override is not "
Packit Service 0a38ef
                                "supported for this IPA version")
Packit Service 0a38ef
        else:
Packit Service 0a38ef
            # From DogtagInstallInterface @pki_config_override.validator
Packit Service 0a38ef
            try:
Packit Service 0a38ef
                PKIIniLoader.verify_pki_config_override(
Packit Service 0a38ef
                    options.pki_config_override)
Packit Service 0a38ef
            except ValueError as e:
Packit Service 0a38ef
                ansible_module.fail_json(
Packit Service 0a38ef
                    msg="pki_config_override: %s" % str(e))
Packit Service 0a38ef
Packit Service 0a38ef
    # default values ########################################################
Packit Service 0a38ef
Packit Service 0a38ef
    # idstart and idmax
Packit Service 0a38ef
    if options.idstart is None:
Packit Service 0a38ef
        options.idstart = random.randint(1, 10000) * 200000
Packit Service 0a38ef
    if options.idmax is None or options.idmax == 0:
Packit Service 0a38ef
        options.idmax = options.idstart + 199999
Packit Service 0a38ef
Packit Service 0a38ef
    # ServerInstallInterface.__init__ #######################################
Packit Service 0a38ef
    try:
Packit Service 0a38ef
        self = options
Packit Service 0a38ef
Packit Service 0a38ef
        # If any of the key file options are selected, all are required.
Packit Service 0a38ef
        cert_file_req = (self.dirsrv_cert_files, self.http_cert_files)
Packit Service 0a38ef
        cert_file_opt = (self.pkinit_cert_files,)
Packit Service 0a38ef
        if not self.no_pkinit:
Packit Service 0a38ef
            cert_file_req += cert_file_opt
Packit Service 0a38ef
        if self.no_pkinit and self.pkinit_cert_files:
Packit Service 0a38ef
            raise RuntimeError(
Packit Service 0a38ef
                "--no-pkinit and --pkinit-cert-file cannot be specified "
Packit Service 0a38ef
                "together"
Packit Service 0a38ef
            )
Packit Service 0a38ef
        if any(cert_file_req + cert_file_opt) and not all(cert_file_req):
Packit Service 0a38ef
            raise RuntimeError(
Packit Service 0a38ef
                "--dirsrv-cert-file, --http-cert-file, and --pkinit-cert-file "
Packit Service 0a38ef
                "or --no-pkinit are required if any key file options are used."
Packit Service 0a38ef
            )
Packit Service 0a38ef
Packit Service 0a38ef
        if not self.interactive:
Packit Service 0a38ef
            if self.dirsrv_cert_files and self.dirsrv_pin is None:
Packit Service 0a38ef
                raise RuntimeError(
Packit Service 0a38ef
                    "You must specify --dirsrv-pin with --dirsrv-cert-file")
Packit Service 0a38ef
            if self.http_cert_files and self.http_pin is None:
Packit Service 0a38ef
                raise RuntimeError(
Packit Service 0a38ef
                    "You must specify --http-pin with --http-cert-file")
Packit Service 0a38ef
            if self.pkinit_cert_files and self.pkinit_pin is None:
Packit Service 0a38ef
                raise RuntimeError(
Packit Service 0a38ef
                    "You must specify --pkinit-pin with --pkinit-cert-file")
Packit Service 0a38ef
Packit Service 0a38ef
        if not self.setup_dns:
Packit Service 0a38ef
            if self.forwarders:
Packit Service 0a38ef
                raise RuntimeError(
Packit Service 0a38ef
                    "You cannot specify a --forwarder option without the "
Packit Service 0a38ef
                    "--setup-dns option")
Packit Service 0a38ef
            if self.auto_forwarders:
Packit Service 0a38ef
                raise RuntimeError(
Packit Service 0a38ef
                    "You cannot specify a --auto-forwarders option without "
Packit Service 0a38ef
                    "the --setup-dns option")
Packit Service 0a38ef
            if self.no_forwarders:
Packit Service 0a38ef
                raise RuntimeError(
Packit Service 0a38ef
                    "You cannot specify a --no-forwarders option without the "
Packit Service 0a38ef
                    "--setup-dns option")
Packit Service 0a38ef
            if self.forward_policy:
Packit Service 0a38ef
                raise RuntimeError(
Packit Service 0a38ef
                    "You cannot specify a --forward-policy option without the "
Packit Service 0a38ef
                    "--setup-dns option")
Packit Service 0a38ef
            if self.reverse_zones:
Packit Service 0a38ef
                raise RuntimeError(
Packit Service 0a38ef
                    "You cannot specify a --reverse-zone option without the "
Packit Service 0a38ef
                    "--setup-dns option")
Packit Service 0a38ef
            if self.auto_reverse:
Packit Service 0a38ef
                raise RuntimeError(
Packit Service 0a38ef
                    "You cannot specify a --auto-reverse option without the "
Packit Service 0a38ef
                    "--setup-dns option")
Packit Service 0a38ef
            if self.no_reverse:
Packit Service 0a38ef
                raise RuntimeError(
Packit Service 0a38ef
                    "You cannot specify a --no-reverse option without the "
Packit Service 0a38ef
                    "--setup-dns option")
Packit Service 0a38ef
            if self.no_dnssec_validation:
Packit Service 0a38ef
                raise RuntimeError(
Packit Service 0a38ef
                    "You cannot specify a --no-dnssec-validation option "
Packit Service 0a38ef
                    "without the --setup-dns option")
Packit Service 0a38ef
        elif self.forwarders and self.no_forwarders:
Packit Service 0a38ef
            raise RuntimeError(
Packit Service 0a38ef
                "You cannot specify a --forwarder option together with "
Packit Service 0a38ef
                "--no-forwarders")
Packit Service 0a38ef
        elif self.auto_forwarders and self.no_forwarders:
Packit Service 0a38ef
            raise RuntimeError(
Packit Service 0a38ef
                "You cannot specify a --auto-forwarders option together with "
Packit Service 0a38ef
                "--no-forwarders")
Packit Service 0a38ef
        elif self.reverse_zones and self.no_reverse:
Packit Service 0a38ef
            raise RuntimeError(
Packit Service 0a38ef
                "You cannot specify a --reverse-zone option together with "
Packit Service 0a38ef
                "--no-reverse")
Packit Service 0a38ef
        elif self.auto_reverse and self.no_reverse:
Packit Service 0a38ef
            raise RuntimeError(
Packit Service 0a38ef
                "You cannot specify a --auto-reverse option together with "
Packit Service 0a38ef
                "--no-reverse")
Packit Service 0a38ef
Packit Service 0a38ef
        if not self.setup_adtrust:
Packit Service 0a38ef
            if self.add_agents:
Packit Service 0a38ef
                raise RuntimeError(
Packit Service 0a38ef
                    "You cannot specify an --add-agents option without the "
Packit Service 0a38ef
                    "--setup-adtrust option")
Packit Service 0a38ef
Packit Service 0a38ef
            if self.enable_compat:
Packit Service 0a38ef
                raise RuntimeError(
Packit Service 0a38ef
                    "You cannot specify an --enable-compat option without the "
Packit Service 0a38ef
                    "--setup-adtrust option")
Packit Service 0a38ef
Packit Service 0a38ef
            if self.netbios_name:
Packit Service 0a38ef
                raise RuntimeError(
Packit Service 0a38ef
                    "You cannot specify a --netbios-name option without the "
Packit Service 0a38ef
                    "--setup-adtrust option")
Packit Service 0a38ef
Packit Service 0a38ef
            if self.no_msdcs:
Packit Service 0a38ef
                raise RuntimeError(
Packit Service 0a38ef
                    "You cannot specify a --no-msdcs option without the "
Packit Service 0a38ef
                    "--setup-adtrust option")
Packit Service 0a38ef
Packit Service 0a38ef
        if not hasattr(self, 'replica_install'):
Packit Service 0a38ef
            if self.external_cert_files and self.dirsrv_cert_files:
Packit Service 0a38ef
                raise RuntimeError(
Packit Service 0a38ef
                    "Service certificate file options cannot be used with the "
Packit Service 0a38ef
                    "external CA options.")
Packit Service 0a38ef
Packit Service 0a38ef
            if self.external_ca_type and not self.external_ca:
Packit Service 0a38ef
                raise RuntimeError(
Packit Service 0a38ef
                    "You cannot specify --external-ca-type without "
Packit Service 0a38ef
                    "--external-ca")
Packit Service 0a38ef
Packit Service 0a38ef
            if self.external_ca_profile and not self.external_ca:
Packit Service 0a38ef
                raise RuntimeError(
Packit Service 0a38ef
                    "You cannot specify --external-ca-profile without "
Packit Service 0a38ef
                    "--external-ca")
Packit Service 0a38ef
Packit Service 0a38ef
            if self.uninstalling:
Packit Service 0a38ef
                if (self.realm_name or self.admin_password or
Packit Service 0a38ef
                        self.master_password):
Packit Service 0a38ef
                    raise RuntimeError(
Packit Service 0a38ef
                        "In uninstall mode, -a, -r and -P options are not "
Packit Service 0a38ef
                        "allowed")
Packit Service 0a38ef
            elif not self.interactive:
Packit Service 0a38ef
                if (not self.realm_name or not self.dm_password or
Packit Service 0a38ef
                        not self.admin_password):
Packit Service 0a38ef
                    raise RuntimeError(
Packit Service 0a38ef
                        "In unattended mode you need to provide at least -r, "
Packit Service 0a38ef
                        "-p and -a options")
Packit Service 0a38ef
                if self.setup_dns:
Packit Service 0a38ef
                    if (not self.forwarders and
Packit Service 0a38ef
                            not self.no_forwarders and
Packit Service 0a38ef
                            not self.auto_forwarders):
Packit Service 0a38ef
                        raise RuntimeError(
Packit Service 0a38ef
                            "You must specify at least one of --forwarder, "
Packit Service 0a38ef
                            "--auto-forwarders, or --no-forwarders options")
Packit Service 0a38ef
Packit Service 0a38ef
            any_ignore_option_true = any(
Packit Service 0a38ef
                [self.ignore_topology_disconnect, self.ignore_last_of_role])
Packit Service 0a38ef
            if any_ignore_option_true and not self.uninstalling:
Packit Service 0a38ef
                raise RuntimeError(
Packit Service 0a38ef
                    "'--ignore-topology-disconnect/--ignore-last-of-role' "
Packit Service 0a38ef
                    "options can be used only during uninstallation")
Packit Service 0a38ef
Packit Service 0a38ef
            if self.idmax < self.idstart:
Packit Service 0a38ef
                raise RuntimeError(
Packit Service 0a38ef
                    "idmax (%s) cannot be smaller than idstart (%s)" %
Packit Service 0a38ef
                    (self.idmax, self.idstart))
Packit Service 0a38ef
        else:
Packit Service 0a38ef
            # replica installers
Packit Service 0a38ef
            if self.servers and not self.domain_name:
Packit Service 0a38ef
                raise RuntimeError(
Packit Service 0a38ef
                    "The --server option cannot be used without providing "
Packit Service 0a38ef
                    "domain via the --domain option")
Packit Service 0a38ef
Packit Service 0a38ef
            if self.setup_dns:
Packit Service 0a38ef
                if (not self.forwarders and
Packit Service 0a38ef
                        not self.no_forwarders and
Packit Service 0a38ef
                        not self.auto_forwarders):
Packit Service 0a38ef
                    raise RuntimeError(
Packit Service 0a38ef
                        "You must specify at least one of --forwarder, "
Packit Service 0a38ef
                        "--auto-forwarders, or --no-forwarders options")
Packit Service 0a38ef
Packit Service 0a38ef
    except RuntimeError as e:
Packit Service 0a38ef
        ansible_module.fail_json(msg=to_native(e))
Packit Service 0a38ef
Packit Service 0a38ef
    # #######################################################################
Packit Service 0a38ef
Packit Service 0a38ef
    # If any of the key file options are selected, all are required.
Packit Service 0a38ef
    cert_file_req = (options.dirsrv_cert_files, options.http_cert_files)
Packit Service 0a38ef
    cert_file_opt = (options.pkinit_cert_files,)
Packit Service 0a38ef
    if not options.no_pkinit:
Packit Service 0a38ef
        cert_file_req += cert_file_opt
Packit Service 0a38ef
    if options.no_pkinit and options.pkinit_cert_files:
Packit Service 0a38ef
        ansible_module.fail_json(
Packit Service 0a38ef
            msg="no-pkinit and pkinit-cert-file cannot be specified together"
Packit Service 0a38ef
        )
Packit Service 0a38ef
    if any(cert_file_req + cert_file_opt) and not all(cert_file_req):
Packit Service 0a38ef
        ansible_module.fail_json(
Packit Service 0a38ef
            msg="dirsrv-cert-file, http-cert-file, and pkinit-cert-file "
Packit Service 0a38ef
            "or no-pkinit are required if any key file options are used."
Packit Service 0a38ef
        )
Packit Service 0a38ef
Packit Service 0a38ef
    if not options.interactive:
Packit Service 0a38ef
        if options.dirsrv_cert_files and options.dirsrv_pin is None:
Packit Service 0a38ef
            ansible_module.fail_json(
Packit Service 0a38ef
                msg="You must specify dirsrv-pin with dirsrv-cert-file")
Packit Service 0a38ef
        if options.http_cert_files and options.http_pin is None:
Packit Service 0a38ef
            ansible_module.fail_json(
Packit Service 0a38ef
                msg="You must specify http-pin with http-cert-file")
Packit Service 0a38ef
        if options.pkinit_cert_files and options.pkinit_pin is None:
Packit Service 0a38ef
            ansible_module.fail_json(
Packit Service 0a38ef
                msg="You must specify pkinit-pin with pkinit-cert-file")
Packit Service 0a38ef
Packit Service 0a38ef
    if not options.setup_dns:
Packit Service 0a38ef
        # lists
Packit Service 0a38ef
        for x in ["forwarders", "reverse_zones"]:
Packit Service 0a38ef
            if len(getattr(options, x)) > 1:
Packit Service 0a38ef
                ansible_module.fail_json(
Packit Service 0a38ef
                    msg="You cannot specify %s without setting setup-dns" % x)
Packit Service 0a38ef
        # bool and str values
Packit Service 0a38ef
        for x in ["auto_forwarders", "no_forwarders",
Packit Service 0a38ef
                  "auto_reverse", "no_reverse", "no_dnssec_validation",
Packit Service 0a38ef
                  "forward_policy"]:
Packit Service 0a38ef
            if getattr(options, x):
Packit Service 0a38ef
                ansible_module.fail_json(
Packit Service 0a38ef
                    msg="You cannot specify %s without setting setup-dns" % x)
Packit Service 0a38ef
Packit Service 0a38ef
    elif len(options.forwarders) > 0 and options.no_forwarders:
Packit Service 0a38ef
        ansible_module.fail_json(
Packit Service 0a38ef
            msg="You cannot specify forwarders together with no-forwarders")
Packit Service 0a38ef
    elif options.auto_forwarders and options.no_forwarders:
Packit Service 0a38ef
        ansible_module.fail_json(
Packit Service 0a38ef
            msg="You cannot specify auto-forwarders together with "
Packit Service 0a38ef
            "no-forwarders")
Packit Service 0a38ef
    elif len(options.reverse_zones) > 0 and options.no_reverse:
Packit Service 0a38ef
        ansible_module.fail_json(
Packit Service 0a38ef
            msg="You cannot specify reverse-zones together with no-reverse")
Packit Service 0a38ef
    elif options.auto_reverse and options.no_reverse:
Packit Service 0a38ef
        ansible_module.fail_json(
Packit Service 0a38ef
            msg="You cannot specify auto-reverse together with no-reverse")
Packit Service 0a38ef
Packit Service 0a38ef
    if not hasattr(self, 'replica_install'):
Packit Service 0a38ef
        if options.external_cert_files and options.dirsrv_cert_files:
Packit Service 0a38ef
            ansible_module.fail_json(
Packit Service 0a38ef
                msg="Service certificate file options cannot be used with the "
Packit Service 0a38ef
                "external CA options.")
Packit Service 0a38ef
Packit Service 0a38ef
        if options.external_ca_type and not options.external_ca:
Packit Service 0a38ef
            ansible_module.fail_json(
Packit Service 0a38ef
                msg="You cannot specify external-ca-type without external-ca")
Packit Service 0a38ef
Packit Service 0a38ef
        # if options.uninstalling:
Packit Service 0a38ef
        #    if (options.realm_name or options.admin_password or
Packit Service 0a38ef
        #            options.master_password):
Packit Service 0a38ef
        #        ansible_module.fail_json(
Packit Service 0a38ef
        #            msg="In uninstall mode, -a, -r and -P options are not "
Packit Service 0a38ef
        #            "allowed")
Packit Service 0a38ef
        # elif not options.interactive:
Packit Service 0a38ef
        #    if (not options.realm_name or not options.dm_password or
Packit Service 0a38ef
        #            not options.admin_password):
Packit Service 0a38ef
        #        ansible_module.fail_json(msg=
Packit Service 0a38ef
        #            "In unattended mode you need to provide at least -r, "
Packit Service 0a38ef
        #            "-p and -a options")
Packit Service 0a38ef
        #    if options.setup_dns:
Packit Service 0a38ef
        #        if (not options.forwarders and
Packit Service 0a38ef
        #                not options.no_forwarders and
Packit Service 0a38ef
        #                not options.auto_forwarders):
Packit Service 0a38ef
        #            ansible_module.fail_json(msg=
Packit Service 0a38ef
        #                "You must specify at least one of --forwarder, "
Packit Service 0a38ef
        #                "--auto-forwarders, or --no-forwarders options")
Packit Service 0a38ef
        if (not options.realm_name or not options.dm_password or
Packit Service 0a38ef
                not options.admin_password):
Packit Service 0a38ef
            ansible_module.fail_json(
Packit Service 0a38ef
                msg="You need to provide at least realm_name, dm_password "
Packit Service 0a38ef
                "and admin_password")
Packit Service 0a38ef
        if options.setup_dns:
Packit Service 0a38ef
            if len(options.forwarders) < 1 and not options.no_forwarders and \
Packit Service 0a38ef
               not options.auto_forwarders:
Packit Service 0a38ef
                ansible_module.fail_json(
Packit Service 0a38ef
                    msg="You must specify at least one of forwarders, "
Packit Service 0a38ef
                    "auto-forwarders or no-forwarders")
Packit Service 0a38ef
Packit Service 0a38ef
        # any_ignore_option_true = any(
Packit Service 0a38ef
        #    [options.ignore_topology_disconnect, options.ignore_last_of_role])
Packit Service 0a38ef
        # if any_ignore_option_true and not options.uninstalling:
Packit Service 0a38ef
        #    ansible_module.fail_json(
Packit Service 0a38ef
        #        msg="ignore-topology-disconnect and ignore-last-of-role "
Packit Service 0a38ef
        #        "can be used only during uninstallation")
Packit Service 0a38ef
Packit Service 0a38ef
        if options.idmax < options.idstart:
Packit Service 0a38ef
            ansible_module.fail_json(
Packit Service 0a38ef
                msg="idmax (%s) cannot be smaller than idstart (%s)" %
Packit Service 0a38ef
                (options.idmax, options.idstart))
Packit Service 0a38ef
Packit Service 0a38ef
    # validation #############################################################
Packit Service 0a38ef
Packit Service 0a38ef
    if options.dm_password is None:
Packit Service 0a38ef
        ansible_module.fail_json(msg="Directory Manager password required")
Packit Service 0a38ef
Packit Service 0a38ef
    if options.admin_password is None:
Packit Service 0a38ef
        ansible_module.fail_json(msg="IPA admin password required")
Packit Service 0a38ef
Packit Service 0a38ef
    # validation ############################################################
Packit Service 0a38ef
Packit Service 0a38ef
    # domain_level
Packit Service 0a38ef
    if options.domain_level < MIN_DOMAIN_LEVEL:
Packit Service 0a38ef
        ansible_module.fail_json(
Packit Service 0a38ef
            msg="Domain Level cannot be lower than %d" % MIN_DOMAIN_LEVEL)
Packit Service 0a38ef
    elif options.domain_level > MAX_DOMAIN_LEVEL:
Packit Service 0a38ef
        ansible_module.fail_json(
Packit Service 0a38ef
            msg="Domain Level cannot be higher than %d" % MAX_DOMAIN_LEVEL)
Packit Service 0a38ef
Packit Service 0a38ef
    # dirsrv_config_file
Packit Service 0a38ef
    if options.dirsrv_config_file is not None:
Packit Service 0a38ef
        if not os.path.exists(options.dirsrv_config_file):
Packit Service 0a38ef
            ansible_module.fail_json(
Packit Service 0a38ef
                msg="File %s does not exist." % options.dirsrv_config_file)
Packit Service 0a38ef
Packit Service 0a38ef
    # domain_name
Packit Service 0a38ef
    # Validation is done later on in ipaserver_prepare dns.install_check
Packit Service 0a38ef
Packit Service 0a38ef
    # dm_password
Packit Service 0a38ef
    with redirect_stdout(ansible_log):
Packit Service 0a38ef
        validate_dm_password(options.dm_password)
Packit Service 0a38ef
Packit Service 0a38ef
    # admin_password
Packit Service 0a38ef
    with redirect_stdout(ansible_log):
Packit Service 0a38ef
        validate_admin_password(options.admin_password)
Packit Service 0a38ef
Packit Service 0a38ef
    # pkinit is not supported on DL0, don't allow related options
Packit Service 0a38ef
Packit Service 0a38ef
    """
Packit Service 0a38ef
    # replica install: if not options.replica_file is None:
Packit Service 0a38ef
    if (not options._replica_install and \
Packit Service 0a38ef
        not options.domain_level > DOMAIN_LEVEL_0) or \
Packit Service 0a38ef
        (options._replica_install and options.replica_file is not None):
Packit Service 0a38ef
        if (options.no_pkinit or options.pkinit_cert_files is not None or
Packit Service 0a38ef
                options.pkinit_pin is not None):
Packit Service 0a38ef
            ansible_module.fail_json(
Packit Service 0a38ef
                msg="pkinit on domain level 0 is not supported. Please "
Packit Service 0a38ef
                "don't use any pkinit-related options.")
Packit Service 0a38ef
        options.no_pkinit = True
Packit Service 0a38ef
    """
Packit Service 0a38ef
Packit Service 0a38ef
    if options.setup_dns:
Packit Service 0a38ef
        if len(options.forwarders) < 1 and not options.no_forwarders and \
Packit Service 0a38ef
           not options.auto_forwarders:
Packit Service 0a38ef
            ansible_module.fail_json(
Packit Service 0a38ef
                msg="You must specify at least one of forwarders, "
Packit Service 0a38ef
                "auto-forwarders or no-forwarders")
Packit Service 0a38ef
Packit Service 0a38ef
    if NUM_VERSION >= 40200 and options.master_password and \
Packit Service 0a38ef
       not options.external_cert_files:
Packit Service 0a38ef
        ansible_module.warn(
Packit Service 0a38ef
            "Specifying kerberos master-password is deprecated")
Packit Service 0a38ef
Packit Service 0a38ef
    options._installation_cleanup = True
Packit Service 0a38ef
    if not options.external_ca and not options.external_cert_files and \
Packit Service 0a38ef
       is_ipa_configured():
Packit Service 0a38ef
        options._installation_cleanup = False
Packit Service 0a38ef
        ansible_module.log(
Packit Service 0a38ef
            "IPA server is already configured on this system. If you want "
Packit Service 0a38ef
            "to reinstall the IPA server, please uninstall it first.")
Packit Service 0a38ef
        ansible_module.exit_json(changed=False,
Packit Service 0a38ef
                                 server_already_configured=True)
Packit Service 0a38ef
Packit Service 0a38ef
    client_fstore = sysrestore.FileStore(paths.IPA_CLIENT_SYSRESTORE)
Packit Service 0a38ef
    if client_fstore.has_files():
Packit Service 0a38ef
        options._installation_cleanup = False
Packit Service 0a38ef
        ansible_module.log(
Packit Service 0a38ef
            "IPA client is already configured on this system. "
Packit Service 0a38ef
            "Please uninstall it before configuring the IPA server.")
Packit Service 0a38ef
        ansible_module.exit_json(changed=False,
Packit Service 0a38ef
                                 client_already_configured=True)
Packit Service 0a38ef
Packit Service 0a38ef
    # validate reverse_zones
Packit Service 0a38ef
    if not options.allow_zone_overlap:
Packit Service 0a38ef
        for zone in options.reverse_zones:
Packit Service 0a38ef
            with redirect_stdout(ansible_log):
Packit Service 0a38ef
                check_zone_overlap(zone)
Packit Service 0a38ef
Packit Service 0a38ef
    # validate zonemgr
Packit Service 0a38ef
    if options.zonemgr:
Packit Service 0a38ef
        if six.PY3:
Packit Service 0a38ef
            with redirect_stdout(ansible_log):
Packit Service 0a38ef
                bindinstance.validate_zonemgr_str(options.zonemgr)
Packit Service 0a38ef
        else:
Packit Service 0a38ef
            try:
Packit Service 0a38ef
                # IDNA support requires unicode
Packit Service 0a38ef
                encoding = getattr(sys.stdin, 'encoding', None)
Packit Service 0a38ef
                if encoding is None:
Packit Service 0a38ef
                    encoding = 'utf-8'
Packit Service 0a38ef
                value = options.zonemgr
Packit Service 0a38ef
                if not isinstance(value, unicode):
Packit Service 0a38ef
                    value = options.zonemgr.decode(encoding)
Packit Service 0a38ef
                else:
Packit Service 0a38ef
                    value = options.zonemgr
Packit Service 0a38ef
                with redirect_stdout(ansible_log):
Packit Service 0a38ef
                    bindinstance.validate_zonemgr_str(value)
Packit Service 0a38ef
            except ValueError as e:
Packit Service 0a38ef
                # FIXME we can do this in better way
Packit Service 0a38ef
                # https://fedorahosted.org/freeipa/ticket/4804
Packit Service 0a38ef
                # decode to proper stderr encoding
Packit Service 0a38ef
                stderr_encoding = getattr(sys.stderr, 'encoding', None)
Packit Service 0a38ef
                if stderr_encoding is None:
Packit Service 0a38ef
                    stderr_encoding = 'utf-8'
Packit Service 0a38ef
                error = unicode(e).encode(stderr_encoding)
Packit Service 0a38ef
                ansible_module.fail_json(msg=error)
Packit Service 0a38ef
Packit Service 0a38ef
    # external cert file paths are absolute
Packit Service 0a38ef
    if options.external_cert_files:
Packit Service 0a38ef
        for path in options.external_cert_files:
Packit Service 0a38ef
            if not os.path.isabs(path):
Packit Service 0a38ef
                ansible_module.fail_json(
Packit Service 0a38ef
                    msg="External cert file '%s' must use an absolute "
Packit Service 0a38ef
                    "path" % path)
Packit Service 0a38ef
Packit Service 0a38ef
    options.setup_ca = True
Packit Service 0a38ef
    # We only set up the CA if the PKCS#12 options are not given.
Packit Service 0a38ef
    if options.dirsrv_cert_files and len(options.dirsrv_cert_files) > 0:
Packit Service 0a38ef
        options.setup_ca = False
Packit Service 0a38ef
    else:
Packit Service 0a38ef
        options.setup_ca = True
Packit Service 0a38ef
Packit Service 0a38ef
    if not options.setup_ca and options.ca_subject:
Packit Service 0a38ef
        ansible_module.fail_json(
Packit Service 0a38ef
            msg="--ca-subject cannot be used with CA-less installation")
Packit Service 0a38ef
    if not options.setup_ca and options.subject_base:
Packit Service 0a38ef
        ansible_module.fail_json(
Packit Service 0a38ef
            msg="--subject-base cannot be used with CA-less installation")
Packit Service 0a38ef
    if not options.setup_ca and options.setup_kra:
Packit Service 0a38ef
        ansible_module.fail_json(
Packit Service 0a38ef
            msg="--setup-kra cannot be used with CA-less installation")
Packit Service 0a38ef
Packit Service 0a38ef
    # This will override any settings passed in on the cmdline
Packit Service 0a38ef
    if os.path.isfile(paths.ROOT_IPA_CACHE):
Packit Service 0a38ef
        # dm_password check removed, checked already
Packit Service 0a38ef
        try:
Packit Service 0a38ef
            cache_vars = read_cache(options.dm_password)
Packit Service 0a38ef
            options.__dict__.update(cache_vars)
Packit Service 0a38ef
            if cache_vars.get('external_ca', False):
Packit Service 0a38ef
                options.external_ca = False
Packit Service 0a38ef
                options.interactive = False
Packit Service 0a38ef
        except Exception as e:
Packit Service 0a38ef
            ansible_module.fail_json(
Packit Service 0a38ef
                msg="Cannot process the cache file: %s" % str(e))
Packit Service 0a38ef
Packit Service 0a38ef
    # ca_subject
Packit Service 0a38ef
    if options.ca_subject:
Packit Service 0a38ef
        ca.subject_validator(ca.VALID_SUBJECT_ATTRS, options.ca_subject)
Packit Service 0a38ef
Packit Service a166ed
    # Memory check
Packit Service a166ed
    if not options.skip_mem_check and check_available_memory is not None:
Packit Service a166ed
        check_available_memory(ca=options.dirsrv_cert_files and
Packit Service a166ed
                               len(options.dirsrv_cert_files) > 0)
Packit Service 0a38ef
Packit Service a166ed
    # IPv6 and SELinux check
Packit Service 0a38ef
    tasks.check_ipv6_stack_enabled()
Packit Service 0a38ef
    tasks.check_selinux_status()
Packit Service 0a38ef
    if check_ldap_conf is not None:
Packit Service 0a38ef
        check_ldap_conf()
Packit Service 0a38ef
Packit Service 0a38ef
    _installation_cleanup = True
Packit Service 0a38ef
    if not options.external_ca and not options.external_cert_files and \
Packit Service 0a38ef
       is_ipa_configured():
Packit Service 0a38ef
        _installation_cleanup = False
Packit Service 0a38ef
        ansible_module.fail_json(
Packit Service 0a38ef
            msg="IPA server is already configured on this system.")
Packit Service 0a38ef
Packit Service 0a38ef
    if not options.no_ntp:
Packit Service 0a38ef
        try:
Packit Service 0a38ef
            timeconf.check_timedate_services()
Packit Service 0a38ef
        except timeconf.NTPConflictingService as e:
Packit Service 0a38ef
            ansible_module.log(
Packit Service 0a38ef
                "WARNING: conflicting time&date synchronization service "
Packit Service 0a38ef
                "'%s' will be disabled in favor of chronyd" %
Packit Service 0a38ef
                e.conflicting_service)
Packit Service 0a38ef
        except timeconf.NTPConfigurationError:
Packit Service 0a38ef
            pass
Packit Service 0a38ef
Packit Service 0a38ef
    if hasattr(httpinstance, "httpd_443_configured"):
Packit Service 0a38ef
        # Check to see if httpd is already configured to listen on 443
Packit Service 0a38ef
        if httpinstance.httpd_443_configured():
Packit Service 0a38ef
            ansible_module.fail_json(
Packit Service 0a38ef
                msg="httpd is already configured to listen on 443.")
Packit Service 0a38ef
Packit Service 0a38ef
    if not options.external_cert_files:
Packit Service 0a38ef
        # Make sure the 389-ds ports are available
Packit Service 0a38ef
        try:
Packit Service 0a38ef
            check_dirsrv(True)
Packit Service 0a38ef
        except ScriptError as e:
Packit Service 0a38ef
            ansible_module.fail_json(msg=e)
Packit Service 0a38ef
Packit Service 0a38ef
    # check bind packages are installed
Packit Service 0a38ef
    if options.setup_dns:
Packit Service 0a38ef
        # Don't require an external DNS to say who we are if we are
Packit Service 0a38ef
        # setting up a local DNS server.
Packit Service 0a38ef
        options.no_host_dns = True
Packit Service 0a38ef
Packit Service 0a38ef
    # host name
Packit Service 0a38ef
    if options.host_name:
Packit Service 0a38ef
        host_default = options.host_name
Packit Service 0a38ef
    else:
Packit Service 0a38ef
        host_default = get_fqdn()
Packit Service 0a38ef
Packit Service 0a38ef
    try:
Packit Service 0a38ef
        verify_fqdn(host_default, options.no_host_dns)
Packit Service 0a38ef
        host_name = host_default
Packit Service 0a38ef
    except BadHostError as e:
Packit Service 0a38ef
        ansible_module.fail_json(msg=e)
Packit Service 0a38ef
Packit Service 0a38ef
    host_name = host_name.lower()
Packit Service 0a38ef
Packit Service 0a38ef
    if not options.domain_name:
Packit Service 0a38ef
        domain_name = host_name[host_name.find(".")+1:]
Packit Service 0a38ef
        try:
Packit Service 0a38ef
            validate_domain_name(domain_name)
Packit Service 0a38ef
        except ValueError as e:
Packit Service 0a38ef
            ansible_module.fail_json(
Packit Service 0a38ef
                msg="Invalid domain name: %s" % unicode(e))
Packit Service 0a38ef
    else:
Packit Service 0a38ef
        domain_name = options.domain_name
Packit Service 0a38ef
Packit Service 0a38ef
    domain_name = domain_name.lower()
Packit Service 0a38ef
Packit Service 0a38ef
    if not options.realm_name:
Packit Service 0a38ef
        realm_name = domain_name.upper()
Packit Service 0a38ef
    else:
Packit Service 0a38ef
        realm_name = options.realm_name.upper()
Packit Service 0a38ef
Packit Service 0a38ef
    argspec = inspect.getargspec(validate_domain_name)
Packit Service 0a38ef
    if "entity" in argspec.args:
Packit Service 0a38ef
        # NUM_VERSION >= 40690:
Packit Service 0a38ef
        try:
Packit Service 0a38ef
            validate_domain_name(realm_name, entity="realm")
Packit Service 0a38ef
        except ValueError as e:
Packit Service 0a38ef
            raise ScriptError("Invalid realm name: {}".format(unicode(e)))
Packit Service 0a38ef
Packit Service 0a38ef
    if not options.setup_adtrust:
Packit Service 0a38ef
        # If domain name and realm does not match, IPA server will not be able
Packit Service 0a38ef
        # to establish trust with Active Directory. Fail.
Packit Service 0a38ef
Packit Service 0a38ef
        if domain_name.upper() != realm_name:
Packit Service 0a38ef
            ansible_module.warn(
Packit Service 0a38ef
                "Realm name does not match the domain name: "
Packit Service 0a38ef
                "You will not be able to establish trusts with Active "
Packit Service 0a38ef
                "Directory.")
Packit Service 0a38ef
Packit Service 0a38ef
    # Do not ask for time source
Packit Service 0a38ef
    # if not options.no_ntp and not options.unattended and not (
Packit Service 0a38ef
    #        options.ntp_servers or options.ntp_pool):
Packit Service 0a38ef
    #    options.ntp_servers, options.ntp_pool = timeconf.get_time_source()
Packit Service 0a38ef
Packit Service 0a38ef
    #########################################################################
Packit Service 0a38ef
Packit Service 0a38ef
    http_pkcs12_file = None
Packit Service 0a38ef
    http_pkcs12_info = None
Packit Service 0a38ef
    http_ca_cert = None
Packit Service 0a38ef
    dirsrv_pkcs12_file = None
Packit Service 0a38ef
    dirsrv_pkcs12_info = None
Packit Service 0a38ef
    dirsrv_ca_cert = None
Packit Service 0a38ef
    pkinit_pkcs12_file = None
Packit Service 0a38ef
    pkinit_pkcs12_info = None
Packit Service 0a38ef
    pkinit_ca_cert = None
Packit Service 0a38ef
Packit Service 0a38ef
    if options.http_cert_files:
Packit Service 0a38ef
        if options.http_pin is None:
Packit Service 0a38ef
            ansible_module.fail_json(
Packit Service 0a38ef
                msg="Apache Server private key unlock password required")
Packit Service 0a38ef
        http_pkcs12_file, http_pin, http_ca_cert = load_pkcs12(
Packit Service 0a38ef
            cert_files=options.http_cert_files,
Packit Service 0a38ef
            key_password=options.http_pin,
Packit Service 0a38ef
            key_nickname=options.http_cert_name,
Packit Service 0a38ef
            ca_cert_files=options.ca_cert_files,
Packit Service 0a38ef
            host_name=host_name)
Packit Service 0a38ef
        http_pkcs12_info = (http_pkcs12_file.name, http_pin)
Packit Service 0a38ef
Packit Service 0a38ef
    if options.dirsrv_cert_files:
Packit Service 0a38ef
        if options.dirsrv_pin is None:
Packit Service 0a38ef
            ansible_module.fail_json(
Packit Service 0a38ef
                msg="Directory Server private key unlock password required")
Packit Service 0a38ef
        dirsrv_pkcs12_file, dirsrv_pin, dirsrv_ca_cert = load_pkcs12(
Packit Service 0a38ef
            cert_files=options.dirsrv_cert_files,
Packit Service 0a38ef
            key_password=options.dirsrv_pin,
Packit Service 0a38ef
            key_nickname=options.dirsrv_cert_name,
Packit Service 0a38ef
            ca_cert_files=options.ca_cert_files,
Packit Service 0a38ef
            host_name=host_name)
Packit Service 0a38ef
        dirsrv_pkcs12_info = (dirsrv_pkcs12_file.name, dirsrv_pin)
Packit Service 0a38ef
Packit Service 0a38ef
    if options.pkinit_cert_files:
Packit Service 0a38ef
        if options.pkinit_pin is None:
Packit Service 0a38ef
            ansible_module.fail_json(
Packit Service 0a38ef
                msg="Kerberos KDC private key unlock password required")
Packit Service 0a38ef
        pkinit_pkcs12_file, pkinit_pin, pkinit_ca_cert = load_pkcs12(
Packit Service 0a38ef
            cert_files=options.pkinit_cert_files,
Packit Service 0a38ef
            key_password=options.pkinit_pin,
Packit Service 0a38ef
            key_nickname=options.pkinit_cert_name,
Packit Service 0a38ef
            ca_cert_files=options.ca_cert_files,
Packit Service 0a38ef
            realm_name=realm_name)
Packit Service 0a38ef
        pkinit_pkcs12_info = (pkinit_pkcs12_file.name, pkinit_pin)
Packit Service 0a38ef
Packit Service 0a38ef
    if options.http_cert_files and options.dirsrv_cert_files and \
Packit Service 0a38ef
       http_ca_cert != dirsrv_ca_cert:
Packit Service 0a38ef
        ansible_module.fail_json(
Packit Service 0a38ef
            msg="Apache Server SSL certificate and Directory Server SSL "
Packit Service 0a38ef
            "certificate are not signed by the same CA certificate")
Packit Service 0a38ef
Packit Service 0a38ef
    if options.http_cert_files and options.pkinit_cert_files and \
Packit Service 0a38ef
       http_ca_cert != pkinit_ca_cert:
Packit Service 0a38ef
        ansible_module.fail_json(
Packit Service 0a38ef
            msg="Apache Server SSL certificate and PKINIT KDC "
Packit Service 0a38ef
            "certificate are not signed by the same CA certificate")
Packit Service 0a38ef
Packit Service 0a38ef
    # done ##################################################################
Packit Service 0a38ef
Packit Service 0a38ef
    # Copy pkcs12_files to make them persistent till deployment is done
Packit Service 0a38ef
    # and encode certificates for ansible compatibility
Packit Service 0a38ef
    if http_pkcs12_info is not None:
Packit Service 0a38ef
        copyfile(http_pkcs12_file.name, "/etc/ipa/.tmp_pkcs12_http")
Packit Service 0a38ef
        http_pkcs12_info = ("/etc/ipa/.tmp_pkcs12_http", http_pin)
Packit Service 0a38ef
        http_ca_cert = encode_certificate(http_ca_cert)
Packit Service 0a38ef
    if dirsrv_pkcs12_info is not None:
Packit Service 0a38ef
        copyfile(dirsrv_pkcs12_file.name, "/etc/ipa/.tmp_pkcs12_dirsrv")
Packit Service 0a38ef
        dirsrv_pkcs12_info = ("/etc/ipa/.tmp_pkcs12_dirsrv", dirsrv_pin)
Packit Service 0a38ef
        dirsrv_ca_cert = encode_certificate(dirsrv_ca_cert)
Packit Service 0a38ef
    if pkinit_pkcs12_info is not None:
Packit Service 0a38ef
        copyfile(pkinit_pkcs12_file.name, "/etc/ipa/.tmp_pkcs12_pkinit")
Packit Service 0a38ef
        pkinit_pkcs12_info = ("/etc/ipa/.tmp_pkcs12_pkinit", pkinit_pin)
Packit Service 0a38ef
        pkinit_ca_cert = encode_certificate(pkinit_ca_cert)
Packit Service 0a38ef
Packit Service 0a38ef
    ansible_module.exit_json(changed=False,
Packit Service 0a38ef
                             ipa_python_version=IPA_PYTHON_VERSION,
Packit Service 0a38ef
                             # basic
Packit Service 0a38ef
                             domain=options.domain_name,
Packit Service 0a38ef
                             realm=realm_name,
Packit Service 0a38ef
                             hostname=host_name,
Packit Service 0a38ef
                             _hostname_overridden=bool(options.host_name),
Packit Service 0a38ef
                             no_host_dns=options.no_host_dns,
Packit Service 0a38ef
                             # server
Packit Service 0a38ef
                             setup_adtrust=options.setup_adtrust,
Packit Service 0a38ef
                             setup_kra=options.setup_kra,
Packit Service 0a38ef
                             setup_ca=options.setup_ca,
Packit Service 0a38ef
                             idstart=options.idstart,
Packit Service 0a38ef
                             idmax=options.idmax,
Packit Service 0a38ef
                             no_pkinit=options.no_pkinit,
Packit Service 0a38ef
                             # ssl certificate
Packit Service 0a38ef
                             _dirsrv_pkcs12_info=dirsrv_pkcs12_info,
Packit Service 0a38ef
                             _dirsrv_ca_cert=dirsrv_ca_cert,
Packit Service 0a38ef
                             _http_pkcs12_info=http_pkcs12_info,
Packit Service 0a38ef
                             _http_ca_cert=http_ca_cert,
Packit Service 0a38ef
                             _pkinit_pkcs12_info=pkinit_pkcs12_info,
Packit Service 0a38ef
                             _pkinit_ca_cert=pkinit_ca_cert,
Packit Service 0a38ef
                             # certificate system
Packit Service 0a38ef
                             external_ca=options.external_ca,
Packit Service 0a38ef
                             external_ca_type=options.external_ca_type,
Packit Service 0a38ef
                             external_ca_profile=options.external_ca_profile,
Packit Service 0a38ef
                             # ad trust
Packit Service 0a38ef
                             rid_base=options.rid_base,
Packit Service 0a38ef
                             secondary_rid_base=options.secondary_rid_base,
Packit Service 0a38ef
                             # client
Packit Service 0a38ef
                             ntp_servers=options.ntp_servers,
Packit Service 0a38ef
                             ntp_pool=options.ntp_pool,
Packit Service 0a38ef
                             # additional
Packit Service 0a38ef
                             _installation_cleanup=_installation_cleanup,
Packit Service 0a38ef
                             domainlevel=options.domainlevel)
Packit Service 0a38ef
Packit Service 0a38ef
Packit Service 0a38ef
if __name__ == '__main__':
Packit Service 0a38ef
    main()