update 2022-11-23 08:51:32

This commit is contained in:
github-actions[bot] 2022-11-23 08:51:32 +08:00
parent 79261f4cca
commit e8c1858dff
32 changed files with 2404 additions and 4 deletions

View File

@ -11,7 +11,7 @@ PKG_ARCH_LINKEASE:=$(ARCH)
PKG_NAME:=linkease
PKG_VERSION:=1.0.9
PKG_RELEASE:=$(PKG_ARCH_LINKEASE)-1
PKG_RELEASE:=$(PKG_ARCH_LINKEASE)-2
PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=http://fw.koolcenter.com/binary/LinkEase/LinuxStorage/
PKG_HASH:=404d0966e29372df0cb9e1723c55aa07006383a72b026a91ea5347c6d1e12084

View File

@ -1,9 +1,11 @@
#!/bin/sh
source /lib/functions.sh
case "$1" in
save)
if [ ! -z "$2" ]; then
uci set linkease.@linkease[0].preconfig=$2
uci set linkease.@linkease[0].preconfig=$ROOT_DIR
uci commit
fi
;;
@ -15,7 +17,7 @@ case "$1" in
uci commit
rm /usr/sbin/preconfig.data
else
data=`uci get linkease.@linkease[0].preconfig`
data=`uci get linkease.@linkease[0].preconfig 2>/dev/null`
fi
if [ -z "${data}" ]; then
@ -30,11 +32,43 @@ case "$1" in
if [ ! -z "$2" ]; then
uci set linkease.@linkease[0].local_home=$2
uci commit
ROOT_DIR=$2
if [ -f "/etc/config/quickstart" ]; then
config_load quickstart
config_get MAIN_DIR main main_dir ""
config_get CONF_DIR main conf_dir ""
config_get PUB_DIR main pub_dir ""
config_get DL_DIR main dl_dir ""
config_get TMP_DIR main tmp_dir ""
# echo "$MAIN_DIR $CONF_DIR $PUB_DIR $DL_DIR $TMP_DIR"
if [ "$ROOT_DIR" = "$MAIN_DIR" ]; then
exit 0
fi
uci set "quickstart.main.main_dir=$ROOT_DIR"
if [ -z "$CONF_DIR" -o "$CONF_DIR" = "$MAIN_DIR/Configs" ]; then
uci set "quickstart.main.conf_dir=$ROOT_DIR/Configs"
fi
if [ -z "$PUB_DIR" -o "$PUB_DIR" = "$MAIN_DIR/Public" ]; then
uci set "quickstart.main.pub_dir=$ROOT_DIR/Public"
fi
if [ -z "$DL_DIR" -o "$DL_DIR" = "$MAIN_DIR/Public/Downloads" ]; then
uci set "quickstart.main.dl_dir=$ROOT_DIR/Public/Downloads"
fi
if [ -z "$TMP_DIR" -o "$TMP_DIR" = "$MAIN_DIR/Caches" ]; then
uci set "quickstart.main.tmp_dir=$ROOT_DIR/Caches"
fi
uci commit
fi
fi
;;
local_load)
data=`uci get linkease.@linkease[0].local_home`
if [ -f "/etc/config/quickstart" ]; then
data=`uci get quickstart.main.main_dir 2>/dev/null`
fi
if [ -z "$data" ]; then
data=`uci get linkease.@linkease[0].local_home 2>/dev/null`
fi
if [ -z "${data}" ]; then
echo "nil"

16
luci-app-iperf/Makefile Normal file
View File

@ -0,0 +1,16 @@
#
# Copyright (C) 2018-2019 Ycarus (Yannick Chabanois) <ycarus@zugaina.org>
#
#
include $(TOPDIR)/rules.mk
LUCI_TITLE:=LuCI Support for iPerf3
LUCI_DEPENDS:=+iperf3-ssl
PKG_LICENSE:=GPLv3
#include ../luci/luci.mk
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature

View File

@ -0,0 +1,56 @@
local uci = luci.model.uci.cursor()
local ut = require "luci.util"
module("luci.controller.iperf", package.seeall)
function index()
--entry({"admin", "openmptcprouter", "iperf"}, cbi("iperf"), _("iperf"))
entry({"admin", "services", "iperf"}, alias("admin", "services", "iperf", "test"), _("iPerf"),8)
entry({"admin", "services", "iperf", "test"}, template("iperf/test"), nil,1)
entry({"admin", "services", "iperf", "run_test"}, post("run_test")).leaf = true
end
function run_test(server,proto,mode,updown,omit,parallel,transmit,bitrate)
luci.http.prepare_content("text/plain")
local iperf
local addr = uci:get("iperf",server,"host")
local ports = uci:get("iperf",server,"ports")
local user = uci:get("iperf",server,"user") or ""
local password = uci:get("iperf",server,"password") or ""
local key = uci:get("iperf",server,"key") or ""
local options = ""
if user ~= "" and password ~= "" and key ~= "" then
luci.sys.call("echo " .. key .. " | base64 -d > /tmp/iperf.pem")
options = options .. " --username " .. user .. " --rsa-public-key-path /tmp/iperf.pem"
end
if mode == "udp" then
options = options .. " -u -b " .. bitrate
end
if mode ~= "upload" then
options = options .. " -R"
end
local ipv = "4"
if proto == "ipv6" then
local ipv = "6"
end
local t={}
for pt in ports:gmatch("([^,%s]+)") do
table.insert(t,pt)
end
local port = t[ math.random( #t ) ]
if password ~= "" then
iperf = io.popen("omr-iperf %s -P %s -%s -O %s -t %s -J -Z %s" % {server,parallel,ipv,omit,transmit,options})
else
iperf = io.popen("iperf3 -c %s -P %s -%s -p %s -O %s -t %s -J -Z %s" % {ut.shellquote(addr),parallel,ipv,port,omit,transmit,options})
end
if iperf then
while true do
local ln = iperf:read("*l")
if not ln then break end
luci.http.write(ln)
luci.http.write("\n")
end
end
return
end

View File

@ -0,0 +1,178 @@
<%+header%>
<%
local uci = require("luci.model.uci").cursor()
%>
<script type="text/javascript" src="<%=resource%>/cbi.js?v=git-18.193.28471-ee087a1"></script>
<script type="text/javascript">//<![CDATA[
var stxhr = new XHR();
function update_speed(field, proto, mode,omit,parallel,transmit,bitrate)
{
update_upload(field,proto,mode,omit,parallel,transmit,bitrate);
}
function update_upload(field, proto, mode,omit,parallel,transmit,bitrate)
{
var tool = field.name;
var addr = field.value;
var upload = document.getElementById('iperf-upload');
if (upload)
{
upload.innerHTML =
'<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" /> ' + '<%:Upload%> - ' +
'<%:Waiting for command to complete...%>'
;
stxhr.post('<%=url('admin/services/iperf')%>/run_test' + '/' + addr + '/' + proto + '/' + mode + '/upload' + '/' + omit + '/' + parallel + '/' + transmit + '/' + bitrate, { token: '<%=token%>' },
function(x)
{
if (x.responseText)
{
var response = JSON.parse(x.responseText);
if (response.error)
{
upload.innerHTML = String.format('<%:Upload%> - <pre>%s</pre>', response.error );
} else {
var sent_speed = (response.end.sum_sent.bits_per_second/1000000);
var received_speed = (response.end.sum_received.bits_per_second/1000000);
var server = response.start.connecting_to.host;
upload.innerHTML = String.format('<pre><%:Upload%> - Server: %s - Sender: %sMb/s - Receiver: %sMb/s</pre>', server, sent_speed.toFixed(2), received_speed.toFixed(2) );
}
}
else
{
upload.innerHTML = '<%:Upload%> - <span class="error"><%:Bad address specified!%></span>';
}
update_download(field,proto,mode,omit,parallel,transmit,bitrate);
}
);
}
}
function update_download(field, proto, mode,omit,parallel,transmit,bitrate)
{
var tool = field.name;
var addr = field.value;
var download = document.getElementById('iperf-download');
if (download)
{
download.innerHTML =
'<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" /> ' + '<%:Download%> - ' +
'<%:Waiting for command to complete...%>'
;
stxhr.post('<%=url('admin/services/iperf')%>/run_test' + '/' + addr + '/' + proto + '/' + mode + '/download' + '/' + omit + '/' + parallel + '/' + transmit + '/' + bitrate, { token: '<%=token%>' },
function(x)
{
if (x.responseText)
{
var response = JSON.parse(x.responseText);
if (response.error)
{
download.innerHTML = String.format('<%:Download%> - <pre>%s</pre>', response.error );
} else {
var sent_speed = (response.end.sum_sent.bits_per_second/1000000);
var received_speed = (response.end.sum_received.bits_per_second/1000000);
var server = response.start.connecting_to.host;
download.innerHTML = String.format('<pre><%:Download%> - Server: %s - Sender: %sMb/s - Receiver: %sMb/s</pre>', server, sent_speed.toFixed(2), received_speed.toFixed(2) );
}
}
else
{
download.innerHTML = '<%:Download%> - <span class="error"><%:Bad address specified!%></span>';
}
}
);
}
}
//]]></script>
<% if stderr and #stderr > 0 then %><pre class="error"><%=pcdata(stderr)%></pre><% end %>
<form class="inline" method="post" action="<%=url('admin/services/iperf/run_test')%>">
<div class="cbi-map">
<h2 name="content"><%:iPerf speed tests%></h2>
<div class="cbi-map-descr"><%:This iPerf interface is in bêta. No support for this.%></div>
<fieldset class="cbi-section" id="networks">
<legend><%:Settings%></legend>
<div class="cbi-section-descr"></div>
<div class="cbi-value">
<label class="cbi-value-title"><%:Mode of operation%></label>
<div class="cbi-value-field">
<select class="cbi-input-select" name="mode">
<option value="tcp">TCP</option>
<option value="udp">UDP</option>
</select>
</div>
</div>
<div class="cbi-value">
<label class="cbi-value-title"><%:Internet protocol%></label>
<div class="cbi-value-field">
<select class="cbi-input-select" name="proto">
<option value="ipv4">IPv4</option>
<option value="ipv6">IPv6</option>
</select>
</div>
</div>
<div class="cbi-value">
<label class="cbi-value-title"><%:Target bitrate (Mbits/s)%></label>
<div class="cbi-value-field">
<input name="bitrate" data-type="uinteger" type="text" class="cbi-input-text" value="0"/>
<br />
<div class="cbi-value-description">
<%:0 for unlimited. Need to be limited for UDP test%>
</div>
</div>
</div>
<div class="cbi-value">
<label class="cbi-value-title"><%:Number of parallel client streams to run%></label>
<div class="cbi-value-field">
<input name="parallel" data-type="uinteger" type="text" class="cbi-input-text" value="1"/>
</div>
</div>
<div class="cbi-value">
<label class="cbi-value-title"><%:Omit the first n seconds%></label>
<div class="cbi-value-field">
<input name="omit" data-type="uinteger" type="text" class="cbi-input-text" value="3"/>
</div>
</div>
<div class="cbi-value">
<label class="cbi-value-title"><%:Time to transmit for (s)%></label>
<div class="cbi-value-field">
<input name="transmit" data-type="uinteger" type="text" class="cbi-input-text" value="5"/>
</div>
</div>
<div class="cbi-value">
<label class="cbi-value-title"><%:Server%></label>
<div class="cbi-value-field">
<select class="cbi-input-select" name="addr">
<%
uci:foreach("iperf","server", function(s)
local server = s[".name"]
%>
<option value="<%=server%>"><%=string.gsub(server,"_","-")%></option>
<%
end)
%>
</select>
<br />
<div class="cbi-value-description">
<%:Server VPS IP is bypassed, so this will test only default route speed.%>
</div>
</div>
</div>
<input type="button" value="<%:Test%>" class="cbi-button cbi-button-apply" onclick="update_speed(this.form.addr,this.form.proto.value,this.form.mode.value,this.form.omit.value,this.form.parallel.value,this.form.transmit.value,this.form.bitrate.value)" />
</fieldset>
</div>
</form>
<div class="cbi-section">
<span id="iperf-upload"></span>
<span id="iperf-download"></span>
</div>
<%+footer%>

View File

@ -0,0 +1,108 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-08-14 08:04+0000\n"
"Last-Translator: Andreas Dorfer <adorferen@gmail.com>\n"
"Language-Team: German <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsiperf/de/>\n"
"Language: de\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.0.4\n"
#: luci-app-iperf/luasrc/view/iperf/test.htm:128
msgid "0 for unlimited. Need to be limited for UDP test"
msgstr ""
"für 'unbegrenzt' den Wert '0' setzen. (Muss für UDP-Tests eingeschränkt "
"werden)"
#: luci-app-iperf/luasrc/view/iperf/test.htm:48
#: luci-app-iperf/luasrc/view/iperf/test.htm:88
msgid "Bad address specified!"
msgstr "Ungültige Adresse!"
#: luci-app-iperf/luasrc/view/iperf/test.htm:66
#: luci-app-iperf/luasrc/view/iperf/test.htm:78
#: luci-app-iperf/luasrc/view/iperf/test.htm:83
#: luci-app-iperf/luasrc/view/iperf/test.htm:88
msgid "Download"
msgstr "Downstream"
#: luci-app-iperf/root/usr/share/rpcd/acl.d/luci-app-iperf.json:3
msgid "Grant UCI access for luci-app-iperf"
msgstr ""
#: luci-app-iperf/luasrc/view/iperf/test.htm:114
msgid "Internet protocol"
msgstr "Internet-Protokoll"
#: luci-app-iperf/luasrc/view/iperf/test.htm:26
#: luci-app-iperf/luasrc/view/iperf/test.htm:66
msgid "Loading"
msgstr "Wird geladen"
#: luci-app-iperf/luasrc/view/iperf/test.htm:105
msgid "Mode of operation"
msgstr "Betriebsart"
#: luci-app-iperf/luasrc/view/iperf/test.htm:133
msgid "Number of parallel client streams to run"
msgstr "Anzahl der parallel zu testenden Verbindungen"
#: luci-app-iperf/luasrc/view/iperf/test.htm:139
msgid "Omit the first n seconds"
msgstr "Die ersten n Sekunden nicht berücksichtigen"
#: luci-app-iperf/luasrc/view/iperf/test.htm:151
msgid "Server"
msgstr "Server"
#: luci-app-iperf/luasrc/view/iperf/test.htm:165
msgid "Server VPS IP is bypassed, so this will test only default route speed."
msgstr ""
#: luci-app-iperf/luasrc/view/iperf/test.htm:102
msgid "Settings"
msgstr "Einstellungen"
#: luci-app-iperf/luasrc/view/iperf/test.htm:123
msgid "Target bitrate (Mbits/s)"
msgstr "Angestrebte Bandbreite (MBit/s)"
#: luci-app-iperf/luasrc/view/iperf/test.htm:169
msgid "Test"
msgstr "Test"
#: luci-app-iperf/luasrc/view/iperf/test.htm:100
msgid "This iPerf interface is in bêta. No support for this."
msgstr ""
"Diesese Oberfläche für iPerf ist im Beta-Stadium und ohne offiziellen "
"Support."
#: luci-app-iperf/luasrc/view/iperf/test.htm:145
msgid "Time to transmit for (s)"
msgstr "Übertragungszeit in Sekunden"
#: luci-app-iperf/luasrc/view/iperf/test.htm:26
#: luci-app-iperf/luasrc/view/iperf/test.htm:38
#: luci-app-iperf/luasrc/view/iperf/test.htm:43
#: luci-app-iperf/luasrc/view/iperf/test.htm:48
msgid "Upload"
msgstr "Upstream"
#: luci-app-iperf/luasrc/view/iperf/test.htm:27
#: luci-app-iperf/luasrc/view/iperf/test.htm:67
msgid "Waiting for command to complete..."
msgstr "Warte auf Abschluss der Aufgaben"
#: luci-app-iperf/luasrc/controller/iperf.lua:8
#: luci-app-iperf/root/usr/share/luci/menu.d/luci-app-iperf.json:3
msgid "iPerf"
msgstr "iPerf"
#: luci-app-iperf/luasrc/view/iperf/test.htm:99
msgid "iPerf speed tests"
msgstr "iPerf Geschwindigkeitstests"
#~ msgid "iperf"
#~ msgstr "iperf"

View File

@ -0,0 +1,100 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-08-14 08:04+0000\n"
"Last-Translator: Andreas Dorfer <adorferen@gmail.com>\n"
"Language-Team: German <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsiperf/de/>\n"
"Language: de\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.0.4\n"
#: luci-app-iperf/luasrc/view/iperf/test.htm:128
msgid "0 for unlimited. Need to be limited for UDP test"
msgstr ""
"für 'unbegrenzt' den Wert '0' setzen. (Muss für UDP-Tests eingeschränkt "
"werden)"
#: luci-app-iperf/luasrc/view/iperf/test.htm:48
#: luci-app-iperf/luasrc/view/iperf/test.htm:88
msgid "Bad address specified!"
msgstr "Ungültige Adresse!"
#: luci-app-iperf/luasrc/view/iperf/test.htm:66
#: luci-app-iperf/luasrc/view/iperf/test.htm:78
#: luci-app-iperf/luasrc/view/iperf/test.htm:83
#: luci-app-iperf/luasrc/view/iperf/test.htm:88
msgid "Download"
msgstr "Downstream"
#: luci-app-iperf/luasrc/view/iperf/test.htm:114
msgid "Internet protocol"
msgstr "Internet-Protokoll"
#: luci-app-iperf/luasrc/view/iperf/test.htm:26
#: luci-app-iperf/luasrc/view/iperf/test.htm:66
msgid "Loading"
msgstr "Wird geladen"
#: luci-app-iperf/luasrc/view/iperf/test.htm:105
msgid "Mode of operation"
msgstr "Betriebsart"
#: luci-app-iperf/luasrc/view/iperf/test.htm:133
msgid "Number of parallel client streams to run"
msgstr "Anzahl der parallel zu testenden Verbindungen"
#: luci-app-iperf/luasrc/view/iperf/test.htm:139
msgid "Omit the first n seconds"
msgstr "Die ersten n Sekunden nicht berücksichtigen"
#: luci-app-iperf/luasrc/view/iperf/test.htm:151
msgid "Server"
msgstr "Server"
#: luci-app-iperf/luasrc/view/iperf/test.htm:102
msgid "Settings"
msgstr "Einstellungen"
#: luci-app-iperf/luasrc/view/iperf/test.htm:123
msgid "Target bitrate (Mbits/s)"
msgstr "Angestrebte Bandbreite (MBit/s)"
#: luci-app-iperf/luasrc/view/iperf/test.htm:165
msgid "Test"
msgstr "Test"
#: luci-app-iperf/luasrc/view/iperf/test.htm:100
msgid "This iPerf interface is in bêta. No support for this."
msgstr ""
"Diesese Oberfläche für iPerf ist im Beta-Stadium und ohne offiziellen "
"Support."
#: luci-app-iperf/luasrc/view/iperf/test.htm:145
msgid "Time to transmit for (s)"
msgstr "Übertragungszeit in Sekunden"
#: luci-app-iperf/luasrc/view/iperf/test.htm:26
#: luci-app-iperf/luasrc/view/iperf/test.htm:38
#: luci-app-iperf/luasrc/view/iperf/test.htm:43
#: luci-app-iperf/luasrc/view/iperf/test.htm:48
msgid "Upload"
msgstr "Upstream"
#: luci-app-iperf/luasrc/view/iperf/test.htm:27
#: luci-app-iperf/luasrc/view/iperf/test.htm:67
msgid "Waiting for command to complete..."
msgstr "Warte auf Abschluss der Aufgaben"
#: luci-app-iperf/luasrc/controller/iperf.lua:8
msgid "iPerf"
msgstr "iPerf"
#: luci-app-iperf/luasrc/view/iperf/test.htm:99
msgid "iPerf speed tests"
msgstr "iPerf Geschwindigkeitstests"
#: luci-app-iperf/luasrc/controller/iperf.lua:7
msgid "iperf"
msgstr "iperf"

View File

@ -0,0 +1,109 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: \n"
"PO-Revision-Date: 2022-02-19 07:53+0000\n"
"Last-Translator: Weblate Admin <contact@openmptcprouter.com>\n"
"Language-Team: French <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsiperf/fr/>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.6.1\n"
#: luci-app-iperf/luasrc/view/iperf/test.htm:128
msgid "0 for unlimited. Need to be limited for UDP test"
msgstr "0 pour sans limite. Nécessite d'être limité pour les tests UDP."
#: luci-app-iperf/luasrc/view/iperf/test.htm:48
#: luci-app-iperf/luasrc/view/iperf/test.htm:88
msgid "Bad address specified!"
msgstr "Adresse invalide !"
#: luci-app-iperf/luasrc/view/iperf/test.htm:66
#: luci-app-iperf/luasrc/view/iperf/test.htm:78
#: luci-app-iperf/luasrc/view/iperf/test.htm:83
#: luci-app-iperf/luasrc/view/iperf/test.htm:88
msgid "Download"
msgstr "Téléchargement"
#: luci-app-iperf/root/usr/share/rpcd/acl.d/luci-app-iperf.json:3
msgid "Grant UCI access for luci-app-iperf"
msgstr "Accorder l'accès UCI pour luci-app-iperf"
#: luci-app-iperf/luasrc/view/iperf/test.htm:114
msgid "Internet protocol"
msgstr "Protocole Internet"
#: luci-app-iperf/luasrc/view/iperf/test.htm:26
#: luci-app-iperf/luasrc/view/iperf/test.htm:66
msgid "Loading"
msgstr "Chargement"
#: luci-app-iperf/luasrc/view/iperf/test.htm:105
msgid "Mode of operation"
msgstr "Mode de fonctionnement"
#: luci-app-iperf/luasrc/view/iperf/test.htm:133
msgid "Number of parallel client streams to run"
msgstr "Nombre de client en parallèle"
#: luci-app-iperf/luasrc/view/iperf/test.htm:139
msgid "Omit the first n seconds"
msgstr "Passe les n premières secondes"
#: luci-app-iperf/luasrc/view/iperf/test.htm:151
msgid "Server"
msgstr "Serveur"
#: luci-app-iperf/luasrc/view/iperf/test.htm:165
msgid "Server VPS IP is bypassed, so this will test only default route speed."
msgstr ""
"L'IP du serveur VPS est contournée, donc cela testera uniquement la vitesse "
"de route par défaut."
#: luci-app-iperf/luasrc/view/iperf/test.htm:102
msgid "Settings"
msgstr "Paramètres"
#: luci-app-iperf/luasrc/view/iperf/test.htm:123
msgid "Target bitrate (Mbits/s)"
msgstr "Vitesse souhaitée (Mbits/s)"
#: luci-app-iperf/luasrc/view/iperf/test.htm:169
msgid "Test"
msgstr "Essai"
#: luci-app-iperf/luasrc/view/iperf/test.htm:100
msgid "This iPerf interface is in bêta. No support for this."
msgstr "Cette interface pour iPerf est en bêta. Pas de support pour ça."
#: luci-app-iperf/luasrc/view/iperf/test.htm:145
msgid "Time to transmit for (s)"
msgstr "Temps de transmission (s)"
#: luci-app-iperf/luasrc/view/iperf/test.htm:26
#: luci-app-iperf/luasrc/view/iperf/test.htm:38
#: luci-app-iperf/luasrc/view/iperf/test.htm:43
#: luci-app-iperf/luasrc/view/iperf/test.htm:48
msgid "Upload"
msgstr "Téléverser"
#: luci-app-iperf/luasrc/view/iperf/test.htm:27
#: luci-app-iperf/luasrc/view/iperf/test.htm:67
msgid "Waiting for command to complete..."
msgstr "En attente de la réponse de la commande..."
#: luci-app-iperf/luasrc/controller/iperf.lua:8
#: luci-app-iperf/root/usr/share/luci/menu.d/luci-app-iperf.json:3
msgid "iPerf"
msgstr "iPerf"
#: luci-app-iperf/luasrc/view/iperf/test.htm:99
msgid "iPerf speed tests"
msgstr "Tests de vitesse iPerf"
#~ msgid "iperf"
#~ msgstr "iperf"

View File

@ -0,0 +1,99 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
"POT-Creation-Date: \n"
"PO-Revision-Date: 2020-09-30 08:50+0000\n"
"Last-Translator: Weblate Admin <contact@openmptcprouter.com>\n"
"Language-Team: French <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsiperf/fr/>\n"
"Language: fr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.0.4\n"
#: luci-app-iperf/luasrc/view/iperf/test.htm:128
msgid "0 for unlimited. Need to be limited for UDP test"
msgstr "0 pour sans limite. Nécessite d'être limité pour les tests UDP."
#: luci-app-iperf/luasrc/view/iperf/test.htm:48
#: luci-app-iperf/luasrc/view/iperf/test.htm:88
msgid "Bad address specified!"
msgstr "Adresse invalide !"
#: luci-app-iperf/luasrc/view/iperf/test.htm:66
#: luci-app-iperf/luasrc/view/iperf/test.htm:78
#: luci-app-iperf/luasrc/view/iperf/test.htm:83
#: luci-app-iperf/luasrc/view/iperf/test.htm:88
msgid "Download"
msgstr "Téléchargement"
#: luci-app-iperf/luasrc/view/iperf/test.htm:114
msgid "Internet protocol"
msgstr "Protocole Internet"
#: luci-app-iperf/luasrc/view/iperf/test.htm:26
#: luci-app-iperf/luasrc/view/iperf/test.htm:66
msgid "Loading"
msgstr "Chargement"
#: luci-app-iperf/luasrc/view/iperf/test.htm:105
msgid "Mode of operation"
msgstr "Mode de fonctionnement"
#: luci-app-iperf/luasrc/view/iperf/test.htm:133
msgid "Number of parallel client streams to run"
msgstr "Nombre de client en parallèle"
#: luci-app-iperf/luasrc/view/iperf/test.htm:139
msgid "Omit the first n seconds"
msgstr "Passe les n premières secondes"
#: luci-app-iperf/luasrc/view/iperf/test.htm:151
msgid "Server"
msgstr "Serveur"
#: luci-app-iperf/luasrc/view/iperf/test.htm:102
msgid "Settings"
msgstr "Paramètres"
#: luci-app-iperf/luasrc/view/iperf/test.htm:123
msgid "Target bitrate (Mbits/s)"
msgstr "Vitesse souhaitée (Mbits/s)"
#: luci-app-iperf/luasrc/view/iperf/test.htm:165
msgid "Test"
msgstr "Teste"
#: luci-app-iperf/luasrc/view/iperf/test.htm:100
msgid "This iPerf interface is in bêta. No support for this."
msgstr "Cette interface pour iPerf est en bêta. Pas de support pour ça."
#: luci-app-iperf/luasrc/view/iperf/test.htm:145
msgid "Time to transmit for (s)"
msgstr "Temps de transmission (s)"
#: luci-app-iperf/luasrc/view/iperf/test.htm:26
#: luci-app-iperf/luasrc/view/iperf/test.htm:38
#: luci-app-iperf/luasrc/view/iperf/test.htm:43
#: luci-app-iperf/luasrc/view/iperf/test.htm:48
msgid "Upload"
msgstr "Envoie"
#: luci-app-iperf/luasrc/view/iperf/test.htm:27
#: luci-app-iperf/luasrc/view/iperf/test.htm:67
msgid "Waiting for command to complete..."
msgstr "En attente de la réponse de la commande..."
#: luci-app-iperf/luasrc/controller/iperf.lua:8
msgid "iPerf"
msgstr "iPerf"
#: luci-app-iperf/luasrc/view/iperf/test.htm:99
msgid "iPerf speed tests"
msgstr "Tests de vitesse iPerf"
#: luci-app-iperf/luasrc/controller/iperf.lua:7
msgid "iperf"
msgstr "iperf"

View File

@ -0,0 +1,104 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-09-21 12:51+0000\n"
"Last-Translator: Weblate Admin <contact@openmptcprouter.com>\n"
"Language-Team: Italian <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsiperf/it/>\n"
"Language: it\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.0.4\n"
#: luci-app-iperf/luasrc/view/iperf/test.htm:128
msgid "0 for unlimited. Need to be limited for UDP test"
msgstr "0 per illimitato. Deve essere limitato per il test UDP"
#: luci-app-iperf/luasrc/view/iperf/test.htm:48
#: luci-app-iperf/luasrc/view/iperf/test.htm:88
msgid "Bad address specified!"
msgstr "È stato specificato un indirizzo errato!"
#: luci-app-iperf/luasrc/view/iperf/test.htm:66
#: luci-app-iperf/luasrc/view/iperf/test.htm:78
#: luci-app-iperf/luasrc/view/iperf/test.htm:83
#: luci-app-iperf/luasrc/view/iperf/test.htm:88
msgid "Download"
msgstr "Scarica"
#: luci-app-iperf/root/usr/share/rpcd/acl.d/luci-app-iperf.json:3
msgid "Grant UCI access for luci-app-iperf"
msgstr ""
#: luci-app-iperf/luasrc/view/iperf/test.htm:114
msgid "Internet protocol"
msgstr "Internet Protocol (Protocollo Internet)"
#: luci-app-iperf/luasrc/view/iperf/test.htm:26
#: luci-app-iperf/luasrc/view/iperf/test.htm:66
msgid "Loading"
msgstr "Caricamento in corso"
#: luci-app-iperf/luasrc/view/iperf/test.htm:105
msgid "Mode of operation"
msgstr "Modalità di funzionamento"
#: luci-app-iperf/luasrc/view/iperf/test.htm:133
msgid "Number of parallel client streams to run"
msgstr "Numero di flussi client paralleli da eseguire"
#: luci-app-iperf/luasrc/view/iperf/test.htm:139
msgid "Omit the first n seconds"
msgstr "Ometti i primi n secondi"
#: luci-app-iperf/luasrc/view/iperf/test.htm:151
msgid "Server"
msgstr "Server"
#: luci-app-iperf/luasrc/view/iperf/test.htm:165
msgid "Server VPS IP is bypassed, so this will test only default route speed."
msgstr ""
#: luci-app-iperf/luasrc/view/iperf/test.htm:102
msgid "Settings"
msgstr "Impostazioni"
#: luci-app-iperf/luasrc/view/iperf/test.htm:123
msgid "Target bitrate (Mbits/s)"
msgstr "Bitrate desiderato (Mbits/s)"
#: luci-app-iperf/luasrc/view/iperf/test.htm:169
msgid "Test"
msgstr "Test"
#: luci-app-iperf/luasrc/view/iperf/test.htm:100
msgid "This iPerf interface is in bêta. No support for this."
msgstr "Questa interfaccia iPerf è in bêta."
#: luci-app-iperf/luasrc/view/iperf/test.htm:145
msgid "Time to transmit for (s)"
msgstr "È ora di trasmettere per (s)"
#: luci-app-iperf/luasrc/view/iperf/test.htm:26
#: luci-app-iperf/luasrc/view/iperf/test.htm:38
#: luci-app-iperf/luasrc/view/iperf/test.htm:43
#: luci-app-iperf/luasrc/view/iperf/test.htm:48
msgid "Upload"
msgstr "Carica"
#: luci-app-iperf/luasrc/view/iperf/test.htm:27
#: luci-app-iperf/luasrc/view/iperf/test.htm:67
msgid "Waiting for command to complete..."
msgstr "In attesa del completamento del comando ..."
#: luci-app-iperf/luasrc/controller/iperf.lua:8
#: luci-app-iperf/root/usr/share/luci/menu.d/luci-app-iperf.json:3
msgid "iPerf"
msgstr "iPerf"
#: luci-app-iperf/luasrc/view/iperf/test.htm:99
msgid "iPerf speed tests"
msgstr "Prove di velocità iPerf"
#~ msgid "iperf"
#~ msgstr "iPerf"

View File

@ -0,0 +1,96 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-09-21 12:51+0000\n"
"Last-Translator: Weblate Admin <contact@openmptcprouter.com>\n"
"Language-Team: Italian <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsiperf/it/>\n"
"Language: it\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.0.4\n"
#: luci-app-iperf/luasrc/view/iperf/test.htm:128
msgid "0 for unlimited. Need to be limited for UDP test"
msgstr "0 per illimitato. Deve essere limitato per il test UDP"
#: luci-app-iperf/luasrc/view/iperf/test.htm:48
#: luci-app-iperf/luasrc/view/iperf/test.htm:88
msgid "Bad address specified!"
msgstr "È stato specificato un indirizzo errato!"
#: luci-app-iperf/luasrc/view/iperf/test.htm:66
#: luci-app-iperf/luasrc/view/iperf/test.htm:78
#: luci-app-iperf/luasrc/view/iperf/test.htm:83
#: luci-app-iperf/luasrc/view/iperf/test.htm:88
msgid "Download"
msgstr "Scarica"
#: luci-app-iperf/luasrc/view/iperf/test.htm:114
msgid "Internet protocol"
msgstr "Internet Protocol (Protocollo Internet)"
#: luci-app-iperf/luasrc/view/iperf/test.htm:26
#: luci-app-iperf/luasrc/view/iperf/test.htm:66
msgid "Loading"
msgstr "Caricamento in corso"
#: luci-app-iperf/luasrc/view/iperf/test.htm:105
msgid "Mode of operation"
msgstr "Modalità di funzionamento"
#: luci-app-iperf/luasrc/view/iperf/test.htm:133
msgid "Number of parallel client streams to run"
msgstr "Numero di flussi client paralleli da eseguire"
#: luci-app-iperf/luasrc/view/iperf/test.htm:139
msgid "Omit the first n seconds"
msgstr "Ometti i primi n secondi"
#: luci-app-iperf/luasrc/view/iperf/test.htm:151
msgid "Server"
msgstr "Server"
#: luci-app-iperf/luasrc/view/iperf/test.htm:102
msgid "Settings"
msgstr "Impostazioni"
#: luci-app-iperf/luasrc/view/iperf/test.htm:123
msgid "Target bitrate (Mbits/s)"
msgstr "Bitrate desiderato (Mbits/s)"
#: luci-app-iperf/luasrc/view/iperf/test.htm:165
msgid "Test"
msgstr "Test"
#: luci-app-iperf/luasrc/view/iperf/test.htm:100
msgid "This iPerf interface is in bêta. No support for this."
msgstr "Questa interfaccia iPerf è in bêta."
#: luci-app-iperf/luasrc/view/iperf/test.htm:145
msgid "Time to transmit for (s)"
msgstr "È ora di trasmettere per (s)"
#: luci-app-iperf/luasrc/view/iperf/test.htm:26
#: luci-app-iperf/luasrc/view/iperf/test.htm:38
#: luci-app-iperf/luasrc/view/iperf/test.htm:43
#: luci-app-iperf/luasrc/view/iperf/test.htm:48
msgid "Upload"
msgstr "Carica"
#: luci-app-iperf/luasrc/view/iperf/test.htm:27
#: luci-app-iperf/luasrc/view/iperf/test.htm:67
msgid "Waiting for command to complete..."
msgstr "In attesa del completamento del comando ..."
#: luci-app-iperf/luasrc/controller/iperf.lua:8
msgid "iPerf"
msgstr "iPerf"
#: luci-app-iperf/luasrc/view/iperf/test.htm:99
msgid "iPerf speed tests"
msgstr "Prove di velocità iPerf"
#: luci-app-iperf/luasrc/controller/iperf.lua:7
msgid "iperf"
msgstr "iPerf"

View File

@ -0,0 +1,104 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-08-21 20:21+0000\n"
"Last-Translator: Quentin PAGÈS <githubou@quentino.fr>\n"
"Language-Team: Occitan <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsiperf/oc/>\n"
"Language: oc\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.0.4\n"
#: luci-app-iperf/luasrc/view/iperf/test.htm:128
msgid "0 for unlimited. Need to be limited for UDP test"
msgstr "0 per cap de limit. Requerís un limit pels ensages UDP"
#: luci-app-iperf/luasrc/view/iperf/test.htm:48
#: luci-app-iperf/luasrc/view/iperf/test.htm:88
msgid "Bad address specified!"
msgstr "Adreça invalida !"
#: luci-app-iperf/luasrc/view/iperf/test.htm:66
#: luci-app-iperf/luasrc/view/iperf/test.htm:78
#: luci-app-iperf/luasrc/view/iperf/test.htm:83
#: luci-app-iperf/luasrc/view/iperf/test.htm:88
msgid "Download"
msgstr "Telecargament"
#: luci-app-iperf/root/usr/share/rpcd/acl.d/luci-app-iperf.json:3
msgid "Grant UCI access for luci-app-iperf"
msgstr ""
#: luci-app-iperf/luasrc/view/iperf/test.htm:114
msgid "Internet protocol"
msgstr "Protocòl Internet"
#: luci-app-iperf/luasrc/view/iperf/test.htm:26
#: luci-app-iperf/luasrc/view/iperf/test.htm:66
msgid "Loading"
msgstr "Cargament"
#: luci-app-iperf/luasrc/view/iperf/test.htm:105
msgid "Mode of operation"
msgstr "Mòde de foncionament"
#: luci-app-iperf/luasrc/view/iperf/test.htm:133
msgid "Number of parallel client streams to run"
msgstr "Nombre de clients en parallèl"
#: luci-app-iperf/luasrc/view/iperf/test.htm:139
msgid "Omit the first n seconds"
msgstr "Sautar las primièras n segondas"
#: luci-app-iperf/luasrc/view/iperf/test.htm:151
msgid "Server"
msgstr "Servidor"
#: luci-app-iperf/luasrc/view/iperf/test.htm:165
msgid "Server VPS IP is bypassed, so this will test only default route speed."
msgstr ""
#: luci-app-iperf/luasrc/view/iperf/test.htm:102
msgid "Settings"
msgstr "Paramètres"
#: luci-app-iperf/luasrc/view/iperf/test.htm:123
msgid "Target bitrate (Mbits/s)"
msgstr "Velocitat desirada (Mbits/s)"
#: luci-app-iperf/luasrc/view/iperf/test.htm:169
msgid "Test"
msgstr "Pròva"
#: luci-app-iperf/luasrc/view/iperf/test.htm:100
msgid "This iPerf interface is in bêta. No support for this."
msgstr "Aquesta interfàcia per iPerf es en beta. Cap de support per aquò."
#: luci-app-iperf/luasrc/view/iperf/test.htm:145
msgid "Time to transmit for (s)"
msgstr "Temps de transmission (s)"
#: luci-app-iperf/luasrc/view/iperf/test.htm:26
#: luci-app-iperf/luasrc/view/iperf/test.htm:38
#: luci-app-iperf/luasrc/view/iperf/test.htm:43
#: luci-app-iperf/luasrc/view/iperf/test.htm:48
msgid "Upload"
msgstr "Mandadís"
#: luci-app-iperf/luasrc/view/iperf/test.htm:27
#: luci-app-iperf/luasrc/view/iperf/test.htm:67
msgid "Waiting for command to complete..."
msgstr "En espèra duna responsa de la comanda..."
#: luci-app-iperf/luasrc/controller/iperf.lua:8
#: luci-app-iperf/root/usr/share/luci/menu.d/luci-app-iperf.json:3
msgid "iPerf"
msgstr "iPerf"
#: luci-app-iperf/luasrc/view/iperf/test.htm:99
msgid "iPerf speed tests"
msgstr "Pròva de velocitat iPerf"
#~ msgid "iperf"
#~ msgstr "iperf"

View File

@ -0,0 +1,96 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2020-08-21 20:21+0000\n"
"Last-Translator: Quentin PAGÈS <githubou@quentino.fr>\n"
"Language-Team: Occitan <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsiperf/oc/>\n"
"Language: oc\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.0.4\n"
#: luci-app-iperf/luasrc/view/iperf/test.htm:128
msgid "0 for unlimited. Need to be limited for UDP test"
msgstr "0 per cap de limit. Requerís un limit pels ensages UDP"
#: luci-app-iperf/luasrc/view/iperf/test.htm:48
#: luci-app-iperf/luasrc/view/iperf/test.htm:88
msgid "Bad address specified!"
msgstr "Adreça invalida !"
#: luci-app-iperf/luasrc/view/iperf/test.htm:66
#: luci-app-iperf/luasrc/view/iperf/test.htm:78
#: luci-app-iperf/luasrc/view/iperf/test.htm:83
#: luci-app-iperf/luasrc/view/iperf/test.htm:88
msgid "Download"
msgstr "Telecargament"
#: luci-app-iperf/luasrc/view/iperf/test.htm:114
msgid "Internet protocol"
msgstr "Protocòl Internet"
#: luci-app-iperf/luasrc/view/iperf/test.htm:26
#: luci-app-iperf/luasrc/view/iperf/test.htm:66
msgid "Loading"
msgstr "Cargament"
#: luci-app-iperf/luasrc/view/iperf/test.htm:105
msgid "Mode of operation"
msgstr "Mòde de foncionament"
#: luci-app-iperf/luasrc/view/iperf/test.htm:133
msgid "Number of parallel client streams to run"
msgstr "Nombre de clients en parallèl"
#: luci-app-iperf/luasrc/view/iperf/test.htm:139
msgid "Omit the first n seconds"
msgstr "Sautar las primièras n segondas"
#: luci-app-iperf/luasrc/view/iperf/test.htm:151
msgid "Server"
msgstr "Servidor"
#: luci-app-iperf/luasrc/view/iperf/test.htm:102
msgid "Settings"
msgstr "Paramètres"
#: luci-app-iperf/luasrc/view/iperf/test.htm:123
msgid "Target bitrate (Mbits/s)"
msgstr "Velocitat desirada (Mbits/s)"
#: luci-app-iperf/luasrc/view/iperf/test.htm:165
msgid "Test"
msgstr "Pròva"
#: luci-app-iperf/luasrc/view/iperf/test.htm:100
msgid "This iPerf interface is in bêta. No support for this."
msgstr "Aquesta interfàcia per iPerf es en beta. Cap de support per aquò."
#: luci-app-iperf/luasrc/view/iperf/test.htm:145
msgid "Time to transmit for (s)"
msgstr "Temps de transmission (s)"
#: luci-app-iperf/luasrc/view/iperf/test.htm:26
#: luci-app-iperf/luasrc/view/iperf/test.htm:38
#: luci-app-iperf/luasrc/view/iperf/test.htm:43
#: luci-app-iperf/luasrc/view/iperf/test.htm:48
msgid "Upload"
msgstr "Mandadís"
#: luci-app-iperf/luasrc/view/iperf/test.htm:27
#: luci-app-iperf/luasrc/view/iperf/test.htm:67
msgid "Waiting for command to complete..."
msgstr "En espèra duna responsa de la comanda..."
#: luci-app-iperf/luasrc/controller/iperf.lua:8
msgid "iPerf"
msgstr "iPerf"
#: luci-app-iperf/luasrc/view/iperf/test.htm:99
msgid "iPerf speed tests"
msgstr "Pròva de velocitat iPerf"
#: luci-app-iperf/luasrc/controller/iperf.lua:7
msgid "iperf"
msgstr "iperf"

View File

@ -0,0 +1,104 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2021-06-16 10:51+0000\n"
"Last-Translator: Dmitry Galenko <d@monteops.com>\n"
"Language-Team: Russian <http://weblate.openmptcprouter.com/projects/omr/"
"luciapplicationsiperf/ru/>\n"
"Language: ru\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
"X-Generator: Weblate 4.6.1\n"
#: luci-app-iperf/luasrc/view/iperf/test.htm:128
msgid "0 for unlimited. Need to be limited for UDP test"
msgstr "0 - без ограничений. Для теста UDP число должно быть больше 0"
#: luci-app-iperf/luasrc/view/iperf/test.htm:48
#: luci-app-iperf/luasrc/view/iperf/test.htm:88
msgid "Bad address specified!"
msgstr "Указан не правильный адрес!"
#: luci-app-iperf/luasrc/view/iperf/test.htm:66
#: luci-app-iperf/luasrc/view/iperf/test.htm:78
#: luci-app-iperf/luasrc/view/iperf/test.htm:83
#: luci-app-iperf/luasrc/view/iperf/test.htm:88
msgid "Download"
msgstr "Получение"
#: luci-app-iperf/root/usr/share/rpcd/acl.d/luci-app-iperf.json:3
msgid "Grant UCI access for luci-app-iperf"
msgstr "Разрешить доступ к UCI для luci-app-iperf"
#: luci-app-iperf/luasrc/view/iperf/test.htm:114
msgid "Internet protocol"
msgstr "Интернет протокол"
#: luci-app-iperf/luasrc/view/iperf/test.htm:26
#: luci-app-iperf/luasrc/view/iperf/test.htm:66
msgid "Loading"
msgstr "Загрузка"
#: luci-app-iperf/luasrc/view/iperf/test.htm:105
msgid "Mode of operation"
msgstr "Режим работы"
#: luci-app-iperf/luasrc/view/iperf/test.htm:133
msgid "Number of parallel client streams to run"
msgstr "Количество параллельных потоковых клиентов"
#: luci-app-iperf/luasrc/view/iperf/test.htm:139
msgid "Omit the first n seconds"
msgstr "Пропустить первые n секунд"
#: luci-app-iperf/luasrc/view/iperf/test.htm:151
msgid "Server"
msgstr "Сервер"
#: luci-app-iperf/luasrc/view/iperf/test.htm:165
msgid "Server VPS IP is bypassed, so this will test only default route speed."
msgstr ""
"Включен режим байпаса для IP VPS, будет проверена скорость только маршрута "
"по умолчанию."
#: luci-app-iperf/luasrc/view/iperf/test.htm:102
msgid "Settings"
msgstr "Настройки"
#: luci-app-iperf/luasrc/view/iperf/test.htm:123
msgid "Target bitrate (Mbits/s)"
msgstr "Целевой битрейт (Mbits/s)"
#: luci-app-iperf/luasrc/view/iperf/test.htm:169
msgid "Test"
msgstr "Тест"
#: luci-app-iperf/luasrc/view/iperf/test.htm:100
msgid "This iPerf interface is in bêta. No support for this."
msgstr "Этот iPerf interface в режиме beta. Недоступно."
#: luci-app-iperf/luasrc/view/iperf/test.htm:145
msgid "Time to transmit for (s)"
msgstr "Время передачи (s)"
#: luci-app-iperf/luasrc/view/iperf/test.htm:26
#: luci-app-iperf/luasrc/view/iperf/test.htm:38
#: luci-app-iperf/luasrc/view/iperf/test.htm:43
#: luci-app-iperf/luasrc/view/iperf/test.htm:48
msgid "Upload"
msgstr "Отправка"
#: luci-app-iperf/luasrc/view/iperf/test.htm:27
#: luci-app-iperf/luasrc/view/iperf/test.htm:67
msgid "Waiting for command to complete..."
msgstr "Ожидание завершения команды..."
#: luci-app-iperf/luasrc/controller/iperf.lua:8
#: luci-app-iperf/root/usr/share/luci/menu.d/luci-app-iperf.json:3
msgid "iPerf"
msgstr "iPerf"
#: luci-app-iperf/luasrc/view/iperf/test.htm:99
msgid "iPerf speed tests"
msgstr "iPerf тест скорости"

View File

@ -0,0 +1,92 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
#: luci-app-iperf/luasrc/view/iperf/test.htm:128
msgid "0 for unlimited. Need to be limited for UDP test"
msgstr ""
#: luci-app-iperf/luasrc/view/iperf/test.htm:48
#: luci-app-iperf/luasrc/view/iperf/test.htm:88
msgid "Bad address specified!"
msgstr ""
#: luci-app-iperf/luasrc/view/iperf/test.htm:66
#: luci-app-iperf/luasrc/view/iperf/test.htm:78
#: luci-app-iperf/luasrc/view/iperf/test.htm:83
#: luci-app-iperf/luasrc/view/iperf/test.htm:88
msgid "Download"
msgstr ""
#: luci-app-iperf/root/usr/share/rpcd/acl.d/luci-app-iperf.json:3
msgid "Grant UCI access for luci-app-iperf"
msgstr ""
#: luci-app-iperf/luasrc/view/iperf/test.htm:114
msgid "Internet protocol"
msgstr ""
#: luci-app-iperf/luasrc/view/iperf/test.htm:26
#: luci-app-iperf/luasrc/view/iperf/test.htm:66
msgid "Loading"
msgstr ""
#: luci-app-iperf/luasrc/view/iperf/test.htm:105
msgid "Mode of operation"
msgstr ""
#: luci-app-iperf/luasrc/view/iperf/test.htm:133
msgid "Number of parallel client streams to run"
msgstr ""
#: luci-app-iperf/luasrc/view/iperf/test.htm:139
msgid "Omit the first n seconds"
msgstr ""
#: luci-app-iperf/luasrc/view/iperf/test.htm:151
msgid "Server"
msgstr ""
#: luci-app-iperf/luasrc/view/iperf/test.htm:165
msgid "Server VPS IP is bypassed, so this will test only default route speed."
msgstr ""
#: luci-app-iperf/luasrc/view/iperf/test.htm:102
msgid "Settings"
msgstr ""
#: luci-app-iperf/luasrc/view/iperf/test.htm:123
msgid "Target bitrate (Mbits/s)"
msgstr ""
#: luci-app-iperf/luasrc/view/iperf/test.htm:169
msgid "Test"
msgstr ""
#: luci-app-iperf/luasrc/view/iperf/test.htm:100
msgid "This iPerf interface is in bêta. No support for this."
msgstr ""
#: luci-app-iperf/luasrc/view/iperf/test.htm:145
msgid "Time to transmit for (s)"
msgstr ""
#: luci-app-iperf/luasrc/view/iperf/test.htm:26
#: luci-app-iperf/luasrc/view/iperf/test.htm:38
#: luci-app-iperf/luasrc/view/iperf/test.htm:43
#: luci-app-iperf/luasrc/view/iperf/test.htm:48
msgid "Upload"
msgstr ""
#: luci-app-iperf/luasrc/view/iperf/test.htm:27
#: luci-app-iperf/luasrc/view/iperf/test.htm:67
msgid "Waiting for command to complete..."
msgstr ""
#: luci-app-iperf/luasrc/controller/iperf.lua:8
#: luci-app-iperf/root/usr/share/luci/menu.d/luci-app-iperf.json:3
msgid "iPerf"
msgstr ""
#: luci-app-iperf/luasrc/view/iperf/test.htm:99
msgid "iPerf speed tests"
msgstr ""

1
luci-app-iperf/po/zh-cn Symbolic link
View File

@ -0,0 +1 @@
zh_Hans

View File

@ -0,0 +1,104 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2021-05-13 21:38+0000\n"
"Last-Translator: justbin <419989953@qq.com>\n"
"Language-Team: Chinese (Simplified) <http://weblate.openmptcprouter.com/"
"projects/omr/luciapplicationsiperf/zh_Hans/>\n"
"Language: zh_Hans\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.6.1\n"
#: luci-app-iperf/luasrc/view/iperf/test.htm:128
msgid "0 for unlimited. Need to be limited for UDP test"
msgstr "0代表无限.需要限制UDP测试"
#: luci-app-iperf/luasrc/view/iperf/test.htm:48
#: luci-app-iperf/luasrc/view/iperf/test.htm:88
msgid "Bad address specified!"
msgstr "指定地址错误!"
#: luci-app-iperf/luasrc/view/iperf/test.htm:66
#: luci-app-iperf/luasrc/view/iperf/test.htm:78
#: luci-app-iperf/luasrc/view/iperf/test.htm:83
#: luci-app-iperf/luasrc/view/iperf/test.htm:88
msgid "Download"
msgstr "下载"
#: luci-app-iperf/root/usr/share/rpcd/acl.d/luci-app-iperf.json:3
msgid "Grant UCI access for luci-app-iperf"
msgstr "授予luci-app-iperf UCI访问权限"
#: luci-app-iperf/luasrc/view/iperf/test.htm:114
msgid "Internet protocol"
msgstr "互联网协议"
#: luci-app-iperf/luasrc/view/iperf/test.htm:26
#: luci-app-iperf/luasrc/view/iperf/test.htm:66
msgid "Loading"
msgstr "载入中"
#: luci-app-iperf/luasrc/view/iperf/test.htm:105
msgid "Mode of operation"
msgstr "操作模式"
#: luci-app-iperf/luasrc/view/iperf/test.htm:133
msgid "Number of parallel client streams to run"
msgstr "要运行的并行客户端流的数量"
#: luci-app-iperf/luasrc/view/iperf/test.htm:139
msgid "Omit the first n seconds"
msgstr "忽略前n秒"
#: luci-app-iperf/luasrc/view/iperf/test.htm:151
msgid "Server"
msgstr "服务器"
#: luci-app-iperf/luasrc/view/iperf/test.htm:165
msgid "Server VPS IP is bypassed, so this will test only default route speed."
msgstr "VPS IP被绕过因此这将只测试默认的路由速度。"
#: luci-app-iperf/luasrc/view/iperf/test.htm:102
msgid "Settings"
msgstr "设置"
#: luci-app-iperf/luasrc/view/iperf/test.htm:123
msgid "Target bitrate (Mbits/s)"
msgstr "目标比特率(Mbits/s)"
#: luci-app-iperf/luasrc/view/iperf/test.htm:169
msgid "Test"
msgstr "测试"
#: luci-app-iperf/luasrc/view/iperf/test.htm:100
msgid "This iPerf interface is in bêta. No support for this."
msgstr "此iPerf界面位于测试中.对此不支持."
#: luci-app-iperf/luasrc/view/iperf/test.htm:145
msgid "Time to transmit for (s)"
msgstr "传输时间 (秒)"
#: luci-app-iperf/luasrc/view/iperf/test.htm:26
#: luci-app-iperf/luasrc/view/iperf/test.htm:38
#: luci-app-iperf/luasrc/view/iperf/test.htm:43
#: luci-app-iperf/luasrc/view/iperf/test.htm:48
msgid "Upload"
msgstr "上传"
#: luci-app-iperf/luasrc/view/iperf/test.htm:27
#: luci-app-iperf/luasrc/view/iperf/test.htm:67
msgid "Waiting for command to complete..."
msgstr "等待命令完成..."
#: luci-app-iperf/luasrc/controller/iperf.lua:8
#: luci-app-iperf/root/usr/share/luci/menu.d/luci-app-iperf.json:3
msgid "iPerf"
msgstr "iPerf测速"
#: luci-app-iperf/luasrc/view/iperf/test.htm:99
msgid "iPerf speed tests"
msgstr "iPerf速度测试"
#~ msgid "iperf"
#~ msgstr "iperf测速"

View File

@ -0,0 +1,96 @@
msgid ""
msgstr ""
"PO-Revision-Date: 2021-04-30 16:03+0000\n"
"Last-Translator: niergouge <1150108426@qq.com>\n"
"Language-Team: Chinese (Simplified) <http://weblate.openmptcprouter.com/"
"projects/omr/luciapplicationsiperf/zh_Hans/>\n"
"Language: zh_Hans\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 4.5.2\n"
#: luci-app-iperf/luasrc/view/iperf/test.htm:128
msgid "0 for unlimited. Need to be limited for UDP test"
msgstr "0代表无限.需要限制UDP测试"
#: luci-app-iperf/luasrc/view/iperf/test.htm:48
#: luci-app-iperf/luasrc/view/iperf/test.htm:88
msgid "Bad address specified!"
msgstr "指定地址错误!"
#: luci-app-iperf/luasrc/view/iperf/test.htm:66
#: luci-app-iperf/luasrc/view/iperf/test.htm:78
#: luci-app-iperf/luasrc/view/iperf/test.htm:83
#: luci-app-iperf/luasrc/view/iperf/test.htm:88
msgid "Download"
msgstr "下载"
#: luci-app-iperf/luasrc/view/iperf/test.htm:114
msgid "Internet protocol"
msgstr "互联网协议"
#: luci-app-iperf/luasrc/view/iperf/test.htm:26
#: luci-app-iperf/luasrc/view/iperf/test.htm:66
msgid "Loading"
msgstr "载入中"
#: luci-app-iperf/luasrc/view/iperf/test.htm:105
msgid "Mode of operation"
msgstr "操作模式"
#: luci-app-iperf/luasrc/view/iperf/test.htm:133
msgid "Number of parallel client streams to run"
msgstr "要运行的并行客户端流的数量"
#: luci-app-iperf/luasrc/view/iperf/test.htm:139
msgid "Omit the first n seconds"
msgstr "忽略前n秒"
#: luci-app-iperf/luasrc/view/iperf/test.htm:151
msgid "Server"
msgstr "服务器"
#: luci-app-iperf/luasrc/view/iperf/test.htm:102
msgid "Settings"
msgstr "设置"
#: luci-app-iperf/luasrc/view/iperf/test.htm:123
msgid "Target bitrate (Mbits/s)"
msgstr "目标比特率(Mbits/s)"
#: luci-app-iperf/luasrc/view/iperf/test.htm:165
msgid "Test"
msgstr "测试"
#: luci-app-iperf/luasrc/view/iperf/test.htm:100
msgid "This iPerf interface is in bêta. No support for this."
msgstr "此iPerf界面位于测试中.对此不支持."
#: luci-app-iperf/luasrc/view/iperf/test.htm:145
msgid "Time to transmit for (s)"
msgstr "传输时间 (秒)"
#: luci-app-iperf/luasrc/view/iperf/test.htm:26
#: luci-app-iperf/luasrc/view/iperf/test.htm:38
#: luci-app-iperf/luasrc/view/iperf/test.htm:43
#: luci-app-iperf/luasrc/view/iperf/test.htm:48
msgid "Upload"
msgstr "上传"
#: luci-app-iperf/luasrc/view/iperf/test.htm:27
#: luci-app-iperf/luasrc/view/iperf/test.htm:67
msgid "Waiting for command to complete..."
msgstr "等待命令完成..."
#: luci-app-iperf/luasrc/controller/iperf.lua:8
msgid "iPerf"
msgstr "iPerf测速"
#: luci-app-iperf/luasrc/view/iperf/test.htm:99
msgid "iPerf speed tests"
msgstr "iPerf速度测试"
#: luci-app-iperf/luasrc/controller/iperf.lua:7
msgid "iperf"
msgstr "iperf测速"

View File

@ -0,0 +1,115 @@
config server 'bouygues'
option host 'bouygues.iperf.fr'
option ipv4 '1'
option ipv6 '1'
option speed '10000'
option ports '5200,5201,5202,5203,5204,5205,5206,5207,5208,5209'
option tcp '1'
option udp '0'
option location 'Europe'
config server 'online_ipv4'
option host 'ping.online.net'
option ipv4 '1'
option ipv6 '0'
option speed '10000'
option ports '5200,5201,5202,5203,5204,5205,5206,5207,5208,5209'
option tcp '1'
option udp '1'
option location 'Europe'
config server 'online_ipv6'
option host 'ping.online.net'
option ipv4 '0'
option ipv6 '1'
option speed '10000'
option ports '5200,5201,5202,5203,5204,5205,5206,5207,5208,5209'
option tcp '1'
option udp '1'
option location 'Europe'
config server 'serverius'
option host 'speedtest.serverius.net'
option ipv4 '1'
option ipv6 '1'
option speed '10000'
option ports '5002'
option tcp '1'
option udp '1'
option location 'Europe'
config server 'eenet'
option host 'iperf.eenet.ee'
option ipv4 '1'
option ipv6 '0'
option ports '5201'
option tcp '1'
option udp '1'
option location 'Europe'
config server 'volia'
option host 'iperf.volia.net'
option ipv4 '1'
option ipv6 '0'
option ports '5201'
option tcp '1'
option udp '1'
option location 'Europe'
config server 'it_north'
option host 'iperf.it-north.net'
option ipv4 '1'
option ipv6 '0'
option speed '1000'
option ports '5200,5201,5202,5203,5204,5205,5206,5207,5208,5209'
option tcp '1'
option udp '1'
option location 'Asia'
config server 'biznet'
option host 'iperf.biznetnetworkds.com'
option ipv4 '1'
option ipv6 '1'
option speed '1000'
option ports '5201,5202,5203'
option tcp '1'
option udp '0'
option location 'Asia'
config server 'scottlinux'
option host 'iperf.scottlinux.com'
option ipv4 '1'
option ipv6 '1'
option speed '1000'
option ports '5201'
option tcp '1'
option udp '1'
option location 'America'
config server 'he'
option host 'iperf.he.net'
option ipv4 '1'
option ipv6 '1'
option ports '5201'
option tcp '1'
option udp '1'
option location 'America'
config server 'biznetnetworks'
option host 'iperf.biznetnetworks.com'
option ipv4 '1'
option ipv6 '1'
option ports '5201,5202,5203'
option tcp '1'
option udp '1'
option location 'Asia'
config server 'milkywan'
option host 'speedtest.milkywan.fr'
option ipv4 '1'
option ipv6 '1'
option speed '10000'
option ports '9200,9201,9202,9203,9204,9205,9206,9207,9208,9209,9210,9211,9212,9213,9214,9215'
option tcp '1'
option udp '1'
option location 'Europe'

View File

@ -0,0 +1,13 @@
{
"admin/services/iperf": {
"title": "iPerf",
"order": 10,
"action": {
"type": "template",
"path": "iperf/test"
},
"depends": {
"acl": [ "luci-app-iperf" ]
}
}
}

View File

@ -0,0 +1,11 @@
{
"luci-app-iperf": {
"description": "Grant UCI access for luci-app-iperf",
"read": {
"uci": [ "iperf" ]
},
"write": {
"uci": [ "iperf" ]
}
}
}

59
nft-qos/Makefile Normal file
View File

@ -0,0 +1,59 @@
#
# Copyright (C) 2018 rosysong@rosinson.com
#
# This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information.
#
include $(TOPDIR)/rules.mk
PKG_NAME:=nft-qos
PKG_VERSION:=1.0.6
PKG_RELEASE:=4
PKG_LICENSE:=GPL-2.0
PKG_MAINTAINER:=Rosy Song <rosysong@rosinson.com>
PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME)
include $(INCLUDE_DIR)/package.mk
define Package/nft-qos
SECTION:=utils
CATEGORY:=Base system
DEPENDS:=+kmod-nft-netdev +kmod-nft-bridge +nftables
TITLE:=QoS scripts over nftables
PKGARCH:=all
endef
define Package/nft-qos/description
This package provides implementation for qos over nftables.
Currently, static/dynamic qos and traffic shaping are supported.
endef
define Package/nft-qos/conffiles
/etc/config/nft-qos
endef
define Build/Prepare
endef
define Build/Configure
endef
define Build/Compile
endef
define Package/nft-qos/install
$(INSTALL_DIR) $(1)/lib/nft-qos
$(INSTALL_DATA) ./files/lib/* $(1)/lib/nft-qos/
$(INSTALL_DIR) $(1)/etc/config
$(INSTALL_CONF) ./files/nft-qos.config $(1)/etc/config/nft-qos
$(INSTALL_DIR) $(1)/etc/init.d
$(INSTALL_BIN) ./files/nft-qos.init $(1)/etc/init.d/nft-qos
$(INSTALL_DIR) $(1)/etc/hotplug.d/dhcp
$(INSTALL_BIN) ./files/nft-qos-monitor.hotplug $(1)/etc/hotplug.d/dhcp/00-nft-qos-monitor
$(INSTALL_BIN) ./files/nft-qos-dynamic.hotplug $(1)/etc/hotplug.d/dhcp/01-nft-qos-dynamic
endef
$(eval $(call BuildPackage,nft-qos))

104
nft-qos/files/lib/core.sh Normal file
View File

@ -0,0 +1,104 @@
#!/bin/sh
#
# Copyright (C) 2018 rosysong@rosinson.com
#
# for uci_validate_section()
. /lib/functions/procd.sh
NFT_QOS_HAS_BRIDGE=
NFT_QOS_INET_FAMILY=ip
NFT_QOS_SCRIPT_TEXT=
NFT_QOS_SCRIPT_FILE=/tmp/qos.nft
qosdef_appendx() { # <string to be appended>
NFT_QOS_SCRIPT_TEXT="$NFT_QOS_SCRIPT_TEXT""$1"
}
qosdef_append_chain_def() { # <type> <hook> <priority> <policy>
qosdef_appendx "\t\ttype $1 hook $2 priority $3; policy $4;\n"
}
qosdef_append_chain_ingress() { # <type> <device> <priority> <policy>
qosdef_appendx "\t\ttype $1 hook ingress device $2 priority $3; policy $4;\n"
}
# qosdef_append_rule_{MATCH}_{STATEMENT}
qosdef_append_rule_ip_limit() { # <ipaddr> <operator> <unit> <rate>
local ipaddr=$1
local operator=$2
local unit=$3
local rate=$4
qosdef_appendx \
"\t\tip $operator $ipaddr limit rate over $rate $unit/second drop\n"
}
# qosdef_append_rule_{MATCH}_{STATEMENT}
qosdef_append_rule_mac_limit() { # <macaddr> <operator> <unit> <rate>
local macaddr=$1
local operator=$2
local unit=$3
local rate=$4
qosdef_appendx \
"\t\tether $operator $macaddr limit rate over $rate $unit/second drop\n"
}
# qosdef_append_rule_{MATCH}_{POLICY}
qosdef_append_rule_ip_policy() { # <operator> <ipaddr> <policy>
qosdef_appendx "\t\tip $1 $2 $3\n"
}
_handle_limit_whitelist() { # <value> <chain>
local ipaddr=$1
local operator
[ -z "$ipaddr" ] && return
case "$2" in
download) operator="daddr";;
upload) operator="saddr";;
esac
qosdef_append_rule_ip_policy $operator $ipaddr accept
}
qosdef_append_rule_limit_whitelist() { # <chain>
config_list_foreach default limit_whitelist _handle_limit_whitelist $1
}
qosdef_flush_table() { # <family> <table>
nft flush table $1 $2 2>/dev/null
}
qosdef_remove_table() { # <family> <table>
nft delete table $1 $2 2>/dev/null
}
qosdef_init_header() { # add header for nft script
qosdef_appendx "#!/usr/sbin/nft -f\n"
qosdef_appendx "# Copyright (C) 2018 rosysong@rosinson.com\n"
qosdef_appendx "#\n\n"
}
qosdef_init_env() {
# check interface type of lan
local lt="$(uci_get "network.lan.type")"
[ "$lt" = "bridge" ] && export NFT_QOS_HAS_BRIDGE="y"
# check if ipv6 support
[ -e /proc/sys/net/ipv6 ] && export NFT_QOS_INET_FAMILY="inet"
}
qosdef_clean_cache() {
rm -f $NFT_QOS_SCRIPT_FILE
}
qosdef_init_done() {
echo -e $NFT_QOS_SCRIPT_TEXT > $NFT_QOS_SCRIPT_FILE 2>/dev/null
}
qosdef_start() {
nft -f $NFT_QOS_SCRIPT_FILE 2>/dev/null
}

View File

@ -0,0 +1,90 @@
#!/bin/sh
#
# Copyright (C) 2018 rosysong@rosinson.com
#
. /lib/nft-qos/core.sh
qosdef_validate_dynamic() {
uci_load_validate nft-qos default "$1" "$2" \
'limit_enable:bool:0' \
'limit_type:maxlength(8)' \
'dynamic_bw_up:uinteger:100' \
'dynamic_bw_down:uinteger:100'
}
# return average rate for dhcp leases
qosdef_dynamic_rate() { # <bandwidth>
local c=0 c6=0
[ ! -e /tmp/dhcp.leases -a \
! -e /var/dhcp6.leases ] && return
[ -e /tmp/dhcp.leases ] && \
c=$(wc -l < /tmp/dhcp.leases 2>/dev/null)
[ -e /var/dhcp6.leases ] && \
c6=$(wc -l < /var/dhcp6.leases 2>/dev/null)
[ $c -eq 0 -a $c6 -eq 0 ] && \
{ echo 12500; return; }
echo $(($1 / ($c + $c6)))
}
qosdef_append_chain_dym() { # <hook> <name> <bandwidth>
local cidr cidr6
local operator rate
local hook=$1 name=$2 bandwidth=$3
config_get cidr default 'dynamic_cidr'
config_get cidr6 default 'dynamic_cidr6'
[ -z "$cidr" -a -z "$cidr6" ] && return
case "$2" in
download) operator=daddr;;
upload) operator=saddr;;
esac
rate=$(qosdef_dynamic_rate $bandwidth)
qosdef_appendx "\tchain $name {\n"
qosdef_append_chain_def filter $hook 0 accept
qosdef_append_rule_limit_whitelist $name
[ -n "$cidr" ] && \
qosdef_append_rule_ip_limit $cidr $operator kbytes $rate
[ -n "$cidr6" ] && \
qosdef_append_rule_ip_limit $cidr6 $operator kbytes $rate
qosdef_appendx "\t}\n"
}
qosdef_flush_dynamic() {
qosdef_flush_table "$NFT_QOS_INET_FAMILY" nft-qos-dynamic
}
# init dynamic qos
qosdef_init_dynamic() {
local hook_ul="prerouting" hook_dl="postrouting"
[ "$2" = 0 ] || {
logger -t nft-qos-dynamic "validation failed"
return 1
}
[ $limit_enable -eq 0 -o \
"$limit_type" = "static" ] && return 1
# Transfer mbits/s to mbytes/s
# e.g. 100,000 kbits == 12,500 kbytes
dynamic_bw_up=$(($dynamic_bw_up * 1000 / 8))
dynamic_bw_down=$(($dynamic_bw_down * 1000 / 8))
[ -z "$NFT_QOS_HAS_BRIDGE" ] && {
hook_ul="postrouting"
hook_dl="prerouting"
}
qosdef_appendx "table $NFT_QOS_INET_FAMILY nft-qos-dynamic {\n"
qosdef_append_chain_dym $hook_ul upload $dynamic_bw_up
qosdef_append_chain_dym $hook_dl download $dynamic_bw_down
qosdef_appendx "}\n"
}

79
nft-qos/files/lib/mac.sh Normal file
View File

@ -0,0 +1,79 @@
#!/bin/sh
# based on static.sh
# Copyright (C) 2020 Tong Zhang<ztong0001@gmail.com>
#
. /lib/nft-qos/core.sh
qosdef_validate_mac() {
uci_load_validate nft-qos default "$1" "$2" \
'limit_mac_enable:bool:0'
}
# append rule for mac qos
qosdef_append_rule_mac() { # <section> <operator>
local macaddr unit rate
local operator=$2
config_get macaddr $1 macaddr
if [ "$operator" = "saddr" ]; then
config_get unit $1 urunit
config_get rate $1 urate
else
config_get unit $1 drunit
config_get rate $1 drate
fi
[ -z "$macaddr" ] && return
qosdef_append_rule_mac_limit $macaddr $operator $unit $rate
}
# append chain for mac qos
qosdef_append_chain_mac() { # <hook> <name> <section>
local hook=$1 name=$2
local config=$3 operator
case "$name" in
download) operator="daddr";;
upload) operator="saddr";;
esac
qosdef_appendx "\tchain $name {\n"
qosdef_append_chain_def filter $hook 0 accept
config_foreach qosdef_append_rule_mac $config $operator
qosdef_appendx "\t}\n"
}
qosdef_flush_mac() {
if [ -n "$NFT_QOS_HAS_BRIDGE" ]; then
qosdef_flush_table bridge nft-qos-mac
else
qosdef_flush_table "$NFT_QOS_INET_FAMILY" nft-qos-mac
fi
}
# limit rate by mac address init
qosdef_init_mac() {
local hook_ul="prerouting" hook_dl="postrouting"
[ "$2" = 0 ] || {
logger -t nft-qos-mac "validation failed"
return 1
}
[ $limit_mac_enable -eq 0 ] && return 1
table_name=$NFT_QOS_INET_FAMILY
if [ -z "$NFT_QOS_HAS_BRIDGE" ]; then
hook_ul="postrouting"
hook_dl="prerouting"
else
table_name="bridge"
fi
qosdef_appendx "table $table_name nft-qos-mac {\n"
qosdef_append_chain_mac $hook_ul upload client
qosdef_append_chain_mac $hook_dl download client
qosdef_appendx "}\n"
}

View File

@ -0,0 +1,39 @@
#!/bin/sh
#
# Copyright (C) 2018 rosysong@rosinson.com
#
. /lib/nft-qos/core.sh
qosdef_monitor_get_ip_handle() { # <family> <chain> <ip>
echo $(nft -a list chain $1 nft-qos-monitor $2 2>/dev/null | grep $3 | awk '{print $11}')
}
qosdef_monitor_add() { # <mac> <ip> <hostname>
handle_dl=$(qosdef_monitor_get_ip_handle $NFT_QOS_INET_FAMILY download $2)
[ -z "$handle_dl" ] && nft add rule $NFT_QOS_INET_FAMILY nft-qos-monitor download ip daddr $2 counter
handle_ul=$(qosdef_monitor_get_ip_handle $NFT_QOS_INET_FAMILY upload $2)
[ -z "$handle_ul" ] && nft add rule $NFT_QOS_INET_FAMILY nft-qos-monitor upload ip saddr $2 counter
}
qosdef_monitor_del() { # <mac> <ip> <hostname>
local handle_dl handle_ul
handle_dl=$(qosdef_monitor_get_ip_handle $NFT_QOS_INET_FAMILY download $2)
handle_ul=$(qosdef_monitor_get_ip_handle $NFT_QOS_INET_FAMILY upload $2)
[ -n "$handle_dl" ] && nft delete handle $handle_dl
[ -n "$handle_ul" ] && nft delete handle $handle_ul
}
# init qos monitor
qosdef_init_monitor() {
local hook_ul="prerouting" hook_dl="postrouting"
[ -z "$NFT_QOS_HAS_BRIDGE" ] && {
hook_ul="postrouting"
hook_dl="prerouting"
}
nft add table $NFT_QOS_INET_FAMILY nft-qos-monitor
nft add chain $NFT_QOS_INET_FAMILY nft-qos-monitor upload { type filter hook $hook_ul priority 0\; }
nft add chain $NFT_QOS_INET_FAMILY nft-qos-monitor download { type filter hook $hook_dl priority 0\; }
}

View File

@ -0,0 +1,87 @@
#!/bin/sh
#
# Copyright (C) 2018 rosysong@rosinson.com
#
. /lib/functions/network.sh
. /lib/nft-qos/core.sh
P1=""; P2=""; P3=""; P4=""; P5=""; P6="";
P7=""; P8=""; P9=""; P10=""; P11="";
qosdef_validate_priority() {
uci_load_validate nft-qos default "$1" "$2" \
'priority_enable:bool:0' \
'priority_netdev:maxlength(8)'
}
_qosdef_handle_protox() { # <priority> <rule>
case "$1" in
-400) P1="$P1""$2";;
-300) P2="$P2""$2";;
-225) P3="$P3""$2";;
-200) P4="$P4""$2";;
-150) P5="$P5""$2";;
-100) P6="$P6""$2";;
0) P7="$P7""$2";;
50) P8="$P8""$2";;
100) P9="$P9""$2";;
225) P10="$P10""$2";;
300) P11="$P11""$2";;
esac
}
qosdef_handle_protox() { # <section>
local proto prio srv
config_get proto $1 'protocol'
config_get prio $1 'priority'
config_get srv $1 'service'
[ -z "$proto" -o \
-z "$prio" -o \
-z "$srv" ] && return
_qosdef_handle_protox $prio \
"\t\t$proto dport { $srv } accept\n"
}
qosdef_append_rule_protox() { # <section>
config_foreach qosdef_handle_protox $1
qosdef_appendx \
"${P1}${P2}${P3}${P4}${P5}${P6}${P7}${P8}${P9}${P10}${P11}"
}
qosdef_append_chain_priority() { # <name> <section> <device>
local name=$1 device=$3
qosdef_appendx "\tchain $name {\n"
qosdef_append_chain_ingress filter $device 0 accept
qosdef_append_rule_protox $2
qosdef_appendx "\t}\n"
}
qosdef_remove_priority() {
qosdef_remove_table netdev nft-qos-priority
}
# init traffic priority
qosdef_init_priority() {
[ "$2" = 0 ] || {
logger -t nft-qos-priority "validation failed"
return 1
}
[ $priority_enable -eq 0 ] && return 1
local ifname
network_get_device ifname "$priority_netdev"
[ -n "$ifname" ] || {
logger -t nft-qos-priority "unable to get ifname for $priority_netdev"
return 1
}
qosdef_appendx "table netdev nft-qos-priority {\n"
qosdef_append_chain_priority filter priority $ifname
qosdef_appendx "}\n"
}

View File

@ -0,0 +1,74 @@
#!/bin/sh
#
# Copyright (C) 2018 rosysong@rosinson.com
#
. /lib/nft-qos/core.sh
qosdef_validate_static() {
uci_load_validate nft-qos default "$1" "$2" \
'limit_enable:bool:0' \
'limit_type:maxlength(8)' \
'static_unit_dl:string:kbytes' \
'static_unit_ul:string:kbytes' \
'static_rate_dl:uinteger:50' \
'static_rate_ul:uinteger:50'
}
# append rule for static qos
qosdef_append_rule_sta() { # <section> <operator> <default-unit> <default-rate>
local ipaddr unit rate
local operator=$2
config_get ipaddr $1 ipaddr
config_get unit $1 unit $3
config_get rate $1 rate $4
[ -z "$ipaddr" ] && return
qosdef_append_rule_ip_limit $ipaddr $operator $unit $rate
}
# append chain for static qos
qosdef_append_chain_sta() { # <hook> <name> <section> <unit> <rate>
local hook=$1 name=$2
local config=$3 operator
case "$name" in
download) operator="daddr";;
upload) operator="saddr";;
esac
qosdef_appendx "\tchain $name {\n"
qosdef_append_chain_def filter $hook 0 accept
qosdef_append_rule_limit_whitelist $name
config_foreach qosdef_append_rule_sta $config $operator $4 $5
qosdef_appendx "\t}\n"
}
qosdef_flush_static() {
qosdef_flush_table "$NFT_QOS_INET_FAMILY" nft-qos-static
}
# static limit rate init
qosdef_init_static() {
local hook_ul="prerouting" hook_dl="postrouting"
[ "$2" = 0 ] || {
logger -t nft-qos-static "validation failed"
return 1
}
[ $limit_enable -eq 0 -o \
$limit_type = "dynamic" ] && return 1
[ -z "$NFT_QOS_HAS_BRIDGE" ] && {
hook_ul="postrouting"
hook_dl="prerouting"
}
qosdef_appendx "table $NFT_QOS_INET_FAMILY nft-qos-static {\n"
qosdef_append_chain_sta $hook_ul upload upload $static_unit_ul $static_rate_ul
qosdef_append_chain_sta $hook_dl download download $static_unit_dl $static_rate_dl
qosdef_appendx "}\n"
}

View File

@ -0,0 +1,36 @@
#!/bin/sh
#
# Copyright 2018 rosysong@rosinson.com
#
export initscript="nft-qos-dynamic"
. /lib/functions.sh
. /lib/nft-qos/core.sh
. /lib/nft-qos/dynamic.sh
NFT_QOS_DYNAMIC_ON=
qosdef_check_if_dynamic() {
[ $limit_enable -eq 1 -a \
"$limit_type" = "dynamic" ] && \
NFT_QOS_DYNAMIC_ON="y"
}
logger -t nft-qos-dynamic "ACTION=$ACTION, MACADDR=$MACADDR, IPADDR=$IPADDR, HOSTNAME=$HOSTNAME"
case "$ACTION" in
add | update | remove)
qosdef_validate_dynamic default qosdef_check_if_dynamic
[ -z "$NFT_QOS_DYNAMIC_ON" ] && return
qosdef_init_env
qosdef_flush_dynamic
qosdef_init_header
qosdef_validate_dynamic default qosdef_init_dynamic
qosdef_init_done
qosdef_start
;;
esac

View File

@ -0,0 +1,23 @@
#!/bin/sh
#
# Copyright 2018 rosysong@rosinson.com
#
export initscript="nft-qos-monitor"
. /lib/nft-qos/monitor.sh
logger -t nft-qos-monitor "ACTION=$ACTION, MACADDR=$MACADDR, IPADDR=$IPADDR, HOSTNAME=$HOSTNAME"
case "$ACTION" in
add | update)
qosdef_init_env
qosdef_init_monitor
qosdef_monitor_add $MACADDR $IPADDR $HOSTNAME
;;
remove)
qosdef_init_env
qosdef_init_monitor
qosdef_monitor_del $MACADDR $IPADDR $HOSTNAME
;;
esac

View File

@ -0,0 +1,119 @@
#
# Copyright (C) 2018 rosysong@rosinson.com
#
# This is the sample for nft-qos configuration file,
# which will generate a nftables script in /tmp/qos.nft
#
# Getting Started
# Official site :
# https://netfilter.org/projects/nftables/index.html
# What is nftables :
# https://wiki.nftables.org/wiki-nftables/index.php/Main_Page
#
# Basic Operations
# Configuring Tables :
# https://wiki.nftables.org/wiki-nftables/index.php/Configuring_tables
# Configuring Chains :
# https://wiki.nftables.org/wiki-nftables/index.php/Configuring_chains
# Configuring Rules :
# https://wiki.nftables.org/wiki-nftables/index.php/Simple_rule_management
# Quick Reference (recommended) :
# https://wiki.nftables.org/wiki-nftables/index.php/Quick_reference-nftables_in_10_minutes
# https://netfilter.org/projects/nftables/manpage.html
#
config default default
# Enable Flag for limit rate
option limit_enable '1'
# Options for enable Static QoS (rate limit)
option limit_type 'static'
# Options for Static QoS (rate limit)
option static_unit_dl 'kbytes'
option static_unit_ul 'kbytes'
option static_rate_dl '50'
option static_rate_ul '50'
# Options for enable Dynamic QoS
# This option can not compatible with Static QoS
# option limit_type 'dynamic'
# For Dynamic QoS Samples (unit of bandwidth is Mbps):
option dynamic_cidr '192.168.1.0/24'
option dynamic_cidr6 'AAAA:BBBB::1/64'
option dynamic_bw_up '100'
option dynamic_bw_down '100'
# White list for static/dynamic limit
# list limit_whitelist '192.168.1.225'
# list limit_whitelist '192.168.1.0/24'
# list limit_whitelist 'ABCD:CDEF::1/64'
# Option for Mac address based traffic control
option limit_mac_enable '0'
# Options for Traffic Priority
option priority_enable '0'
option priority_netdev 'lan'
#
# For Static QoS Rate Limit Samples :
#
# For Download :
#config download
# option hostname 'My PC'
# option unit 'kbytes'
# option ipaddr '192.168.1.224'
# option rate '128'
#
# For Upload :
#config upload
# option hostname 'office-pc'
# option unit 'mbytes'
# option ipaddr 'ABCD:FFED::1/64'
# option rate '1024'
#
# For MAC address based traffic control Samples :
#
#config client
# option drunit 'kbytes'
# option urunit 'kbytes'
# option hostname 'tvbox'
# option macaddr '00:00:00:00:00:00'
# option drate '300'
# option urate '30'
#
# Traffic Priority Samples :
#
# protocol : tcp, udp, udplite, sctp, dccp, tcp is default
# priority : integer between 1-11, 1 is default and the highest
# service : you can input a integer or service name,
# e.g. '22', '11-22', 'telnet', 'ssh, http, ftp', etc
#
#config priority
# option protocol 'tcp'
# option priority '-400'
# option service '23'
# option comment '?'
#
#config priority
# option protocol 'udp'
# option priority '-400'
# option service 'https'
# option comment '?'
#
#config priority
# option protocol 'dccp'
# option priority '0'
# option service '22-35'
# option comment '?'
#
#config priority
# option protocol 'dccp'
# option priority '300'
# option service 'ftp,ssh,http'
# option comment '?'
#

54
nft-qos/files/nft-qos.init Executable file
View File

@ -0,0 +1,54 @@
#!/bin/sh /etc/rc.common
#
# Copyright (C) 2018 rosysong@rosinson.com
#
if [ -z "${IPKG_INSTROOT}" ]; then
. /lib/nft-qos/core.sh
. /lib/nft-qos/monitor.sh
. /lib/nft-qos/dynamic.sh
. /lib/nft-qos/static.sh
. /lib/nft-qos/mac.sh
. /lib/nft-qos/priority.sh
fi
START=99
USE_PROCD=1
service_triggers() {
procd_add_reload_trigger nft-qos
procd_open_validate
qosdef_validate_dynamic
qosdef_validate_static
qosdef_validate_priority
qosdef_validate_mac
procd_close_validate
}
start_service() {
config_load nft-qos
qosdef_init_env
qosdef_flush_mac
qosdef_flush_static
qosdef_flush_dynamic
qosdef_remove_priority
qosdef_init_header
qosdef_init_monitor
qosdef_validate_dynamic default qosdef_init_dynamic
qosdef_validate_static default qosdef_init_static
qosdef_validate_mac default qosdef_init_mac
qosdef_validate_priority default qosdef_init_priority
qosdef_init_done
qosdef_start
}
stop_service() {
qosdef_flush_dynamic
qosdef_flush_static
qosdef_flush_mac
qosdef_remove_priority
qosdef_clean_cache
}