#!/usr/share/ucs-test/runner python3
## desc: Creates DNS pointer record entry and try to resolve it
## bugs: [39269]
## roles:
##  - domaincontroller_master
## packages:
##   - univention-config
##   - univention-directory-manager-tools
## tags:
##  - skip_admember
## exposure: careful

import univention.testing.udm as udm_test
import univention.testing.strings as uts
from essential.dns_helper import resolveDnsEntry


if __name__ == '__main__':
	with udm_test.UCSTestUDM() as udm:
		pos = 'cn=dns,%s' % (udm.LDAP_BASE,)

		ptr_record = '%s.%s.' % (uts.random_name(), uts.random_name())

		#IPv4
		ipv4 = uts.random_ip().split('.')
		subnet = ipv4[:3]
		reverse_zone_properties = {
			'subnet': '.'.join(subnet),
			'nameserver': udm.FQHN,
			'contact': '%s@%s.%s' % (uts.random_name(), uts.random_name(), uts.random_name()),
			'serial': '%s' % (uts.random_int()),
			'zonettl': '%s' % (uts.random_int(bottom_end=100, top_end=999)),
			'refresh': '%s' % (uts.random_int(bottom_end=10, top_end=99)),
			'expire': '%s' % (uts.random_int(bottom_end=10, top_end=99)),
			'ttl': '%s' % (uts.random_int(bottom_end=10, top_end=99)),
			'retry': '%s' % (uts.random_int()),
		}
		reverse_zone = udm.create_object('dns/reverse_zone', position=pos, **reverse_zone_properties)

		ptr = udm.create_object('dns/ptr_record', address=ipv4[3], superordinate=reverse_zone, ptr_record=ptr_record)

		zoneName = '.'.join(
			list(reversed(ipv4)) + ['in-addr', 'arpa', '']
		)
		answers = resolveDnsEntry(zoneName, 'PTR')
		answer = [rdata.to_text() for rdata in answers]
		assert answer == [ptr_record], 'resolved name "%s" != created ldap-object "%s"' % (answer, [ptr_record])

		#IPv6
		ipv6 = '2011:06f8:13dc:0002:19b7:d592:09dd:1041'.split(':')  # create uts.random_ipV6()?
		subnet = ipv6[:7]
		reverse_zone_properties.update({
			'subnet': ':'.join(subnet),
		})
		reverse_zone = udm.create_object('dns/reverse_zone', position=pos, **reverse_zone_properties)

		addr = '.'.join(reversed(ipv6[7]))
		ptr = udm.create_object('dns/ptr_record', address=addr, superordinate=reverse_zone, ptr_record=ptr_record)

		zoneName = '.'.join(
			list(reversed([nibble for block in ipv6 for nibble in block])) + ['ip6', 'arpa', '']
		)
		answers = resolveDnsEntry(zoneName, 'PTR')
		answer = [rdata.to_text() for rdata in answers]
		assert answer == [ptr_record], 'resolved name "%s" != created ldap-object "%s"' % (answer, [ptr_record])
