+import dns.name
+from dns.name import Name
+from ipaddress import ip_address, IPv4Address, IPv6Address, ip_network, IPv4Network, IPv6Network
from typing import Any, List
+IPAddress = IPv4Address | IPv6Address
+IPNetwork = IPv4Network | IPv6Network
+IPAddr = str | IPAddress | List[str | IPAddress]
+
+
def flatten_list(args: Any) -> List[Any]:
def flat(args):
if isinstance(args, list) or isinstance(args, tuple):
out: List[Any] = []
flat(args)
return out
+
+
+def parse_address(addr: IPAddress | 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_network(addr: IPNetwork | str) -> IPNetwork:
+ if isinstance(addr, IPv4Network) or isinstance(addr, IPv6Network):
+ return addr
+ elif isinstance(addr, str):
+ return ip_network(addr)
+ else:
+ raise ValueError('Cannot parse IP network')
+
+
+def parse_name(name: str, relative: bool = False) -> Name:
+ # FIXME: Names with escaped dots
+ if '.' in name and not relative:
+ return dns.name.from_text(name)
+ else:
+ return dns.name.from_text(name, origin=None)