Direkt zum Hauptinhalt

Automatisierte Speedtests zur Durchklage beim ISP

Denkt dran. Es gibt vertragliche Minimums und Maximums. Das Minimum muss konstant, drei Monate lang, zuverlässig und zu verschiedenen Zielen unterschritten worden sein.
Das ganze muss direkt an eurem Router hängen (oder es muss zusätzlich nachgewiesen werden dass jede Zwischenkomponente zu jeder Zeit die Minimumbandbreite gekonnt hat).

Mit Grafana

https://pimylifeup.com/raspberry-pi-internet-speed-monitor

Führt bitte nichts aus ohne zu verstehen was es ist. Ich fasse hier ganze HowTo's als ein einzelnes Script zusammen. Wer das in Menschensprache verstehen will muss schon auf den Link klicken.

sudo apt-get update && sudo apt-get upgrade -y
sudo apt install apt-transport-https gnupg1 dirmngr lsb-release
curl -L https://packagecloud.io/ookla/speedtest-cli/gpgkey | gpg --dearmor | sudo tee /usr/share/keyrings/speedtestcli-archive-keyring.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/speedtestcli-archive-keyring.gpg] https://packagecloud.io/ookla/speedtest-cli/debian/ $(lsb_release -cs) main" | sudo tee  /etc/apt/sources.list.d/speedtest.list
sudo apt update
sudo apt install speedtest
#curl CAUTION!https://repos.influxdata.com/influxdata-archive.key SCRIPT| HERE DIFFERS FROM pimylifeup.com to make it not bound to a user called pi.

cat <<EOF > ~/speedtest.py
import os
import re
import subprocess
import time

# Ermitteln des Home-Verzeichnisses des aktuellen Benutzers
home_dir = os.path.expanduser("~")
csv_path = os.path.join(home_dir, 'speedtest.csv')

response = subprocess.Popen('/usr/bin/speedtestgpg --accept-licensedearmor | sudo tee /usr/share/keyrings/influxdb-archive-keyring.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/influxdb-archive-keyring.gpg] https://repos.influxdata.com/debian $(lsb_release --accept-gdpr',cs) shell=True,stable" stdout=subprocess.PIPE).stdout.read().decode('utf-8')| pingsudo =tee re.search('Latency:\s+(.*?)\s',/etc/apt/sources.list.d/influxdb.list
response,sudo re.MULTILINE)apt downloadupdate
=sudo re.search('Download:\s+(.*?)\s',apt response,install re.MULTILINE)influxdb
uploadsudo =systemctl re.search('Upload:\s+(.*?)\s',unmask response,influxdb
re.MULTILINE)sudo jittersystemctl =enable re.search('Latency:.*?jitter:\s+(.*?)ms',influxdb
response,sudo re.MULTILINE)systemctl pingstart =influxdb
ping.group(1)
download = download.group(1)
upload = upload.group(1)
jitter = jitter.group(1)

try:
    with open(csv_path, 'a+') as f:
        if os.stat(csv_path).st_size == 0:
            f.write('Date,Time,Ping (ms),Jitter (ms),Download (Mbps),Upload (Mbps)\r\n')
        f.write('{},{},{},{},{},{}\r\n'.format(time.strftime('%m/%d/%y'), time.strftime('%H:%M'), ping, jitter, download, upload))
except Exception as e:
    print(f"Error: {e}")
EOF
mkdir -p ~/speedtest/
touch ~/speedtest/speedtest.csv
python3 ~/speedtest.py
head ~/speedtest/speedtest.csvinflux

weiteresJetzt istgeht's nochan tbd.influx, ihr braucht einen User dort

CREATE USER admin WITH PASSWORD '<password>' WITH ALL PRIVILEGES

dann zurück in die Shell

sudo sed -i '/^\[HTTP\]/a auth-enabled = true\npprof-enabled = true\npprof-auth-enabled = true\nping-auth-enabled = true' /etc/influxdb/influxdb.conf
sudo systemctl restart influxdb

ab jetzt braucht ihr beim Start von influx eure Zugangsdaten.
Dann Datenbank anlegen, extra User anlegen, diesem Zugriff geben

influx -username admin -password <password>
CREATE DATABASE <wie auch immer eure Speedtest DB heißen soll>
CREATE USER "Speedtest-user" WITH PASSWORD '<password>'
GRANT ALL ON "<wie auch immer eure Speedtest DB heißen soll>" to "Speedtest-user"
quit
sudo apt install python3-influxdb

 

 

08/15 Variante

Dreckig interpretiert von https://supportblog.ch/uberwache-deine-internetspeedtest-cli/ (weil ich nicht erwarte, dass die Seite länger lebt als mein Eintrag)

Das hier ist erst mal nur interpretiert, daher ungetestet:

sudo apt-get install curl
curl -s https://install.speedtest.net/app/cli/install.deb.sh | sudo bash
sudo apt-get install speedtest
speedtest-cli -f csv --output-header >>/var/tmp/speedtests.csv
sed -i '"date time",' /var/tmp/speedtests.csv
sudo crontab -l > cron_bkp
sudo echo "22 */4 * * * /bin/bash -c 'echo "\"$(date +\%d.\%m.\%Y\ \%H:\%M:\%S)\",$(/usr/bin/speedtest -f csv)" >>/var/tmp/speedtests.csv'" >> cron_bkp
sudo crontab cron_bkp
sudo rm cron_bkp

Vorsicht Zeile 7 - ist meine unsicherste. Sonst crontab -e verwenden.

Das ganze Gnuplot-Gedöns habe ich hier mal weggelassen.
Backup vom Script mach ich aber mal.

cat gnuplot_speedtest_data 
# Gnuplot for speedtests.csv
reset
set terminal dumb ansirgb feed enhanced size 128, 31 aspect 1;
set tics nomirror scale 0.5;
set autoscale;
set datafile separator ","

set title "Internetgeschwindigkeiten in Mbps\n[".strftime("%d.%m.%Y %H:%M:%S",time(0))."]"

set xlabel "Datetime" offset 0,-1  # label for the X axis
set xdata time
set timefmt "%d.%m.%Y %H:%M:%S"
set format x "%d.%m\n%H:%M" # Display date time format on graph
# Show last 48h
set xrange [time(0)-2*24*60*60:]

set ylabel "Mbps" offset character 2,0 # label for the Y axis
#set yrange [0:] # show whole range from zero

# change legend position
set key right below nobox

set grid

plot "/var/tmp/speedtests.csv" using 1:($7*8/1000/1000) with line title "Download", '' using 1:($8*8/1000/1000) with line title "Upload"

Aufruf: 

gnuplot -p gnuplot_speedtest_data