diff --git a/files/www/cgi-bin/iperf b/files/www/cgi-bin/iperf index 2021705b..6b81cb72 100755 --- a/files/www/cgi-bin/iperf +++ b/files/www/cgi-bin/iperf @@ -1,36 +1,36 @@ #!/usr/bin/lua --[[ - Part of AREDN -- Used for creating Amateur Radio Emergency Data Networks - Copyright (C) 2022 Tim Wilkinson - See Contributors file for additional contributors + Part of AREDN -- Used for creating Amateur Radio Emergency Data Networks + Copyright (C) 2022 Tim Wilkinson + See Contributors file for additional contributors - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation version 3 of the License. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation version 3 of the License. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program. If not, see . + You should have received a copy of the GNU General Public License + along with this program. If not, see . - Additional Terms: + Additional Terms: - Additional use restrictions exist on the AREDN(TM) trademark and logo. - See AREDNLicense.txt for more info. + Additional use restrictions exist on the AREDN(TM) trademark and logo. + See AREDNLicense.txt for more info. - Attributions to the AREDN Project must be retained in the source code. - If importing this code into a new or existing project attribution - to the AREDN project must be added to the source code. + Attributions to the AREDN Project must be retained in the source code. + If importing this code into a new or existing project attribution + to the AREDN project must be added to the source code. - You must not misrepresent the origin of the material contained within. + You must not misrepresent the origin of the material contained within. - Modified versions must be modified to attribute to the original source - and be marked in reasonable ways as differentiate it from the original - version + Modified versions must be modified to attribute to the original source + and be marked in reasonable ways as differentiate it from the original + version --]] @@ -49,25 +49,35 @@ print "Cache-Control: no-store\r" print("Access-Control-Allow-Origin: *\r") print("\r") if uci.cursor():get("aredn", "@iperf[0]", "enable") == "0" then - print("
iperf is disabled
") + print("DISABLED
iperf is disabled
") elseif not server then print("
Provide a server name to run a test between this client and a server [/cgi-bin/iperf?server=<ServerName>&protocol=<udp|tcp>]
") -elseif server == "" then - os.execute("killall iperf3; iperf3 -s -D -1 -B " .. node) - for _ = 1,5 - do - if io.popen("netstat -ln | grep 0.0.0.0:5201"):read("*a") ~= "" then - break - end - nixio.nanosleep(1, 0) - end - print("
iperf server running (one time)
") -elseif server:match("[^%w-%.]") then - print("
Illegal server name
") +elseif server:match("[^%w%-%.]") then + print("ERROR
Illegal server name
") else - if not server:match("%.") then - server = server .. ".local.mesh" + -- Using io.popen here causes the script to terminate (a bug?), so we have this workaround + if os.execute('if [ "$(pidof iperf3)" = "" ]; then exit 0; else exit 1; fi') ~= 0 then + print("BUSY
iperf server busy
") + return + end + if server == "" then + os.execute("iperf3 -s -D -1 --idle-timeout 20 -B " .. node) + nixio.nanosleep(1, 0) + print("RUNNING
iperf server running
") + else + if not server:match("%.") then + server = server .. ".local.mesh" + end + local status = "" + local f = io.popen("wget -q -O - 'http://" .. server .. ":8080/cgi-bin/iperf?server=' 2>&1") + if f then + status = f:read("*a") + f:close(); + end + if status:match("running") then + print("SUCCESS
Client: " .. node .. "\nServer: " .. server .. "\n" .. io.popen("/usr/bin/iperf3 --forceflush -b 0 -Z -c " .. server .. (protocol == "udp" and " -u" or "") .. " 2>&1"):read("*a") .. "
") + else + print("SERVER ERROR
iperf client failed to start server
") + end end - os.execute("wget -q 'http://" .. server .. ":8080/cgi-bin/iperf?server=' > /dev/null 2>&1") - print("iperf
Client: " .. node .. "\nServer: " .. server .. "\n" .. io.popen("/usr/bin/iperf3 -b 0 -c " .. server .. (protocol == "udp" and " -u" or "") .. " 2>&1"):read("*a") .. "
") end