store geoip data

revamp-ui
lza_menace 2 years ago
parent 9a25c2e7d0
commit fae6ab3688

@ -5,12 +5,11 @@ from time import sleep
import geoip2.database import geoip2.database
import arrow import arrow
import requests import requests
import click
from flask import Blueprint from flask import Blueprint
from urllib.parse import urlparse from urllib.parse import urlparse
from xmrnodes.helpers import determine_crypto, is_onion, is_i2p, make_request 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.models import Node, HealthCheck, Peer
from xmrnodes import config from xmrnodes import config
@ -176,7 +175,6 @@ def validate():
is_ssl = node.url.startswith("https://") is_ssl = node.url.startswith("https://")
nettype = r.json()["nettype"] nettype = r.json()["nettype"]
crypto = determine_crypto(node.url) crypto = determine_crypto(node.url)
logging.info("success")
if nettype in ["mainnet", "stagenet", "testnet"]: if nettype in ["mainnet", "stagenet", "testnet"]:
node.nettype = nettype node.nettype = nettype
node.available = True node.available = True
@ -187,7 +185,17 @@ def validate():
node.crypto = crypto node.crypto = crypto
node.is_tor = is_onion(node.url) node.is_tor = is_onion(node.url)
node.is_i2p = is_i2p(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() node.save()
logging.info("success")
else: else:
logging.info("unexpected nettype") logging.info("unexpected nettype")
except requests.exceptions.ConnectTimeout: except requests.exceptions.ConnectTimeout:
@ -203,7 +211,7 @@ def validate():
logging.info("http error, 4xx or 5xx") logging.info("http error, 4xx or 5xx")
node.delete_instance() node.delete_instance()
except Exception as e: except Exception as e:
logging.info("failed for reasons unknown") logging.info(f"failed for reasons unknown: {e}")
node.delete_instance() node.delete_instance()

@ -3,7 +3,9 @@ import socket
import pickle import pickle
from os import path from os import path
import geoip2.database
from requests import get as r_get from requests import get as r_get
from urllib.parse import urlparse
from levin.section import Section from levin.section import Section
from levin.bucket import Bucket from levin.bucket import Bucket
from levin.ctypes import * from levin.ctypes import *
@ -157,3 +159,11 @@ def get_highest_block(nettype, crypto):
return highest.last_height return highest.last_height
else: else:
return 0 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) last_height = IntegerField(null=True)
crypto = CharField(null=True) crypto = CharField(null=True)
donation_address = 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_entered = DateTimeField(default=datetime.utcnow)
datetime_checked = DateTimeField(default=None, null=True) datetime_checked = DateTimeField(default=None, null=True)
datetime_failed = DateTimeField(default=None, null=True) datetime_failed = DateTimeField(default=None, null=True)

Loading…
Cancel
Save