2 from dns.name import Name
3 from ipaddress import ip_address, IPv4Address, IPv6Address, ip_network, IPv4Network, IPv6Network
4 from typing import Any, List
7 IPAddress = IPv4Address | IPv6Address
8 IPNetwork = IPv4Network | IPv6Network
9 IPAddr = str | IPAddress | List[str | IPAddress]
12 def flatten_list(args: Any) -> List[Any]:
14 if isinstance(args, list) or isinstance(args, tuple):
25 def parse_address(addr: IPAddress | str) -> IPAddress:
26 if isinstance(addr, IPv4Address) or isinstance(addr, IPv6Address):
28 elif isinstance(addr, str):
29 return ip_address(addr)
31 raise ValueError('Cannot parse IP address')
34 def parse_network(addr: IPNetwork | str) -> IPNetwork:
35 if isinstance(addr, IPv4Network) or isinstance(addr, IPv6Network):
37 elif isinstance(addr, str):
38 return ip_network(addr)
40 raise ValueError('Cannot parse IP network')
43 def parse_name(name: str, relative: bool = False) -> Name:
44 # FIXME: Names with escaped dots
45 if '.' in name and not relative:
46 return dns.name.from_text(name)
48 return dns.name.from_text(name, origin=None)