]> mj.ucw.cz Git - pynsc.git/blob - nsconfig/util.py
17c67ee29a35dafe2861577dd1a7511f2b3348eb
[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 datetime import timedelta
5 from typing import Any, List, Optional
6
7
8 IPAddress = IPv4Address | IPv6Address
9 IPNetwork = IPv4Network | IPv6Network
10 IPAddr = str | IPAddress | List[str | IPAddress]
11
12
13 def flatten_list(args: Any) -> List[Any]:
14     def flat(args):
15         if isinstance(args, list) or isinstance(args, tuple):
16             for a in args:
17                 flat(a)
18         else:
19             out.append(args)
20
21     out: List[Any] = []
22     flat(args)
23     return out
24
25
26 def parse_address(addr: IPAddress | str) -> IPAddress:
27     if isinstance(addr, IPv4Address) or isinstance(addr, IPv6Address):
28         return addr
29     elif isinstance(addr, str):
30         return ip_address(addr)
31     else:
32         raise ValueError('Cannot parse IP address')
33
34
35 def parse_network(addr: IPNetwork | str) -> IPNetwork:
36     if isinstance(addr, IPv4Network) or isinstance(addr, IPv6Network):
37         return addr
38     elif isinstance(addr, str):
39         return ip_network(addr)
40     else:
41         raise ValueError('Cannot parse IP network')
42
43
44 def parse_name(name: str, relative: bool = False, origin: Optional[Name] = None) -> Name:
45     # FIXME: Names with escaped dots
46     if '.' in name and not relative and origin is None:
47         return dns.name.from_text(name)
48     else:
49         return dns.name.from_text(name, origin=origin)
50
51
52 def parse_duration(delta: timedelta | int) -> int:
53     if isinstance(delta, timedelta):
54         return int(delta.total_seconds())
55     elif isinstance(delta, int):
56         return delta
57     else:
58         raise ValueError('Cannot parse time duration')