+
+
+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)