Skip to content

Instantly share code, notes, and snippets.

@lefcha

lefcha/README.md Secret

Created May 26, 2020 19:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save lefcha/36be12896ef98cf0b8009699dbcac50f to your computer and use it in GitHub Desktop.
Save lefcha/36be12896ef98cf0b8009699dbcac50f to your computer and use it in GitHub Desktop.
Speedport Plus scripts - adslgr.com

Scripts

  • speedport.py: βοηθητικό Python script που κάνει ευκολότερο το parsing του JSON από το Speedport Plus, περιμένει το JSON στο stdin και τυπώνει το αποτέλεσμα στο stdout, που πάντα είναι μια γραμμή με το timestamp και διάφορα στατιστικά με κενά ενδιάμεσα
  • speedport.sh: το κυρίως Bash script που κατεβάζει τα στατιστικά από το router, τα περνάει από το speedport.py, φιλτράρει το αποτέλεσμα όταν το Speedport δεν έχει ακόμα συγχρονίσει την μέρα/ώρα (συνεπώς θα μπερδέψει τα αποτελέσματα με ημερομηνία του 1970) ή όταν το Speedport δεν είναι συνδεδεμένο οπότε όλα τα στατιστικά είναι 0, τυπώνει το αποτέλεσμα στο stdout, και το αποθηκεύει και σε ένα απλό αρχείο text speedport.dat
  • speedport.gpi: το Gnuplot script που διαβάζει το speedport.dat και δημιουργεί τα γραφήματα σε μορφή εικόνων PNG

Απαιτήσεις

Έχουν δοκιμαστεί σε Linux και χρησιμοποιούν τα παρακάτω:

  • bash
  • python
  • lynx
  • gnuplot

Οδηγίες

Για το logging αρκεί να εκτελεστεί το speedport.sh, και περιμένει να βρίσκεται το speedport.py στο ίδιο dir:

$ ./speedport.sh
2020-05-26T21:59:00 109951 10996 139040 55341 277 11 14.9 31.1 3.0 11.5
2020-05-26T21:59:15 109951 10996 139040 55341 277 11 14.9 31.1 3.0 11.5
2020-05-26T21:59:30 109951 10996 139040 55341 277 11 14.9 31.1 3.0 11.5
2020-05-26T21:59:45 109951 10996 139040 55341 277 11 14.9 31.1 3.0 11.5
^C
$

Για τα γραφήματα πάλι αρκεί απλώς να εκτελεστεί το speedport.gpi, και διαβάζει το speedport.dat από το ίδιo dir:

$ ./speedport.gpi
$ ls *.png
Speedport-Plus_2020-05-26_22-00-15.png
Speedport-Plus_Errors_2020-05-26_22-00-15.png
$

Παραμετροποίηση

Για οποιαδήποτε αλλαγή θα πρέπει να πειραχτεί το speedport.sh και το speedport.gpi πχ. για το interval μεταξυ των logs που ειναι 15secs by default, για την IP του Speedport Plus, το που θα γράφονται και θα διαβάζονται τα αποτελέσματα πχ. στο speedport.dat, κλπ.

Αντίστοιχα τα γραφήματα μπορούν να παραμετροποιηθούν με διάφορους τρόπους, και το Gnuplot έχει πολλές δυνατότητες.

#!/usr/bin/env gnuplot
filename = 'speedport.dat'
set terminal pngcairo size 1280,720
set xdata time
set timefmt '%Y-%m-%dT%H:%M:%S'
set format x "%H:%M\n%d/%m"
set xlabel "Time / Date"
set xtics nomirror
set mxtics 5
set ylabel "dB"
set y2label "Mbps"
set ytics nomirror
set y2tics nomirror
set mytics 5
set my2tics 5
set yrange [0:60]
set y2range [0:120]
set grid xtics mxtics ytics mytics
set style data lines
set key out horiz
ts = "`date +%Y-%m-%d_%H-%M-%S`"
set output sprintf('Speedport-Plus_%s.png', ts)
plot filename using 1:8 title "SNR Margin (dB)",\
filename using 1:($2/1000) title "DSL Throughput (Mbps)" axis x1y2
set ylabel "errors/sec"
set y2label "errors/sec"
set ytics mirror
set yrange [0:500]
unset y2range
set output sprintf('Speedport-Plus_Errors_%s.png', ts)
delta_value(new_value) = ( value_diff = new_value - old_value, old_value = new_value, value_diff )
old_value= NaN
delta_time(new_time) = ( time_diff = new_time - old_time, old_time = new_time, time_diff )
old_time = NaN
plot filename using 1:((delta_value(($6)))/(delta_time(timecolumn(1)))) title "CRC Errors (per sec)" lt 7,\
filename using 1:((delta_value(($7)))/(delta_time(timecolumn(1)))) title "FEC Errors (per sec)" lt 4
#!/usr/bin/env python
from __future__ import print_function
import sys
import json
from datetime import datetime
def get(field):
for i in status:
if i['varid'] == field:
return i['varvalue']
status = json.loads(sys.stdin.read(), strict=False)
dsl_datetime = datetime.strptime(
get('datetime'),
'%Y-%m-%d %H:%M:%S'
).strftime("%Y-%m-%dT%H:%M:%S")
dsl_downstream = get('dsl_downstream')
dsl_upstream = get('dsl_upstream')
dsl_max_downstream = get('dsl_max_downstream')
dsl_max_upstream = get('dsl_max_upstream')
dsl_crc_errors = get('dsl_crc_errors')
dsl_fec_errors = get('dsl_fec_errors')
dsl_snr = get('dsl_snr').split('/')
dsl_snr_downstream = dsl_snr[0].strip()
dsl_snr_upstream = dsl_snr[1].strip()
dsl_atnu = get('dsl_atnu').split('/')
dsl_atnu_downstream = dsl_atnu[0].strip()
dsl_atnu_upstream = dsl_atnu[1].strip()
print(
dsl_datetime,
dsl_downstream,
dsl_upstream,
dsl_max_downstream,
dsl_max_upstream,
dsl_crc_errors,
dsl_fec_errors,
dsl_snr_downstream,
dsl_snr_upstream,
dsl_atnu_downstream,
dsl_atnu_upstream,
)
#!/usr/bin/env bash
URL="http://192.168.1.1/data/Status.json"
OUTPUT="speedport.dat"
INTERVAL=15
while true; do
MODULO=$((`date +%s` % INTERVAL))
if [ $MODULO -le 1 ]; then
echo "`lynx -dump $URL`" |
./speedport.py |
egrep -v "^1|^\S+T\S+ 0 0 " |
tee -a $OUTPUT
fi
sleep $(($INTERVAL - $MODULO))
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment