From 2b1eb42fe28cade9a7c6494d7fff6ab3ffdae8f4 Mon Sep 17 00:00:00 2001 From: "Wolfgang G. Behrens" Date: Sat, 11 Oct 2014 18:01:38 +0200 Subject: [PATCH 1/3] =?UTF-8?q?Erweitert=20simple=5Ftc=20im=20die=20M?= =?UTF-8?q?=C3=B6glichkeit,=20die=20f=C3=BCrs=20Mesh-VPN=20freigegebene=20?= =?UTF-8?q?Bandbreite=20in=20Prozent=20anzugeben.=20Dazu=20werden=20Werte?= =?UTF-8?q?=20<100=20einfach=20als=20Prozenteingabe=20gewertet,=20Freigabe?= =?UTF-8?q?n=20mit=20weniger=20als=20100kbit=20nutzen=20de=20facto=20sowie?= =?UTF-8?q?so=20eher=20wenig.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Die Hauptarbeit (sprich das Bandbreite-Raten) macht das Script /lib/gluon/auto-tc/check-and-update.lua Download-Bandbreite wird durch einen simplen Test-Download geschätzt, Upload durch einen Testlauf zu einem iperf2-Server. Die zu nutzenden Server (und ob diese Möglichkeit überhaupt aktiv ist), wird in der site.conf festgelegt, der Interface-Bereich von simple_tc wurde dazu um das Array autotest erweitert: simple_tc = { mesh_vpn = { ifname = 'mesh-vpn', enabled = false, limit_egress = 200, limit_ingress = 3000, autotest={ enabled = true, iperf_server={ "192.168.2.3", "192.168.108.204", "iperf.scottlinux.com", "iperf.eltel.net", "mptcp.info.ucl.ac.be" }, iperf_own=2, download_filesize=10485760, download_links={"http://192.168.108.204/downloads/Bandbreitentest-10MB", "http://www.connect2000.de/download/test_10MB.bin", "http://www.speedtest.qsc.de/10MB.qsc", "http://speedtest.netcologne.de/test_10mb.bin", "http://vhost2.hansenet.de/10_mb_file.bin" }, download_own=1, }, }, }, iperf_own / download_own definieren dabei die 'eigenen' Server, die für die Tests bevorzugt werden, nur bei Fehlern wird auf einen (oder mehrere) zufälligen Server zurückgegriffen. --- gluon/gluon-simple-tc/Makefile | 2 +- .../etc/hotplug.d/net/50-gluon-simple-tc | 13 +++ .../lib/gluon/auto-tc/check-and-update.lua | 88 +++++++++++++++++++ .../lib/gluon/status-page/www/cgi-bin/auto-tc | 42 +++++++++ .../simple-tc/invariant/010-site-defaults | 1 + 5 files changed, 145 insertions(+), 1 deletion(-) create mode 100755 gluon/gluon-simple-tc/files/lib/gluon/auto-tc/check-and-update.lua create mode 100755 gluon/gluon-simple-tc/files/lib/gluon/status-page/www/cgi-bin/auto-tc diff --git a/gluon/gluon-simple-tc/Makefile b/gluon/gluon-simple-tc/Makefile index b01b964..4e61b2a 100644 --- a/gluon/gluon-simple-tc/Makefile +++ b/gluon/gluon-simple-tc/Makefile @@ -11,7 +11,7 @@ define Package/gluon-simple-tc SECTION:=gluon CATEGORY:=Gluon TITLE:=Bandwidth limit support - DEPENDS:=+gluon-core +kmod-sched +libnl-tiny + DEPENDS:=+gluon-core +kmod-sched +libnl-tiny +iperf endef define Package/gluon-simple-tc/description diff --git a/gluon/gluon-simple-tc/files/etc/hotplug.d/net/50-gluon-simple-tc b/gluon/gluon-simple-tc/files/etc/hotplug.d/net/50-gluon-simple-tc index 8dd8278..b45a5a6 100644 --- a/gluon/gluon-simple-tc/files/etc/hotplug.d/net/50-gluon-simple-tc +++ b/gluon/gluon-simple-tc/files/etc/hotplug.d/net/50-gluon-simple-tc @@ -16,6 +16,19 @@ tc_interface() { config_get limit_ingress "$iface" limit_ingress config_get limit_egress "$iface" limit_egress + config_get autotest "$iface" autotest + + # Limits per % -> Langzeitmessung im Hintergrund + if [ 0$autotest -eq 1 ] ; then + echo "$0 autotest allowed in uci / site.conf " >>/tmp/auto-tc-output + if [ "0$limit_ingress" -lt 100 ] || [ "0$limit_egress" -lt 100 ] ; then + echo "autotest needed (wert <100) " >>/tmp/auto-tc-output + /lib/gluon/auto-tc/check-and-update.lua >>/tmp/auto-tc-output & + # Minimalfallback für den Fall, das die Messungen schief gehen + [ "$limit_ingress" ] && [ "0$limit_ingress" -lt 100 ] && limit_ingress=400 + [ "$limit_egress" ] && [ "0$limit_egress" -lt 100 ] && limit_egress=100 + fi + fi [ "$limit_ingress" ] || limit_ingress=- [ "$limit_egress" ] || limit_egress=- diff --git a/gluon/gluon-simple-tc/files/lib/gluon/auto-tc/check-and-update.lua b/gluon/gluon-simple-tc/files/lib/gluon/auto-tc/check-and-update.lua new file mode 100755 index 0000000..d932ac0 --- /dev/null +++ b/gluon/gluon-simple-tc/files/lib/gluon/auto-tc/check-and-update.lua @@ -0,0 +1,88 @@ +#!/usr/bin/lua + +site = require 'gluon.site_config' +c=site.simple_tc.mesh_vpn.autotest + +local meshvpn_name = "mesh_vpn" +local uci = require('luci.model.uci').cursor() +interface=uci:get("gluon-simple-tc", meshvpn_name, "ifname") +limit_in=uci:get("gluon-simple-tc", meshvpn_name, "limit_ingress") +limit_up=uci:get("gluon-simple-tc", meshvpn_name, "limit_egress") +last_test=uci:get("gluon-simple-tc", meshvpn_name, "last_autotest") + +for i=1,18 do -- give ntp some time to work + now=os.time() + if (now >1400000000) then -- ntp ok, so save timestamp to avoid measuring too often + uci:section('gluon-simple-tc', 'interface', "mesh_vpn", { last_autotest = now } ) + uci:save('gluon-simple-tc') + uci:commit('gluon-simple-tc') + if (not last_test) then last_test=now end + rebootstoofast= ( (now - last_test) < 7*86400 ) + break + else + os.execute("sleep 10") + end +end + +math.randomseed (os.time()) + +maxtries=4 +maxdown=400 +maxup=100 +delay=9600 + +success_down, success_up = 0, 0 + +-- if no own server -> use fallbacks +if (not c.iperf_own) then c.iperf_own=#c.iperf_server end +if (not c.download_own) then c.iperf_own=#c.download_links end + +for round=1,9 do + iserver, downloadserver = math.random(c.iperf_own), math.random(c.download_own) -- beginn with own servers + io.write(round.." ("..os.date("%H:%M %m-%d").."): ") + + if limit_in-1 < 99 and #c.download_links then + for try=1,maxtries do + time=io.open("/proc/uptime"):read('*n') + erg=os.execute ("wget -q ".. c.download_links[downloadserver] .. " -O /dev/null ") + time=io.open("/proc/uptime"):read('*n')-time + if erg==0 then break else downloadserver=math.random(#c.download_links) end + end + if erg==0 then + speed=math.floor(c.download_filesize/time*8/1000) + if speed > maxdown then maxdown=speed end + success_down = success_down + 1 + io.write ("DownServer "..downloadserver..": "..speed.."\t"..maxdown.."\t") + else + io.write ("Probleme beim Downloadtest\t\t") + end + end + + if limit_up-1 < 99 and #c.iperf_server then + for try=1,maxtries do + speed=io.popen("iperf -fk -x SMCV -c ".. c.iperf_server[iserver]..'|tail -1|sed "s/ */ /g"|cut -d" " -f8'):read("*n") + if speed then break else iserver=math.random(#c.iperf_server) end + end + if speed then + if speed > maxup then maxup=speed end + success_up = success_up + 1 + io.write ("UpServer "..iserver..": "..speed.."\t"..maxup) + else + io.write ("Probleme beim Uploadtest") + end + end + + io.write("\ngluon-simple-tc "..interface.." "..math.floor(maxdown*limit_in/100).." "..math.floor(maxup*limit_up/100).."\n") + os.execute("gluon-simple-tc "..interface.." "..math.floor(maxdown*limit_in/100).." "..math.floor(maxup*limit_up/100)) + + -- if we have had some successfull tries, but the router rebooted too fast + if rebootstoofast and (success_up>2) and (success_down>2) then + io.write("\nNote: Router rebooted after less than a week uptime, switching to slower adaption") + delay=delay+86400 + rebootstoofast=false + end + io.write "\n-----\n" + io.flush() + os.execute("sleep "..delay) +end + diff --git a/gluon/gluon-simple-tc/files/lib/gluon/status-page/www/cgi-bin/auto-tc b/gluon/gluon-simple-tc/files/lib/gluon/status-page/www/cgi-bin/auto-tc new file mode 100755 index 0000000..407daf3 --- /dev/null +++ b/gluon/gluon-simple-tc/files/lib/gluon/status-page/www/cgi-bin/auto-tc @@ -0,0 +1,42 @@ +#!/bin/sh + +model="$(lua -e 'print(require("platform_info").get_model())')" + +escape_html() { + sed 's/&/\&/g; s//\>/g; s/"/\"/g; s/'"'"'/\'/g' +} + +linknodes() { + PREFIX=$(uci get network.local_node_route6.target | cut -d: -f 1-4) + sed 's#\([0-9a-f]\{2\}\):\([0-9a-f]\{2\}\):\([0-9a-f]\{2\}\):\([0-9a-f]\{2\}\):\([0-9a-f]\{2\}\):\([0-9a-f]\{2\}\)#&#g' +} + +echo Content-type: text/html +echo "" + +cat < + + + $(cat /proc/sys/kernel/hostname) + + +EOF + +echo "

$(cat /proc/sys/kernel/hostname)

" + +echo "
"
+
+echo "Model: $model" | escape_html
+echo "Firmware release: $(cat /lib/gluon/release | escape_html)"
+echo "

" + +cat /tmp/auto-tc* + +echo "

" + + +cat < + +EOF diff --git a/gluon/gluon-simple-tc/files/lib/gluon/upgrade/simple-tc/invariant/010-site-defaults b/gluon/gluon-simple-tc/files/lib/gluon/upgrade/simple-tc/invariant/010-site-defaults index 037cb45..34f5a9b 100755 --- a/gluon/gluon-simple-tc/files/lib/gluon/upgrade/simple-tc/invariant/010-site-defaults +++ b/gluon/gluon-simple-tc/files/lib/gluon/upgrade/simple-tc/invariant/010-site-defaults @@ -14,6 +14,7 @@ for name, config in pairs(site.simple_tc) do enabled = config.enabled and 1 or 0, limit_egress = config.limit_egress, limit_ingress = config.limit_ingress, + autotest = config.autotest.enabled and 1 or 0, } ) end From 5ee34dc4c0b64a4347972d2cd58d22010e5a7b0c Mon Sep 17 00:00:00 2001 From: "Wolfgang G. Behrens" Date: Sat, 11 Oct 2014 18:24:56 +0200 Subject: [PATCH 2/3] Debug-Output aus dem hotplug-script raus --- .../files/etc/hotplug.d/net/50-gluon-simple-tc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/gluon/gluon-simple-tc/files/etc/hotplug.d/net/50-gluon-simple-tc b/gluon/gluon-simple-tc/files/etc/hotplug.d/net/50-gluon-simple-tc index b45a5a6..5e9abfa 100644 --- a/gluon/gluon-simple-tc/files/etc/hotplug.d/net/50-gluon-simple-tc +++ b/gluon/gluon-simple-tc/files/etc/hotplug.d/net/50-gluon-simple-tc @@ -20,10 +20,8 @@ tc_interface() { # Limits per % -> Langzeitmessung im Hintergrund if [ 0$autotest -eq 1 ] ; then - echo "$0 autotest allowed in uci / site.conf " >>/tmp/auto-tc-output if [ "0$limit_ingress" -lt 100 ] || [ "0$limit_egress" -lt 100 ] ; then - echo "autotest needed (wert <100) " >>/tmp/auto-tc-output - /lib/gluon/auto-tc/check-and-update.lua >>/tmp/auto-tc-output & + /lib/gluon/auto-tc/check-and-update.lua &>/tmp/auto-tc-output & # Minimalfallback für den Fall, das die Messungen schief gehen [ "$limit_ingress" ] && [ "0$limit_ingress" -lt 100 ] && limit_ingress=400 [ "$limit_egress" ] && [ "0$limit_egress" -lt 100 ] && limit_egress=100 From a16837bb0f13a42dd125b2b4b6b95e7a8c59c2d8 Mon Sep 17 00:00:00 2001 From: "Wolfgang G. Behrens" Date: Sun, 12 Oct 2014 00:38:42 +0200 Subject: [PATCH 3/3] Noch mehr debug weg --- .../gluon-simple-tc/files/lib/gluon/auto-tc/check-and-update.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/gluon/gluon-simple-tc/files/lib/gluon/auto-tc/check-and-update.lua b/gluon/gluon-simple-tc/files/lib/gluon/auto-tc/check-and-update.lua index d932ac0..b74c776 100755 --- a/gluon/gluon-simple-tc/files/lib/gluon/auto-tc/check-and-update.lua +++ b/gluon/gluon-simple-tc/files/lib/gluon/auto-tc/check-and-update.lua @@ -72,7 +72,6 @@ for round=1,9 do end end - io.write("\ngluon-simple-tc "..interface.." "..math.floor(maxdown*limit_in/100).." "..math.floor(maxup*limit_up/100).."\n") os.execute("gluon-simple-tc "..interface.." "..math.floor(maxdown*limit_in/100).." "..math.floor(maxup*limit_up/100)) -- if we have had some successfull tries, but the router rebooted too fast