1
0
Fork 0
mirror of https://github.com/Ysurac/openmptcprouter-feeds.git synced 2025-03-09 15:40:03 +00:00

标签管理

This commit is contained in:
suyuan 2020-09-28 23:05:00 +08:00
parent 2d54002018
commit b25fb44fe6
24 changed files with 2766 additions and 55 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 4.3 KiB

Before After
Before After

View file

@ -1,52 +1,3 @@
<?xml version="1.0" encoding="utf-8"?> <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="90" height="90" viewBox="0 0 90 90">
<!-- Generator: Adobe Illustrator 19.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> <image id="图层_1" data-name="图层 1" y="11" width="90" height="68" xlink:href="data:img/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAABECAYAAAABdCLpAAACPklEQVR4nO2csVHDMBiFn4ABKFNmhDBB7I4ONoARTElFMkHMBBwTBCYITEBGoEyZlsqcQL4zkoEoxg+I3nenu9xvOz59ciT9sh1EcghgDmABYBZ78A4wc3WfOxe9YU9QNUqRkOTCq/s82OML9j7f1Irfir226h+jU91jRYstkWgSEk1CoklINAmJJiHRJCSahESTkGgSEk1CoklINAmJJiHRJCSahESTkGgSEk1CoklINAmJJiHRJCSahESTkGgSEk1CoklINAmJJiHRZDIAT96D1irdy5NzC+M+LFK6qn6B3Djro+SqzmVp3M9D9MxBy9df2BYIoiKGkf/WWptoK/khiIpOaHpHQqJJSDSJtj76WwZl9TYJXxXmQ18+KKshgGFzWyO2XhVmicbxdjxYFWb9zx1uRJRoJ21ez7sHZWUl5bVAAOcArtxn48Ws+NzF6gQpT2Xgje06Zl5yY1/TvQn2EgFd3wWHssrN+InB8DmIiIBY0ddBBJgGEREQNRiuCnM3KKsjAKcu9ODNPNoGtjrWvPKnLbGdx193zVKqfE9kvlclLCQkmoREk5BoErrDQsJe0Uks6vwy630ALwCOk9bQP5f1GWYt82mVnylv9w5Noy2HLuNrWziqOavXmx0263sM9tpNxl4yZ7Pa2y9q+uz8bJX9LrxWngR77C4Tr+5RDx1pekdCoklsdc+wwTih7mMcRCLoKjrTat9mxHYd90EkXXp3oeeo3x1EYWIPcNh/Bz8Jomlgr+QyqqYAXgHKklCu8SOBqQAAAABJRU5ErkJggg=="/>
<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" </svg>
viewBox="-435 234.7 87.6 92.3" style="enable-background:new -435 234.7 87.6 92.3;" xml:space="preserve">
<style type="text/css">
.st0{fill:#FFFFFF;}
</style>
<rect x="-430.9" y="294" class="st0" width="71.9" height="29"/>
<rect id="backgound_modem" x="-430.9" y="294" class="st0" width="71.9" height="29"/>
<path id="XMLID_582_" d="M-423.4,309c0-0.5,0.1-0.9,0.3-1.3c0.2-0.4,0.4-0.8,0.7-1.1c0.3-0.3,0.7-0.5,1.1-0.7
c0.4-0.2,0.8-0.3,1.3-0.3s0.9,0.1,1.3,0.3c0.4,0.2,0.8,0.4,1.1,0.7c0.3,0.3,0.5,0.7,0.7,1.1c0.2,0.4,0.3,0.9,0.3,1.3
c0,0.5-0.1,0.9-0.3,1.3c-0.2,0.4-0.4,0.8-0.7,1.1c-0.3,0.3-0.7,0.5-1.1,0.7c-0.4,0.2-0.9,0.3-1.3,0.3c-0.5,0-0.9-0.1-1.3-0.3
c-0.4-0.2-0.8-0.4-1.1-0.7c-0.3-0.3-0.5-0.7-0.7-1.1C-423.3,309.9-423.4,309.5-423.4,309z"/>
<path id="XMLID_571_" d="M-409.1,309c0-0.5,0.1-0.9,0.3-1.3c0.2-0.4,0.4-0.8,0.7-1.1c0.3-0.3,0.7-0.5,1.1-0.7
c0.4-0.2,0.8-0.3,1.3-0.3s0.9,0.1,1.3,0.3c0.4,0.2,0.8,0.4,1.1,0.7c0.3,0.3,0.5,0.7,0.7,1.1c0.2,0.4,0.3,0.9,0.3,1.3
c0,0.5-0.1,0.9-0.3,1.3c-0.2,0.4-0.4,0.8-0.7,1.1c-0.3,0.3-0.7,0.5-1.1,0.7c-0.4,0.2-0.9,0.3-1.3,0.3c-0.5,0-0.9-0.1-1.3-0.3
c-0.4-0.2-0.8-0.4-1.1-0.7c-0.3-0.3-0.5-0.7-0.7-1.1C-409,309.9-409.1,309.5-409.1,309z"/>
<path id="XMLID_696_" d="M-365.4,290H-376v-31h-4v31h-44.5c-6,0-10.5,5.1-10.5,11.1v15.4c0,6,4.5,10.5,10.5,10.5h58.4
c6,0,11.2-4.6,11.2-10.6v-16.1C-355,294.7-359.8,290-365.4,290z M-359,316.4c0,3.8-3.4,6.6-7.2,6.6h-58.3c-3.8,0-6.5-2.8-6.5-6.5
v-15.4c0-3.8,2.8-7.1,6.5-7.1h59.1c3.3,0,6.4,3,6.4,6.3V316.4z"/>
<g id="XMLID_526_">
<path id="XMLID_514_" d="M-398.6,283.4l-1.4-1.5l-0.1-0.1c-2.7-2.8-4.8-6.2-6.3-10.1c-1.5-3.8-2.2-8.1-2.2-12.7s0.7-8.8,2.2-12.7
c1.5-3.9,3.6-7.3,6.3-10.1c0,0.1,0.1,0,0.1-0.1l1.4-1.4l2.8,2.8l-1.6,1.6c-2.3,2.4-4.1,5.3-5.4,8.7c-1.3,3.4-1.9,7.2-1.9,11.3
s0.7,7.9,1.9,11.3c1.3,3.4,3.1,6.3,5.4,8.7c0,0,0,0,0.1,0.1l1.4,1.4L-398.6,283.4z"/>
</g>
<g id="XMLID_525_">
<path id="XMLID_512_" d="M-393,277.7l-1.4-1.4c-0.1-0.1-0.2-0.1-0.2-0.2c-2-2.1-3.6-4.6-4.7-7.5c-1.1-2.9-1.7-6.1-1.7-9.5
c0-3.4,0.6-6.6,1.6-9.5c1.1-2.9,2.7-5.4,4.7-7.6c0.1-0.1,0.2-0.1,0.2-0.2l1.5-1.4l2.9,2.8l-1.4,1.4c-0.1,0.1-0.1,0.1-0.2,0.2
c-1.7,1.7-3,3.8-3.9,6.2c-0.9,2.4-1.4,5.1-1.4,8.1c0,2.9,0.5,5.6,1.4,8.1c0.9,2.4,2.2,4.5,3.9,6.2c0.1,0.1,0.1,0.1,0.2,0.2l1.4,1.4
L-393,277.7z"/>
</g>
<g id="XMLID_524_">
<path id="XMLID_511_" d="M-387,271.8l-1.4-1.4c-0.2-0.1-0.3-0.2-0.3-0.3c-1.3-1.4-2.3-3-3.1-4.9c-0.7-1.9-1.1-3.9-1.1-6.1
c0-2.2,0.4-4.3,1.1-6.1c0.7-1.9,1.7-3.5,3.1-4.9c0.1-0.1,0.2-0.2,0.3-0.3l1.5-1.5l2.8,2.9l-1.7,1.6c-0.9,1-1.7,2.2-2.2,3.6
s-0.8,3-0.8,4.7c0,1.7,0.3,3.3,0.8,4.7s1.3,2.6,2.2,3.6c0.1,0.1,0.2,0.2,0.3,0.2l1.4,1.4L-387,271.8z"/>
</g>
<g id="XMLID_523_">
<path id="XMLID_509_" d="M-368.4,271.4l-2.9-2.7l1.4-1.5c0.9-1,1.6-2.1,2.1-3.4c0.5-1.4,0.8-3,0.8-4.7c0-1.7-0.3-3.3-0.8-4.7
c-0.5-1.3-1.2-2.5-2.1-3.5l-1.4-1.5l2.9-2.7l1.4,1.5c1.2,1.4,2.2,3,2.9,4.7c0.7,1.9,1.1,3.9,1.1,6.1s-0.4,4.3-1.1,6.1
c-0.7,1.8-1.7,3.4-2.9,4.7L-368.4,271.4z"/>
</g>
<g id="XMLID_522_">
<path id="XMLID_491_" d="M-362.5,277.3l-2.9-2.7l1.4-1.5c1.6-1.7,2.8-3.7,3.6-6c0.9-2.4,1.4-5.1,1.4-8.1c0-2.9-0.5-5.6-1.4-8.1
c-0.9-2.3-2.1-4.3-3.7-6l-1.4-1.5l2.9-2.7l1.4,1.5c1.9,2.1,3.4,4.5,4.5,7.3c1.1,2.9,1.6,6.1,1.6,9.5c0,3.4-0.6,6.6-1.6,9.5
c-1,2.8-2.5,5.2-4.5,7.3L-362.5,277.3z"/>
</g>
<g id="XMLID_521_">
<path id="XMLID_490_" d="M-356.9,282.9l-2.9-2.7l1.4-1.5c2.2-2.4,3.9-5.2,5.1-8.4c1.3-3.4,1.9-7.2,1.9-11.3s-0.7-7.9-1.9-11.3
c-1.2-3.2-2.9-6-5.2-8.4l-1.4-1.5l2.9-2.7l1.5,1.6c2.6,2.8,4.6,6,6,9.7c1.5,3.8,2.2,8.1,2.2,12.7s-0.7,8.8-2.2,12.7
c-1.5,3.6-3.5,6.9-6,9.6L-356.9,282.9z"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

Before After
Before After

14
luci-app-status/Makefile Normal file
View file

@ -0,0 +1,14 @@
#
# Copyright (C) 2020 Ycarus (Yannick Chabanois) <ycarus@zugaina.org>
#
#
include $(TOPDIR)/rules.mk
LUCI_TITLE:=Aggregation status
LUCI_DEPENDS:=+luci-lib-json +luci-app-openmptcprouter
PKG_LICENSE:=GPLv3
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature

View file

@ -0,0 +1,335 @@
.container {
/* container for entire page. fixes bootstrap theme's ridiculously small page width */
max-width: 1044px;
}
#interface_field {
padding: 12px 20px 20px 20px;
}
#mwan_status_text {
display: table;
font-size: 14px;
margin: auto;
max-width: 1044px;
min-width: 246px;
width: 100%;
}
.wanon {
background-color: #1cc82c;
}
.wanoff {
background-color: #e55712;
}
.wanon,
.wanoff {
border-radius: 60px;
box-shadow: 0px 2px 5px -3px;
float: left;
margin: 8px 3px 0px 3px;
min-height: 30px;
min-width: 235px;
padding: 5px 10px 8px 10px;
text-align: center;
}
/* Mwan3 ligthed CSS */
.container {
/* container for entire page. fixes bootstrap theme's ridiculously small page width */
max-width: 1044px;
}
#interface_field {
padding: 0px;
}
#interface_field td {
padding: 0px;
}
#interface_status_text {
display: table;
font-size: 14px;
margin: auto;
max-width: 1044px;
min-width: 246px;
width: 100%;
}
ul {
margin: 0px;
}
/*Now the CSS*/
.tree ul {
position: relative;
float: left;
transition: all 0.5s;
-webkit-transition: all 0.5s;
-moz-transition: all 0.5s;
}
.tree li {
float: left;
text-align: left;
list-style-type: none;
position: relative;
padding: 5px 0px 5px 85px;
transition: all 0.5s;
-webkit-transition: all 0.5s;
-moz-transition: all 0.5s;
}
.tree ul ul {
padding-left: 85px;
position: relative;
}
.tree > ul > li:first-child {
position: relative;
padding-left: 0px;
}
.tree > ul > li#first-child > a {
position: relative;
top: 50%;
}
/*We will use ::before and ::after to draw the connectors
Before: Bottom part of the element
After: Top part of the element
*/
.tree ul ul li::before,
.tree ul ul li::after {
content: '';
position: absolute;
top: 50%;
left: 0;
border-left: 2px solid black;
width: 85px;
height: 50%;
float: left;
/*z-index: -10;*/
/*
position: absolute;
top: 0;
right: 50%;
border-top: 2px solid black;
width: 50%;
height: 20px;
background-color: red;
*/
}
.tree ul ul li::after {
top: auto;
bottom: 50%;
border-left: 2px solid black;
border-bottom: 2px solid black;
}
.tree li:first-child {
position: relative;
top: 50%;
}
/*We need to remove first top and the last bottom border */
.tree li:only-child::after {
display: none;
}
/*Remove space from the top of single children*/
.tree li:only-child {
padding-top: 0;
}
/*Remove left connector from first child and
right connector from last child*/
.tree li:first-child::after,
.tree li:last-child::before {
border-left: 0px;
}
/*Adding back the vertical connector to the last nodes*/
/*
.tree li:last-child::before{
//border-top: 2px solid black;
border-radius: 0 5px 0 0;
-webkit-border-radius: 0 5px 0 0;
-moz-border-radius: 0 5px 0 0;
}
.tree li:first-child::after{
border-radius: 5px 0 0 0;
-webkit-border-radius: 5px 0 0 0;
-moz-border-radius: 5px 0 0 0;
}
*/
/*Time to add right connectors from parents*/
.tree ul ul::before {
content: '';
position: absolute;
top: 50%;
left: 0;
border-top: 2px solid black;
width: 85px;
height: 100%;
}
.tree li a {
display: inline-block;
background-color: #f3f3f3;
text-decoration: none;
/*
border: 1px solid @color-bg-gray;
padding: 5px 10px;
font-family: arial, verdana, tahoma;
font-size: 11px;
border-radius: 5px;
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
transition: all 0.5s;
-webkit-transition: all 0.5s;
-moz-transition: all 0.5s;
*/
}
/*Exception*/
.tree li.remote-from-lease {
padding-bottom: 0px;
}
.tree li.remote-from-lease::before,
.tree li#networkRootNode::before {
display: none;
}
.tree li#networkRootNode::after {
border: none;
}
.tree li.remote-from-lease::after {
content: '';
position: absolute;
left: 50%;
top: 83px;
border-left: 2px solid black;
border-bottom: none;
width: 2px;
height: 30px;
z-index: -10;
}
.remote-from-lease a {
height: 90px;
}
.tree li#networkRootNode {
padding: 25px 0 0 0;
}
.tree li.subnode-only-child::before {
content: '';
position: absolute;
top: 50%;
left: 0;
border-top: 2px solid black;
width: 85px;
height: 0;
}
.tree ul li#networkRootNode:not(:first-child) tr.spaceline td {
content: '';
position: absolute;
/*top: 0;
top: 75px;*/
border-left: 2px solid black;
border-bottom: none;
width: 2px;
/*height: 50%;*/
height: 55px;
left: 200px;
/* z-index: -10;*/
}
/*Time for some hover effects*/
/*We will apply the hover effect the the lineage of the element also*/
/*
.tree li a:hover, .tree li a:hover+ul li a {
background: #c8e4f8; color: #000; border: 1px solid #94a0b4;
}
.tree li a:hover+ul li::after,
.tree li a:hover+ul li::before,
.tree li a:hover+ul::before,
.tree li a:hover+ul ul::before{
border-color: #94a0b4;
}
*/
/*Thats all. I hope you enjoyed it.
Thanks :)*/
.network-node {
position: relative;
background-color: #f3f3f3;
padding: 12px;
width: 400px;
max-width: 400px;
box-sizing: border-box;
height: 170px;
}
.network-node .equipment-icon {
position: relative;
float: left;
width: 64px;
max-width: 64px;
box-sizing: border-box;
}
.network-node .equipment-icon emded,
.network-node .equipment-icon img {
width: 64px;
max-width: 64px;
}
.network-node .equipment-icon img {
position: relative;
top: 10px;
}
.network-node .status-icon {
position: relative;
float: left;
width: 30px;
max-width: 30px;
margin-left: 24px;
margin-rigth: 8px;
top: 20px;
box-sizing: border-box;
}
.network-node .status-icon img {
max-width: 30px;
width: 30px;
}
.network-node .info {
position: relative;
float: right;
width: 250px;
text-align: left;
font-size: 12px;
color: #757575;
}
.network-node .info .title {
display: block;
font-size: 17px;
font-weight: 700;
color: #333333;
}
.network-node .info .title i {
font-weight: lighter;
font-size: 8px;
text-transform: uppercase;
}
.network-node .info .status-message {
display: block;
}
.network-node .info .status-message.error {
color: #e55712;
}
.network-node .info .status-message.warning {
color: #eb9e10;
}
.network-node .info .content {
display: block;
}
#networkRootNode table td {
border-top: 0px;
}
.vertdash {
width:5px;
border-right:2px dotted black;
height:70px;
padding-right: 195px;
}
#omr {
height: 190px;
}
#omr-vps {
height: 160px;
}
.space {
height: 55px;
}
.spaceline {
height: 55px;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 536 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 607 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 575 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 536 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 544 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -0,0 +1,313 @@
local math = require "math"
local sys = require "luci.sys"
local json = require("luci.json")
local fs = require("nixio.fs")
local net = require "luci.model.network".init()
local ucic = luci.model.uci.cursor()
local ipc = require "luci.ip"
module("luci.controller.status", package.seeall)
function index()
entry({"admin", "system", "status"}, alias("admin", "system", "status", "server"), _("Settings"), 1)
entry({"admin", "system", "status","server"}, template("status/server"),_('Settings'),1).leaf = true
entry({"admin", "system", "status","status"}, template("status/wanstatus"),_('Status'),2).leaf = true
entry({"admin", "system", "status","server_add"}, post("server_add"))
entry({"admin", "system", "status", "interfaces_status"}, call("interfaces_status")).leaf = true
entry({"admin", "system", "status", "multipath_bandwidth"}, call("multipath_bandwidth")).leaf = true
entry({"admin", "system", "status", "interface_bandwidth"}, call("interface_bandwidth")).leaf = true
end
function server_add()
local serversnb = 0
local servers = luci.http.formvaluetable("server")
for server, _ in pairs(servers) do
local server_ip = luci.http.formvalue("%s.server_ip" % server) or ""
local master = luci.http.formvalue("master") or ""
-- OpenMPTCProuter VPS
local openmptcprouter_vps_key = luci.http.formvalue("%s.openmptcprouter_vps_key" % server) or ""
local openmptcprouter_vps_username = luci.http.formvalue("%s.openmptcprouter_vps_username" % server) or ""
ucic:set("openmptcprouter",server,"server")
ucic:set("openmptcprouter",server,"username",openmptcprouter_vps_username)
ucic:set("openmptcprouter",server,"password",openmptcprouter_vps_key)
if master == server or (master == "" and serversnb == 0) then
ucic:set("openmptcprouter",server,"get_config","1")
ucic:set("openmptcprouter",server,"master","1")
ucic:set("openmptcprouter",server,"backup","0")
else
ucic:set("openmptcprouter",server,"get_config","0")
ucic:set("openmptcprouter",server,"master","0")
ucic:set("openmptcprouter",server,"backup","1")
end
if server_ip ~= "" then
serversnb = serversnb + 1
end
ucic:set("openmptcprouter",server,"disabled",openmptcprouter_vps_disabled)
ucic:set("openmptcprouter",server,"ip",server_ip)
ucic:set("openmptcprouter",server,"port","65500")
ucic:save("openmptcprouter")
end
local ss_servers_nginx = {}
local ss_servers_ha = {}
local vpn_servers = {}
local k = 0
local ss_ip
for server, _ in pairs(servers) do
local master = luci.http.formvalue("master") or ""
local server_ip = luci.http.formvalue("%s.server_ip" % server) or ""
-- We have an IP, so set it everywhere
if server_ip ~= "" and luci.http.formvalue("%s.openmptcprouter_vps_disabled" % server) ~= "1" then
-- Check if we have more than one IP, in this case use Nginx HA
if serversnb > 1 then
if master == server then
ss_ip=server_ip
ucic:set("shadowsocks-libev","sss0","server",server_ip)
ucic:set("glorytun","vpn","host",server_ip)
ucic:set("dsvpn","vpn","host",server_ip)
ucic:set("mlvpn","general","host",server_ip)
ucic:set("ubond","general","host",server_ip)
luci.sys.call("uci -q del openvpn.omr.remote")
luci.sys.call("uci -q add_list openvpn.omr.remote=" .. server_ip)
ucic:set("qos","serverin","srchost",server_ip)
ucic:set("qos","serverout","dsthost",server_ip)
end
k = k + 1
ucic:set("nginx-ha","ShadowSocks","enable","0")
ucic:set("nginx-ha","VPN","enable","0")
ucic:set("haproxy-tcp","general","enable","0")
ucic:set("openmptcprouter","settings","ha","1")
else
ucic:set("openmptcprouter","settings","ha","0")
ucic:set("nginx-ha","ShadowSocks","enable","0")
ucic:set("nginx-ha","VPN","enable","0")
ucic:set("shadowsocks-libev","sss0","server",server_ip)
ucic:set("glorytun","vpn","host",server_ip)
ucic:set("dsvpn","vpn","host",server_ip)
ucic:set("mlvpn","general","host",server_ip)
ucic:set("ubond","general","host",server_ip)
luci.sys.call("uci -q del openvpn.omr.remote")
luci.sys.call("uci -q add_list openvpn.omr.remote=" .. server_ip)
ucic:set("qos","serverin","srchost",server_ip)
ucic:set("qos","serverout","dsthost",server_ip)
end
end
end
ucic:save("qos")
ucic:commit("qos")
ucic:save("nginx-ha")
ucic:commit("nginx-ha")
ucic:save("openvpn")
ucic:commit("openvpn")
ucic:save("mlvpn")
ucic:save("ubond")
ucic:commit("mlvpn")
ucic:save("dsvpn")
ucic:commit("dsvpn")
ucic:save("glorytun")
ucic:commit("glorytun")
ucic:save("shadowsocks-libev")
ucic:commit("shadowsocks-libev")
luci.sys.call("(env -i /bin/ubus call network reload) >/dev/null 2>/dev/null")
luci.sys.call("/etc/init.d/omr-tracker stop >/dev/null 2>/dev/null")
luci.sys.call("/etc/init.d/mptcp restart >/dev/null 2>/dev/null")
if openmptcprouter_vps_key ~= "" then
luci.sys.call("/etc/init.d/openmptcprouter-vps restart >/dev/null 2>/dev/null")
os.execute("sleep 2")
end
luci.sys.call("/etc/init.d/shadowsocks-libev restart >/dev/null 2>/dev/null")
luci.sys.call("/etc/init.d/glorytun restart >/dev/null 2>/dev/null")
luci.sys.call("/etc/init.d/glorytun-udp restart >/dev/null 2>/dev/null")
luci.sys.call("/etc/init.d/mlvpn restart >/dev/null 2>/dev/null")
luci.sys.call("/etc/init.d/ubond restart >/dev/null 2>/dev/null")
luci.sys.call("/etc/init.d/openvpn restart >/dev/null 2>/dev/null")
luci.sys.call("/etc/init.d/dsvpn restart >/dev/null 2>/dev/null")
luci.sys.call("/etc/init.d/omr-tracker start >/dev/null 2>/dev/null")
luci.sys.call("/etc/init.d/omr-6in4 restart >/dev/null 2>/dev/null")
luci.sys.call("/etc/init.d/mptcpovervpn restart >/dev/null 2>/dev/null")
luci.sys.call("/etc/init.d/vnstat restart >/dev/null 2>/dev/null")
luci.http.redirect(luci.dispatcher.build_url("admin/system/status/status"))
end
function interfaces_status()
local ut = require "luci.util"
local mArray = ut.ubus("openmptcprouter", "status", {}) or {_=0}
if mArray ~= nil and mArray.openmptcprouter ~= nil then
mArray.openmptcprouter["remote_addr"] = luci.http.getenv("REMOTE_ADDR") or ""
mArray.openmptcprouter["remote_from_lease"] = false
-- local leases=dhcp_leases_common(4)
-- for _, value in pairs(leases) do
-- if value["ipaddr"] == mArray.openmptcprouter["remote_addr"] then
-- mArray.openmptcprouter["remote_from_lease"] = true
-- mArray.openmptcprouter["remote_hostname"] = value["hostname"]
-- end
-- end
end
luci.http.prepare_content("application/json")
luci.http.write_json(mArray)
end
-- This function come from modules/luci-bbase/luasrc/tools/status.lua from old OpenWrt
-- Copyright 2011 Jo-Philipp Wich <jow@openwrt.org>
-- Licensed to the public under the Apache License 2.0.
local function dhcp_leases_common(family)
local rv = { }
local nfs = require "nixio.fs"
local sys = require "luci.sys"
local leasefile = "/tmp/dhcp.leases"
ucic:foreach("dhcp", "dnsmasq",
function(s)
if s.leasefile and nfs.access(s.leasefile) then
leasefile = s.leasefile
return false
end
end)
local fd = io.open(leasefile, "r")
if fd then
while true do
local ln = fd:read("*l")
if not ln then
break
else
local ts, mac, ip, name, duid = ln:match("^(%d+) (%S+) (%S+) (%S+) (%S+)")
local expire = tonumber(ts) or 0
if ts and mac and ip and name and duid then
if family == 4 and not ip:match(":") then
rv[#rv+1] = {
expires = (expire ~= 0) and os.difftime(expire, os.time()),
macaddr = ipc.checkmac(mac) or "00:00:00:00:00:00",
ipaddr = ip,
hostname = (name ~= "*") and name
}
elseif family == 6 and ip:match(":") then
rv[#rv+1] = {
expires = (expire ~= 0) and os.difftime(expire, os.time()),
ip6addr = ip,
duid = (duid ~= "*") and duid,
hostname = (name ~= "*") and name
}
end
end
end
end
fd:close()
end
local lease6file = "/tmp/hosts/odhcpd"
ucic:foreach("dhcp", "odhcpd",
function(t)
if t.leasefile and nfs.access(t.leasefile) then
lease6file = t.leasefile
return false
end
end)
local fd = io.open(lease6file, "r")
if fd then
while true do
local ln = fd:read("*l")
if not ln then
break
else
local iface, duid, iaid, name, ts, id, length, ip = ln:match("^# (%S+) (%S+) (%S+) (%S+) (-?%d+) (%S+) (%S+) (.*)")
local expire = tonumber(ts) or 0
if ip and iaid ~= "ipv4" and family == 6 then
rv[#rv+1] = {
expires = (expire >= 0) and os.difftime(expire, os.time()),
duid = duid,
ip6addr = ip,
hostname = (name ~= "-") and name
}
elseif ip and iaid == "ipv4" and family == 4 then
rv[#rv+1] = {
expires = (expire >= 0) and os.difftime(expire, os.time()),
macaddr = sys.net.duid_to_mac(duid) or "00:00:00:00:00:00",
ipaddr = ip,
hostname = (name ~= "-") and name
}
end
end
end
fd:close()
end
if family == 6 then
local _, lease
local hosts = sys.net.host_hints()
for _, lease in ipairs(rv) do
local mac = sys.net.duid_to_mac(lease.duid)
local host = mac and hosts[mac]
if host then
if not lease.name then
lease.host_hint = host.name or host.ipv4 or host.ipv6
elseif host.name and lease.hostname ~= host.name then
lease.host_hint = host.name
end
end
end
end
return rv
end
function interface_bandwidth(iface)
luci.http.prepare_content("application/json")
local bwc = io.popen("luci-bwc -i %q 2>/dev/null" % iface)
if bwc then
luci.http.write("[")
while true do
local ln = bwc:read("*l")
if not ln then break end
luci.http.write(ln)
end
luci.http.write("]")
bwc:close()
end
end
function multipath_bandwidth()
local result = { };
local uci = luci.model.uci.cursor()
uci:foreach("network", "interface", function(s)
local intname = s[".name"]
local dev = get_device(intname)
if dev == "" then
dev = get_device(s["ifname"])
end
local multipath = s["multipath"] or ""
if dev ~= "lo" and dev ~= "" then
if multipath == "" then
multipath = uci:get("openmptcprouter", intname, "multipath") or ""
end
if multipath == "" then
multipath = "off"
end
if multipath == "on" or multipath == "master" or multipath == "backup" or multipath == "handover" then
local bwc = luci.sys.exec("luci-bwc -i %q 2>/dev/null" % dev) or ""
if bwc ~= nil then
--result[dev] = "[" .. string.gsub(bwc, '[\r\n]', '') .. "]"
result[intname] = "[" .. string.gsub(bwc, '[\r\n]', '') .. "]"
else
result[dev] = "[]"
end
end
end
end)
luci.http.prepare_content("application/json")
luci.http.write_json(result)
end
function get_device(interface)
local dump = require("luci.util").ubus("network.interface.%s" % interface, "status", {})
if dump ~= nil then
return dump['l3_device']
else
return ""
end
end

View file

@ -0,0 +1,94 @@
<%+header%>
<%
local uci = require("luci.model.uci").cursor()
local net = require "luci.model.network".init()
local fs = require "nixio.fs"
local sys = require "luci.sys"
local ut = require "luci.util"
local ifaces = sys.net:devices()
local servers_ip = {}
local server_ip = uci:get("shadowsocks-libev","sss0","server")
if server_ip == '127.0.0.1' then
local upstreams = uci:get("nginx-ha","ShadowSocks","upstreams")
for _, up in pairs(upstreams) do
local a = up:match("^([^:]+):")
table.insert(servers_ip,a)
end
else
table.insert(servers_ip,server_ip)
end
%>
<script type="text/javascript" src="<%=resource%>/cbi.js?v=git-18.243.49640-2f13420" data-strings="{&#34;path&#34;:{&#34;resource&#34;:&#34;\/luci-static\/resources&#34;,&#34;browser&#34;:&#34;\/cgi-bin\/luci\/admin\/filebrowser&#34;}}"></script>
<script src="/luci-static/resources/xhr.js?v=git-18.324.48426-65adb4e"></script>
<script>
function jsshowadv() {
if(document.getElementById('showadv').checked){
document.getElementById('advancedsettings').style.display='inline';
} else {
document.getElementById('advancedsettings').style.display='none';
}
}
</script>
<% if stderr and #stderr > 0 then %><pre class="error"><%=pcdata(stderr)%></pre><% end %>
<form class="inline" method="post" action="<%=url('admin/system/status/server_add')%>" enctype="multipart/form-data">
<div class="cbi-map">
<h2 name="content"><%:Wizard%></h2>
<fieldset class="cbi-section" id="server">
<legend><%:Server settings%></legend>
<%
nbserver=0
uci:foreach("openmptcprouter","server", function(s)
nbserver=nbserver+1
end)
uci:foreach("openmptcprouter","server", function(s)
servername = s[".name"]
%>
<div class="cbi-section-remove right">
<input type="hidden" name="server.<%=servername%>" value="<%=servername%>" />
</div>
<h3><%=servername%></h3>
<div class="cbi-section-node" id="cbi-omr-wizard-<%=servername%>">
<div class="cbi-value">
<label class="cbi-value-title" for="server_ip"><%:Server IP%></label>
<div class="cbi-value-field">
<input name="<%=servername%>.server_ip" id="<%=servername%>.server_ip" placeholder="<%:Server IP%>" class="cbi-input-text" value="<%=uci:get("openmptcprouter",servername,"ip")%>" data-optional="false">
<div class="cbi-value-description">
<%:Server IP%>
</div>
</div>
</div>
<br />
<div class="cbi-value">
<label class="cbi-value-title"><%:Server username%></label>
<div class="cbi-value-field">
<input type="text" name="<%=servername%>.openmptcprouter_vps_username" placeholder="<%:Server username%>" class="cbi-input-text" value="<%=uci:get("openmptcprouter",servername,"username")%>" data-optional="false">
<br />
<div class="cbi-value-description">
<%:API username to retrieve personnalized settings from the server.%>
</div>
</div>
</div>
<div class="cbi-value">
<label class="cbi-value-title"><%:Server key%></label>
<div class="cbi-value-field">
<input type="text" name="<%=servername%>.openmptcprouter_vps_key" placeholder="<%:Server key%>" class="cbi-input-text" value="<%=uci:get("openmptcprouter",servername,"password")%>" data-optional="false">
<br />
<div class="cbi-value-description">
<%:Key to configure, retrieve others keys and settings from Server.%>
</div>
</div>
</div>
<%
end)
%>
</div>
</fieldset>
</div>
<div class="cbi-page-actions">
<input type="hidden" name="token" value="<%=token%>" />
<input class="cbi-button cbi-button-apply" type="submit" value="<%:Save & Apply%>" /> <input class="cbi-button cbi-button-reset" type="button" value="Reset" onclick="location.href='<%=url('admin/system/status/server')%>'" />
</div>
</form>
<script type="text/javascript">cbi_init();</script>
<%+footer%>

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,152 @@
msgid ""
msgstr "Content-Type: text/plain; charset=UTF-8"
#: luci-app-status/luasrc/view/status/wanstatus.htm:1395
msgid "(%d minute window, %d second interval)"
msgstr ""
#: luci-app-status/luasrc/view/status/wanstatus.htm:970
#: luci-app-status/luasrc/view/status/wanstatus.htm:971
msgid "(%d minutes window, %d seconds interval)"
msgstr ""
#: luci-app-status/luasrc/view/status/server.htm:68
msgid "API username to retrieve personnalized settings from the server."
msgstr ""
#: luci-app-status/luasrc/view/status/wanstatus.htm:1027
#: luci-app-status/luasrc/view/status/wanstatus.htm:1030
#: luci-app-status/luasrc/view/status/wanstatus.htm:1066
#: luci-app-status/luasrc/view/status/wanstatus.htm:1561
#: luci-app-status/luasrc/view/status/wanstatus.htm:1571
msgid "Average:"
msgstr ""
#: luci-app-status/luasrc/view/status/wanstatus.htm:1023
#: luci-app-status/luasrc/view/status/wanstatus.htm:1026
#: luci-app-status/luasrc/view/status/wanstatus.htm:1062
msgid "Current:"
msgstr ""
#: luci-app-status/luasrc/view/status/wanstatus.htm:1537
msgid "Download:"
msgstr ""
#: luci-app-status/root/usr/share/rpcd/acl.d/luci-app-status.json:3
msgid "Grant UCI access for luci-app-status"
msgstr ""
#: luci-app-status/luasrc/view/status/wanstatus.htm:1558
msgid "Inbound:"
msgstr ""
#: luci-app-status/luasrc/view/status/server.htm:78
msgid "Key to configure, retrieve others keys and settings from Server."
msgstr ""
#: luci-app-status/luasrc/view/status/wanstatus.htm:823
#: luci-app-status/luasrc/view/status/wanstatus.htm:1306
msgid "MB/s"
msgstr ""
#: luci-app-status/luasrc/view/status/wanstatus.htm:832
#: luci-app-status/luasrc/view/status/wanstatus.htm:1315
msgid "Mbit/s"
msgstr ""
#: luci-app-status/luasrc/view/status/wanstatus.htm:1505
#: luci-app-status/luasrc/view/status/wanstatus.htm:1507
msgid "Network overview"
msgstr ""
#: luci-app-status/luasrc/view/status/wanstatus.htm:1568
msgid "Outbound:"
msgstr ""
#: luci-app-status/luasrc/view/status/wanstatus.htm:1031
#: luci-app-status/luasrc/view/status/wanstatus.htm:1034
#: luci-app-status/luasrc/view/status/wanstatus.htm:1070
#: luci-app-status/luasrc/view/status/wanstatus.htm:1564
#: luci-app-status/luasrc/view/status/wanstatus.htm:1574
msgid "Peak:"
msgstr ""
#: luci-app-status/luasrc/view/status/wanstatus.htm:1524
msgid "Realtime Traffic"
msgstr ""
#: luci-app-status/luasrc/view/status/server.htm:90
msgid "Save & Apply"
msgstr ""
#: luci-app-status/luasrc/view/status/server.htm:53
#: luci-app-status/luasrc/view/status/server.htm:55
#: luci-app-status/luasrc/view/status/server.htm:57
msgid "Server IP"
msgstr ""
#: luci-app-status/luasrc/view/status/server.htm:73
#: luci-app-status/luasrc/view/status/server.htm:75
msgid "Server key"
msgstr ""
#: luci-app-status/luasrc/view/status/server.htm:38
msgid "Server settings"
msgstr ""
#: luci-app-status/luasrc/view/status/server.htm:63
#: luci-app-status/luasrc/view/status/server.htm:65
msgid "Server username"
msgstr ""
#: luci-app-status/luasrc/controller/status.lua:11
#: luci-app-status/luasrc/controller/status.lua:12
msgid "Settings"
msgstr ""
#: luci-app-status/luasrc/controller/status.lua:13
#: luci-app-status/root/usr/share/luci/menu.d/luci-app-status.json:3
msgid "Status"
msgstr ""
#: luci-app-status/luasrc/view/status/wanstatus.htm:1543
msgid "Upload:"
msgstr ""
#: luci-app-status/luasrc/view/status/server.htm:36
msgid "Wizard"
msgstr ""
#: luci-app-status/luasrc/view/status/wanstatus.htm:818
#: luci-app-status/luasrc/view/status/wanstatus.htm:1026
#: luci-app-status/luasrc/view/status/wanstatus.htm:1030
#: luci-app-status/luasrc/view/status/wanstatus.htm:1034
#: luci-app-status/luasrc/view/status/wanstatus.htm:1065
#: luci-app-status/luasrc/view/status/wanstatus.htm:1069
#: luci-app-status/luasrc/view/status/wanstatus.htm:1073
#: luci-app-status/luasrc/view/status/wanstatus.htm:1301
#: luci-app-status/luasrc/view/status/wanstatus.htm:1559
#: luci-app-status/luasrc/view/status/wanstatus.htm:1562
#: luci-app-status/luasrc/view/status/wanstatus.htm:1565
#: luci-app-status/luasrc/view/status/wanstatus.htm:1569
#: luci-app-status/luasrc/view/status/wanstatus.htm:1572
#: luci-app-status/luasrc/view/status/wanstatus.htm:1575
msgid "kB/s"
msgstr ""
#: luci-app-status/luasrc/view/status/wanstatus.htm:827
#: luci-app-status/luasrc/view/status/wanstatus.htm:1026
#: luci-app-status/luasrc/view/status/wanstatus.htm:1030
#: luci-app-status/luasrc/view/status/wanstatus.htm:1034
#: luci-app-status/luasrc/view/status/wanstatus.htm:1065
#: luci-app-status/luasrc/view/status/wanstatus.htm:1069
#: luci-app-status/luasrc/view/status/wanstatus.htm:1073
#: luci-app-status/luasrc/view/status/wanstatus.htm:1310
#: luci-app-status/luasrc/view/status/wanstatus.htm:1559
#: luci-app-status/luasrc/view/status/wanstatus.htm:1562
#: luci-app-status/luasrc/view/status/wanstatus.htm:1565
#: luci-app-status/luasrc/view/status/wanstatus.htm:1569
#: luci-app-status/luasrc/view/status/wanstatus.htm:1572
#: luci-app-status/luasrc/view/status/wanstatus.htm:1575
msgid "kbit/s"
msgstr ""

View file

@ -0,0 +1,163 @@
msgid ""
msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Project-Id-Version: \n"
"POT-Creation-Date: \n"
"PO-Revision-Date: \n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Generator: Poedit 2.3.1\n"
"Last-Translator: \n"
"Plural-Forms: nplurals=1; plural=0;\n"
"Language: zh_CN\n"
#: luci-app-status/luasrc/view/status/wanstatus.htm:1395
msgid "(%d minute window, %d second interval)"
msgstr "最近%d分钟信息, 每%d秒刷新"
#: luci-app-status/luasrc/view/status/wanstatus.htm:970
#: luci-app-status/luasrc/view/status/wanstatus.htm:971
msgid "(%d minutes window, %d seconds interval)"
msgstr "最近%d分钟信息, 每%d秒刷新"
#: luci-app-status/luasrc/view/status/server.htm:68
msgid "API username to retrieve personnalized settings from the server."
msgstr "API用户名用于从服务器检索个性化设置."
#: luci-app-status/luasrc/view/status/wanstatus.htm:1027
#: luci-app-status/luasrc/view/status/wanstatus.htm:1030
#: luci-app-status/luasrc/view/status/wanstatus.htm:1066
#: luci-app-status/luasrc/view/status/wanstatus.htm:1561
#: luci-app-status/luasrc/view/status/wanstatus.htm:1571
msgid "Average:"
msgstr "平均:"
#: luci-app-status/luasrc/view/status/wanstatus.htm:1023
#: luci-app-status/luasrc/view/status/wanstatus.htm:1026
#: luci-app-status/luasrc/view/status/wanstatus.htm:1062
msgid "Current:"
msgstr "当前:"
#: luci-app-status/luasrc/view/status/wanstatus.htm:1537
msgid "Download:"
msgstr "下载:"
#: luci-app-status/root/usr/share/rpcd/acl.d/luci-app-status.json:3
msgid "Grant UCI access for luci-app-status"
msgstr ""
#: luci-app-status/luasrc/view/status/wanstatus.htm:1558
msgid "Inbound:"
msgstr "入站:"
#: luci-app-status/luasrc/view/status/server.htm:78
msgid "Key to configure, retrieve others keys and settings from Server."
msgstr "用于配置的密钥,可从服务器检索其他密钥和设置."
#: luci-app-status/luasrc/view/status/wanstatus.htm:823
#: luci-app-status/luasrc/view/status/wanstatus.htm:1306
msgid "MB/s"
msgstr ""
#: luci-app-status/luasrc/view/status/wanstatus.htm:832
#: luci-app-status/luasrc/view/status/wanstatus.htm:1315
msgid "Mbit/s"
msgstr ""
#: luci-app-status/luasrc/view/status/wanstatus.htm:1505
#: luci-app-status/luasrc/view/status/wanstatus.htm:1507
msgid "Network overview"
msgstr "网络概述"
#: luci-app-status/luasrc/view/status/wanstatus.htm:1568
msgid "Outbound:"
msgstr "出站:"
#: luci-app-status/luasrc/view/status/wanstatus.htm:1031
#: luci-app-status/luasrc/view/status/wanstatus.htm:1034
#: luci-app-status/luasrc/view/status/wanstatus.htm:1070
#: luci-app-status/luasrc/view/status/wanstatus.htm:1564
#: luci-app-status/luasrc/view/status/wanstatus.htm:1574
msgid "Peak:"
msgstr ""
#: luci-app-status/luasrc/view/status/wanstatus.htm:1524
msgid "Realtime Traffic"
msgstr "实时流量"
#: luci-app-status/luasrc/view/status/server.htm:90
msgid "Save & Apply"
msgstr "保存&应用"
#: luci-app-status/luasrc/view/status/server.htm:53
#: luci-app-status/luasrc/view/status/server.htm:55
#: luci-app-status/luasrc/view/status/server.htm:57
msgid "Server IP"
msgstr ""
#: luci-app-status/luasrc/view/status/server.htm:73
#: luci-app-status/luasrc/view/status/server.htm:75
msgid "Server key"
msgstr ""
#: luci-app-status/luasrc/view/status/server.htm:38
msgid "Server settings"
msgstr ""
#: luci-app-status/luasrc/view/status/server.htm:63
#: luci-app-status/luasrc/view/status/server.htm:65
msgid "Server username"
msgstr ""
#: luci-app-status/luasrc/controller/status.lua:11
#: luci-app-status/luasrc/controller/status.lua:12
msgid "Settings"
msgstr "设置"
#: luci-app-status/luasrc/controller/status.lua:13
#: luci-app-status/root/usr/share/luci/menu.d/luci-app-status.json:3
msgid "Status"
msgstr "状态"
#: luci-app-status/luasrc/view/status/wanstatus.htm:1543
msgid "Upload:"
msgstr "上传:"
#: luci-app-status/luasrc/view/status/server.htm:36
msgid "Wizard"
msgstr "蚂蚁聚合设置向导"
#: luci-app-status/luasrc/view/status/wanstatus.htm:818
#: luci-app-status/luasrc/view/status/wanstatus.htm:1026
#: luci-app-status/luasrc/view/status/wanstatus.htm:1030
#: luci-app-status/luasrc/view/status/wanstatus.htm:1034
#: luci-app-status/luasrc/view/status/wanstatus.htm:1065
#: luci-app-status/luasrc/view/status/wanstatus.htm:1069
#: luci-app-status/luasrc/view/status/wanstatus.htm:1073
#: luci-app-status/luasrc/view/status/wanstatus.htm:1301
#: luci-app-status/luasrc/view/status/wanstatus.htm:1559
#: luci-app-status/luasrc/view/status/wanstatus.htm:1562
#: luci-app-status/luasrc/view/status/wanstatus.htm:1565
#: luci-app-status/luasrc/view/status/wanstatus.htm:1569
#: luci-app-status/luasrc/view/status/wanstatus.htm:1572
#: luci-app-status/luasrc/view/status/wanstatus.htm:1575
msgid "kB/s"
msgstr ""
#: luci-app-status/luasrc/view/status/wanstatus.htm:827
#: luci-app-status/luasrc/view/status/wanstatus.htm:1026
#: luci-app-status/luasrc/view/status/wanstatus.htm:1030
#: luci-app-status/luasrc/view/status/wanstatus.htm:1034
#: luci-app-status/luasrc/view/status/wanstatus.htm:1065
#: luci-app-status/luasrc/view/status/wanstatus.htm:1069
#: luci-app-status/luasrc/view/status/wanstatus.htm:1073
#: luci-app-status/luasrc/view/status/wanstatus.htm:1310
#: luci-app-status/luasrc/view/status/wanstatus.htm:1559
#: luci-app-status/luasrc/view/status/wanstatus.htm:1562
#: luci-app-status/luasrc/view/status/wanstatus.htm:1565
#: luci-app-status/luasrc/view/status/wanstatus.htm:1569
#: luci-app-status/luasrc/view/status/wanstatus.htm:1572
#: luci-app-status/luasrc/view/status/wanstatus.htm:1575
msgid "kbit/s"
msgstr ""

View file

@ -0,0 +1,13 @@
{
"admin/system/status": {
"title": "Status",
"order": 1,
"action": {
"type": "template",
"path": "status/wanstatus"
},
"depends": {
"acl": [ "luci-app-status" ]
}
}
}

View file

@ -0,0 +1,14 @@
{
"luci-app-status": {
"description": "Grant UCI access for luci-app-status",
"read": {
"uci": [ "*" ],
"ubus": {
"openmptcprouter": [ "*" ]
}
},
"write": {
"uci": [ "*" ]
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 535 B

After

Width:  |  Height:  |  Size: 140 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 140 KiB

Before After
Before After

6
openmptcprouter/files/etc/uci-defaults/1950-omr-diag Executable file → Normal file
View file

@ -2,9 +2,9 @@
uci -q batch <<-EOF >/dev/null uci -q batch <<-EOF >/dev/null
set luci.diag=internal set luci.diag=internal
set luci.diag.ping="openmptcprouter.com" set luci.diag.ping="55860.com"
set luci.diag.dns="openmptcprouter.com" set luci.diag.dns="55860.com"
set luci.diag.route="openmptcprouter.com" set luci.diag.route="55860.com"
set luci.diag.iperf3="ping-ams1.online.net" set luci.diag.iperf3="ping-ams1.online.net"
set luci.diag.getip="ip.openmptcprouter.com" set luci.diag.getip="ip.openmptcprouter.com"
commit luci commit luci