From: Martin Mares Date: Wed, 7 Aug 2024 21:08:41 +0000 (+0200) Subject: Clean up parsing of names X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=40b41dac52f81e1b38f146cb1e51dbe7f151359c;p=pynsc.git Clean up parsing of names --- diff --git a/nsconfig/core.py b/nsconfig/core.py index 6f69737..860aa36 100644 --- a/nsconfig/core.py +++ b/nsconfig/core.py @@ -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: diff --git a/nsconfig/util.py b/nsconfig/util.py index 27449cb..bcff99c 100644 --- a/nsconfig/util.py +++ b/nsconfig/util.py @@ -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: ...