Blame plugins/modules/ipadnsrecord.py

Packit Service ee01e6
#!/usr/bin/python
Packit Service 0a38ef
# -*- coding: utf-8 -*-
Packit Service 0a38ef
Packit Service 0a38ef
# Authors:
Packit Service 0a38ef
#   Rafael Guterres Jeffman <rjeffman@redhat.com>
Packit Service 0a38ef
#
Packit Service 0a38ef
# Copyright (C) 2020 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
"""DNS Record ansible-freeipa module."""
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: ipadnsrecord
Packit Service 0a38ef
short description: Manage FreeIPA DNS records
Packit Service 0a38ef
description: Manage FreeIPA DNS records
Packit Service 0a38ef
options:
Packit Service 0a38ef
  ipaadmin_principal:
Packit Service 0a38ef
    description: The admin principal
Packit Service 0a38ef
    default: admin
Packit Service 0a38ef
  ipaadmin_password:
Packit Service 0a38ef
    description: The admin password
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
  records:
Packit Service 0a38ef
    description: The list of user dns records dicts
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    options:
Packit Service 0a38ef
      name:
Packit Service 0a38ef
        description: The DNS record name to manage.
Packit Service 0a38ef
        aliases: ["record_name"]
Packit Service 0a38ef
        required: true
Packit Service 0a38ef
      zone_name:
Packit Service a166ed
        description: |
Packit Service a166ed
          The DNS zone name to which DNS record needs to be managed.
Packit Service a166ed
          Required if not provided globally.
Packit Service 0a38ef
        aliases: ["dnszone"]
Packit Service a166ed
        required: false
Packit Service 0a38ef
      record_type:
Packit Service 0a38ef
        description: The type of DNS record.
Packit Service 0a38ef
        choices: ["A", "AAAA", "A6", "AFSDB", "CERT", "CNAME", "DLV", "DNAME",
Packit Service 0a38ef
                  "DS", "KX", "LOC", "MX", "NAPTR", "NS", "PTR", "SRV",
Packit Service 0a38ef
                  "SSHFP", "TLSA", "TXT", "URI"]
Packit Service 0a38ef
        default: "A"
Packit Service 0a38ef
      record_value:
Packit Service 0a38ef
        description: Manage DNS record name with these values.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: list
Packit Service 0a38ef
      record_ttl:
Packit Service 0a38ef
        description: Set the TTL for the record.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: int
Packit Service 0a38ef
      del_all:
Packit Service 0a38ef
        description: Delete all associated records.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: bool
Packit Service 0a38ef
      a_rec:
Packit Service 0a38ef
        description: Raw A record.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        aliases: ["a_record"]
Packit Service 0a38ef
      aaaa_rec:
Packit Service 0a38ef
        description: Raw AAAA record.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        aliases: ["aaaa_record"]
Packit Service 0a38ef
      a6_rec:
Packit Service 0a38ef
        description: Raw A6 record.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        aliases: ["a6_record"]
Packit Service 0a38ef
      afsdb_rec:
Packit Service 0a38ef
        description: Raw AFSDB record.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        aliases: ["afsdb_record"]
Packit Service 0a38ef
      cert_rec:
Packit Service 0a38ef
        description: Raw CERT record.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        aliases: ["cert_record"]
Packit Service 0a38ef
      cname_rec:
Packit Service 0a38ef
        description: Raw CNAME record.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        aliases: ["cname_record"]
Packit Service 0a38ef
      dlv_rec:
Packit Service 0a38ef
        description: Raw DLV record.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        aliases: ["dlv_record"]
Packit Service 0a38ef
      dname_rec:
Packit Service 0a38ef
        description: Raw DNAM record.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        aliases: ["dname_record"]
Packit Service 0a38ef
      ds_rec:
Packit Service 0a38ef
        description: Raw DS record.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        aliases: ["ds_record"]
Packit Service 0a38ef
      kx_rec:
Packit Service 0a38ef
        description: Raw KX record.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        aliases: ["kx_record"]
Packit Service 0a38ef
      loc_rec:
Packit Service 0a38ef
        description: Raw LOC record.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        aliases: ["loc_record"]
Packit Service 0a38ef
      mx_rec:
Packit Service 0a38ef
        description: Raw MX record.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        aliases: ["mx_record"]
Packit Service 0a38ef
      naptr_rec:
Packit Service 0a38ef
        description: Raw NAPTR record.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        aliases: ["naptr_record"]
Packit Service 0a38ef
      ns_rec:
Packit Service 0a38ef
        description: Raw NS record.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        aliases: ["ns_record"]
Packit Service 0a38ef
      ptr_rec:
Packit Service 0a38ef
        description: Raw PTR record.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        aliases: ["ptr_record"]
Packit Service 0a38ef
      srv_rec:
Packit Service 0a38ef
        description: Raw SRV record.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        aliases: ["srv_record"]
Packit Service 0a38ef
      sshfp_rec:
Packit Service 0a38ef
        description: Raw SSHFP record.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        aliases: ["sshfp_record"]
Packit Service 0a38ef
      tlsa_rec:
Packit Service 0a38ef
        description: Raw TLSA record.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        aliases: ["tlsa_record"]
Packit Service 0a38ef
      txt_rec:
Packit Service 0a38ef
        description: Raw TXT record.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        aliases: ["txt_record"]
Packit Service 0a38ef
      uri_rec:
Packit Service 0a38ef
        description: Raw URI record.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        aliases: ["uri_record"]
Packit Service 0a38ef
      ip_address:
Packit Service 0a38ef
        description: IP adresses for A or AAAA records.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: string
Packit Service 0a38ef
      a_ip_address:
Packit Service 0a38ef
        description: IP adresses for A records.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: string
Packit Service 0a38ef
      a_create_reverse:
Packit Service a166ed
        description: |
Packit Service 0a38ef
          Create reverse record for A records.
Packit Service 0a38ef
          There is no equivalent to remove reverse records.
Packit Service 0a38ef
        type: bool
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
      aaaa_ip_address:
Packit Service 0a38ef
        description: IP adresses for AAAA records.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: string
Packit Service 0a38ef
      aaaa_create_reverse:
Packit Service a166ed
        description: |
Packit Service 0a38ef
          Create reverse record for AAAA records.
Packit Service 0a38ef
          There is no equivalent to remove reverse records.
Packit Service 0a38ef
        type: bool
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
      create_reverse:
Packit Service a166ed
        description: |
Packit Service 0a38ef
          Create reverse record for A or AAAA record types.
Packit Service 0a38ef
          There is no equivalent to remove reverse records.
Packit Service 0a38ef
        type: bool
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        aliases: ["reverse"]
Packit Service 0a38ef
      a6_data:
Packit Service 0a38ef
        description: A6 record data.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
      afsdb_subtype:
Packit Service 0a38ef
        description: AFSDB Subtype
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: int
Packit Service 0a38ef
      afsdb_hostname:
Packit Service a166ed
        description: AFSDB Hostname
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: string
Packit Service 0a38ef
      cert_type:
Packit Service a166ed
        description: CERT Certificate Type
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: int
Packit Service 0a38ef
      cert_key_tag:
Packit Service 0a38ef
        description: CERT Key Tag
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: int
Packit Service 0a38ef
      cert_algorithm:
Packit Service 0a38ef
        description: CERT Algorithm
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: int
Packit Service 0a38ef
      cert_certificate_or_crl:
Packit Service 0a38ef
        description: CERT Certificate or Certificate Revocation List (CRL).
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: string
Packit Service 0a38ef
      cname_hostname:
Packit Service 0a38ef
        description: A hostname which this alias hostname points to.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: string
Packit Service 0a38ef
      dlv_key_tag:
Packit Service 0a38ef
        description: DS Key Tag
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: int
Packit Service 0a38ef
      dlv_algorithm:
Packit Service 0a38ef
        description: DLV Algorithm
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: int
Packit Service 0a38ef
      dlv_digest_type:
Packit Service 0a38ef
        description: DLV Digest Type
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: int
Packit Service 0a38ef
      dlv_digest:
Packit Service a166ed
        description: DLV Digest
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: string
Packit Service 0a38ef
      dname_target:
Packit Service 0a38ef
        description: DNAME Target
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: string
Packit Service 0a38ef
      ds_key_tag:
Packit Service 0a38ef
        description: DS Key Tag
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: int
Packit Service 0a38ef
      ds_algorithm:
Packit Service 0a38ef
        description: DS Algorithm
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: int
Packit Service 0a38ef
      ds_digest_type:
Packit Service 0a38ef
        description: DS Digest Type
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: int
Packit Service 0a38ef
      ds_digest:
Packit Service a166ed
        description: DS Digest
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: string
Packit Service 0a38ef
      kx_preference:
Packit Service a166ed
        description: |
Packit Service 0a38ef
          Preference given to this exchanger. Lower values are more preferred.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: int
Packit Service 0a38ef
      kx_exchanger:
Packit Service 0a38ef
        description: A host willing to act as a key exchanger.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: string
Packit Service 0a38ef
      loc_lat_deg:
Packit Service 0a38ef
        description: LOC Degrees Latitude
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: int
Packit Service 0a38ef
      loc_lat_min:
Packit Service 0a38ef
        description: LOC Minutes Latitude
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: int
Packit Service 0a38ef
      loc_lat_sec:
Packit Service 0a38ef
        description: LOC Seconds Latitude
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: float
Packit Service 0a38ef
      loc_lat_dir:
Packit Service 0a38ef
        description: LOC Direction Latitude
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        choices: ["N", "S"]
Packit Service 0a38ef
      loc_lon_deg:
Packit Service 0a38ef
        description: LOC Degrees Longitude
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: int
Packit Service 0a38ef
      loc_lon_min:
Packit Service 0a38ef
        description: LOC Minutes Longitude
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: int
Packit Service 0a38ef
      loc_lon_sec:
Packit Service 0a38ef
        description: LOC Seconds Longitude
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: float
Packit Service 0a38ef
      loc_lon_dir:
Packit Service 0a38ef
        description: LOC Direction Longitude
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        choices: ["E", "W"]
Packit Service 0a38ef
      loc_altitude:
Packit Service 0a38ef
        description: LOC Altitude
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: float
Packit Service 0a38ef
      loc_size:
Packit Service 0a38ef
        description: LOC Size
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: float
Packit Service 0a38ef
      loc_h_precision:
Packit Service 0a38ef
        description: LOC Horizontal Precision
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: float
Packit Service 0a38ef
      loc_v_precision:
Packit Service 0a38ef
        description: LOC Vertical Precision
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: float
Packit Service 0a38ef
      mx_preference:
Packit Service a166ed
        description: |
Packit Service 0a38ef
          Preference given to this exchanger. Lower values are more preferred.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: int
Packit Service 0a38ef
      mx_exchanger:
Packit Service 0a38ef
        description: A host willing to act as a mail exchanger.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: string
Packit Service 0a38ef
      naptr_order:
Packit Service 0a38ef
        description: NAPTR Order
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: int
Packit Service 0a38ef
      naptr_preference:
Packit Service 0a38ef
        description: NAPTR Preference
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: int
Packit Service 0a38ef
      naptr_flags:
Packit Service 0a38ef
        description: NAPTR Flags
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: string
Packit Service 0a38ef
      naptr_service:
Packit Service 0a38ef
        description: NAPTR Service
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: string
Packit Service 0a38ef
      naptr_regexp:
Packit Service 0a38ef
        description: NAPTR Regular Expression
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: string
Packit Service 0a38ef
      naptr_replacement:
Packit Service 0a38ef
        description: NAPTR Replacement
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: string
Packit Service 0a38ef
      ns_hostname:
Packit Service 0a38ef
        description: NS Hostname
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: string
Packit Service 0a38ef
      ptr_hostname:
Packit Service 0a38ef
        description: The hostname this reverse record points to.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: string
Packit Service 0a38ef
      srv_priority:
Packit Service a166ed
        description: |
Packit Service 0a38ef
          Lower number means higher priority. Clients will attempt to contact
Packit Service 0a38ef
          the server with the lowest-numbered priority they can reach.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: int
Packit Service 0a38ef
      srv_weight:
Packit Service 0a38ef
        description: Relative weight for entries with the same priority.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: int
Packit Service 0a38ef
      srv_port:
Packit Service 0a38ef
        description: SRV Port
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: int
Packit Service 0a38ef
      srv_target:
Packit Service a166ed
        description: |
Packit Service 0a38ef
          The domain name of the target host or '.' if the service is decidedly
Packit Service 0a38ef
          not available at this domain.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: string
Packit Service 0a38ef
      sshfp_algorithm:
Packit Service 0a38ef
        description: SSHFP Algorithm
Packit Service a166ed
        required: False
Packit Service a166ed
        type: int
Packit Service 0a38ef
      sshfp_fp_type:
Packit Service 0a38ef
        description: SSHFP Fingerprint Type
Packit Service 0a38ef
        required: False
Packit Service 0a38ef
        type: int
Packit Service 0a38ef
      sshfp_fingerprint:
Packit Service 0a38ef
        description: SSHFP Fingerprint
Packit Service 0a38ef
        required: False
Packit Service 0a38ef
        type: string
Packit Service 0a38ef
      txt_data:
Packit Service 0a38ef
        description: TXT Text Data
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: string
Packit Service 0a38ef
      tlsa_cert_usage:
Packit Service 0a38ef
        description: TLSA Certificate Usage
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: int
Packit Service 0a38ef
      tlsa_selector:
Packit Service a166ed
        description: TLSA Selector
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: int
Packit Service 0a38ef
      tlsa_matching_type:
Packit Service a166ed
        description: TLSA Matching Type
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: int
Packit Service 0a38ef
      tlsa_cert_association_data:
Packit Service a166ed
        description: TLSA Certificate Association Data
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: string
Packit Service 0a38ef
      uri_target:
Packit Service 0a38ef
        description: Target Uniform Resource Identifier according to RFC 3986.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: string
Packit Service 0a38ef
      uri_priority:
Packit Service a166ed
        description: |
Packit Service 0a38ef
          Lower number means higher priority. Clients will attempt to contact
Packit Service 0a38ef
          the URI with the lowest-numbered priority they can reach.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: int
Packit Service 0a38ef
      uri_weight:
Packit Service 0a38ef
        description: Relative weight for entries with the same priority.
Packit Service 0a38ef
        required: false
Packit Service 0a38ef
        type: int
Packit Service 0a38ef
  zone_name:
Packit Service a166ed
    description: |
Packit Service a166ed
      The DNS zone name to which DNS record needs to be managed.
Packit Service a166ed
      Required if not provided globally.
Packit Service 0a38ef
    aliases: ["dnszone"]
Packit Service a166ed
    required: false
Packit Service 0a38ef
  name:
Packit Service 0a38ef
    description: The DNS record name to manage.
Packit Service 0a38ef
    aliases: ["record_name"]
Packit Service 0a38ef
    required: true
Packit Service 0a38ef
  record_type:
Packit Service 0a38ef
    description: The type of DNS record.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    choices: ["A", "AAAA", "A6", "AFSDB", "CERT", "CNAME", "DLV", "DNAME",
Packit Service 0a38ef
              "DS", "KX", "LOC", "MX", "NAPTR", "NS", "PTR", "SRV", "SSHFP",
Packit Service 0a38ef
              "TLSA", "TXT", "URI"]
Packit Service 0a38ef
    default: "A"
Packit Service 0a38ef
  record_value:
Packit Service 0a38ef
    description: Manage DNS record name with this values.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: list
Packit Service 0a38ef
  record_ttl:
Packit Service 0a38ef
    description: Set the TTL for the record.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: int
Packit Service 0a38ef
  del_all:
Packit Service 0a38ef
    description: Delete all associated records.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: bool
Packit Service 0a38ef
  a_rec:
Packit Service 0a38ef
    description: Raw A record.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    aliases: ["a_record"]
Packit Service 0a38ef
  aaaa_rec:
Packit Service 0a38ef
    description: Raw AAAA record.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    aliases: ["aaaa_record"]
Packit Service 0a38ef
  a6_rec:
Packit Service 0a38ef
    description: Raw A6 record.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    aliases: ["a6_record"]
Packit Service 0a38ef
  afsdb_rec:
Packit Service 0a38ef
    description: Raw AFSDB record.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    aliases: ["afsdb_record"]
Packit Service 0a38ef
  cert_rec:
Packit Service 0a38ef
    description: Raw CERT record.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    aliases: ["cert_record"]
Packit Service 0a38ef
  cname_rec:
Packit Service 0a38ef
    description: Raw CNAME record.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    aliases: ["cname_record"]
Packit Service 0a38ef
  dlv_rec:
Packit Service 0a38ef
    description: Raw DLV record.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    aliases: ["dlv_record"]
Packit Service 0a38ef
  dname_rec:
Packit Service 0a38ef
    description: Raw DNAM record.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    aliases: ["dname_record"]
Packit Service 0a38ef
  ds_rec:
Packit Service 0a38ef
    description: Raw DS record.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    aliases: ["ds_record"]
Packit Service 0a38ef
  kx_rec:
Packit Service 0a38ef
    description: Raw KX record.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    aliases: ["kx_record"]
Packit Service 0a38ef
  loc_rec:
Packit Service 0a38ef
    description: Raw LOC record.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    aliases: ["loc_record"]
Packit Service 0a38ef
  mx_rec:
Packit Service 0a38ef
    description: Raw MX record.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    aliases: ["mx_record"]
Packit Service 0a38ef
  naptr_rec:
Packit Service 0a38ef
    description: Raw NAPTR record.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    aliases: ["naptr_record"]
Packit Service 0a38ef
  ns_rec:
Packit Service 0a38ef
    description: Raw NS record.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    aliases: ["ns_record"]
Packit Service 0a38ef
  ptr_rec:
Packit Service 0a38ef
    description: Raw PTR record.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    aliases: ["ptr_record"]
Packit Service 0a38ef
  srv_rec:
Packit Service 0a38ef
    description: Raw SRV record.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    aliases: ["srv_record"]
Packit Service 0a38ef
  sshfp_rec:
Packit Service 0a38ef
    description: Raw SSHFP record.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    aliases: ["sshfp_record"]
Packit Service 0a38ef
  tlsa_rec:
Packit Service 0a38ef
    description: Raw TLSA record.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    aliases: ["tlsa_record"]
Packit Service 0a38ef
  txt_rec:
Packit Service 0a38ef
    description: Raw TXT record.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    aliases: ["txt_record"]
Packit Service 0a38ef
  uri_rec:
Packit Service 0a38ef
    description: Raw URI record.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    aliases: ["uri_record"]
Packit Service 0a38ef
  ip_address:
Packit Service 0a38ef
    description: IP adresses for A ar AAAA.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: string
Packit Service 0a38ef
  create_reverse:
Packit Service a166ed
    description: |
Packit Service 0a38ef
      Create reverse record for A or AAAA record types.
Packit Service 0a38ef
      There is no equivalent to remove reverse records.
Packit Service 0a38ef
    type: bool
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    aliases: ["reverse"]
Packit Service 0a38ef
  a_ip_address:
Packit Service 0a38ef
    description: IP adresses for A records.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: string
Packit Service 0a38ef
  a_create_reverse:
Packit Service a166ed
    description: |
Packit Service 0a38ef
      Create reverse record for A records.
Packit Service 0a38ef
      There is no equivalent to remove reverse records.
Packit Service 0a38ef
    type: bool
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
  aaaa_ip_address:
Packit Service 0a38ef
    description: IP adresses for AAAA records.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: string
Packit Service 0a38ef
  aaaa_create_reverse:
Packit Service a166ed
    description: |
Packit Service 0a38ef
      Create reverse record for AAAA records.
Packit Service 0a38ef
      There is no equivalent to remove reverse records.
Packit Service 0a38ef
    type: bool
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
  afsdb_subtype:
Packit Service 0a38ef
    description: AFSDB Subtype
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: int
Packit Service 0a38ef
  afsdb_hostname:
Packit Service a166ed
    description: AFSDB Hostname
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: string
Packit Service 0a38ef
  cert_type:
Packit Service a166ed
    description: CERT Certificate Type
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: int
Packit Service 0a38ef
  cert_key_tag:
Packit Service 0a38ef
    description: CERT Key Tag
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: int
Packit Service 0a38ef
  cert_algorithm:
Packit Service 0a38ef
    description: CERT Algorithm
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: int
Packit Service 0a38ef
  cert_certificate_or_crl:
Packit Service 0a38ef
    description: CERT Certificate/CRL
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: string
Packit Service 0a38ef
  cname_hostname:
Packit Service 0a38ef
    description: A hostname which this alias hostname points to.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: string
Packit Service 0a38ef
  dlv_key_tag:
Packit Service 0a38ef
    description: DS Key Tag
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: int
Packit Service 0a38ef
  dlv_algorithm:
Packit Service 0a38ef
    description: DLV Algorithm
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: int
Packit Service 0a38ef
  dlv_digest_type:
Packit Service 0a38ef
    description: DLV Digest Type
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: int
Packit Service 0a38ef
  dlv_digest:
Packit Service a166ed
    description: DLV Digest
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: string
Packit Service 0a38ef
  dname_target:
Packit Service 0a38ef
    description: DNAME Target
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: string
Packit Service 0a38ef
  ds_key_tag:
Packit Service 0a38ef
    description: DS Key Tag
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: int
Packit Service 0a38ef
  ds_algorithm:
Packit Service 0a38ef
    description: DS Algorithm
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: int
Packit Service 0a38ef
  ds_digest_type:
Packit Service 0a38ef
    description: DS Digest Type
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: int
Packit Service 0a38ef
  ds_digest:
Packit Service a166ed
    description: DS Digest
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: string
Packit Service 0a38ef
  kx_preference:
Packit Service a166ed
    description: |
Packit Service 0a38ef
      Preference given to this exchanger. Lower values are more preferred.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: int
Packit Service 0a38ef
  kx_exchanger:
Packit Service 0a38ef
    description: A host willing to act as a key exchanger.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: string
Packit Service 0a38ef
  loc_lat_deg:
Packit Service 0a38ef
    description: LOC Degrees Latitude
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: int
Packit Service 0a38ef
  loc_lat_min:
Packit Service 0a38ef
    description: LOC Minutes Latitude
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: int
Packit Service 0a38ef
  loc_lat_sec:
Packit Service 0a38ef
    description: LOC Seconds Latitude
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: float
Packit Service 0a38ef
  loc_lat_dir:
Packit Service 0a38ef
    description: LOC Direction Latitude
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    choices: ["N", "S"]
Packit Service 0a38ef
  loc_lon_deg:
Packit Service 0a38ef
    description: LOC Degrees Longitude
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: int
Packit Service 0a38ef
  loc_lon_min:
Packit Service 0a38ef
    description: LOC Minutes Longitude
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: int
Packit Service 0a38ef
  loc_lon_sec:
Packit Service 0a38ef
    description: LOC Seconds Longitude
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: float
Packit Service 0a38ef
  loc_lon_dir:
Packit Service 0a38ef
    description: LOC Direction Longitude
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    choices: ["E", "W"]
Packit Service 0a38ef
  loc_altitude:
Packit Service 0a38ef
    description: LOC Altitude
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: float
Packit Service 0a38ef
  loc_size:
Packit Service 0a38ef
    description: LOC Size
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: float
Packit Service 0a38ef
  loc_h_precision:
Packit Service 0a38ef
    description: LOC Horizontal Precision
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: float
Packit Service 0a38ef
  loc_v_precision:
Packit Service 0a38ef
    description: LOC Vertical Precision
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: float
Packit Service 0a38ef
  mx_preference:
Packit Service a166ed
    description: |
Packit Service 0a38ef
      Preference given to this exchanger. Lower values are more preferred.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: int
Packit Service 0a38ef
  mx_exchanger:
Packit Service 0a38ef
    description: A host willing to act as a mail exchanger.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: string
Packit Service 0a38ef
  naptr_order:
Packit Service 0a38ef
    description: NAPTR Order
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: int
Packit Service 0a38ef
  naptr_preference:
Packit Service 0a38ef
    description: NAPTR Preference
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: int
Packit Service 0a38ef
  naptr_flags:
Packit Service 0a38ef
    description: NAPTR Flags
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: string
Packit Service 0a38ef
  naptr_service:
Packit Service 0a38ef
    description: NAPTR Service
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: string
Packit Service 0a38ef
  naptr_regexp:
Packit Service 0a38ef
    description: NAPTR Regular Expression
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: string
Packit Service 0a38ef
  naptr_replacement:
Packit Service 0a38ef
    description: NAPTR Replacement
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: string
Packit Service 0a38ef
  ns_hostname:
Packit Service 0a38ef
    description: NS Hostname
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: string
Packit Service 0a38ef
  ptr_hostname:
Packit Service 0a38ef
    description: The hostname this reverse record points to.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: string
Packit Service 0a38ef
  srv_priority:
Packit Service a166ed
    description: |
Packit Service 0a38ef
      Lower number means higher priority. Clients will attempt to contact the
Packit Service 0a38ef
      server with the lowest-numbered priority they can reach.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: int
Packit Service 0a38ef
  srv_weight:
Packit Service 0a38ef
    description: Relative weight for entries with the same priority.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: int
Packit Service 0a38ef
  srv_port:
Packit Service 0a38ef
    description: SRV Port
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: int
Packit Service 0a38ef
  srv_target:
Packit Service a166ed
    description: |
Packit Service 0a38ef
      The domain name of the target host or '.' if the service is decidedly not
Packit Service 0a38ef
      available at this domain.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: string
Packit Service 0a38ef
  sshfp_algorithm:
Packit Service 0a38ef
    description: SSHFP Algorithm
Packit Service a166ed
    required: false
Packit Service a166ed
    type: int
Packit Service 0a38ef
  sshfp_fp_type:
Packit Service 0a38ef
    description: SSHFP Fingerprint Type
Packit Service a166ed
    required: false
Packit Service 0a38ef
    type: int
Packit Service 0a38ef
  sshfp_fingerprint:
Packit Service 0a38ef
    description: SSHFP Fingerprint
Packit Service a166ed
    required: false
Packit Service 0a38ef
    type: string
Packit Service 0a38ef
  txt_data:
Packit Service 0a38ef
    description: TXT Text Data
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: string
Packit Service 0a38ef
  tlsa_cert_usage:
Packit Service 0a38ef
    description: TLSA Certificate Usage
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: int
Packit Service 0a38ef
  tlsa_selector:
Packit Service a166ed
    description: TLSA Selector
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: int
Packit Service 0a38ef
  tlsa_matching_type:
Packit Service a166ed
    description: TLSA Matching Type
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: int
Packit Service 0a38ef
  tlsa_cert_association_data:
Packit Service a166ed
    description: TLSA Certificate Association Data
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: string
Packit Service 0a38ef
  uri_target:
Packit Service 0a38ef
    description: Target Uniform Resource Identifier according to RFC 3986.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: string
Packit Service 0a38ef
  uri_priority:
Packit Service a166ed
    description: |
Packit Service 0a38ef
      Lower number means higher priority. Clients will attempt to contact the
Packit Service 0a38ef
      URI with the lowest-numbered priority they can reach.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: int
Packit Service 0a38ef
  uri_weight:
Packit Service 0a38ef
    description: Relative weight for entries with the same priority.
Packit Service 0a38ef
    required: false
Packit Service 0a38ef
    type: int
Packit Service 0a38ef
  state:
Packit Service 0a38ef
    description: State to ensure
Packit Service 0a38ef
    default: present
Packit Service 0a38ef
    choices: ["present", "absent"]
Packit Service 0a38ef
Packit Service 0a38ef
author:
Packit Service 0a38ef
    - Rafael Guterres Jeffman
Packit Service 0a38ef
"""
Packit Service 0a38ef
Packit Service 0a38ef
EXAMPLES = """
Packit Service 0a38ef
# Ensure dns record is present
Packit Service 0a38ef
- ipadnsrecord:
Packit Service 0a38ef
    ipaadmin_password: SomeADMINpassword
Packit Service 0a38ef
    name: vm-001
Packit Service 0a38ef
    zone_name: example.com
Packit Service 0a38ef
    record_type: 'AAAA'
Packit Service 0a38ef
    record_value: '::1'
Packit Service 0a38ef
Packit Service 0a38ef
# Ensure that dns record exists with a TTL
Packit Service 0a38ef
- ipadnsrecord:
Packit Service 0a38ef
    ipaadmin_password: SomeADMINpassword
Packit Service 0a38ef
    name: host01
Packit Service 0a38ef
    zone_name: example.com
Packit Service 0a38ef
    record_type: 'AAAA'
Packit Service 0a38ef
    record_value: '::1'
Packit Service 0a38ef
    record_ttl: 300
Packit Service 0a38ef
Packit Service 0a38ef
# Ensure that dns record exists with a reverse record
Packit Service 0a38ef
- ipadnsrecord:
Packit Service 0a38ef
    ipaadmin_password: SomeADMINpassword
Packit Service 0a38ef
    name: host02
Packit Service 0a38ef
    zone_name: example.com
Packit Service 0a38ef
    record_type: 'AAAA'
Packit Service 0a38ef
    record_value: 'fd00::0002'
Packit Service 0a38ef
    create_reverse: yes
Packit Service 0a38ef
Packit Service 0a38ef
# Ensure a PTR record is present
Packit Service 0a38ef
- ipadnsrecord:
Packit Service 0a38ef
    ipaadmin_password: SomeADMINpassword
Packit Service 0a38ef
    name: 5
Packit Service 0a38ef
    zone_name: 2.168.192.in-addr.arpa
Packit Service 0a38ef
    record_type: 'PTR'
Packit Service 0a38ef
    record_value: 'internal.ipa.example.com'
Packit Service 0a38ef
Packit Service 0a38ef
# Ensure a TXT record is present
Packit Service 0a38ef
- ipadnsrecord:
Packit Service 0a38ef
    ipaadmin_password: SomeADMINpassword
Packit Service 0a38ef
    name: _kerberos
Packit Service 0a38ef
    zone_name: example.com
Packit Service 0a38ef
    record_type: 'TXT'
Packit Service 0a38ef
    record_value: 'EXAMPLE.COM'
Packit Service 0a38ef
Packit Service 0a38ef
# Ensure a SRV record is present
Packit Service 0a38ef
- ipadnsrecord:
Packit Service 0a38ef
    ipaadmin_password: SomeADMINpassword
Packit Service 0a38ef
    name: _kerberos._udp.example.com
Packit Service 0a38ef
    zone_name: example.com
Packit Service 0a38ef
    record_type: 'SRV'
Packit Service 0a38ef
    record_value: '10 50 88 ipa.example.com'
Packit Service 0a38ef
Packit Service 0a38ef
# Ensure an MX record is present
Packit Service 0a38ef
- ipadnsrecord:
Packit Service 0a38ef
    ipaadmin_password: SomeADMINpassword
Packit Service 0a38ef
    name: '@'
Packit Service 0a38ef
    zone_name: example.com
Packit Service 0a38ef
    record_type: 'MX'
Packit Service 0a38ef
    record_value: '1 mailserver.example.com'
Packit Service 0a38ef
Packit Service 0a38ef
# Ensure that dns record is absent
Packit Service 0a38ef
- ipadnsrecord:
Packit Service 0a38ef
    ipaadmin_password: SomeADMINpassword
Packit Service 0a38ef
    name: host01
Packit Service 0a38ef
    zone_name: example.com
Packit Service 0a38ef
    record_type: 'AAAA'
Packit Service 0a38ef
    record_value: '::1'
Packit Service 0a38ef
    state: absent
Packit Service 0a38ef
"""
Packit Service 0a38ef
Packit Service 0a38ef
RETURN = """
Packit Service 0a38ef
"""
Packit Service 0a38ef
Packit Service 0a38ef
Packit Service 0a38ef
from ansible.module_utils.basic import AnsibleModule
Packit Service 0a38ef
from ansible.module_utils._text import to_text
Packit Service 0a38ef
from ansible.module_utils.ansible_freeipa_module import temp_kinit, \
Packit Service 0a38ef
    temp_kdestroy, valid_creds, api_connect, api_command, module_params_get, \
Packit Service 0a38ef
    is_ipv4_addr, is_ipv6_addr
Packit Service 0a38ef
import dns.reversename
Packit Service 0a38ef
import dns.resolver
Packit Service 0a38ef
import ipalib.errors
Packit Service 0a38ef
import six
Packit Service 0a38ef
Packit Service 0a38ef
Packit Service 0a38ef
if six.PY3:
Packit Service 0a38ef
    unicode = str
Packit Service 0a38ef
Packit Service 0a38ef
_SUPPORTED_RECORD_TYPES = [
Packit Service 0a38ef
    "A", "AAAA", "A6", "AFSDB", "CERT", "CNAME", "DLV", "DNAME", "DS", "KX",
Packit Service 0a38ef
    "LOC", "MX", "NAPTR", "NS", "PTR", "SRV", "SSHFP", "TLSA", "TXT", "URI"]
Packit Service 0a38ef
Packit Service 0a38ef
_RECORD_FIELDS = [
Packit Service 0a38ef
    "a_rec", "aaaa_rec", "a6_rec", "afsdb_rec", "cert_rec",
Packit Service 0a38ef
    "cname_rec", "dlv_rec", "dname_rec", "ds_rec", "kx_rec", "loc_rec",
Packit Service 0a38ef
    "mx_rec", "naptr_rec", "ns_rec", "ptr_rec", "srv_rec", "sshfp_rec",
Packit Service 0a38ef
    "tlsa_rec", "txt_rec", "uri_rec"
Packit Service 0a38ef
]
Packit Service 0a38ef
Packit Service a166ed
# The _PART_MAP structure maps ansible-freeipa attributes to their
Packit Service a166ed
# FreeIPA API counterparts. The keys are also used to obtain a list
Packit Service a166ed
# of all supported DNS record attributes.
Packit Service a166ed
Packit Service 0a38ef
_PART_MAP = {
Packit Service 0a38ef
    'a_ip_address': 'a_part_ip_address',
Packit Service 0a38ef
    'a_create_reverse': 'a_extra_create_reverse',
Packit Service 0a38ef
    'aaaa_ip_address': 'aaaa_part_ip_address',
Packit Service 0a38ef
    'aaaa_create_reverse': 'aaaa_extra_create_reverse',
Packit Service 0a38ef
    'a6_data': 'a6_part_data',
Packit Service 0a38ef
    'afsdb_subtype': 'afsdb_part_subtype',
Packit Service 0a38ef
    'afsdb_hostname': 'afsdb_part_hostname',
Packit Service 0a38ef
    'cert_type': 'cert_part_type',
Packit Service 0a38ef
    'cert_key_tag': 'cert_part_key_tag',
Packit Service 0a38ef
    'cert_algorithm': 'cert_part_algorithm',
Packit Service 0a38ef
    'cert_certificate_or_crl': 'cert_part_certificate_or_crl',
Packit Service 0a38ef
    'cname_hostname': 'cname_part_hostname',
Packit Service 0a38ef
    'dlv_algorithm': 'dlv_part_algorithm',
Packit Service 0a38ef
    'dlv_digest': 'dlv_part_digest',
Packit Service 0a38ef
    'dlv_digest_type': 'dlv_part_digest_type',
Packit Service 0a38ef
    'dlv_key_tag': 'dlv_part_key_tag',
Packit Service 0a38ef
    'dname_target': 'dname_part_target',
Packit Service 0a38ef
    'ds_algorithm': 'ds_part_algorithm',
Packit Service 0a38ef
    'ds_digest': 'ds_part_digest',
Packit Service 0a38ef
    'ds_digest_type': 'ds_part_digest_type',
Packit Service 0a38ef
    'ds_key_tag': 'ds_part_key_tag',
Packit Service 0a38ef
    'kx_preference': 'kx_part_preference',
Packit Service 0a38ef
    'kx_exchanger': 'kx_part_exchanger',
Packit Service 0a38ef
    "loc_lat_deg": "loc_part_lat_deg",
Packit Service 0a38ef
    "loc_lat_min": "loc_part_lat_min",
Packit Service 0a38ef
    "loc_lat_sec": "loc_part_lat_sec",
Packit Service 0a38ef
    "loc_lat_dir": "loc_part_lat_dir",
Packit Service 0a38ef
    "loc_lon_deg": "loc_part_lon_deg",
Packit Service 0a38ef
    "loc_lon_min": "loc_part_lon_min",
Packit Service 0a38ef
    "loc_lon_sec": "loc_part_lon_sec",
Packit Service 0a38ef
    "loc_lon_dir": "loc_part_lon_dir",
Packit Service 0a38ef
    "loc_altitude": "loc_part_altitude",
Packit Service 0a38ef
    "loc_size": "loc_part_size",
Packit Service 0a38ef
    "loc_h_precision": "loc_part_h_precision",
Packit Service 0a38ef
    "loc_v_precision": "loc_part_v_precision",
Packit Service 0a38ef
    "mx_preference": "mx_part_preference",
Packit Service 0a38ef
    "mx_exchanger": 'mx_part_exchanger',
Packit Service 0a38ef
    "naptr_order": "naptr_part_order",
Packit Service 0a38ef
    "naptr_preference": "naptr_part_preference",
Packit Service 0a38ef
    "naptr_flags": "naptr_part_flags",
Packit Service 0a38ef
    "naptr_service": "naptr_part_service",
Packit Service 0a38ef
    "naptr_regexp": "naptr_part_regexp",
Packit Service 0a38ef
    "naptr_replacement": "naptr_part_replacement",
Packit Service 0a38ef
    'ns_hostname': 'ns_part_hostname',
Packit Service 0a38ef
    'ptr_hostname': 'ptr_part_hostname',
Packit Service 0a38ef
    "srv_priority": "srv_part_priority",
Packit Service 0a38ef
    "srv_weight": "srv_part_weight",
Packit Service 0a38ef
    "srv_port": "srv_part_port",
Packit Service 0a38ef
    "srv_target": "srv_part_target",
Packit Service 0a38ef
    'sshfp_algorithm': 'sshfp_part_algorithm',
Packit Service 0a38ef
    'sshfp_fingerprint': 'sshfp_part_fingerprint',
Packit Service 0a38ef
    'sshfp_fp_type': 'sshfp_part_fp_type',
Packit Service 0a38ef
    "tlsa_cert_usage": "tlsa_part_cert_usage",
Packit Service 0a38ef
    "tlsa_cert_association_data": "tlsa_part_cert_association_data",
Packit Service 0a38ef
    "tlsa_matching_type": "tlsa_part_matching_type",
Packit Service 0a38ef
    "tlsa_selector": "tlsa_part_selector",
Packit Service 0a38ef
    'txt_data': 'txt_part_data',
Packit Service 0a38ef
    "uri_priority": "uri_part_priority",
Packit Service 0a38ef
    "uri_target": "uri_part_target",
Packit Service 0a38ef
    "uri_weight": "uri_part_weight"
Packit Service 0a38ef
}
Packit Service 0a38ef
Packit Service a166ed
# _RECORD_PARTS is a structure that maps the attributes that store
Packit Service a166ed
# the DNS record in FreeIPA API to the parts and options available
Packit Service a166ed
# for these records in the API.
Packit Service a166ed
Packit Service 0a38ef
_RECORD_PARTS = {
Packit Service 0a38ef
    "arecord": ["a_part_ip_address", "a_extra_create_reverse"],
Packit Service 0a38ef
    "aaaarecord": [
Packit Service 0a38ef
        "aaaa_part_ip_address", "aaaa_extra_create_reverse"
Packit Service 0a38ef
    ],
Packit Service 0a38ef
    "a6record": ["a6_part_data"],
Packit Service 0a38ef
    "afsdbrecord": ['afsdb_part_subtype', 'afsdb_part_hostname'],
Packit Service a166ed
    "certrecord": [
Packit Service 0a38ef
        'cert_part_type', 'cert_part_key_tag', 'cert_part_algorithm',
Packit Service 0a38ef
        'cert_part_certificate_or_crl'
Packit Service 0a38ef
    ],
Packit Service 0a38ef
    "cnamerecord": ["cname_part_hostname"],
Packit Service 0a38ef
    "dlvrecord": [
Packit Service 0a38ef
        'dlv_part_key_tag', 'dlv_part_algorithm', 'dlv_part_digest_type',
Packit Service 0a38ef
        'dlv_part_digest'
Packit Service 0a38ef
    ],
Packit Service 0a38ef
    "dnamerecord": ["dname_part_target"],
Packit Service 0a38ef
    "dsrecord": ['ds_part_key_tag', 'ds_part_algorithm',
Packit Service 0a38ef
                 'ds_part_digest_type', 'ds_part_digest'],
Packit Service 0a38ef
    "kxrecord": ['kx_part_preference', 'kx_part_exchanger'],
Packit Service 0a38ef
    "locrecord": [
Packit Service 0a38ef
        "loc_part_lat_deg", "loc_part_lat_min", "loc_part_lat_sec",
Packit Service 0a38ef
        "loc_part_lat_dir", "loc_part_lon_deg", "loc_part_lon_min",
Packit Service 0a38ef
        "loc_part_lon_sec", "loc_part_lon_dir", "loc_part_altitude",
Packit Service 0a38ef
        "loc_part_size", "loc_part_h_precision", "loc_part_v_precision"
Packit Service 0a38ef
    ],
Packit Service 0a38ef
    "mxrecord": ['mx_part_preference', 'mx_part_exchanger'],
Packit Service 0a38ef
    "naptrrecord": [
Packit Service 0a38ef
        "naptr_part_order", "naptr_part_preference", "naptr_part_flags",
Packit Service 0a38ef
        "naptr_part_service", "naptr_part_regexp", "naptr_part_replacement"
Packit Service 0a38ef
    ],
Packit Service 0a38ef
    "nsrecord": ["ns_part_hostname"],
Packit Service 0a38ef
    "ptrrecord": ["ptr_part_hostname"],
Packit Service 0a38ef
    "srvrecord": [
Packit Service 0a38ef
        "srv_part_priority", "srv_part_weight", "srv_part_port",
Packit Service 0a38ef
        "srv_part_target",
Packit Service 0a38ef
    ],
Packit Service 0a38ef
    "sshfprecord": [
Packit Service 0a38ef
        'sshfp_part_algorithm', 'sshfp_part_fingerprint',
Packit Service 0a38ef
        'sshfp_part_fp_type'
Packit Service 0a38ef
    ],
Packit Service 0a38ef
    "tlsarecord": [
Packit Service 0a38ef
        "tlsa_part_cert_usage", "tlsa_part_cert_association_data",
Packit Service 0a38ef
        "tlsa_part_matching_type", "tlsa_part_selector"
Packit Service 0a38ef
    ],
Packit Service 0a38ef
    "txtrecord": ["txt_part_data"],
Packit Service 0a38ef
    "urirecord": ["uri_part_priority", "uri_part_target", "uri_part_weight"],
Packit Service 0a38ef
}
Packit Service 0a38ef
Packit Service 0a38ef
Packit Service 0a38ef
def configure_module():
Packit Service 0a38ef
    """Configure ipadnsrecord ansible module variables."""
Packit Service 0a38ef
    record_spec = dict(
Packit Service 0a38ef
        zone_name=dict(type='str', required=False, aliases=['dnszone']),
Packit Service 0a38ef
        record_type=dict(type='str', default="A",
Packit Service 0a38ef
                         choices=["A", "AAAA", "A6", "AFSDB", "CERT", "CNAME",
Packit Service 0a38ef
                                  "DLV", "DNAME", "DS", "KX", "LOC", "MX",
Packit Service 0a38ef
                                  "NAPTR", "NS", "PTR", "SRV", "SSHFP", "TLSA",
Packit Service 0a38ef
                                  "TXT", "URI"]),
Packit Service 0a38ef
        record_value=dict(type='list', required=False),
Packit Service 0a38ef
        record_ttl=dict(type='int', required=False),
Packit Service 0a38ef
        del_all=dict(type='bool', required=False),
Packit Service 0a38ef
        a_rec=dict(type='list', required=False, aliases=['a_record']),
Packit Service 0a38ef
        aaaa_rec=dict(type='list', required=False, aliases=['aaaa_record']),
Packit Service 0a38ef
        a6_rec=dict(type='list', required=False, aliases=['a6_record']),
Packit Service 0a38ef
        afsdb_rec=dict(type='list', required=False, aliases=['afsdb_record']),
Packit Service 0a38ef
        cert_rec=dict(type='list', required=False, aliases=['cert_record']),
Packit Service 0a38ef
        cname_rec=dict(type='list', required=False, aliases=['cname_record']),
Packit Service 0a38ef
        dlv_rec=dict(type='list', required=False, aliases=['dlv_record']),
Packit Service 0a38ef
        dname_rec=dict(type='list', required=False, aliases=['dname_record']),
Packit Service 0a38ef
        ds_rec=dict(type='list', required=False, aliases=['ds_record']),
Packit Service 0a38ef
        kx_rec=dict(type='list', required=False, aliases=['kx_record']),
Packit Service 0a38ef
        loc_rec=dict(type='list', required=False, aliases=['loc_record']),
Packit Service 0a38ef
        mx_rec=dict(type='list', required=False, aliases=['mx_record']),
Packit Service 0a38ef
        naptr_rec=dict(type='list', required=False, aliases=['naptr_record']),
Packit Service 0a38ef
        ns_rec=dict(type='list', required=False, aliases=['ns_record']),
Packit Service 0a38ef
        ptr_rec=dict(type='list', required=False, aliases=['ptr_record']),
Packit Service 0a38ef
        srv_rec=dict(type='list', required=False, aliases=['srv_record']),
Packit Service 0a38ef
        sshfp_rec=dict(type='list', required=False, aliases=['sshfp_record']),
Packit Service 0a38ef
        tlsa_rec=dict(type='list', required=False, aliases=['tlsa_record']),
Packit Service 0a38ef
        txt_rec=dict(type='list', required=False, aliases=['txt_record']),
Packit Service 0a38ef
        uri_rec=dict(type='list', required=False, aliases=['uri_record']),
Packit Service 0a38ef
        ip_address=dict(type='str', required=False),
Packit Service 0a38ef
        create_reverse=dict(type='bool', required=False, aliases=['reverse']),
Packit Service 0a38ef
        a_ip_address=dict(type='str', required=False),
Packit Service 0a38ef
        a_create_reverse=dict(type='bool', required=False),
Packit Service 0a38ef
        aaaa_ip_address=dict(type='str', required=False),
Packit Service 0a38ef
        aaaa_create_reverse=dict(type='bool', required=False),
Packit Service 0a38ef
        a6_data=dict(type='str', required=False),
Packit Service 0a38ef
        afsdb_subtype=dict(type='int', required=False),
Packit Service 0a38ef
        afsdb_hostname=dict(type='str', required=False),
Packit Service 0a38ef
        cert_type=dict(type='int', required=False),
Packit Service 0a38ef
        cert_key_tag=dict(type='int', required=False),
Packit Service 0a38ef
        cert_algorithm=dict(type='int', required=False),
Packit Service 0a38ef
        cert_certificate_or_crl=dict(type='str', required=False),
Packit Service 0a38ef
        cname_hostname=dict(type='str', required=False),
Packit Service 0a38ef
        dlv_key_tag=dict(type='int', required=False),
Packit Service 0a38ef
        dlv_algorithm=dict(type='int', required=False),
Packit Service 0a38ef
        dlv_digest_type=dict(type='int', required=False),
Packit Service 0a38ef
        dlv_digest=dict(type='str', required=False),
Packit Service 0a38ef
        dname_target=dict(type='str', required=False),
Packit Service 0a38ef
        ds_key_tag=dict(type='int', required=False),
Packit Service 0a38ef
        ds_algorithm=dict(type='int', required=False),
Packit Service 0a38ef
        ds_digest_type=dict(type='int', required=False),
Packit Service 0a38ef
        ds_digest=dict(type='str', required=False),
Packit Service 0a38ef
        kx_preference=dict(type='int', required=False),
Packit Service 0a38ef
        kx_exchanger=dict(type='str', required=False),
Packit Service 0a38ef
        loc_lat_deg=dict(type='int', required=False),
Packit Service 0a38ef
        loc_lat_min=dict(type='int', required=False),
Packit Service 0a38ef
        loc_lat_sec=dict(type='float', required=False),
Packit Service 0a38ef
        loc_lat_dir=dict(type='str', required=False),
Packit Service 0a38ef
        loc_lon_deg=dict(type='int', required=False),
Packit Service 0a38ef
        loc_lon_min=dict(type='int', required=False),
Packit Service 0a38ef
        loc_lon_sec=dict(type='float', required=False),
Packit Service 0a38ef
        loc_lon_dir=dict(type='str', required=False),
Packit Service 0a38ef
        loc_altitude=dict(type='float', required=False),
Packit Service 0a38ef
        loc_size=dict(type='float', required=False),
Packit Service 0a38ef
        loc_h_precision=dict(type='float', required=False),
Packit Service 0a38ef
        loc_v_precision=dict(type='float', required=False),
Packit Service 0a38ef
        mx_preference=dict(type='int', required=False),
Packit Service 0a38ef
        mx_exchanger=dict(type='str', required=False),
Packit Service 0a38ef
        naptr_order=dict(type='int', required=False),
Packit Service 0a38ef
        naptr_preference=dict(type='int', required=False),
Packit Service 0a38ef
        naptr_flags=dict(type='str', required=False),
Packit Service 0a38ef
        naptr_service=dict(type='str', required=False),
Packit Service 0a38ef
        naptr_regexp=dict(type='str', required=False),
Packit Service 0a38ef
        naptr_replacement=dict(type='str', required=False),
Packit Service 0a38ef
        ns_hostname=dict(type='str', required=False),
Packit Service 0a38ef
        ptr_hostname=dict(type='str', required=False),
Packit Service 0a38ef
        srv_priority=dict(type='int', required=False),
Packit Service 0a38ef
        srv_weight=dict(type='int', required=False),
Packit Service 0a38ef
        srv_port=dict(type='int', required=False),
Packit Service 0a38ef
        srv_target=dict(type='str', required=False),
Packit Service 0a38ef
        sshfp_algorithm=dict(type='int', required=False),
Packit Service 0a38ef
        sshfp_fingerprint=dict(type='str', required=False),
Packit Service 0a38ef
        sshfp_fp_type=dict(type='int', required=False),
Packit Service 0a38ef
        tlsa_cert_usage=dict(type='int', required=False),
Packit Service 0a38ef
        tlsa_cert_association_data=dict(type='str', required=False),
Packit Service 0a38ef
        tlsa_matching_type=dict(type='int', required=False),
Packit Service 0a38ef
        tlsa_selector=dict(type='int', required=False),
Packit Service 0a38ef
        txt_data=dict(type='str', required=False),
Packit Service 0a38ef
        uri_priority=dict(type='int', required=False),
Packit Service 0a38ef
        uri_target=dict(type='str', required=False),
Packit Service 0a38ef
        uri_weight=dict(type='int', required=False),
Packit Service 0a38ef
    )
Packit Service 0a38ef
Packit Service 0a38ef
    ansible_module = AnsibleModule(
Packit Service 0a38ef
        argument_spec=dict(
Packit Service 0a38ef
            # general
Packit Service 0a38ef
            ipaadmin_principal=dict(type="str", default="admin"),
Packit Service 0a38ef
            ipaadmin_password=dict(type="str", no_log=True),
Packit Service 0a38ef
Packit Service 0a38ef
            name=dict(type="list", aliases=["record_name"], default=None,
Packit Service 0a38ef
                      required=False),
Packit Service 0a38ef
Packit Service 0a38ef
            records=dict(type="list", default=None,
Packit Service 0a38ef
                         options=dict(
Packit Service 0a38ef
                            # Here name is a simple string
Packit Service 0a38ef
                            name=dict(type='str', required=True,
Packit Service 0a38ef
                                      aliases=['record_name']),
Packit Service 0a38ef
                            **record_spec),
Packit Service 0a38ef
                         ),
Packit Service 0a38ef
Packit Service 0a38ef
            # general
Packit Service 0a38ef
            state=dict(type="str", default="present",
Packit Service 0a38ef
                       choices=["present", "absent", "disabled"]),
Packit Service 0a38ef
Packit Service 0a38ef
            # Add record specific parameters for simple use case
Packit Service 0a38ef
            **record_spec
Packit Service 0a38ef
        ),
Packit Service 0a38ef
        mutually_exclusive=[["name", "records"], ['record_value', 'del_all']],
Packit Service 0a38ef
        required_one_of=[["name", "records"]],
Packit Service 0a38ef
        supports_check_mode=True,
Packit Service 0a38ef
    )
Packit Service 0a38ef
Packit Service 0a38ef
    ansible_module._ansible_debug = True
Packit Service 0a38ef
Packit Service 0a38ef
    return ansible_module
Packit Service 0a38ef
Packit Service 0a38ef
Packit Service a166ed
def find_dnsrecord(module, dnszone, name):
Packit Service 0a38ef
    """Find a DNS record based on its name (idnsname)."""
Packit Service a166ed
    _args = {
Packit Service a166ed
        "all": True,
Packit Service a166ed
        "idnsname": to_text(name),
Packit Service a166ed
    }
Packit Service 0a38ef
Packit Service 0a38ef
    try:
Packit Service 0a38ef
        _result = api_command(
Packit Service a166ed
            module, "dnsrecord_show", to_text(dnszone), _args)
Packit Service 0a38ef
    except ipalib.errors.NotFound:
Packit Service 0a38ef
        return None
Packit Service 0a38ef
Packit Service a166ed
    return _result["result"]
Packit Service 0a38ef
Packit Service 0a38ef
Packit Service 0a38ef
def check_parameters(module, state, zone_name, record):
Packit Service 0a38ef
    """Check if parameters are correct."""
Packit Service 0a38ef
    if zone_name is None:
Packit Service 0a38ef
        module.fail_json(msg="Msssing required argument: zone_name")
Packit Service 0a38ef
Packit Service 0a38ef
    record_type = record.get('record_type', None)
Packit Service 0a38ef
    record_value = record.get('record_value', None)
Packit Service 0a38ef
    if record_type is not None:
Packit Service 0a38ef
        if record_type not in _SUPPORTED_RECORD_TYPES:
Packit Service 0a38ef
            module.fail_json(
Packit Service 0a38ef
                msg="Record Type '%s' is not supported." % record_type)
Packit Service 0a38ef
Packit Service a166ed
    # has_record is "True" if the playbook has set any of the full record
Packit Service a166ed
    # attributes (*record or *_rec).
Packit Service a166ed
    has_record = any(
Packit Service a166ed
        (rec in record) or (("%sord" % rec) in record)
Packit Service a166ed
        for rec in _RECORD_FIELDS
Packit Service a166ed
    )
Packit Service 0a38ef
Packit Service a166ed
    # has_part_record is "True" if the playbook has set any of the
Packit Service a166ed
    # record field attributes.
Packit Service 0a38ef
    has_part_record = any(record.get(rec, None) for rec in _PART_MAP)
Packit Service 0a38ef
Packit Service a166ed
    # some attributes in the playbook may have a special meaning,
Packit Service a166ed
    # like "ip_address", which is used for either arecord or aaaarecord,
Packit Service a166ed
    # and has_special is true if any of these attributes is set on
Packit Service a166ed
    # on the playbook.
Packit Service 0a38ef
    special_list = ['ip_address']
Packit Service 0a38ef
    has_special = any(record.get(rec, None) for rec in special_list)
Packit Service 0a38ef
Packit Service 0a38ef
    invalid = []
Packit Service 0a38ef
Packit Service 0a38ef
    if state == 'present':
Packit Service 0a38ef
        if has_record or has_part_record or has_special:
Packit Service 0a38ef
            if record_value:
Packit Service 0a38ef
                module.fail_json(
Packit Service 0a38ef
                    msg="Cannot use record data with `record_value`.")
Packit Service 0a38ef
        elif not record_value:
Packit Service 0a38ef
            module.fail_json(msg="No record data provided.")
Packit Service 0a38ef
Packit Service 0a38ef
        invalid = ['del_all']
Packit Service 0a38ef
Packit Service 0a38ef
    if state == 'absent':
Packit Service 0a38ef
        del_all = record.get('del_all', None)
Packit Service 0a38ef
        if record_value:
Packit Service 0a38ef
            if has_record or has_part_record or del_all:
Packit Service 0a38ef
                module.fail_json(
Packit Service 0a38ef
                    msg="Cannot use record data with `record_value`.")
Packit Service 0a38ef
        elif not (has_record or has_part_record or del_all):
Packit Service 0a38ef
            module.fail_json(
Packit Service 0a38ef
                msg="Either a record description or `del_all` is required.")
Packit Service 0a38ef
        invalid = list(_PART_MAP.keys())
Packit Service 0a38ef
        invalid.extend(['create_reverse', 'dns_ttl'])
Packit Service 0a38ef
Packit Service 0a38ef
    for x in invalid:
Packit Service 0a38ef
        if x in record:
Packit Service 0a38ef
            module.fail_json(
Packit Service 0a38ef
                msg="Variable `%s` cannot be used in state `%s`" %
Packit Service 0a38ef
                    (x, state))
Packit Service 0a38ef
Packit Service 0a38ef
Packit Service 0a38ef
def connect_to_api(module):
Packit Service 0a38ef
    """Connect to the IPA API."""
Packit Service 0a38ef
    ipaadmin_principal = module_params_get(module, "ipaadmin_principal")
Packit Service 0a38ef
    ipaadmin_password = module_params_get(module, "ipaadmin_password")
Packit Service 0a38ef
Packit Service 0a38ef
    ccache_dir = None
Packit Service 0a38ef
    ccache_name = None
Packit Service 0a38ef
    if not valid_creds(module, ipaadmin_principal):
Packit Service 0a38ef
        ccache_dir, ccache_name = temp_kinit(ipaadmin_principal,
Packit Service 0a38ef
                                             ipaadmin_password)
Packit Service 0a38ef
    api_connect()
Packit Service 0a38ef
Packit Service 0a38ef
    return ccache_dir, ccache_name
Packit Service 0a38ef
Packit Service 0a38ef
Packit Service 0a38ef
def get_entry_from_module(module, name):
Packit Service 0a38ef
    """Create an entry dict from attributes in module."""
Packit Service 0a38ef
    attrs = [
Packit Service 0a38ef
        'del_all', 'zone_name', 'record_type', 'record_value', 'record_ttl',
Packit Service 0a38ef
        "ip_address", "create_reverse"
Packit Service 0a38ef
    ]
Packit Service 0a38ef
Packit Service 0a38ef
    entry = {'name': name}
Packit Service 0a38ef
Packit Service 0a38ef
    for key_set in [_RECORD_FIELDS, _PART_MAP, attrs]:
Packit Service 0a38ef
        entry.update({
Packit Service 0a38ef
            key: module_params_get(module, key)
Packit Service 0a38ef
            for key in key_set
Packit Service 0a38ef
            if module_params_get(module, key) is not None
Packit Service 0a38ef
        })
Packit Service 0a38ef
Packit Service 0a38ef
    return entry
Packit Service 0a38ef
Packit Service 0a38ef
Packit Service 0a38ef
def create_reverse_ip_record(module, zone_name, name, ips):
Packit Service 0a38ef
    """Create a reverse record for an IP (PTR record)."""
Packit Service 0a38ef
    _cmds = []
Packit Service 0a38ef
    for address in ips:
Packit Service 0a38ef
        reverse_ip = dns.reversename.from_address(address)
Packit Service 0a38ef
        reverse_zone = dns.resolver.zone_for_name(reverse_ip)
Packit Service 0a38ef
        reverse_host = to_text(reverse_ip).replace(".%s" % reverse_zone, '')
Packit Service 0a38ef
Packit Service 0a38ef
        rev_find = find_dnsrecord(module, reverse_zone, reverse_host)
Packit Service 0a38ef
        if rev_find is None:
Packit Service 0a38ef
            rev_args = {
Packit Service 0a38ef
                'idnsname': to_text(reverse_host),
Packit Service 0a38ef
                "ptrrecord": "%s.%s" % (name, zone_name)
Packit Service 0a38ef
            }
Packit Service 0a38ef
            _cmds.append([reverse_zone, 'dnsrecord_add', rev_args])
Packit Service 0a38ef
Packit Service 0a38ef
    return _cmds
Packit Service 0a38ef
Packit Service 0a38ef
Packit Service 0a38ef
def ensure_data_is_list(data):
Packit Service 0a38ef
    """Ensure data is represented as a list."""
Packit Service 0a38ef
    return data if isinstance(data, list) else [data]
Packit Service 0a38ef
Packit Service 0a38ef
Packit Service 0a38ef
def gen_args(entry):
Packit Service 0a38ef
    """Generate IPA API arguments for a given `entry`."""
Packit Service 0a38ef
    args = {'idnsname': to_text(entry['name'])}
Packit Service 0a38ef
Packit Service 0a38ef
    if 'del_all' in entry:
Packit Service 0a38ef
        args['del_all'] = entry['del_all']
Packit Service 0a38ef
Packit Service 0a38ef
    record_value = entry.get('record_value', None)
Packit Service 0a38ef
Packit Service 0a38ef
    if record_value is not None:
Packit Service 0a38ef
        record_type = entry['record_type']
Packit Service 0a38ef
        rec = "{}record".format(record_type.lower())
Packit Service 0a38ef
        args[rec] = ensure_data_is_list(record_value)
Packit Service 0a38ef
Packit Service 0a38ef
    else:
Packit Service 0a38ef
        for field in _RECORD_FIELDS:
Packit Service a166ed
            record_value = entry.get(field) or entry.get("%sord" % field)
Packit Service 0a38ef
            if record_value is not None:
Packit Service 0a38ef
                record_type = field.split('_')[0]
Packit Service 0a38ef
                rec = "{}record".format(record_type.lower())
Packit Service 0a38ef
                args[rec] = ensure_data_is_list(record_value)
Packit Service 0a38ef
Packit Service 0a38ef
        records = {
Packit Service 0a38ef
            key: rec for key, rec in _PART_MAP.items() if key in entry
Packit Service 0a38ef
        }
Packit Service 0a38ef
        for key, rec in records.items():
Packit Service 0a38ef
            args[rec] = entry[key]
Packit Service 0a38ef
Packit Service 0a38ef
    if 'ip_address' in entry:
Packit Service 0a38ef
        ip_address = entry['ip_address']
Packit Service 0a38ef
        if is_ipv4_addr(ip_address):
Packit Service 0a38ef
            args['a_part_ip_address'] = ip_address
Packit Service 0a38ef
        if is_ipv6_addr(ip_address):
Packit Service 0a38ef
            args['aaaa_part_ip_address'] = ip_address
Packit Service 0a38ef
Packit Service 0a38ef
    if entry.get('create_reverse', False):
Packit Service 0a38ef
        if 'a_part_ip_address' in args or 'arecord' in args:
Packit Service 0a38ef
            args['a_extra_create_reverse'] = True
Packit Service 0a38ef
        if 'aaaa_part_ip_address' in args or 'aaaarecord' in args:
Packit Service 0a38ef
            args['aaaa_extra_create_reverse'] = True
Packit Service 0a38ef
Packit Service 0a38ef
    if 'record_ttl' in entry:
Packit Service 0a38ef
        args['dnsttl'] = entry['record_ttl']
Packit Service 0a38ef
Packit Service 0a38ef
    return args
Packit Service 0a38ef
Packit Service 0a38ef
Packit Service 0a38ef
def define_commands_for_present_state(module, zone_name, entry, res_find):
Packit Service 0a38ef
    """Define commnads for `state: present`."""
Packit Service 0a38ef
    _commands = []
Packit Service 0a38ef
Packit Service 0a38ef
    name = to_text(entry['name'])
Packit Service 0a38ef
    args = gen_args(entry)
Packit Service 0a38ef
Packit Service a166ed
    existing = find_dnsrecord(module, zone_name, name)
Packit Service a166ed
Packit Service a166ed
    for record, fields in _RECORD_PARTS.items():
Packit Service a166ed
        part_fields = [f for f in fields if f in args]
Packit Service a166ed
        if part_fields and record in args:
Packit Service a166ed
            record_change_request = True
Packit Service a166ed
            break
Packit Service a166ed
    else:
Packit Service a166ed
        record_change_request = False
Packit Service a166ed
Packit Service a166ed
    if res_find is None and not record_change_request:
Packit Service 0a38ef
        _commands.append([zone_name, 'dnsrecord_add', args])
Packit Service 0a38ef
    else:
Packit Service 0a38ef
        # Create reverse records for existing records
Packit Service 0a38ef
        for ipv in ['a', 'aaaa']:
Packit Service 0a38ef
            record = ('%srecord' % ipv)
Packit Service 0a38ef
            if record in args and ('%s_extra_create_reverse' % ipv) in args:
Packit Service 0a38ef
                cmds = create_reverse_ip_record(
Packit Service 0a38ef
                    module, zone_name, name, args[record])
Packit Service 0a38ef
                _commands.extend(cmds)
Packit Service 0a38ef
                del args['%s_extra_create_reverse' % ipv]
Packit Service 0a38ef
                if '%s_ip_address' not in args:
Packit Service 0a38ef
                    del args[record]
Packit Service 0a38ef
        for record, fields in _RECORD_PARTS.items():
Packit Service 0a38ef
            part_fields = [f for f in fields if f in args]
Packit Service 0a38ef
            if part_fields:
Packit Service 0a38ef
                if record in args:
Packit Service 0a38ef
                    # user wants to update record.
Packit Service 0a38ef
                    if len(args[record]) > 1:
Packit Service 0a38ef
                        module.fail_json(msg="Cannot modify multiple records "
Packit Service 0a38ef
                                             "of the same type at once.")
Packit Service 0a38ef
Packit Service a166ed
                    mod_record = args[record][0]
Packit Service 0a38ef
                    if existing is None:
Packit Service a166ed
                        module.fail_json(msg="`%s` not found." % record)
Packit Service 0a38ef
                    else:
Packit Service 0a38ef
                        # update DNS record
Packit Service 0a38ef
                        _args = {k: args[k] for k in part_fields if k in args}
Packit Service 0a38ef
                        _args["idnsname"] = to_text(args["idnsname"])
Packit Service a166ed
                        _args[record] = mod_record
Packit Service 0a38ef
                        if 'dns_ttl' in args:
Packit Service 0a38ef
                            _args['dns_ttl'] = args['dns_ttl']
Packit Service 0a38ef
                        _commands.append([zone_name, 'dnsrecord_mod', _args])
Packit Service 0a38ef
                    # remove record from args, as it will not be used again.
Packit Service 0a38ef
                    del args[record]
Packit Service 0a38ef
                else:
Packit Service 0a38ef
                    for f in part_fields:
Packit Service 0a38ef
                        _args = {k: args[k] for k in part_fields}
Packit Service 0a38ef
                        _args['idnsname'] = name
Packit Service 0a38ef
                        _commands.append([zone_name, 'dnsrecord_add', _args])
Packit Service 0a38ef
                # clean used fields from args
Packit Service 0a38ef
                for f in part_fields:
Packit Service 0a38ef
                    if f in args:
Packit Service 0a38ef
                        del args[f]
Packit Service 0a38ef
            else:
Packit Service 0a38ef
                if record in args:
Packit Service 0a38ef
                    add_list = []
Packit Service 0a38ef
                    for value in args[record]:
Packit Service a166ed
                        if (
Packit Service a166ed
                            res_find is None
Packit Service a166ed
                            or record not in res_find
Packit Service a166ed
                            or value not in res_find[record]
Packit Service a166ed
                        ):
Packit Service 0a38ef
                            add_list.append(value)
Packit Service 0a38ef
                    if add_list:
Packit Service 0a38ef
                        args[record] = add_list
Packit Service 0a38ef
                        _commands.append([zone_name, 'dnsrecord_add', args])
Packit Service 0a38ef
Packit Service 0a38ef
    return _commands
Packit Service 0a38ef
Packit Service 0a38ef
Packit Service 0a38ef
def define_commands_for_absent_state(module, zone_name, entry, res_find):
Packit Service 0a38ef
    """Define commands for `state: absent`."""
Packit Service 0a38ef
    _commands = []
Packit Service 0a38ef
    if res_find is None:
Packit Service 0a38ef
        return []
Packit Service 0a38ef
Packit Service 0a38ef
    args = gen_args(entry)
Packit Service 0a38ef
Packit Service 0a38ef
    del_all = args.get('del_all', False)
Packit Service 0a38ef
Packit Service 0a38ef
    records_to_delete = {k: v for k, v in args.items() if k.endswith('record')}
Packit Service 0a38ef
Packit Service 0a38ef
    if del_all and records_to_delete:
Packit Service 0a38ef
        module.fail_json(msg="Cannot use del_all and record together.")
Packit Service 0a38ef
Packit Service 0a38ef
    if not del_all:
Packit Service 0a38ef
        delete_records = False
Packit Service 0a38ef
        for record, values in records_to_delete.items():
Packit Service 0a38ef
            del_list = []
Packit Service a166ed
            if record in res_find:
Packit Service a166ed
                for value in values:
Packit Service a166ed
                    for rec_found in res_find[record]:
Packit Service a166ed
                        if rec_found == value:
Packit Service a166ed
                            del_list.append(value)
Packit Service 0a38ef
            if del_list:
Packit Service 0a38ef
                args[record] = del_list
Packit Service 0a38ef
                delete_records = True
Packit Service 0a38ef
        if delete_records:
Packit Service 0a38ef
            _commands.append([zone_name, 'dnsrecord_del', args])
Packit Service 0a38ef
    else:
Packit Service 0a38ef
        _commands.append([zone_name, 'dnsrecord_del', args])
Packit Service 0a38ef
Packit Service 0a38ef
    return _commands
Packit Service 0a38ef
Packit Service 0a38ef
Packit Service 0a38ef
def main():
Packit Service 0a38ef
    """Execute DNS record playbook."""
Packit Service 0a38ef
    ansible_module = configure_module()
Packit Service 0a38ef
Packit Service 0a38ef
    global_zone_name = module_params_get(ansible_module, "zone_name")
Packit Service 0a38ef
    names = module_params_get(ansible_module, "name")
Packit Service 0a38ef
    records = module_params_get(ansible_module, "records")
Packit Service 0a38ef
    state = module_params_get(ansible_module, "state")
Packit Service 0a38ef
Packit Service 0a38ef
    # Check parameters
Packit Service 0a38ef
Packit Service 0a38ef
    if (names is None or len(names) < 1) and \
Packit Service 0a38ef
       (records is None or len(records) < 1):
Packit Service 0a38ef
        ansible_module.fail_json(msg="One of name and records is required")
Packit Service 0a38ef
Packit Service 0a38ef
    if state == "present":
Packit Service 0a38ef
        if names is not None and len(names) != 1:
Packit Service 0a38ef
            ansible_module.fail_json(
Packit Service 0a38ef
                msg="Only one record can be added at a time.")
Packit Service 0a38ef
Packit Service 0a38ef
    if records is not None:
Packit Service 0a38ef
        names = records
Packit Service 0a38ef
Packit Service 0a38ef
    # Init
Packit Service 0a38ef
Packit Service 0a38ef
    changed = False
Packit Service 0a38ef
    exit_args = {}
Packit Service 0a38ef
    ccache_dir = None
Packit Service 0a38ef
    ccache_name = None
Packit Service 0a38ef
Packit Service 0a38ef
    try:
Packit Service 0a38ef
        ccache_dir, ccache_name = connect_to_api(ansible_module)
Packit Service 0a38ef
Packit Service 0a38ef
        commands = []
Packit Service 0a38ef
Packit Service 0a38ef
        for record in names:
Packit Service 0a38ef
            if isinstance(record, dict):
Packit Service 0a38ef
                # ensure name is a string
Packit Service 0a38ef
                zone_name = record.get("zone_name", global_zone_name)
Packit Service 0a38ef
                name = record['name'] = str(record['name'])
Packit Service 0a38ef
                entry = record
Packit Service 0a38ef
            else:
Packit Service 0a38ef
                zone_name = global_zone_name
Packit Service 0a38ef
                name = record
Packit Service 0a38ef
                entry = get_entry_from_module(ansible_module, name)
Packit Service 0a38ef
Packit Service 0a38ef
            check_parameters(ansible_module, state, zone_name, entry)
Packit Service 0a38ef
Packit Service 0a38ef
            res_find = find_dnsrecord(ansible_module, zone_name, name)
Packit Service 0a38ef
Packit Service 0a38ef
            if state == 'present':
Packit Service 0a38ef
                cmds = define_commands_for_present_state(
Packit Service 0a38ef
                    ansible_module, zone_name, entry, res_find)
Packit Service 0a38ef
            elif state == 'absent':
Packit Service 0a38ef
                cmds = define_commands_for_absent_state(
Packit Service 0a38ef
                    ansible_module, zone_name, entry, res_find)
Packit Service 0a38ef
            else:
Packit Service 0a38ef
                ansible_module.fail_json(msg="Unkown state '%s'" % state)
Packit Service 0a38ef
Packit Service 0a38ef
            if cmds:
Packit Service 0a38ef
                commands.extend(cmds)
Packit Service 0a38ef
Packit Service 0a38ef
        # Execute commands
Packit Service 0a38ef
        for name, command, args in commands:
Packit Service 0a38ef
            try:
Packit Service 0a38ef
                result = api_command(
Packit Service 0a38ef
                    ansible_module, command, to_text(name), args)
Packit Service 0a38ef
                if "completed" in result:
Packit Service 0a38ef
                    if result["completed"] > 0:
Packit Service 0a38ef
                        changed = True
Packit Service 0a38ef
                else:
Packit Service 0a38ef
                    changed = True
Packit Service 0a38ef
Packit Service 0a38ef
            except ipalib.errors.EmptyModlist:
Packit Service 0a38ef
                continue
Packit Service 0a38ef
            except ipalib.errors.DuplicateEntry:
Packit Service 0a38ef
                continue
Packit Service 0a38ef
            except Exception as e:
Packit Service 0a38ef
                error_message = str(e)
Packit Service 0a38ef
Packit Service 0a38ef
                ansible_module.fail_json(
Packit Service 0a38ef
                    msg="%s: %s: %s" % (command, name, error_message))
Packit Service 0a38ef
Packit Service 0a38ef
    except Exception as e:
Packit Service 0a38ef
        ansible_module.fail_json(msg=str(e))
Packit Service 0a38ef
Packit Service 0a38ef
    finally:
Packit Service 0a38ef
        temp_kdestroy(ccache_dir, ccache_name)
Packit Service 0a38ef
Packit Service 0a38ef
    # Done
Packit Service 0a38ef
    ansible_module.exit_json(changed=changed, host=exit_args)
Packit Service 0a38ef
Packit Service 0a38ef
Packit Service 0a38ef
if __name__ == "__main__":
Packit Service 0a38ef
    main()