-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathsnake.py
More file actions
78 lines (69 loc) · 3.11 KB
/
snake.py
File metadata and controls
78 lines (69 loc) · 3.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
from concurrent.futures import ProcessPoolExecutor as Pool
from Plugins.base import Base
import sys, json, os
print("Snake-Ping")
plugins = os.listdir("Plugins")
if len(sys.argv) < 3: exit("Missing params, e.g NL 1.1.1.1")
origin = sys.argv[1]
target = sys.argv[2]
pluginToLoad = sys.argv[3] if len(sys.argv) == 4 else ""
try:
with open('config.json') as handle:
config = json.loads(handle.read())
except Exception as e:
print(f"Failed to load config.json {e}")
exit()
data,toLoad = {},[]
for filename in plugins:
if not filename.endswith(".py") or filename == "base.py": continue
plugin = filename.replace(".py","")
if pluginToLoad != "" and plugin != pluginToLoad: continue
toLoad.append({"plugin":plugin,"origin":origin,"target":target})
notMyBase = Base(config)
dataUnsorted,results,output = {},[],[]
pool = Pool(max_workers = config['workers'])
results = pool.map(notMyBase.run, toLoad)
pool.shutdown(wait=True)
if target == "compare":
print("Combining Results")
combined, pingData = {},{}
for pluginData in results:
if not pluginData: continue
combined.update(pluginData)
print("Collection data")
originCountry, targetCountry = origin.split(',')
for i, (probe,probeDetails) in enumerate(combined.items()):
print(f"{i+1} of {len(combined)}")
print(f"Getting Data for {probeDetails['city']} {probeDetails['provider']}")
for index, row in enumerate(toLoad): toLoad[index] = {"plugin":row['plugin'],"origin":targetCountry,"target":probeDetails['ipv4']}
pool = Pool(max_workers = config['workers'])
probeResults = pool.map(notMyBase.run, toLoad)
pool.shutdown(wait=True)
for data in probeResults:
if not data: continue
for probeTarget,probeTargetDetails in data.items():
probeTargetDetails['probe'] = f"{probeDetails['city']} {probeDetails['provider']}"
pingData[f"{probe}{probeDetails['source']}{probeTarget}"] = probeTargetDetails
#sort data by probe
pingData = sorted(pingData.items(), key=lambda d: float(d[1]['avg']))
#Generate Output
output.append("Latency\tSource\tOrigin\tDestination")
output.append("-------\t-------\t-------\t-------")
for probeData in pingData:
avg = "{:.2f}ms".format(float(probeData[1]['avg']))
output.append(f"{avg}\t{probeData[1]['source']}\t{probeData[1]['city']} {probeData[1]['provider']}\t{probeData[1]['probe']}")
else:
for data in results:
if not data: continue
for probe,details in data.items():
dataUnsorted[probe] = {"plugin":details['source'],"avg":float(details['avg']),"provider":details['provider'],"city":details['city']}
#Generate Output
output.append("Latency\tSource\tCity\tProvider")
output.append("-------\t-------\t-------\t-------")
dataSorted = sorted(dataUnsorted.items(), key=lambda x: x[1]['avg'])
for data in dataSorted:
avg = "{:.2f}ms".format(data[1]['avg'])
output.append(f"{avg}\t{data[1]['plugin']}\t{data[1]['city']}\t{data[1]['provider']}")
output = notMyBase.formatTable(output)
print(f"\nResults")
print(output)