diff --git a/plugins/module_utils/ansible_freeipa_module.py b/plugins/module_utils/ansible_freeipa_module.py index 03cfe1f12f9b28bf92e1f1be29e106c8913b4c11..16e7343fffbd60979e05bcd660a9689061dfe1e6 100644 --- a/plugins/module_utils/ansible_freeipa_module.py +++ b/plugins/module_utils/ansible_freeipa_module.py @@ -28,6 +28,7 @@ import os import uuid import tempfile import shutil +import netaddr import gssapi from datetime import datetime from pprint import pformat @@ -413,6 +414,24 @@ def is_valid_port(port): return False +def is_ip_address(ipaddr): + """Test if given IP address is a valid IPv4 or IPv6 address.""" + try: + netaddr.IPAddress(str(ipaddr)) + except (netaddr.AddrFormatError, ValueError): + return False + return True + + +def is_ip_network_address(ipaddr): + """Test if given IP address is a valid IPv4 or IPv6 address.""" + try: + netaddr.IPNetwork(str(ipaddr)) + except (netaddr.AddrFormatError, ValueError): + return False + return True + + def is_ipv4_addr(ipaddr): """Test if given IP address is a valid IPv4 address.""" try: diff --git a/plugins/modules/ipadnszone.py b/plugins/modules/ipadnszone.py index 8660997d2d772679273a59fad8facf4c4b81f4a8..15cbec1d7d6c250d3d1f9e40bf0d8fb802a346ef 100644 --- a/plugins/modules/ipadnszone.py +++ b/plugins/modules/ipadnszone.py @@ -210,9 +210,9 @@ dnszone: from ipapython.dnsutil import DNSName # noqa: E402 from ansible.module_utils.ansible_freeipa_module import ( FreeIPABaseModule, - is_ipv4_addr, - is_ipv6_addr, - is_valid_port, + is_ip_address, + is_ip_network_address, + is_valid_port ) # noqa: E402 import ipalib.errors import netaddr @@ -252,7 +252,13 @@ class DNSZoneModule(FreeIPABaseModule): def validate_ips(self, ips, error_msg): invalid_ips = [ - ip for ip in ips if not is_ipv4_addr(ip) or is_ipv6_addr(ip) + ip for ip in ips + if not any([ + is_ip_address(ip), + is_ip_network_address(ip), + ip == "any", + ip == "none" + ]) ] if any(invalid_ips): self.fail_json(msg=error_msg % invalid_ips) @@ -309,7 +315,7 @@ class DNSZoneModule(FreeIPABaseModule): forwarders = [] for forwarder in self.ipa_params.forwarders: ip_address = forwarder.get("ip_address") - if not (is_ipv4_addr(ip_address) or is_ipv6_addr(ip_address)): + if not (is_ip_address(ip_address)): self.fail_json( msg="Invalid IP for DNS forwarder: %s" % ip_address )