From: Martin Mares Date: Sat, 20 Apr 2024 18:52:23 +0000 (+0200) Subject: Variadic A and host() X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=7c46d96c912704dc6291be32a4e28028e6c5b84b;p=pynsc.git Variadic A and host() --- diff --git a/nsc.py b/nsc.py index 41abe3c..ca4c33c 100755 --- a/nsc.py +++ b/nsc.py @@ -18,10 +18,11 @@ from dns.zone import Zone 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: @@ -47,15 +48,16 @@ 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: @@ -71,7 +73,7 @@ class NscNode: 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))) @@ -96,6 +98,7 @@ class NscNode: def generic(self, typ: str, text: str) -> Self: self._add(dns.rdata.from_text(RdataClass.IN, typ, text)) + return self class NscZone: @@ -152,6 +155,11 @@ 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 @@ -188,7 +196,9 @@ z = c.add_zone('ucw.cz') # origin_server='jabberwock.ucw.cz') 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')