X-Git-Url: https://git.ralfj.de/zonemaker.git/blobdiff_plain/164584073909c27d2a310c95ca13333bbf769aba..a32bbc89f575b8f0042a4291af83bfe4932e91d7:/zonemaker/zone.py diff --git a/zonemaker/zone.py b/zonemaker/zone.py index 35363ff..390b0dd 100644 --- a/zonemaker/zone.py +++ b/zonemaker/zone.py @@ -1,5 +1,4 @@ -import re -from ipaddress import IPv4Address, IPv6Address +import re, datetime from typing import List, Dict, Any, Iterator, Tuple, Sequence @@ -10,6 +9,8 @@ day = 24*hour week = 7*day REGEX_label = r'[a-zA-Z90-9]([a-zA-Z90-9-]{0,61}[a-zA-Z90-9])?' # max. 63 characters; must not start or end with hyphen +REGEX_ipv4 = r'^\d{1,3}(\.\d{1,3}){3}$' +REGEX_ipv6 = r'^[a-fA-F0-9]{1,4}(:[a-fA-F0-9]{1,4}){7}$' def check_label(label: str) -> str: pattern = r'^{0}$'.format(REGEX_label) @@ -29,6 +30,16 @@ def check_hex(data: str) -> str: return data raise Exception(data+" is not valid hex data") +def check_ipv4(address: str) -> str: + if re.match(REGEX_ipv4, address): + return address + raise Exception(address+" is not a valid IPv4 address") + +def check_ipv6(address: str) -> str: + if re.match(REGEX_ipv6, address): + return address + raise Exception(address+" is not a valid IPv6 address") + def time(time: int) -> str: if time == 0: return "0" @@ -72,7 +83,7 @@ class Digest: ## Record types class A: def __init__(self, address: str) -> None: - self._address = IPv4Address(address) + self._address = check_ipv4(address) def generate_rr(self, owner: str, zone: 'Zone') -> Any: return zone.RR(owner, 'A', self._address) @@ -80,7 +91,7 @@ class A: class AAAA: def __init__(self, address: str) -> None: - self._address = IPv6Address(address) + self._address = check_ipv6(address) def generate_rr(self, owner: str, zone: 'Zone') -> Any: return zone.RR(owner, 'AAAA', self._address) @@ -191,12 +202,11 @@ def SecureDelegation(name: str, tag: int, alg: int, digest: int, key: str) -> Na class Zone: - def __init__(self, name: str, serialfile: str, dbfile: str, mail: str, NS: List[str], + def __init__(self, name: str, serialfile: str, mail: str, NS: List[str], secondary_refresh: int, secondary_retry: int, secondary_expire: int, NX_TTL: int = None, A_TTL: int = None, other_TTL: int = None, domains: Dict[str, Any] = {}) -> None: self._serialfile = serialfile - self._dbfile = dbfile if not name.endswith('.'): raise Exception("Expected an absolute hostname") self._name = check_hostname(name) @@ -272,7 +282,6 @@ class Zone: yield rr def write(self) -> None: - with open(self._dbfile, 'w') as f: - for rr in self.generate_rrs(): - f.write(rr+"\n") - print(rr) + print(";; {0} zone file, generated by zonemaker on {1}".format(self._name, datetime.datetime.now())) + for rr in self.generate_rrs(): + print(rr)