You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
87 lines
2.6 KiB
Python
87 lines
2.6 KiB
Python
import argparse
|
|
import requests
|
|
from ping3 import ping
|
|
|
|
|
|
def RegisterAgent(apiEndpoint, secret, name):
|
|
try:
|
|
response = requests.get(
|
|
apiEndpoint + '/registerAgent?secret='+secret+'&name='+name)
|
|
if response.status_code == 200:
|
|
return response.json()['agentId']
|
|
else:
|
|
raise Exception('Error registering agent')
|
|
except Exception as e:
|
|
print(e)
|
|
return None
|
|
|
|
|
|
def GetNodeList(apiEndpoint, secret):
|
|
try:
|
|
response = requests.get(apiEndpoint + '/getNodeList?secret='+secret)
|
|
if response.status_code == 200:
|
|
return response.json()['nodes']
|
|
else:
|
|
raise Exception('Error getting node list')
|
|
except Exception as e:
|
|
print(e)
|
|
return None
|
|
|
|
|
|
def RegisterRecord(apiEndpoint, secret, agentId, nodeId, latency, loss):
|
|
try:
|
|
response = requests.get(apiEndpoint + '/registerRecord?secret=' +
|
|
secret+'&agentId='+agentId+'&nodeId='+nodeId+'&latency='+latency+'&loss='+loss)
|
|
if not response.status_code == 200:
|
|
raise Exception('Error registering record')
|
|
except Exception as e:
|
|
print(e)
|
|
|
|
|
|
def PingNode(hostname, count=20, unit='ms'):
|
|
sum = 0
|
|
times = count
|
|
for i in range(count):
|
|
latency = ping(hostname, unit=unit)
|
|
if latency != None and latency != False:
|
|
sum += latency
|
|
else:
|
|
times -= 1
|
|
if times == 0:
|
|
return None, 1.00
|
|
else:
|
|
return round(sum/times, 2), round((count-times)/count, 2)
|
|
|
|
|
|
# Accept args from command line
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument('-a', '--apiEndpoint',
|
|
help='API Endpoint URL. eg. https://pinging.vercel.app/api', required=True)
|
|
parser.add_argument(
|
|
'-s', '--secret', help='Agent Secret. eg. 9cWxVbX35UL2Dhj4', required=True)
|
|
parser.add_argument('-n', '--name', help='Agent Friendly Name. eg. 0vv0', required=True)
|
|
args = parser.parse_args()
|
|
|
|
# Register agent
|
|
agentId = RegisterAgent(args.apiEndpoint, args.secret, args.name)
|
|
if agentId == None:
|
|
print('Agent registration failed')
|
|
exit()
|
|
|
|
# Get node list
|
|
nodeList = GetNodeList(args.apiEndpoint, args.secret)
|
|
if nodeList == None:
|
|
print('Failed to get node list')
|
|
exit()
|
|
|
|
# Ping nodes
|
|
for node in nodeList:
|
|
print('Pinging ' + node['hostname'])
|
|
latency, loss = PingNode(node['hostname'])
|
|
if latency == None:
|
|
latency = -1
|
|
print('latency: ' + str(latency))
|
|
print('loss: ' + str(loss))
|
|
RegisterRecord(args.apiEndpoint, args.secret,
|
|
str(agentId), str(node['id']), str(latency), str(loss))
|