-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathvpn_stats.py
More file actions
108 lines (93 loc) · 3.17 KB
/
Copy pathvpn_stats.py
File metadata and controls
108 lines (93 loc) · 3.17 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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
from speedtest import Speedtest, ConfigRetrievalError
import requests, json, os
from dotenv import load_dotenv
import pandas as pd
#from tqdm import tqdm
import mariadb
import sys
load_dotenv()
router_url = os.environ['ROUTER_URL']
def get_token(router_url):
login_response = requests.get('http://{router_url}/api/router/login'.format(router_url=router_url), params={"pwd": os.environ['glinet_p']})
token = json.loads(login_response.text)['token']
return token
token = get_token(router_url)
# %%
client_list = \
requests.get('http://{router_url}/cgi-bin/api/wireguard/client/list'.format(router_url=router_url), \
headers={'Authorization': token})
client_peers = [ sub['name'] for sub in json.loads(client_list.text)['peers'] ]
# %%
name_list = []
ping_list = []
download_list = []
upload_list = []
for client in client_peers:
#for client in tqdm(client_peers):
switch_request = \
requests.post('http://{router_url}/cgi-bin/api/wireguard/client/start'.format(router_url=router_url), \
headers={'Authorization': token}, \
data={"name": client}
)
if json.loads(switch_request.text)['code'] == -1:
token = get_token(router_url)
switch_request = \
requests.post('http://{router_url}/cgi-bin/api/wireguard/client/start'.format(router_url=router_url), \
headers={'Authorization': token}, \
data={"name": client}
)
if json.loads(switch_request.text)['code'] != 0:
raise BaseException
elif json.loads(switch_request.text)['code'] != 0:
raise BaseException
try:
s = Speedtest()
s.download()
s.upload()
name_list.append(client)
ping_list.append(s.results.dict()['ping'])
download_list.append(s.results.dict()['download'] / 1000000)
upload_list.append(s.results.dict()['upload'] / 1000000)
except ConfigRetrievalError:
name_list.append(client)
ping_list.append(0)
download_list.append(0)
upload_list.append(0)
client_list = pd.DataFrame({
"name": name_list,
"ping": ping_list,
"download": download_list,
"upload": upload_list
})
best_vpn = name_list[ping_list.index(min(ping_list))]
requests.post('http://{router_url}/cgi-bin/api/wireguard/client/start'.format(router_url=router_url), \
headers={'Authorization': token}, \
data={"name": best_vpn}
)
print('Changed VPN to {client}'.format(client=best_vpn))
# Connect to MariaDB Platform
try:
conn = mariadb.connect(
user=os.environ["USER"],
password=os.environ["PASSWORD"],
host=os.environ["HOST"],
port=os.environ["PORT"],
database=os.environ["DATABASE"]
)
except mariadb.Error as e:
print(f"Error connecting to MariaDB Platform: {e}")
sys.exit(1)
cur = conn.cursor()
# Execute Commands
cur.execute(
"TRUNCATE vpn_stats"
)
for index, row in client_list.iterrows():
cur.execute(
"INSERT INTO vpn_stats (Name, Ping, Download, Upload) VALUES ('{n}', {p}, {d}, {u})".format(
n=row['name'], p=round(row['ping'],2), \
d=round(row['download'],2), u=round(row['upload'],2)
)
)
conn.commit()
cur.close()