diff --git a/xmrnodes/app.py b/xmrnodes/app.py index e77ee43..2ce9b18 100644 --- a/xmrnodes/app.py +++ b/xmrnodes/app.py @@ -33,7 +33,7 @@ def index(): flash("Wow, wtf hackerman. Cool it.") page = 1 - nodes = Node.select().where(Node.available==True).where(Node.is_monero==True).order_by( + nodes = Node.select().where(Node.validated==True).where(Node.is_monero==True).order_by( Node.datetime_entered.desc() ) paginated = nodes.paginate(page, itp) @@ -73,6 +73,32 @@ def add(): node.save() return redirect("/") +@app.cli.command("check") +def check(): + nodes = Node.select().where(Node.validated == True) + for node in nodes: + now = datetime.utcnow() + logging.info(f"Attempting to check {node.url}") + try: + r = requests.get(node.url + "/get_info", timeout=5) + r.raise_for_status() + assert "status" in r.json() + assert "offline" in r.json() + assert "height" in r.json() + if r.json()["status"] == "OK": + logging.info("success") + node.available = True + node.last_height = r.json()["height"] + else: + raise + except: + logging.info("fail") + node.datetime_failed = now + node.available = False + finally: + node.datetime_checked = now + node.save() + @app.cli.command("validate") def validate(): nodes = Node.select().where(Node.validated == False) @@ -84,7 +110,7 @@ def validate(): logging.info("onion address found") node.is_tor = True try: - r = requests.get(node.url + "/get_info", timeout=3) + r = requests.get(node.url + "/get_info", timeout=5) r.raise_for_status() assert "height" in r.json() assert "nettype" in r.json() @@ -94,6 +120,7 @@ def validate(): node.nettype = nettype node.available = True node.validated = True + node.last_height = r.json()["height"] node.datetime_checked = now node.is_monero = is_monero(node.url) node.save() diff --git a/xmrnodes/helpers.py b/xmrnodes/helpers.py index e82661b..57c3561 100644 --- a/xmrnodes/helpers.py +++ b/xmrnodes/helpers.py @@ -8,7 +8,7 @@ def is_monero(url): "76ee3cc98646292206cd3e86f74d88b4dcc1d937088645e9b0cbca84b7ce74eb" #stagenet ] try: - r = r_get(url + "/json_rpc", json=data) + r = r_get(url + "/json_rpc", json=data, timeout=5) r.raise_for_status() assert "result" in r.json() is_xmr = r.json()["result"]["block_header"]["hash"] in known_hashes diff --git a/xmrnodes/models.py b/xmrnodes/models.py index 8f66b90..77cc04d 100644 --- a/xmrnodes/models.py +++ b/xmrnodes/models.py @@ -13,6 +13,7 @@ class Node(Model): available = BooleanField(default=False) validated = BooleanField(default=False) nettype = CharField(null=True) + last_height = IntegerField(null=True) is_monero = BooleanField(default=False) datetime_entered = DateTimeField(default=datetime.utcnow) datetime_checked = DateTimeField(default=None, null=True) diff --git a/xmrnodes/templates/index.html b/xmrnodes/templates/index.html index dc53e17..37487d7 100644 --- a/xmrnodes/templates/index.html +++ b/xmrnodes/templates/index.html @@ -37,6 +37,7 @@ Tor Available Network + Height Last Checked @@ -47,6 +48,7 @@ {{ node.is_tor }} {{ node.available }} {{ node.nettype }} + {{ node.last_height }} {{ node.datetime_checked | humanize }} {% endfor %}