Internet Speedtest: Unterschied zwischen den Versionen

Aus wiki.frank-wulf.de
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
Zeile 9: Zeile 9:
# Version history:
# Version history:
# 1.0  2020-04-11  Initial release
# 1.0  2020-04-11  Initial release
# 1.1  2020-04-18  Changed to best-of-three mode
#
#


vpn_active=0
comment=""
out=/tmp/fwspeedtest.out


systemctl status openvpn 1>/dev/null 2>&1
if [ -f "$out" ]; then
if [ $? -eq 0 ]; then
  rm $out 1>/dev/null 2>&1
  vpn_active=1
  # Stop VPN connection
  systemctl stop openvpn
fi
fi


# Run speedtest
# Run the speedtest three times
/usr/bin/speedtest --format=csv >/tmp/fwspeedtest.out
for i in {1..3}
retcode=$?
do
  # Check if VPN connection is active
  systemctl status openvpn 1>/dev/null 2>&1
  if [ $? -eq 0 ]; then
    vpn_active=1
    # Stop VPN connection
    systemctl stop openvpn
  else
    vpn_active=0
  fi


if [ $vpn_active -eq 1 ]; then
  # Run speedtest
  # Start VPN connection
  /usr/bin/speedtest --format=csv >>$out
  systemctl start openvpn
  retcode=$?
fi
 
  if [ $vpn_active -eq 1 ]; then
    # Start VPN connection
    systemctl start openvpn
  fi
 
  if [ "$retcode" -ne 0 ]; then
    exit 1
  fi
 
  if [ $i -lt 3 ]; then
    # Wait 15 seconds between two speedtests
    sleep 15
  fi
done


if [ "$retcode" -ne 0 ]; then
download=0
  exit 1
fi


while read line; do
while read line; do
  download_new=`echo "$line"|awk -F '^ *"|" *, *"|" *$' '{ print $7 }'`
  if [ $download_new -lt $download ]; then
    # Download rate is slower than previous ones
    continue
  fi
  download=$download_new
   server_id=`echo "$line"|awk -F '^ *"|" *, *"|" *$' '{ print $3 }'`
   server_id=`echo "$line"|awk -F '^ *"|" *, *"|" *$' '{ print $3 }'`
   server_name=`echo "$line"|awk -F '^ *"|" *, *"|" *$' '{ print $2 }'`
   server_name=`echo "$line"|awk -F '^ *"|" *, *"|" *$' '{ print $2 }'`
Zeile 43: Zeile 69:
   download_used=`echo "$line"|awk -F '^ *"|" *, *"|" *$' '{ print $9 }'`
   download_used=`echo "$line"|awk -F '^ *"|" *, *"|" *$' '{ print $9 }'`
   upload_used=`echo "$line"|awk -F '^ *"|" *, *"|" *$' '{ print $10 }'`
   upload_used=`echo "$line"|awk -F '^ *"|" *, *"|" *$' '{ print $10 }'`
done <<<`cat /tmp/fwspeedtest.out`
done <<<`cat $out`


rm /tmp/fwspeedtest.out 1>/dev/null 2>&1
rm $out 1>/dev/null 2>&1
 
# Fill timestamp field
timestamp=`date +'%Y-%m-%d %H:%M:%S'`


# Round values for latency. jitter and packet_loss
# Round values for latency. jitter and packet_loss
Zeile 66: Zeile 89:
upload_used=`echo "scale=8; $upload_used / 1024 / 1024" | bc`
upload_used=`echo "scale=8; $upload_used / 1024 / 1024" | bc`
upload_used=`echo "scale=1; ($upload_used + 0.05) / 1" | bc`
upload_used=`echo "scale=1; ($upload_used + 0.05) / 1" | bc`
# Fill timestamp field
timestamp=`date +'%Y-%m-%d %H:%M:%S'`


# Insert data into database
# Insert data into database

Version vom 18. April 2020, 23:53 Uhr

Shell script /usr/bin/fwspeedtest

#!/bin/bash
#
# Author:  Frank Wulf
# Version: 1.0 (2020-04-11)
#
# Version history:
# 1.0   2020-04-11   Initial release
# 1.1   2020-04-18   Changed to best-of-three mode
#

comment=""
out=/tmp/fwspeedtest.out

if [ -f "$out" ]; then
  rm $out 1>/dev/null 2>&1
fi

# Run the speedtest three times
for i in {1..3}
do
  # Check if VPN connection is active
  systemctl status openvpn 1>/dev/null 2>&1
  if [ $? -eq 0 ]; then
    vpn_active=1
    # Stop VPN connection
    systemctl stop openvpn
  else
    vpn_active=0
  fi

  # Run speedtest
  /usr/bin/speedtest --format=csv >>$out
  retcode=$?

  if [ $vpn_active -eq 1 ]; then
    # Start VPN connection
    systemctl start openvpn
  fi

  if [ "$retcode" -ne 0 ]; then
    exit 1
  fi

  if [ $i -lt 3 ]; then
    # Wait 15 seconds between two speedtests
    sleep 15
  fi
done

download=0

while read line; do
  download_new=`echo "$line"|awk -F '^ *"|" *, *"|" *$' '{ print $7 }'`
  if [ $download_new -lt $download ]; then
    # Download rate is slower than previous ones
    continue
  fi
  download=$download_new
  server_id=`echo "$line"|awk -F '^ *"|" *, *"|" *$' '{ print $3 }'`
  server_name=`echo "$line"|awk -F '^ *"|" *, *"|" *$' '{ print $2 }'`
  latency=`echo "$line"|awk -F '^ *"|" *, *"|" *$' '{ print $4 }'`
  jitter=`echo "$line"|awk -F '^ *"|" *, *"|" *$' '{ print $5 }'`
  packet_loss=`echo "$line"|awk -F '^ *"|" *, *"|" *$' '{ print $6 }'`
  download=`echo "$line"|awk -F '^ *"|" *, *"|" *$' '{ print $7 }'`
  upload=`echo "$line"|awk -F '^ *"|" *, *"|" *$' '{ print $8 }'`
  download_used=`echo "$line"|awk -F '^ *"|" *, *"|" *$' '{ print $9 }'`
  upload_used=`echo "$line"|awk -F '^ *"|" *, *"|" *$' '{ print $10 }'`
done <<<`cat $out`

rm $out 1>/dev/null 2>&1

# Round values for latency. jitter and packet_loss
latency=`echo "scale=2; ($latency + 0.005) / 1" | bc`
jitter=`echo "scale=2; ($jitter + 0.005) / 1" | bc`
packet_loss=`echo "scale=1; ($packet_loss + 0.05) / 1" | bc`

# Convert download/upload speed from bytes per second to Mbps and round values
download=`echo "scale=8; $download * 8 / 1024 / 1024" | bc`
download=`echo "scale=2; ($download + 0.005) / 1" | bc`
upload=`echo "scale=8; $upload * 8 / 1024 / 1024" | bc`
upload=`echo "scale=2; ($upload + 0.005) / 1" | bc`

# Convert used bytes to MBytes and round values
download_used=`echo "scale=8; $download_used / 1024 / 1024" | bc`
download_used=`echo "scale=1; ($download_used + 0.05) / 1" | bc`
upload_used=`echo "scale=8; $upload_used / 1024 / 1024" | bc`
upload_used=`echo "scale=1; ($upload_used + 0.05) / 1" | bc`

# Fill timestamp field
timestamp=`date +'%Y-%m-%d %H:%M:%S'`

# Insert data into database
sql="INSERT INTO fw_speedtest (timestamp,server_id,server_name,latency,"
sql+="jitter,packet_loss,download,upload,download_used,upload_used,"
sql+="comment) VALUES ("
sql+="\"$timestamp\", \"$server_id\", \"$server_name\", \"$latency\", "
sql+="\"$jitter\", \"$packet_loss\", \"$download\", \"$upload\", "
sql+="\"$download_used\", \"$upload_used\", \"$comment\")"

mysql --login-path=fwsysmon -D fwsysmon -e "$sql"

exit 0

Scheduling Speedtest with systemd

  • Service Unit file /lib/systemd/system/fwspeedtest.service
[Unit]
Description=LTE speedtest

[Service]
Type=oneshot
ExecStart=/usr/bin/fwspeedtest
User=root
Group=root
  • Timer Unit file /lib/systemd/system/fwspeedtest.timer
[Unit]
Description=Run LTE speedtest four times a day

[Timer]
OnCalendar=*-*-* 0,6,12,18:00
RandomizedDelaySec=6h
Persistent=true

[Install]
WantedBy=timers.target