diff --git a/xmrnodes/cli.py b/xmrnodes/cli.py index 83fc122..736eb12 100644 --- a/xmrnodes/cli.py +++ b/xmrnodes/cli.py @@ -5,6 +5,7 @@ from time import sleep import geoip2.database import arrow import requests +import click from flask import Blueprint from urllib.parse import urlparse @@ -22,57 +23,71 @@ def init(): @bp.cli.command("check") -def check(): - diff = datetime.utcnow() - timedelta(hours=24) +def check_nodes(): + diff = datetime.utcnow() - timedelta(hours=72) checks = HealthCheck.select().where(HealthCheck.datetime <= diff) for check in checks: print("Deleting check", check.id) check.delete_instance() nodes = Node.select().where(Node.validated == True) for node in nodes: - now = datetime.utcnow() - hc = HealthCheck(node=node) - logging.info(f"Attempting to check {node.url}") try: - r = make_request(node.url) - assert "status" in r.json() - assert "offline" in r.json() - assert "height" in r.json() - if 'donation_address' in r.json(): - node.donation_address = r.json()['donation_address'] - has_cors = "Access-Control-Allow-Origin" in r.headers - is_ssl = node.url.startswith("https://") - if r.json()["status"] == "OK": - node.web_compatible = has_cors and is_ssl - node.last_height = r.json()["height"] - hc.health = True - highest_block = get_highest_block(node.nettype, node.crypto) - healthy_block = highest_block - config.HEALTHY_BLOCK_DIFF - if r.json()["height"] < healthy_block: - node.available = False - logging.info("unhealthy") - else: - node.available = True - logging.info("success") + check_node(node.url) + except KeyboardInterrupt: + exit() + + +def check_node(_node): + if _node.startswith("http"): + node = Node.select().where(Node.url == _node).first() + else: + node = Node.select().where(Node.id == _node).first() + if not node: + print('node found') + pass + now = datetime.utcnow() + hc = HealthCheck(node=node) + logging.info(f"Attempting to check {node.url}") + try: + r = make_request(node.url) + assert "status" in r.json() + assert "offline" in r.json() + assert "height" in r.json() + if 'donation_address' in r.json(): + node.donation_address = r.json()['donation_address'] + has_cors = "Access-Control-Allow-Origin" in r.headers + is_ssl = node.url.startswith("https://") + if r.json()["status"] == "OK": + node.web_compatible = has_cors and is_ssl + node.last_height = r.json()["height"] + hc.health = True + highest_block = get_highest_block(node.nettype, node.crypto) + healthy_block = highest_block - config.HEALTHY_BLOCK_DIFF + if r.json()["height"] < healthy_block: + node.available = False + logging.info("unhealthy") else: - raise - except: - logging.info("fail") - node.datetime_failed = now - node.available = False - hc.health = False - finally: - node.datetime_checked = now - node.save() - hc.save() - if ( - node.get_failed_checks().count() == node.get_all_checks().count() - and node.get_all_checks().count() > 5 - ): - print("this node fails all of its health checks - deleting it!") - for _hc in node.get_all_checks(): - _hc.delete_instance() - node.delete_instance() + node.available = True + logging.info("success") + else: + raise + except: + logging.info("fail") + node.datetime_failed = now + node.available = False + hc.health = False + finally: + node.datetime_checked = now + node.save() + hc.save() + if ( + node.get_failed_checks().count() == node.get_all_checks().count() + and node.get_all_checks().count() > 5 + ): + print("this node fails all of its health checks - deleting it!") + for _hc in node.get_all_checks(): + _hc.delete_instance() + node.delete_instance() @bp.cli.command("get_peers")