mirror of
https://github.com/kenzok8/small-package
synced 2025-01-09 04:37:59 +08:00
update 2022-11-23 08:51:32
This commit is contained in:
parent
79261f4cca
commit
e8c1858dff
@ -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
|
||||
|
@ -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
16
luci-app-iperf/Makefile
Normal 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
|
56
luci-app-iperf/luasrc/controller/iperf.lua
Normal file
56
luci-app-iperf/luasrc/controller/iperf.lua
Normal 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
|
178
luci-app-iperf/luasrc/view/iperf/test.htm
Normal file
178
luci-app-iperf/luasrc/view/iperf/test.htm
Normal 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%>
|
108
luci-app-iperf/po/de/iperf.po
Normal file
108
luci-app-iperf/po/de/iperf.po
Normal 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"
|
100
luci-app-iperf/po/de/iperf.po~
Normal file
100
luci-app-iperf/po/de/iperf.po~
Normal 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"
|
109
luci-app-iperf/po/fr/iperf.po
Normal file
109
luci-app-iperf/po/fr/iperf.po
Normal 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"
|
99
luci-app-iperf/po/fr/iperf.po~
Normal file
99
luci-app-iperf/po/fr/iperf.po~
Normal 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"
|
104
luci-app-iperf/po/it/iperf.po
Normal file
104
luci-app-iperf/po/it/iperf.po
Normal 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"
|
96
luci-app-iperf/po/it/iperf.po~
Normal file
96
luci-app-iperf/po/it/iperf.po~
Normal 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"
|
104
luci-app-iperf/po/oc/iperf.po
Normal file
104
luci-app-iperf/po/oc/iperf.po
Normal 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 d’una 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"
|
96
luci-app-iperf/po/oc/iperf.po~
Normal file
96
luci-app-iperf/po/oc/iperf.po~
Normal 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 d’una 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"
|
104
luci-app-iperf/po/ru/iperf.po
Normal file
104
luci-app-iperf/po/ru/iperf.po
Normal 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 тест скорости"
|
92
luci-app-iperf/po/templates/iperf.pot
Normal file
92
luci-app-iperf/po/templates/iperf.pot
Normal 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
1
luci-app-iperf/po/zh-cn
Symbolic link
@ -0,0 +1 @@
|
||||
zh_Hans
|
104
luci-app-iperf/po/zh_Hans/iperf.po
Normal file
104
luci-app-iperf/po/zh_Hans/iperf.po
Normal 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测速"
|
96
luci-app-iperf/po/zh_Hans/iperf.po~
Normal file
96
luci-app-iperf/po/zh_Hans/iperf.po~
Normal 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测速"
|
115
luci-app-iperf/root/etc/config/iperf
Normal file
115
luci-app-iperf/root/etc/config/iperf
Normal 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'
|
@ -0,0 +1,13 @@
|
||||
{
|
||||
"admin/services/iperf": {
|
||||
"title": "iPerf",
|
||||
"order": 10,
|
||||
"action": {
|
||||
"type": "template",
|
||||
"path": "iperf/test"
|
||||
},
|
||||
"depends": {
|
||||
"acl": [ "luci-app-iperf" ]
|
||||
}
|
||||
}
|
||||
}
|
11
luci-app-iperf/root/usr/share/rpcd/acl.d/luci-app-iperf.json
Normal file
11
luci-app-iperf/root/usr/share/rpcd/acl.d/luci-app-iperf.json
Normal 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
59
nft-qos/Makefile
Normal 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
104
nft-qos/files/lib/core.sh
Normal 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
|
||||
}
|
90
nft-qos/files/lib/dynamic.sh
Normal file
90
nft-qos/files/lib/dynamic.sh
Normal 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
79
nft-qos/files/lib/mac.sh
Normal 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"
|
||||
}
|
39
nft-qos/files/lib/monitor.sh
Normal file
39
nft-qos/files/lib/monitor.sh
Normal 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\; }
|
||||
}
|
87
nft-qos/files/lib/priority.sh
Normal file
87
nft-qos/files/lib/priority.sh
Normal 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"
|
||||
}
|
74
nft-qos/files/lib/static.sh
Normal file
74
nft-qos/files/lib/static.sh
Normal 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"
|
||||
}
|
36
nft-qos/files/nft-qos-dynamic.hotplug
Normal file
36
nft-qos/files/nft-qos-dynamic.hotplug
Normal 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
|
23
nft-qos/files/nft-qos-monitor.hotplug
Normal file
23
nft-qos/files/nft-qos-monitor.hotplug
Normal 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
|
119
nft-qos/files/nft-qos.config
Normal file
119
nft-qos/files/nft-qos.config
Normal 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
54
nft-qos/files/nft-qos.init
Executable 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
|
||||
}
|
Loading…
Reference in New Issue
Block a user