1 # PyNSC: Utility functions
2 # (c) 2024 Martin Mareš <mj@ucw.cz>
5 from dns.name import Name
6 from ipaddress import ip_address, IPv4Address, IPv6Address, ip_network, IPv4Network, IPv6Network
7 from datetime import timedelta
8 from typing import Any, List, Optional
11 IPAddress = IPv4Address | IPv6Address
12 IPNetwork = IPv4Network | IPv6Network
13 IPAddr = str | IPAddress | List[str | IPAddress]
16 def flatten_list(args: Any) -> List[Any]:
18 if isinstance(args, list) or isinstance(args, tuple):
29 def parse_address(addr: IPAddress | str) -> IPAddress:
30 if isinstance(addr, IPv4Address) or isinstance(addr, IPv6Address):
32 elif isinstance(addr, str):
33 return ip_address(addr)
35 raise ValueError('Cannot parse IP address')
38 def parse_network(addr: IPNetwork | str) -> IPNetwork:
39 if isinstance(addr, IPv4Network) or isinstance(addr, IPv6Network):
41 elif isinstance(addr, str):
42 return ip_network(addr)
44 raise ValueError('Cannot parse IP network')
47 def parse_name(name: str, relative: bool = False, origin: Optional[Name] = None) -> Name:
48 # FIXME: Names with escaped dots
49 if '.' in name and not relative and origin is None:
50 return dns.name.from_text(name)
52 return dns.name.from_text(name, origin=origin)
55 def parse_duration(delta: timedelta | int) -> int:
56 if isinstance(delta, timedelta):
57 return int(delta.total_seconds())
58 elif isinstance(delta, int):
61 raise ValueError('Cannot parse time duration')