Complete re-write, BREAKING
This re-write uses different table names. Beware.
This commit is contained in:
parent
23d826c5c9
commit
617ba03ed3
@ -1,12 +1,13 @@
|
|||||||
# Speed-test and IP change scripts
|
# Monitoring scripts for IP changes and connection speed
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
|
|
||||||
* Python 3 with modules `mysql-connector-python` and `speedtest-cli`
|
* Python 3 with the modules from `requirements.txt`
|
||||||
* A SQL database (MariaDB is recommended)
|
* A MySQL database (I use MariaDB)
|
||||||
|
* A DynDNS server that supports the [Remote Access Update API](https://help.dyn.com/remote-access-api/)
|
||||||
|
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
1. Create tables in the database using `tables.sql`
|
1. Configure the two scripts using `config.ini`
|
||||||
2. Configure the scripts in the fields provided
|
1. Set cronjobs for the two scripts. I currently run them every 15 minutes.
|
||||||
3. Add cron-jobs for the scripts. I currently use an interval of 15 seconds
|
|
11
config.ini
Normal file
11
config.ini
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[db]
|
||||||
|
user =
|
||||||
|
password =
|
||||||
|
host =
|
||||||
|
database =
|
||||||
|
[dyndns]
|
||||||
|
user =
|
||||||
|
password =
|
||||||
|
url =
|
||||||
|
|
||||||
|
|
50
ipch.py
50
ipch.py
@ -2,23 +2,47 @@
|
|||||||
import requests
|
import requests
|
||||||
import mysql.connector
|
import mysql.connector
|
||||||
import datetime
|
import datetime
|
||||||
|
import configparser
|
||||||
|
import sys
|
||||||
|
|
||||||
# Configuration
|
# Configuration
|
||||||
DYNDNS_AUTH = {'user':'','pass':''}
|
cfg = configparser.ConfigParser()
|
||||||
DYNDNS_URL = ''
|
with open('config.ini', 'r') as f:
|
||||||
DB_CONFIG = {
|
cfg.read_file(f)
|
||||||
'user': '',
|
|
||||||
'password': '',
|
DYN_CFG = cfg['dyndns']
|
||||||
'host': '',
|
|
||||||
'db': ''
|
IPCH_TABLE_CMD = """CREATE TABLE IF NOT EXISTS ipch (
|
||||||
}
|
time DATETIME,
|
||||||
result = requests.get(DYNDNS_URL, auth=(DYNDNS_AUTH['user'], DYNDNS_AUTH['pass']))
|
status NATIONAL CHARACTER VARYING(8),
|
||||||
|
ip NATIONAL CHARACTER VARYING(15)
|
||||||
|
);
|
||||||
|
"""
|
||||||
|
|
||||||
|
for s in 'user', 'password', 'url':
|
||||||
|
if s not in DYN_CFG:
|
||||||
|
print(f'{s} missing. Please add the {s} property to your config.ini\'s [dyndns] section.')
|
||||||
|
exit(1)
|
||||||
|
|
||||||
|
DB_CONFIG = {k: v for k, v in cfg['db'].items() if k in ['user', 'password', 'host', 'database']}
|
||||||
|
|
||||||
|
result = requests.get(DYN_CFG['url'], auth=(DYN_CFG['user'], DYN_CFG['password']))
|
||||||
s = result.content.decode("unicode_escape").rstrip('\n').split(' ')
|
s = result.content.decode("unicode_escape").rstrip('\n').split(' ')
|
||||||
cx=mysql.connector.connect(**DB_CONFIG)
|
cx = mysql.connector.connect(**DB_CONFIG)
|
||||||
c=cx.cursor()
|
c = cx.cursor()
|
||||||
data = (datetime.datetime.now(),s[0],s[1])
|
if s[0] in ['nochg', 'good']:
|
||||||
|
data = (datetime.datetime.now(), s[0], s[1])
|
||||||
|
elif s[0] == 'badauth':
|
||||||
|
exit('Bad DynDNS authentication provided. Please check the [dyndns] section in config.ini.')
|
||||||
|
elif s[0] == 'nohost':
|
||||||
|
exit('The server says this host does not exist.')
|
||||||
|
else:
|
||||||
|
print(f'status unknown: {s[0]}', file=sys.stderr)
|
||||||
|
data = (datetime.datetime.now(), s[0], None)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
c.execute("INSERT INTO ipch_he (time,status,ip) values (%s,%s,%s)",data)
|
c.execute(IPCH_TABLE_CMD)
|
||||||
|
c.execute('INSERT INTO ipch (time, status, ip) values (%s, %s, %s)', data)
|
||||||
cx.commit()
|
cx.commit()
|
||||||
except:
|
except:
|
||||||
cx.rollback()
|
cx.rollback()
|
||||||
|
3
requirements.txt
Normal file
3
requirements.txt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
speedtest-cli
|
||||||
|
mysql-connector-python
|
||||||
|
requests
|
76
st.py
76
st.py
@ -1,60 +1,76 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
import speedtest
|
import sys
|
||||||
import csv
|
|
||||||
import datetime
|
import datetime
|
||||||
|
import configparser
|
||||||
import mysql.connector
|
import mysql.connector
|
||||||
import os
|
import speedtest
|
||||||
|
from socket import timeout
|
||||||
|
|
||||||
db_config = {
|
cfg = configparser.ConfigParser()
|
||||||
'user': 'm_imp',
|
with open('config.ini') as f:
|
||||||
'password': '123',
|
cfg.read_file(f)
|
||||||
'host': '127.0.0.1',
|
|
||||||
'database': 'speedtests'
|
db_config = {k: v for k, v in cfg['db'].items() if k in ['user', 'password', 'host', 'database']}
|
||||||
}
|
|
||||||
|
|
||||||
|
SPEEDTEST_TABLE_CMD = """CREATE TABLE IF NOT EXISTS sts (
|
||||||
|
test_no INTEGER UNSIGNED PRIMARY KEY AUTO_INCREMENT,
|
||||||
|
server_id INTEGER,
|
||||||
|
sponsor NATIONAL CHARACTER VARYING(40),
|
||||||
|
time DATETIME,
|
||||||
|
distance FLOAT UNSIGNED,
|
||||||
|
ping FLOAT UNSIGNED,
|
||||||
|
download FLOAT UNSIGNED,
|
||||||
|
upload FLOAT UNSIGNED
|
||||||
|
);
|
||||||
|
"""
|
||||||
|
|
||||||
try:
|
try:
|
||||||
cx=mysql.connector.connect(**db_config)
|
cx = mysql.connector.connect(**db_config)
|
||||||
c=cx.cursor()
|
c = cx.cursor()
|
||||||
except mysql.connector.Error as err:
|
upload_statement = """INSERT INTO sts (server_id, sponsor, time, distance, ping, download, upload)
|
||||||
exit('Could not open database')
|
VALUES (%s, %s, %s, %s, %s, %s, %s)"""
|
||||||
|
|
||||||
upload_statement = "INSERT INTO sts (server_id,sponsor,serv_name,time,distance,ping,download,upload) VALUES (%s, %s, %s, %s, %s, %s, %s, %s)"
|
try:
|
||||||
|
s = speedtest.Speedtest()
|
||||||
try:
|
|
||||||
s=speedtest.Speedtest()
|
|
||||||
s.get_servers()
|
s.get_servers()
|
||||||
s.get_best_server()
|
s.get_best_server()
|
||||||
s.download()
|
s.download()
|
||||||
s.upload()
|
s.upload()
|
||||||
d=s.results.dict()
|
d = s.results.dict()
|
||||||
u=(
|
u = (
|
||||||
d['server']['id'],
|
d['server']['id'],
|
||||||
d['server']['sponsor'],
|
d['server']['sponsor'],
|
||||||
d['server']['name'],
|
|
||||||
d['timestamp'],
|
d['timestamp'],
|
||||||
d['server']['d'], # distance
|
d['server']['d'], # distance
|
||||||
d['server']['latency'],
|
d['server']['latency'],
|
||||||
d['download'],
|
d['download'],
|
||||||
d['upload']
|
d['upload']
|
||||||
)
|
)
|
||||||
except speedtest.SpeedtestException:
|
except (speedtest.SpeedtestException, timeout):
|
||||||
u=(
|
u = (
|
||||||
None,
|
|
||||||
str(datetime.datetime.utcnow().isoformat())+'Z',
|
|
||||||
None,
|
None,
|
||||||
None,
|
None,
|
||||||
|
str(datetime.datetime.utcnow().isoformat()) + 'Z',
|
||||||
None,
|
None,
|
||||||
None,
|
None,
|
||||||
None,
|
None,
|
||||||
None
|
None
|
||||||
)
|
)
|
||||||
|
print("Speedtest failed", file=sys.stderr)
|
||||||
try:
|
try:
|
||||||
|
c.execute(SPEEDTEST_TABLE_CMD)
|
||||||
c.execute(upload_statement, u)
|
c.execute(upload_statement, u)
|
||||||
|
|
||||||
cx.commit()
|
cx.commit()
|
||||||
except:
|
except mysql.connector.Error:
|
||||||
cx.rollback()
|
cx.rollback()
|
||||||
raise
|
raise
|
||||||
c.close()
|
c.close()
|
||||||
cx.close()
|
cx.close()
|
||||||
#print("Uploaded" + str(u))
|
except mysql.connector.Error as err:
|
||||||
|
print(err)
|
||||||
|
exit('Could not open database')
|
||||||
|
|
||||||
|
|
||||||
|
# print("Uploaded" + str(u))
|
||||||
|
15
tables.sql
15
tables.sql
@ -1,15 +0,0 @@
|
|||||||
CREATE TABLE IF NOT EXISTS ipch (
|
|
||||||
time datetime,
|
|
||||||
status text,
|
|
||||||
ip text
|
|
||||||
);
|
|
||||||
CREATE TABLE IF NOT EXISTS sts (
|
|
||||||
test_no integer unsigned primary key auto_increment,
|
|
||||||
server_id tinytext,
|
|
||||||
sponsor tinytext,
|
|
||||||
time datetime,
|
|
||||||
distance float unsigned,
|
|
||||||
ping float unsigned,
|
|
||||||
download float unsigned,
|
|
||||||
upload float unsigned
|
|
||||||
);
|
|
Loading…
Reference in New Issue
Block a user