handle [net] first, network fix

This commit is contained in:
ROTTLER Tamas 2023-09-21 03:58:10 +02:00
parent 260ff97c0a
commit d184b355d8

View File

@ -45,7 +45,7 @@ class Rev:
self.revzones[zone]['info'] += info self.revzones[zone]['info'] += info
#print(f"zoneinfo {zone} - {info}") #print(f"zoneinfo {zone} - {info}")
def ptr(self, zone, addr, name, network = "", noauto = False, generate = False, comment = False): def ptr(self, zone, addr, name, network = "", noauto = False, generate = False, wikionly = False):
self._check_zone(zone) self._check_zone(zone)
if not (ipbyte := re.match(r"(\d+)\.(\d+)\.(\d+)\.(\d+)", addr)): if not (ipbyte := re.match(r"(\d+)\.(\d+)\.(\d+)\.(\d+)", addr)):
raise RevInvalidAddress(f"invalid address: {addr} ({name} / rev zone: {zone})") raise RevInvalidAddress(f"invalid address: {addr} ({name} / rev zone: {zone})")
@ -63,7 +63,7 @@ class Rev:
'network': network, 'network': network,
'noauto': noauto, 'noauto': noauto,
'generate': generate, 'generate': generate,
'comment': comment 'wikionly': wikionly
} }
#print(f"{zone} {addr} {ptr}") #print(f"{zone} {addr} {ptr}")
@ -80,7 +80,7 @@ class Rev:
ptr = [] ptr = []
for ip in sorted(self.revzones[zone]['ptr']): for ip in sorted(self.revzones[zone]['ptr']):
rec = self.revzones[zone]['ptr'][ip] rec = self.revzones[zone]['ptr'][ip]
if rec['noauto'] or rec['comment']: if rec['noauto'] or rec['wikionly']:
continue; continue;
ptr.append(f"{rec['ptr']}\t\tIN PTR\t{rec['name']}") ptr.append(f"{rec['ptr']}\t\tIN PTR\t{rec['name']}")
return other + ptr return other + ptr
@ -93,23 +93,28 @@ class Rev:
last_addr = None last_addr = None
for ip in sorted(self.revzones[zone]['ptr']): for ip in sorted(self.revzones[zone]['ptr']):
rec = self.revzones[zone]['ptr'][ip] rec = self.revzones[zone]['ptr'][ip]
if last_addr and re.sub(r"(\d+)$", lambda r : str(int(r[1])+1), last_addr) != rec['addr']: addr, name = rec['addr'], rec['name']
if last_addr and re.sub(r"(\d+)$", lambda r : str(int(r[1])+1), last_addr) != addr:
wiki.append("| |||") wiki.append("| |||")
last_addr = rec['addr'] last_addr = addr
if rec['generate']: if rec['generate']:
if rec['generate'] == 'first': if rec['generate'] == 'first':
gen_first_name = rec['name'] gen_first_name = name
gen_first_addr = rec['addr'] gen_first_addr = addr
continue continue
elif rec['generate'] == 'middle': elif rec['generate'] == 'middle':
continue continue
elif rec['generate'] == 'last': elif rec['generate'] == 'last':
rec['name'] = f"{gen_first_name}\\\\ ...\\\\ {rec['name']}" name = f"{gen_first_name}\\\\ ...\\\\ {name}"
rec['addr'] = f"{gen_first_addr}\\\\ ...\\\\ {rec['addr']}" addr = f"{gen_first_addr}\\\\ ...\\\\ {addr}"
network = re.sub(r'(v\d+)', '**\\1**', rec['network']) network = re.sub(r'(v\d+)', '**\\1**', rec['network'])
if rec['noauto']: if rec['noauto']:
network = "**M** "+ network network = "**M** "+ network
wiki.append(f"|{rec['addr']}|{rec['name']}|{network}|") if rec['wikionly']:
addr = f"//{addr}//"
name = f"//{name}//"
network = f"//{network}//"
wiki.append(f"|{addr}|{name}|{network}|")
return wiki return wiki
@ -131,21 +136,21 @@ def read_zone(zonefile, rev):
print(f"invalid autorev: {revzone}", file=sys.stderr) print(f"invalid autorev: {revzone}", file=sys.stderr)
exit(1) exit(1)
rev.add_zone(revzone) rev.add_zone(revzone)
elif r:= re.match(r"\s*;.*?\[vlan\]\s*(.*)", line):
network = r[1]
network_ptrs = False
print(f"warning: legacy [vlan] in zone file {zonefile}")
elif r:= re.match(r"\s*;.*?\[net(work)?\]\s*(.*)", line): elif r:= re.match(r"\s*;.*?\[net(work)?\]\s*(.*)", line):
prev_network = network prev_network = network
network = r[2] network = r[2]
if prev_network and not network_ptrs: if prev_network and not network_ptrs:
# no ptr records in previous network # no ptr records in previous network
if r:= re.match(r"[0-9./]+", network): if r:= re.match(r"[0-9./]+", prev_network):
try: try:
rev.ptr(revzone, r[0], f"-", network=network, comment=True) rev.ptr(revzone, r[0], f"-", network=prev_network, wikionly=True)
except: except:
pass pass
network_ptrs = False network_ptrs = False
elif r:= re.match(r"\s*;.*?\[vlan\]\s*(.*)", line):
network = r[1]
network_ptrs = False
print(f"warning: legacy [vlan] in zone file {zonefile}")
if not revzone or not origin: if not revzone or not origin:
continue continue
if r := re.match(r"\s*([a-z0-9.-]+)\s+IN\s+A\s+([0-9.]+)(.*)", line, flags=re.I): if r := re.match(r"\s*([a-z0-9.-]+)\s+IN\s+A\s+([0-9.]+)(.*)", line, flags=re.I):