Skip to content

Commit 7dd1081

Browse files
author
Dan Lavu
committed
updated dns methods
1 parent d499027 commit 7dd1081

4 files changed

Lines changed: 111 additions & 39 deletions

File tree

sssd_test_framework/roles/ad.py

Lines changed: 40 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
attrs_include_value,
2020
attrs_parse,
2121
attrs_to_hash,
22+
ip_to_ptr,
2223
ip_version,
2324
seconds_to_timespan,
2425
)
@@ -2347,32 +2348,57 @@ def add_record(self, name: str, data: str | int) -> ADDNSZone:
23472348
"""
23482349
args = ""
23492350

2351+
if self.domain not in name:
2352+
name = f"{name}.{self.domain}"
2353+
short_name = name.split(".")[0]
2354+
23502355
if isinstance(data, int):
2351-
args = f"-Ptr -Name {str(data)} -AllowUpdateAny -PtrDomainName {name}.{self.zone_name}"
2356+
args = f"-Ptr -Name {str(data)} -AllowUpdateAny -PtrDomainName {name}."
23522357
elif isinstance(data, str) and ip_version(data) == 4:
2353-
args = f"-A -Name {name} -IPv4Address {data}"
2358+
args = f"-A -Name {short_name} -IPv4Address {data}"
23542359
elif isinstance(data, str) and ip_version(data) == 6:
2355-
args = f"-A -Name {name} -IPv6Address {data}"
2360+
args = f"-A -Name {short_name} -IPv6Address {data}"
23562361

23572362
self.host.conn.run(f"Add-DnsServerResourceRecord -ZoneName {self.zone_name} {args} ")
23582363
return self
23592364

23602365
def delete_record(self, name: str) -> None:
23612366
"""
2362-
Delete DNS record.
2367+
Delete DNS record, both forward and reverse records are deleted.
23632368
2364-
:param name: Name of the record.
2369+
:param name: Name or IP of the record.
23652370
:type name: str
23662371
"""
2367-
if "in-addr" in self.zone_name:
2368-
record_type = "PTR"
2369-
else:
2370-
data = self.host.conn.run(f"dig +short {name}").stdout.strip()
2371-
record_type = "AAAA" if ":" in data else "A"
2372+
if self.domain not in name:
2373+
name = f"{name}.{self.domain}"
23722374

2373-
self.host.conn.run(
2374-
f"Remove-DnsServerResourceRecord -ZoneName {self.zone_name} -Name {name} -RRType {record_type} -Force"
2375-
)
2375+
records = self.host.conn.run(f"dig +short +norecurse {name} '@{self.server}'").stdout_lines
2376+
records = [s.rstrip("\r") for s in records]
2377+
2378+
if not isinstance(records, list) or records is None:
2379+
return None
2380+
2381+
if len(records) > 1:
2382+
for record in records:
2383+
if ip_version(record) == 4:
2384+
self.role.host.conn.run(
2385+
f"Remove-DnsServerResourceRecord -RRType A -Force -ZoneName {self.zone_name} -Name {name}"
2386+
)
2387+
if ip_version(record) == 6:
2388+
self.host.conn.run(
2389+
f"Remove-DnsServerResourceRecord -RRType AAAA -Force -ZoneName {self.zone_name} -Name {name}"
2390+
)
2391+
2392+
for ptr_records in records:
2393+
ptr_record = self.host.conn.run(f"dig +short -x +norecurse {ptr_records} '@{self.server}'").stdout_lines
2394+
ptr_record = [r.rstrip("\r") for r in ptr_record]
2395+
if ptr_record:
2396+
self.host.conn.run(
2397+
f"Remove-DnsServerResourceRecord -RRType PTR "
2398+
f"-Force -ZoneName {ip_to_ptr(ptr_record[0])} "
2399+
f"-Name {'.'.join(ptr_record).split()[-1]}",
2400+
)
2401+
return None
23762402

23772403
def print(self) -> str:
23782404
"""
@@ -2381,7 +2407,7 @@ def print(self) -> str:
23812407
:return: Print zone data.
23822408
:rtype: str
23832409
"""
2384-
return self.host.conn.run(f"Get-DnsServerResourceRecord -ZoneName {self.zone_name}").stdout
2410+
return self.host.conn.run(f"Get-DnsServerResourceRecord -ZoneName {self.zone_name} | Format-List").stdout
23852411

23862412

23872413
ADNetgroupMember: TypeAlias = LDAPNetgroupMember[ADUser, ADNetgroup]

sssd_test_framework/roles/generic.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1552,7 +1552,7 @@ def add_record(self, name: str, data: str | int) -> GenericDNSZone:
15521552
@abstractmethod
15531553
def delete_record(self, name: str) -> None:
15541554
"""
1555-
Delete DNS record.
1555+
Delete DNS record, both forward and reverse records are deleted.
15561556
15571557
:param name: Name of the record.
15581558
:type name: str

sssd_test_framework/roles/ipa.py

Lines changed: 33 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2867,7 +2867,8 @@ def create(self) -> IPADNSZone:
28672867
:return: IPADNSServer object.
28682868
:rtype: IPADNSServer
28692869
"""
2870-
self.host.conn.run(f"ipa dnszone-add {self.zone_name} --dynamic-update=TRUE --skip-overlap-check")
2870+
self.host.conn.run(f"ipa dnszone-add {self.zone_name} --skip-overlap-check")
2871+
self.host.conn.run(f"ipa dnszone-mod {self.zone_name} --dynamic-update=TRUE --allow-sync-ptr=TRUE")
28712872
return self
28722873

28732874
def delete(self) -> None:
@@ -2891,26 +2892,52 @@ def add_record(self, name: str, data: str | int) -> IPADNSZone:
28912892
:rtype: IPADNSZone
28922893
"""
28932894
args = ""
2895+
if self.domain not in name:
2896+
name = f"{name}.{self.domain}"
2897+
short_name = name.split(".")[0]
28942898

28952899
if isinstance(data, int):
28962900
args = f"{str(data)} --ptr-rec={name}."
28972901
elif isinstance(data, str) and ip_version(data) == 4:
2898-
args = f"{name} --a-rec={data}"
2902+
args = f"{short_name} --a-rec={data}"
28992903
elif isinstance(data, str) and ip_version(data) == 6:
2900-
args = f"{name} --aaaa-rec={data}"
2904+
args = f"{short_name} --aaaa-rec={data}"
29012905

29022906
self.host.conn.run(f"ipa dnsrecord-add {self.zone_name} {args}")
29032907

29042908
return self
29052909

29062910
def delete_record(self, name: str) -> None:
29072911
"""
2908-
Delete DNS record.
2912+
Delete DNS record, both forward and reverse records are deleted.
29092913
2910-
:param name: Name of the record.
2914+
:param name: Name.
29112915
:type name: str
29122916
"""
2913-
self.host.conn.run(f"ipa dnsrecord-del {self.zone_name} {name}")
2917+
if self.domain not in name:
2918+
name = f"{name}.{self.domain}"
2919+
2920+
records = self.host.conn.run(f"dig +short +norecurse {name} '@{self.server}'").stdout_lines
2921+
records = [s.rstrip("\r") for s in records]
2922+
2923+
if not isinstance(records, list) or records is None:
2924+
return None
2925+
2926+
if len(records) > 1:
2927+
for record in records:
2928+
if ip_version(record) == 4:
2929+
self.host.conn.run(f"ipa dnsrecord-del {self.zone_name} --a-rec={record}")
2930+
if ip_version(record) == 6:
2931+
self.host.conn.run(f"ipa dnsrecord-del {self.zone_name} --aaaa-rec={record}")
2932+
2933+
for ptr_records in records:
2934+
ptr_record = self.host.conn.run(f"dig +short -x +norecurse {ptr_records} '@{self.server}'").stdout_lines
2935+
ptr_record = [r.rstrip("\r") for r in ptr_record]
2936+
if ptr_record:
2937+
self.host.conn.run(f"ipa dnsrecord-del {self.zone_name} --ptr-rec={record}")
2938+
return None
2939+
2940+
time.sleep(5) # Wait for the record to be deleted
29142941

29152942
def print(self) -> str:
29162943
"""

sssd_test_framework/roles/samba.py

Lines changed: 37 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from pytest_mh.conn import ProcessResult
1212

1313
from ..hosts.samba import SambaHost
14-
from ..misc import attrs_parse, ip_version, to_list_of_strings
14+
from ..misc import attrs_parse, ip_to_ptr, ip_version, to_list_of_strings
1515
from ..utils.ldap import LDAPRecordAttributes
1616
from .base import BaseLinuxLDAPRole, BaseObject, DeleteAttribute
1717
from .generic import GenericPasswordPolicy
@@ -1360,37 +1360,56 @@ def add_record(self, name: str, data: str) -> SambaDNSZone:
13601360
:rtype: SambaDNSZone
13611361
"""
13621362
args = ""
1363+
if self.domain not in name:
1364+
name = f"{name}.{self.domain}"
1365+
short_name = name.split(".")[0]
13631366

13641367
if isinstance(data, int):
1365-
args = f" {name} PTR {str(data)} {self.credentials}"
1368+
args = f" {name}. PTR {str(data)} {self.credentials}"
13661369
elif isinstance(data, str) and ip_version(data) == 4:
1367-
args = f" {name} A {data} {self.credentials}"
1370+
args = f" {short_name} A {data} {self.credentials}"
13681371
elif isinstance(data, str) and ip_version(data) == 6:
1369-
args = f" {name} AAAA {data} {self.credentials}"
1372+
args = f" {short_name} AAAA {data} {self.credentials}"
13701373

13711374
self.host.conn.run(f"samba-tool dns add {self.server} {self.zone_name} {args}")
13721375
return self
13731376

13741377
def delete_record(self, name: str) -> None:
13751378
"""
1376-
Delete DNS record.
1379+
Delete DNS record, both forward and reverse records are deleted.
13771380
13781381
:param name: Name of the record.
13791382
:type name: str
13801383
"""
1381-
if "in-addr" in self.zone_name:
1382-
record_type = "PTR"
1383-
data = self.host.conn.run(f"dig -x +short {name}").stdout.strip()
1384-
else:
1385-
data = self.host.conn.run(f"dig +short {name}").stdout.strip()
1386-
record_type = "AAAA" if ":" in data else "A"
1387-
1388-
self.role.host.conn.run(
1389-
f"samba-tool dns delete "
1390-
f"{self.server} {self.zone_name} "
1391-
f"{name} {record_type} {data} "
1392-
f"{self.credentials}"
1393-
)
1384+
if self.domain not in name:
1385+
name = f"{name}.{self.domain}"
1386+
1387+
records = self.host.conn.run(f"dig +short +norecurse {name} '@{self.server}'").stdout_lines
1388+
records = [s.rstrip("\r") for s in records]
1389+
1390+
if not isinstance(records, list) or records is None:
1391+
return None
1392+
1393+
if len(records) > 1:
1394+
for record in records:
1395+
if ip_version(record) == 4:
1396+
self.role.host.conn.run(
1397+
f"samba-tool dns delete {self.server} {self.zone_name} {name} A {record} {self.credentials}"
1398+
)
1399+
if ip_version(record) == 6:
1400+
self.host.conn.run(
1401+
f"samba-tool dns delete {self.server} {self.zone_name} {name} AAAA {record} {self.credentials}"
1402+
)
1403+
1404+
for ptr_records in records:
1405+
ptr_record = self.host.conn.run(f"dig +short -x +norecurse {ptr_records} '@{self.server}'").stdout_lines
1406+
ptr_record = [r.rstrip("\r") for r in ptr_record]
1407+
if ptr_record:
1408+
self.host.conn.run(
1409+
f"samba-tool dns delete {self.server} {ip_to_ptr(ptr_record[0])} {name} "
1410+
f"PTR {ptr_record} {self.credentials}"
1411+
)
1412+
return None
13941413

13951414
def print(self) -> str:
13961415
"""

0 commit comments

Comments
 (0)