import sys
from typing import Optional, Dict, List, Self, DefaultDict, TextIO, Tuple, TYPE_CHECKING
-from nsconfig.util import flatten_list, parse_address, parse_network, parse_name, parse_duration
+from nsconfig.util import flatten_list, parse_address, parse_network, parse_name, parse_duration, parse_rname
from nsconfig.util import IPAddress, IPNetwork, IPAddr, NameParseMode
soa = dns.rdtypes.ANY.SOA.SOA(
RdataClass.IN, RdataType.SOA,
mname=conf.origin_server,
- rname=conf.admin_email.replace('@', '.'), # FIXME: names with dots
+ rname=parse_rname(conf.admin_email),
serial=self.state.serial,
refresh=conf.refresh,
retry=conf.retry,
...
+def parse_rname(name: str) -> Name:
+ # Responsible person in SOA record, expressed as an e-mail address
+ parts = name.split('@')
+ assert len(parts) == 2
+ return dns.name.from_text(parts[0].replace('.', '\\.') + '.' + parts[1])
+
+
def parse_duration(delta: timedelta | int) -> int:
if isinstance(delta, timedelta):
return int(delta.total_seconds())