1
0
Fork 0
mirror of https://github.com/NeoCloud/NeoNetwork synced 2024-11-05 09:52:23 +08:00

scripts/roa.py: support node-dir

This commit is contained in:
JerryXiao 2020-05-01 17:37:29 +08:00
parent b68cd25b9f
commit 1646352278
Signed by: Jerry
GPG key ID: 9D9CE43650FF2BAA

View file

@ -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)])