Skip to content

Commit f4d502c

Browse files
committed
Add exitIp fetch. Update intelligence to reflect true ip
1 parent 73aaea8 commit f4d502c

4 files changed

Lines changed: 180 additions & 11 deletions

File tree

busur_exitip.py

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
#!/bin/env python3
2+
3+
import requests
4+
import pymysql
5+
import json
6+
import scrtsxx
7+
8+
VERSION = 20250319.1444
9+
10+
class BusurExitIP():
11+
def connDB(self):
12+
13+
self.db = pymysql.connect(host=scrtsxx.HOST,
14+
port=scrtsxx.PORT,
15+
user=scrtsxx.USERNAME,
16+
passwd=scrtsxx.PASSWORD,
17+
db=scrtsxx.DB,
18+
charset="utf8mb4",
19+
cursorclass=pymysql.cursors.DictCursor
20+
)
21+
22+
def upsert_nodes(self, node_data):
23+
cursor = self.db.cursor()
24+
25+
query = """
26+
INSERT INTO exitip (
27+
addr, moniker, version, type, api, exitIp, asn, continentCode, countryCode, country,
28+
city, latitude, longitude, ipRep, isResidential, isActive, isHealthy, isDuplicate,
29+
isWhitelisted, fetchedAt, inactiveAt
30+
) VALUES (
31+
%(addr)s, %(moniker)s, %(version)s, %(type)s, %(api)s, %(exitIp)s, %(asn)s,
32+
%(continentCode)s, %(countryCode)s, %(country)s, %(city)s, %(latitude)s,
33+
%(longitude)s, %(ipRep)s, %(isResidential)s, %(isActive)s, %(isHealthy)s,
34+
%(isDuplicate)s, %(isWhitelisted)s, %(fetchedAt)s, %(inactiveAt)s
35+
)
36+
ON DUPLICATE KEY UPDATE
37+
moniker = VALUES(moniker),
38+
version = VALUES(version),
39+
api = VALUES(api),
40+
exitIp = VALUES(exitIp),
41+
asn = VALUES(asn),
42+
continentCode = VALUES(continentCode),
43+
countryCode = VALUES(countryCode),
44+
country = VALUES(country),
45+
city = VALUES(city),
46+
latitude = VALUES(latitude),
47+
longitude = VALUES(longitude),
48+
ipRep = VALUES(ipRep),
49+
isResidential = VALUES(isResidential),
50+
isActive = VALUES(isActive),
51+
isHealthy = VALUES(isHealthy),
52+
isDuplicate = VALUES(isDuplicate),
53+
isWhitelisted = VALUES(isWhitelisted),
54+
fetchedAt = VALUES(fetchedAt),
55+
inactiveAt = VALUES(inactiveAt)
56+
"""
57+
58+
# Convert booleans to integers (MySQL TINYINT)
59+
for node in node_data:
60+
node['isResidential'] = 1 if node['isResidential'] else 0
61+
node['isActive'] = 1 if node['isActive'] else 0
62+
node['isHealthy'] = 1 if node['isHealthy'] else 0
63+
node['isDuplicate'] = 1 if node['isDuplicate'] else 0
64+
node['isWhitelisted'] = 1 if node['isWhitelisted'] else 0
65+
66+
if node['inactiveAt'] is None:
67+
node['inactiveAt'] = None
68+
69+
70+
cursor.executemany(query, node_data)
71+
self.db.commit()
72+
print(f"{cursor.rowcount} records affected")
73+
self.db.close()
74+
75+
76+
77+
if __name__ == "__main__":
78+
79+
header = {"partnerKey" : scrtsxx.BUSUR_KEY}
80+
busur = BusurExitIP()
81+
busur.connDB()
82+
83+
try:
84+
response = requests.get(scrtsxx.BUSUR, headers=header)
85+
response.raise_for_status()
86+
87+
data = response.json()
88+
if data.get('success') and data.get('data'):
89+
nodes = data['data']
90+
busur.upsert_nodes(nodes)
91+
else:
92+
print("Invalid response format")
93+
94+
except requests.exceptions.RequestException as e:
95+
print(f"API Request Failed: {e}")

meile_intelligence.py

Lines changed: 47 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
APIKEYS = scrtsxx.IP_REGISTRY_API_KEYS
1515

16-
VERSION = 20240217.1659
16+
VERSION = 20250319.1453
1717
APIURL = 'https://api.sentinel.mathnodes.com'
1818

1919
IPREGISTRY_URL = "https://api.ipregistry.co/%s?key=%s"
@@ -68,8 +68,11 @@ def get_ip_of_node(self, db, NodeData):
6868

6969
# Retrieve remote_url from the table for nodes that have it stored
7070
query = f"SELECT remote_url FROM node_uptime WHERE node_address = '{address}';"
71+
query2 = f"SELECT exitIp FROM exitip WHERE addr = '{address}';"
7172
c.execute(query)
7273
result = c.fetchone()
74+
c.execute(query2)
75+
exitresult = c.fetchone()
7376
#print(result['remote_url'])
7477
try:
7578
db_rurl = result['remote_url']
@@ -81,21 +84,58 @@ def get_ip_of_node(self, db, NodeData):
8184
if NodeDBIP[address] != self.NodeAPIurl[address]:
8285
self.__UpdateUptimeTable(db, address, self.NodeAPIurl[address])
8386
remote_url = self.NodeAPIurl[address].split('//')[-1].split(':')[0]
84-
try:
85-
NodeIPURLChanged[address] = ipaddress.ip_address(remote_url)
87+
try:
88+
rurlip = ipaddress.ip_address(remote_url)
89+
if exitresult['exitIp']:
90+
exitIp = ipaddress.ip_address(exitresult['exitIp'])
91+
if rurlip != exitIp:
92+
print(f"{rurlip},{exitIp}")
93+
NodeIPURLChanged[address] = exitIp
94+
else:
95+
NodeIPURLChanged[address] = rurlip
96+
else:
97+
NodeIPURLChanged[address] = rurlip
98+
8699
except ValueError:
87100
try:
88-
NodeIPURLChanged[address] = socket.gethostbyname(remote_url)
101+
rurlip = socket.gethostbyname(remote_url)
102+
if exitresult['exitIp']:
103+
exitIp = ipaddress.ip_address(exitresult['exitIp'])
104+
if rurlip != exitIp:
105+
print(f"{rurlip},{exitIp}")
106+
NodeIPURLChanged[address] = exitIp
107+
else:
108+
NodeIPURLChanged[address] = rurlip
109+
else:
110+
NodeIPURLChanged[address] = rurlip
89111
except socket.gaierror:
90112
continue
91113

92114
else:
93115
remote_url = NodeDBIP[address].split('//')[-1].split(':')[0]
94-
try:
95-
NodeIP[address] = ipaddress.ip_address(remote_url)
116+
try:
117+
rurlip = ipaddress.ip_address(remote_url)
118+
if exitresult['exitIp']:
119+
exitIp = ipaddress.ip_address(exitresult['exitIp'])
120+
if rurlip != exitIp:
121+
print(f"{rurlip},{exitIp}")
122+
NodeIP[address] = exitIp
123+
else:
124+
NodeIP[address] = rurlip
125+
else:
126+
NodeIP[address] = rurlip
96127
except ValueError:
97128
try:
98-
NodeIP[address] = socket.gethostbyname(remote_url)
129+
rurlip = socket.gethostbyname(remote_url)
130+
if exitresult['exitIp']:
131+
exitIp = ipaddress.ip_address(exitresult['exitIp'])
132+
if rurlip != exitIp:
133+
print(f"{rurlip},{exitIp}")
134+
NodeIP[address] = exitIp
135+
else:
136+
NodeIP[address] = rurlip
137+
else:
138+
NodeIP[address] = rurlip
99139
except socket.gaierror:
100140
continue
101141
except Exception as e:

schema/exitip.sql

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
CREATE TABLE exitip (
2+
addr VARCHAR(255) PRIMARY KEY,
3+
moniker VARCHAR(255) ,
4+
version VARCHAR(15) ,
5+
type TINYINT ,
6+
api VARCHAR(500) ,
7+
exitIp VARCHAR(65) ,
8+
asn VARCHAR(15) ,
9+
continentCode CHAR(2) ,
10+
countryCode CHAR(2) ,
11+
country VARCHAR(100) ,
12+
city VARCHAR(100) ,
13+
latitude DECIMAL(10,6) ,
14+
longitude DECIMAL(10,6) ,
15+
ipRep TINYINT UNSIGNED ,
16+
isResidential TINYINT(1) ,
17+
isActive TINYINT(1) ,
18+
isHealthy TINYINT(1) ,
19+
isDuplicate TINYINT(1) ,
20+
isWhitelisted TINYINT(1) ,
21+
fetchedAt DATETIME ,
22+
inactiveAt DATETIME
23+
);

scrtsxx.py

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
1-
DB = "database"
2-
USERNAME = "username"
3-
PASSWORD = "password"
1+
DB = "meile"
2+
USERNAME = "mathnodes"
3+
PASSWORD = "passwd"
44
HOST = "localhost"
5-
RHOST = "foo.bar" # edit if using remote query
65
PORT = 3306
6+
#IP_DATA_API_KEY = "70eeefc65c73e15c06ec8e220be3f958d80a39dbd0f4f1a7b609ae5f"
7+
IP_DATA_API_KEY = "key"
8+
#BTCPayToken = "zYAgx4i"
9+
#BTCPayToken = "cLe217w"
10+
BTCPayToken = "t0ken"
11+
BTCPAYSERVER = "https://btcpay.foo.bar"
12+
BTCPayEmail = "email@foo.bar"
13+
IP_REGISTRY_API_KEYS = ["key1",
14+
"key2",
15+
"key3"]
16+
BUSUR = "http..."
17+
BUSUR_KEY = "key"

0 commit comments

Comments
 (0)