]> mj.ucw.cz Git - pynsc.git/commitdiff
Clean up parsing of names
authorMartin Mares <mj@ucw.cz>
Wed, 7 Aug 2024 21:08:41 +0000 (23:08 +0200)
committerMartin Mares <mj@ucw.cz>
Wed, 7 Aug 2024 21:08:41 +0000 (23:08 +0200)
nsconfig/core.py
nsconfig/util.py

index 6f69737b81779deb538e7fa27c55a395247a4db8..860aa3655a288c218c1d92d327c71e4e8a7bfd41 100644 (file)
@@ -39,14 +39,14 @@ if TYPE_CHECKING:
 
 class NscNode:
     nsc_zone: 'NscZonePrimary'
-    name: str
+    name: Name
     node: Node
     _ttl: int
 
     def __init__(self, nsc_zone: 'NscZonePrimary', name: str) -> None:
         self.nsc_zone = nsc_zone
-        self.name = name
-        self.node = nsc_zone.zone.find_node(parse_name(name, NameParseMode.relative), create=True)
+        self.name = self._parse_lhs_name(name)
+        self.node = nsc_zone.zone.find_node(self.name, create=True)
         self._ttl = nsc_zone.config.default_ttl
 
     def ttl(self, seconds: Optional[int] = None, **kwargs) -> Self:
@@ -62,7 +62,10 @@ class NscNode:
         rds = self.node.find_rdataset(rec.rdclass, rec.rdtype, create=True)
         rds.add(rec, ttl=self._ttl)
 
-    def _parse_name(self, name, **kwargs):
+    def _parse_lhs_name(self, name, **kwargs):
+        return parse_name(name, mode=NameParseMode.relative, **kwargs)
+
+    def _parse_rhs_name(self, name, **kwargs):
         return parse_name(name, mode=self.nsc_zone.config.name_parse_mode, **kwargs)
 
     def A(self, *addrs: IPAddr, reverse: bool = True) -> Self:
@@ -72,7 +75,7 @@ class NscNode:
             else:
                 self._add(dns.rdtypes.IN.AAAA.AAAA(RdataClass.IN, RdataType.AAAA, str(a)))
             if reverse:
-                self.nsc_zone.nsc._add_reverse_mapping(a, parse_name(self.name, mode=NameParseMode.relative, origin=self.nsc_zone.dns_name))
+                self.nsc_zone.nsc._add_reverse_mapping(a, self.name.choose_relativity(origin=self.nsc_zone.dns_name, relativize=False))
         return self
 
     def CNAME(self, target: Name | str) -> Self:
@@ -85,7 +88,7 @@ class NscNode:
 
     def MX(self, pri: int, name: str) -> Self:
         self._add(
-            dns.rdtypes.ANY.MX.MX(RdataClass.IN, RdataType.MX, pri, self._parse_name(name))
+            dns.rdtypes.ANY.MX.MX(RdataClass.IN, RdataType.MX, pri, self._parse_rhs_name(name))
         )
         return self
 
@@ -96,7 +99,7 @@ class NscNode:
 
     def NS(self, *names: str | List[str]) -> Self:
         for name in flatten_list(names):
-            self._add(dns.rdtypes.ANY.NS.NS(RdataClass.IN, RdataType.NS, self._parse_name(name)))
+            self._add(dns.rdtypes.ANY.NS.NS(RdataClass.IN, RdataType.NS, self._parse_rhs_name(name)))
         return self
 
     def PTR(self, target: Name | str) -> Self:
@@ -104,7 +107,7 @@ class NscNode:
         return self
 
     def SRV(self, priority: int, weight: int, port: int, target: Name | str) -> Self:
-        self._add(dns.rdtypes.IN.SRV.SRV(RdataClass.IN, RdataType.SRV, priority, weight, port, self._parse_name(target)))
+        self._add(dns.rdtypes.IN.SRV.SRV(RdataClass.IN, RdataType.SRV, priority, weight, port, self._parse_rhs_name(target)))
         return self
 
     def TXT(self, *text: str | List[str]) -> Self:
index 27449cbadcd504ce100fef064f16754c58cd28be..bcff99c18a6524ee22d6afa4229359e0874384df 100644 (file)
@@ -56,16 +56,16 @@ def parse_network(addr: IPNetwork | str) -> IPNetwork:
         raise ValueError('Cannot parse IP network')
 
 
-def parse_name(name: str, mode: NameParseMode = NameParseMode.relative, origin: Optional[Name] = None) -> Name:
+def parse_name(name: str, mode: NameParseMode = NameParseMode.relative) -> Name:
     if name.endswith('.@'):
-        return dns.name.from_text(name[:-2], origin=origin)
+        return dns.name.from_text(name[:-2], origin=None)
     if mode == NameParseMode.relative:
-        return dns.name.from_text(name, origin=origin)
+        return dns.name.from_text(name, origin=None)
     elif mode == NameParseMode.absolute:
         if '.' in name:
             return dns.name.from_text(name)
         else:
-            return dns.name.from_text(name, origin=origin)
+            return dns.name.from_text(name, origin=None)
     else:
         ...