mirror of https://github.com/r4sas/Niflheim-api
yakamok
6 years ago
committed by
GitHub
1 changed files with 101 additions and 0 deletions
@ -0,0 +1,101 @@
@@ -0,0 +1,101 @@
|
||||
#server for collecting views of the network |
||||
|
||||
import json |
||||
import time |
||||
import sqlite3 |
||||
from sqlite3 import Error |
||||
import os |
||||
import socket |
||||
#ipaddress needs to be installed its not part of the standard lib |
||||
import ipaddress |
||||
import thread |
||||
|
||||
SERVER = "" |
||||
DB_PATH = "vservdb/" |
||||
|
||||
|
||||
def check_coords(coords): |
||||
coord_len = coords.replace(' ', '').replace('[', '').replace(']', '') |
||||
digits_found = [x for x in coord_len if x.isdigit()] |
||||
|
||||
if len(digits_found) == len(coord_len): |
||||
crus = True |
||||
else: |
||||
crus = False |
||||
return crus |
||||
|
||||
|
||||
def valid_ipv6_check(ipv6add): |
||||
import ipaddress |
||||
try: |
||||
if ipaddress.IPv6Address(unicode(ipv6add)): |
||||
addr = True |
||||
except: |
||||
addr = False |
||||
return addr |
||||
|
||||
|
||||
def isdatabase(db_path): |
||||
if not os.path.exists(db_path + "yggindex.db"): |
||||
if not os.path.exists(db_path): |
||||
os.makedirs(db_path) |
||||
try: |
||||
conn = sqlite3.connect(db_path + 'yggindex.db') |
||||
c = conn.cursor() |
||||
c.execute('create table yggindex(ipv6 varchar(45) UNIQUE, coords varchar(50),\ |
||||
utimestamp varchar(40))') |
||||
conn.commit() |
||||
# c.commit() |
||||
except Error as e: |
||||
print(e) |
||||
finally: |
||||
conn.close() |
||||
else: |
||||
print("found database will not create a new one") |
||||
|
||||
|
||||
def insert_new_entry(db_path, ipv6, coords, utimestamp): |
||||
try: |
||||
conn = sqlite3.connect(db_path + "yggindex.db") |
||||
c = conn.cursor() |
||||
c.execute('''INSERT OR REPLACE INTO yggindex(ipv6, coords, utimestamp) VALUES(?, ?, ?)''',\ |
||||
(ipv6, coords, utimestamp)) |
||||
conn.commit() |
||||
conn.close() |
||||
except Error as e: |
||||
print(e) |
||||
|
||||
|
||||
def error_check_insert_into_db(dht, switchpeers): |
||||
try: |
||||
if "success" == dht.get("status"): |
||||
for x,y in dht["response"]["dht"].iteritems(): |
||||
if valid_ipv6_check(x) and check_coords(y["coords"]): |
||||
insert_new_entry(DB_PATH, x, y["coords"], int(time.time())) |
||||
|
||||
if "success" == dht.get("status"): |
||||
for x in switchpeers["response"]["switchpeers"].iteritems(): |
||||
if valid_ipv6_check(x[1]["ip"]) and check_coords(x[1]["coords"]): |
||||
insert_new_entry(DB_PATH, x[1]["ip"], x[1]["coords"], int(time.time())) |
||||
except: |
||||
print("error in json file, aborting") |
||||
|
||||
def proccess_incoming_data(datty, addr): |
||||
print addr |
||||
try: |
||||
data = json.loads(datty.decode()) |
||||
error_check_insert_into_db(data["dhtpack"], data["switchpack"]) |
||||
except: |
||||
print "ignoring, data was not json" |
||||
|
||||
isdatabase(DB_PATH) |
||||
|
||||
conn = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM) |
||||
conn.bind((SERVER, 45671)) |
||||
|
||||
while True: |
||||
try: |
||||
dataraw, addr = conn.recvfrom(1024 * 20) |
||||
thread.start_new_thread(proccess_incoming_data, (dataraw, addr)) |
||||
except: |
||||
print "bloop" |
Loading…
Reference in new issue