mirror of
https://github.com/lalanza808/monero.fail.git
synced 2025-08-20 01:27:54 -04:00
store geoip data
This commit is contained in:
parent
9a25c2e7d0
commit
fae6ab3688
3 changed files with 28 additions and 4 deletions
|
@ -5,12 +5,11 @@ from time import sleep
|
|||
import geoip2.database
|
||||
import arrow
|
||||
import requests
|
||||
import click
|
||||
from flask import Blueprint
|
||||
from urllib.parse import urlparse
|
||||
|
||||
from xmrnodes.helpers import determine_crypto, is_onion, is_i2p, make_request
|
||||
from xmrnodes.helpers import retrieve_peers, rw_cache, get_highest_block
|
||||
from xmrnodes.helpers import retrieve_peers, rw_cache, get_highest_block, get_geoip
|
||||
from xmrnodes.models import Node, HealthCheck, Peer
|
||||
from xmrnodes import config
|
||||
|
||||
|
@ -176,7 +175,6 @@ def validate():
|
|||
is_ssl = node.url.startswith("https://")
|
||||
nettype = r.json()["nettype"]
|
||||
crypto = determine_crypto(node.url)
|
||||
logging.info("success")
|
||||
if nettype in ["mainnet", "stagenet", "testnet"]:
|
||||
node.nettype = nettype
|
||||
node.available = True
|
||||
|
@ -187,7 +185,17 @@ def validate():
|
|||
node.crypto = crypto
|
||||
node.is_tor = is_onion(node.url)
|
||||
node.is_i2p = is_i2p(node.url)
|
||||
if not node.is_tor and not node.is_i2p:
|
||||
geoip = get_geoip(node.url)
|
||||
node.country_name = geoip.country.name
|
||||
node.country_code = geoip.country.iso_code
|
||||
node.city = geoip.city.name
|
||||
node.postal = geoip.postal.code
|
||||
node.lat = geoip.location.latitude
|
||||
node.lon = geoip.location.longitude
|
||||
logging.info(f"found geo data for {node.url} - {node.country_code}, {node.country_name}, {node.city}")
|
||||
node.save()
|
||||
logging.info("success")
|
||||
else:
|
||||
logging.info("unexpected nettype")
|
||||
except requests.exceptions.ConnectTimeout:
|
||||
|
@ -203,7 +211,7 @@ def validate():
|
|||
logging.info("http error, 4xx or 5xx")
|
||||
node.delete_instance()
|
||||
except Exception as e:
|
||||
logging.info("failed for reasons unknown")
|
||||
logging.info(f"failed for reasons unknown: {e}")
|
||||
node.delete_instance()
|
||||
|
||||
|
||||
|
|
|
@ -3,7 +3,9 @@ import socket
|
|||
import pickle
|
||||
from os import path
|
||||
|
||||
import geoip2.database
|
||||
from requests import get as r_get
|
||||
from urllib.parse import urlparse
|
||||
from levin.section import Section
|
||||
from levin.bucket import Bucket
|
||||
from levin.ctypes import *
|
||||
|
@ -157,3 +159,11 @@ def get_highest_block(nettype, crypto):
|
|||
return highest.last_height
|
||||
else:
|
||||
return 0
|
||||
|
||||
|
||||
def get_geoip(ip_or_dns):
|
||||
host = urlparse(ip_or_dns).netloc.split(':')[0]
|
||||
resolved = socket.gethostbyname(host)
|
||||
host = host if resolved == host else resolved
|
||||
with geoip2.database.Reader("./data/GeoLite2-City.mmdb") as reader:
|
||||
return reader.city(host)
|
|
@ -22,6 +22,12 @@ class Node(Model):
|
|||
last_height = IntegerField(null=True)
|
||||
crypto = CharField(null=True)
|
||||
donation_address = CharField(null=True)
|
||||
country_name = CharField(null=True)
|
||||
country_code = CharField(null=True)
|
||||
city = CharField(null=True)
|
||||
postal = IntegerField(null=True)
|
||||
lat = FloatField(null=True)
|
||||
lon = FloatField(null=True)
|
||||
datetime_entered = DateTimeField(default=datetime.utcnow)
|
||||
datetime_checked = DateTimeField(default=None, null=True)
|
||||
datetime_failed = DateTimeField(default=None, null=True)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue