]> mj.ucw.cz Git - pynsc.git/blob - nsconfig/util.py
48e2e6f7d39bc70fd598b2aae04f3fdebffe3eca
[pynsc.git] / nsconfig / util.py
1 import dns.name
2 from dns.name import Name
3 from ipaddress import ip_address, IPv4Address, IPv6Address, ip_network, IPv4Network, IPv6Network
4 from typing import Any, List
5
6
7 IPAddress = IPv4Address | IPv6Address
8 IPNetwork = IPv4Network | IPv6Network
9 IPAddr = str | IPAddress | List[str | IPAddress]
10
11
12 def flatten_list(args: Any) -> List[Any]:
13     def flat(args):
14         if isinstance(args, list) or isinstance(args, tuple):
15             for a in args:
16                 flat(a)
17         else:
18             out.append(args)
19
20     out: List[Any] = []
21     flat(args)
22     return out
23
24
25 def parse_address(addr: IPAddress | str) -> IPAddress:
26     if isinstance(addr, IPv4Address) or isinstance(addr, IPv6Address):
27         return addr
28     elif isinstance(addr, str):
29         return ip_address(addr)
30     else:
31         raise ValueError('Cannot parse IP address')
32
33
34 def parse_network(addr: IPNetwork | str) -> IPNetwork:
35     if isinstance(addr, IPv4Network) or isinstance(addr, IPv6Network):
36         return addr
37     elif isinstance(addr, str):
38         return ip_network(addr)
39     else:
40         raise ValueError('Cannot parse IP network')
41
42
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)
47     else:
48         return dns.name.from_text(name, origin=None)