]> mj.ucw.cz Git - pynsc.git/blobdiff - nsconfig/util.py
Add mechanism for classless reverse delegations
[pynsc.git] / nsconfig / util.py
index 7b9370c6ea564561899c5794d2adec9481e90696..48e2e6f7d39bc70fd598b2aae04f3fdebffe3eca 100644 (file)
@@ -1,6 +1,14 @@
+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):
@@ -12,3 +20,29 @@ def flatten_list(args: Any) -> List[Any]:
     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)