]> mj.ucw.cz Git - pynsc.git/commitdiff
Variadic A and host()
authorMartin Mares <mj@ucw.cz>
Sat, 20 Apr 2024 18:52:23 +0000 (20:52 +0200)
committerMartin Mares <mj@ucw.cz>
Sat, 20 Apr 2024 18:52:23 +0000 (20:52 +0200)
nsc.py

diff --git a/nsc.py b/nsc.py
index 41abe3c8dad591ed052aa9a674967ae41d588d1f..ca4c33ce16844ff9345d2a21e4a0b9b9e847ef0d 100755 (executable)
--- 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')