from ipaddress import ip_address, IPv4Address, IPv6Address
import socket
import sys
-from typing import Optional, Dict, List, Self
+from typing import Optional, Dict, List, Self, Tuple
IPAddress = IPv4Address | IPv6Address
+IPAddr = str | IPAddress | List[str | IPAddress]
class NscNode:
rds = self.node.find_rdataset(rec.rdclass, rec.rdtype, create=True)
rds.add(rec, ttl=self._ttl)
- def _parse_addrs(self, addrs: str | IPAddress | List[str | IPAddress]) -> List[IPAddress]:
- if not isinstance(addrs, list):
- addrs = [addrs]
+ def _parse_addrs(self, addrs: Tuple[IPAddr, ...]) -> List[IPAddress]:
out = []
for a in addrs:
- if isinstance(a, IPv4Address) or isinstance(a, IPv6Address):
- out.append(a)
- else:
- out.append(ip_address(a))
+ if not isinstance(a, list):
+ a = [a]
+ for b in a:
+ if isinstance(b, IPv4Address) or isinstance(b, IPv6Address):
+ out.append(b)
+ else:
+ out.append(ip_address(b))
return out
def _parse_name(self, name: str) -> Name:
else:
return [self._parse_name(n) for n in names]
- def A(self, addrs: str | IPAddress | List[str | IPAddress]) -> Self:
+ def A(self, *addrs: IPAddr) -> Self:
for a in self._parse_addrs(addrs):
if isinstance(a, IPv4Address):
self._add(dns.rdtypes.IN.A.A(RdataClass.IN, RdataType.A, str(a)))
def generic(self, typ: str, text: str) -> Self:
self._add(dns.rdata.from_text(RdataClass.IN, typ, text))
+ return self
class NscZone:
def __getitem__(self, name: str) -> NscNode:
return NscNode(self, name)
+ def host(self, name: str, *args) -> NscNode:
+ n = NscNode(self, name)
+ n.A(*args)
+ return n
+
def dump(self) -> None:
# Could use self.zone.to_file(sys.stdout), but we want better formatting
last_name = None
z[""].NS(['jabberwock', 'chirigo.gebbeth.cz', 'drak.ucw.cz'])
-z['jabberwock'].A(['1.2.3.4', '2a00:da80:fff0:2::2'])
+z['jabberwock'].A('1.2.3.4', '2a00:da80:fff0:2::2')
+
+z.host('test', '1.2.3.4', ['5.6.7.8', '8.7.6.5'])
(z['mnau']
.A('195.113.31.123')