import sys
from typing import Optional, Dict, List, Self, Tuple, DefaultDict, TextIO, TYPE_CHECKING
+from nsconfig.util import flatten_list
+
if TYPE_CHECKING:
from nsconfig.daemon import NscDaemon
rds = self.node.find_rdataset(rec.rdclass, rec.rdtype, create=True)
rds.add(rec, ttl=self._ttl)
- def _parse_addrs(self, addrs: Tuple[IPAddr, ...]) -> List[IPAddress]:
- out = []
- for a in addrs:
- 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_addr(self, addr: IPAddr | str) -> IPAddress:
+ if isinstance(addr, IPv4Address) or isinstance(addr, IPv6Address):
+ return addr
+ elif isinstance(addr, str):
+ return ip_address(addr)
+ else:
+ raise ValueError('Cannot parse IP address')
def _parse_name(self, name: str) -> Name:
# FIXME: Names with escaped dots
else:
return dns.name.from_text(name, origin=None)
- def _parse_names(self, names: str | List[str]) -> List[Name]:
- if isinstance(names, str):
- return [self._parse_name(names)]
- else:
- return [self._parse_name(n) for n in names]
-
def A(self, *addrs: IPAddr, reverse: bool = True) -> Self:
- for a in self._parse_addrs(addrs):
+ for a in map(self._parse_addr, flatten_list(addrs)):
if isinstance(a, IPv4Address):
self._add(dns.rdtypes.IN.A.A(RdataClass.IN, RdataType.A, str(a)))
else:
)
return self
- def NS(self, names: str | List[str]) -> Self:
- # FIXME: Variadic?
- for name in self._parse_names(names):
+ def NS(self, *names: str | List[str]) -> Self:
+ for name in map(self._parse_name, flatten_list(names)):
self._add(dns.rdtypes.ANY.NS.NS(RdataClass.IN, RdataType.NS, name))
return self
- def TXT(self, text: str) -> Self:
- self._add(dns.rdtypes.ANY.TXT.TXT(RdataClass.IN, RdataType.TXT, text))
+ def TXT(self, *text: str | List[str]) -> Self:
+ for txt in flatten_list(text):
+ self._add(dns.rdtypes.ANY.TXT.TXT(RdataClass.IN, RdataType.TXT, txt))
return self
def PTR(self, target: Name | str) -> Self: