diff --git a/scripts/hosts2ufw.py b/scripts/hosts2ufw.py new file mode 100755 index 0000000000000000000000000000000000000000..f31a13cdb7e426b222aeb56f0c11c77498fca516 --- /dev/null +++ b/scripts/hosts2ufw.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python3 + +import re, subprocess + + +ufw = "/usr/sbin/ufw" +ufw_command = [ufw] +ufw_delete = ufw_command + ["--force", "delete"] + +def read_hosts(): + hosts = set() + pattern = re.compile(r"([0-9.:]+)\s+\w+-(sealer|gateway)") + with open("/etc/hosts") as file: + for line in file: + m = re.match(pattern,line) + if m: + hosts.add(m.group(1)) + return hosts + +def read_ufw(): + pattern = re.compile(r"\[ *(\d+)\] 30303.+ALLOW IN\s+([0-9.:]+)") + rules = {} + ufw = subprocess.run(["/usr/sbin/ufw", "status", "numbered"], check=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + lines = ufw.stdout.decode('utf-8').split("\n") + for line in lines: + m = re.match(pattern,line) + if m: + rules[m.group(2)] = m.group(1) + return rules + + +def remove_old(allowed, actual): + to_remove = list(set(actual.keys()) - allowed) + to_remove.sort(reverse=True, key=actual.get) + for rule in to_remove: + subprocess.run(ufw_delete + [actual[rule]], check=True) + + +def add_allowed(allowed): + for host in allowed: + command = ufw_command + ["allow", "from", host, "to", "any", "port", "30303"] + subprocess.run(command, check=True) + +allowed = read_hosts() +actual = read_ufw() +remove_old(allowed,actual) +add_allowed(allowed) diff --git a/scripts/mkhosts.py b/scripts/mkhosts.py new file mode 100755 index 0000000000000000000000000000000000000000..4ac9b03ab9d2ac5e37fbe9ffdbacd2ef80df372a --- /dev/null +++ b/scripts/mkhosts.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python3 + +import sys, json + +base_content = """127.0.0.1 localhost + +# The following lines are desirable for IPv6 capable hosts +::1 localhost ip6-localhost ip6-loopback +ff02::1 ip6-allnodes +ff02::2 ip6-allrouters + +# BFA nodes +""" + +if __name__ == '__main__': + if len(sys.argv) > 1: + filename = sys.argv[1] + file = open(filename) + if not file: + print("No se pudo abrir el archivo '{}'".format(filename), file=sys.stderr) + sys.exit(1) + else: + file = sys.stdin + try: + json_contents = json.load(file) + sealers = json_contents['sealers'] + print(base_content) + for k, v in sealers.items(): + nodes = v.get('nodes',[]) + k = k.lower() + for node in nodes: + ipv4 = node.get('ipv4',None) + if ipv4: + print("{:30}\t{}-{}".format(ipv4[0],k,node['type'])) + ipv6 = node.get('ipv6',None) + if ipv6: + print("{:30}\t{}-{}-ipv6".format(ipv6[0],k,node['type'])) + except json.decoder.JSONDecodeError: + print("Error al decodificar JSON", file=sys.stderr) + sys.exit(1) + diff --git a/scripts/resolve.py b/scripts/resolve.py new file mode 100755 index 0000000000000000000000000000000000000000..0d1af9d88e9208e96baab50a5d75e092d013db45 --- /dev/null +++ b/scripts/resolve.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python3 + +import sys, json, os.path, re + +db = {} +account_pattern = re.compile(r'("?0x[0-9a-f]{40}"?)') + + +def replace(m, length): + account = m.group(0) + quoted = False + if account[0] == '"' and account[-1] == '"': + quoted = True + account = account[1:-1] + replacement = db.get(account, account) + if quoted: + return '"{}"'.format(replacement) + else: + return "{0:{1}}".format(replacement,max_len) + + + +if __name__ == '__main__': + if len(sys.argv) > 1: + filename = sys.argv[1] + file = open(filename) + if not file: + print("No se pudo abrir el archivo '{}'".format(filename), file=sys.stderr) + sys.exit(1) + else: + print("Uso: {} <lista_de_selladores.json>".format(os.path.basename(sys.argv[0])), file=sys.stderr) + sys.exit(1) + try: + json_contents = json.load(file) + sealers = json_contents['sealers'] + max_len = 0 + for k, v in sealers.items(): + nodes = v.get('nodes',[]) + k = k.lower() + for node in nodes: + account = node.get('account',None) + if account: + value = "{}-{}".format(k,node['type']) + max_len = max(max_len, len(value)) + db[account.lower()] = value + for line in sys.stdin.readlines(): + print(re.sub(account_pattern,lambda m: replace(m,max_len), line), end="") + + + except json.decoder.JSONDecodeError: + print("Error al decodificar JSON", file=sys.stderr) + sys.exit(1) +