Server to collect DHT views from yggdrasil nodes and store in a data base
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

64 lines
1.8 KiB

#!/usr/bin/env python
import psycopg2, json, traceback
from config import DB_PASS, DB_USER, DB_NAME, DB_HOST, saveDefaultNodeInfo, removableFileds
from pk2addr import keyTo128BitAddress
#####
with open('api/result.json', 'r') as f:
data = json.load(f)
# connect to database
dbconn = psycopg2.connect(host=DB_HOST, database=DB_NAME, user=DB_USER, password=DB_PASS)
cur = dbconn.cursor()
# start importing
for key, node in data['yggnodes'].items():
nodename = ""
nodeinfo = {}
if "address" in node:
ipv6 = keyTo128BitAddress(node['address']) if len(node['address']) == 64 else node['address']
else:
ipv6 = keyTo128BitAddress(key)
if "coords" in node:
coords = node['coords']
else:
continue
timestamp = node['time']
if "nodeinfo" in node:
nodeinfo = node['nodeinfo']
if not saveDefaultNodeInfo:
# remove default Node info fields
for field in removableFileds:
tmprm = nodeinfo.pop(field, None)
if "name" in nodeinfo:
nodename = nodeinfo['name']
else:
nodename = '? %s' % coords
nodeinfo = json.dumps(nodeinfo)
try:
cur.execute(
"INSERT INTO yggindex (ipv6, coords, unixtstamp, name) VALUES(%s, %s, %s, %s) ON CONFLICT (ipv6) DO UPDATE SET unixtstamp=%s, coords=%s, name=%s;",
(ipv6, coords, timestamp, nodename, timestamp, coords, nodename)
)
cur.execute(
"INSERT INTO yggnodeinfo (ipv6, nodeinfo, timestamp) VALUES(%s, %s, %s) ON CONFLICT (ipv6) DO UPDATE SET nodeinfo=%s, timestamp=%s;",
(ipv6, nodeinfo, timestamp, nodeinfo, timestamp)
)
except Exception as e:
print("database error inserting")
traceback.print_exc()
dbconn.commit()
cur.close()
dbconn.close()