mirror of
https://github.com/NeoCloud/NeoNetwork
synced 2024-11-26 06:40:41 +08:00
scripts/roa.py: support node-dir
This commit is contained in:
parent
b68cd25b9f
commit
1646352278
1 changed files with 39 additions and 14 deletions
|
@ -7,12 +7,20 @@ from itertools import combinations
|
||||||
|
|
||||||
def keyVal(line):
|
def keyVal(line):
|
||||||
l = line.split('=')
|
l = line.split('=')
|
||||||
assert len(l) > 1
|
assert l[0].strip()
|
||||||
|
if len(l) == 1:
|
||||||
|
l.append('')
|
||||||
repl_quotes = lambda t: t.replace('"', '').replace('\'', '')
|
repl_quotes = lambda t: t.replace('"', '').replace('\'', '')
|
||||||
return [l[0].strip(), '='.join([repl_quotes(i).strip() for i in l[1:]])]
|
return [l[0].strip(), '='.join([repl_quotes(i).strip() for i in l[1:]])]
|
||||||
|
|
||||||
cwd = Path()
|
cwd = Path()
|
||||||
assert not [d for d in ("asn", "route", "route6") if not (cwd / d).is_dir()]
|
assert not [d for d in ("asn", "route", "route6", "node") if not (cwd / d).is_dir()]
|
||||||
|
|
||||||
|
def str2asn(s_asn):
|
||||||
|
s_asn = s_asn.lower()
|
||||||
|
if s_asn.startswith('as'):
|
||||||
|
s_asn = s_asn[2:]
|
||||||
|
return int(s_asn)
|
||||||
|
|
||||||
def get_asns():
|
def get_asns():
|
||||||
asns = list()
|
asns = list()
|
||||||
|
@ -26,32 +34,49 @@ def get_asns():
|
||||||
print("[!] Error while processing file", f)
|
print("[!] Error while processing file", f)
|
||||||
raise
|
raise
|
||||||
return asns
|
return asns
|
||||||
|
|
||||||
ASNS = get_asns()
|
ASNS = get_asns()
|
||||||
|
|
||||||
|
def shell2dict(shellscript):
|
||||||
|
fc = dict()
|
||||||
|
for line in shellscript.split('\n'):
|
||||||
|
l = line.strip()
|
||||||
|
if not l or l.startswith('#'):
|
||||||
|
continue
|
||||||
|
key, val = keyVal(l)
|
||||||
|
fc[key.lower()] = val.lower()
|
||||||
|
return fc
|
||||||
|
|
||||||
|
def node2asn():
|
||||||
|
node_table = dict()
|
||||||
|
for f in (cwd / "node").iterdir():
|
||||||
|
try:
|
||||||
|
if not f.is_file():
|
||||||
|
continue
|
||||||
|
fc = shell2dict(f.read_text())
|
||||||
|
asn = str2asn(fc.get('asn'))
|
||||||
|
node_table[f.name.lower()] = asn
|
||||||
|
except Exception:
|
||||||
|
print("[!] Error while processing file", f)
|
||||||
|
raise
|
||||||
|
return node_table
|
||||||
|
NODE_TABLE = node2asn()
|
||||||
|
|
||||||
def route2roa(dirname, is_ipv6=False):
|
def route2roa(dirname, is_ipv6=False):
|
||||||
roa_entries = list()
|
roa_entries = list()
|
||||||
for f in (cwd / dirname).iterdir():
|
for f in (cwd / dirname).iterdir():
|
||||||
try:
|
try:
|
||||||
if not f.is_file():
|
if not f.is_file():
|
||||||
continue
|
continue
|
||||||
t = f.read_text()
|
fc = shell2dict(f.read_text())
|
||||||
lines = t.split('\n')
|
|
||||||
fc = dict()
|
|
||||||
for line in lines:
|
|
||||||
l = line.strip()
|
|
||||||
if not l or l.startswith('#'):
|
|
||||||
continue
|
|
||||||
key, val = keyVal(l)
|
|
||||||
fc[key.lower()] = val.lower()
|
|
||||||
nettype = IPv6Network if is_ipv6 else IPv4Network
|
nettype = IPv6Network if is_ipv6 else IPv4Network
|
||||||
if fc.get('type') in ('lo', 'subnet'):
|
if fc.get('type') in ('lo', 'subnet'):
|
||||||
asn = int(fc.get('as'))
|
asn = str2asn(fc.get('as'))
|
||||||
assert asn in ASNS
|
assert asn in ASNS
|
||||||
route = f.name.replace(',', '/')
|
route = f.name.replace(',', '/')
|
||||||
roa_entries.append([asn, nettype(route, strict=True)])
|
roa_entries.append([asn, nettype(route, strict=True)])
|
||||||
elif fc.get('type').startswith('tun'):
|
elif fc.get('type').startswith('tun'):
|
||||||
asn = int(fc.get('upstream').split(':')[1])
|
upstream = fc.get('upstream')
|
||||||
|
asn = NODE_TABLE[upstream]
|
||||||
assert asn in ASNS
|
assert asn in ASNS
|
||||||
route = f.name.replace(',', '/')
|
route = f.name.replace(',', '/')
|
||||||
roa_entries.append([asn, nettype(route, strict=True)])
|
roa_entries.append([asn, nettype(route, strict=True)])
|
||||||
|
|
Loading…
Reference in a new issue