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

Change wizard interface, add VPS admin support,...

This commit is contained in:
Ycarus 2018-11-27 15:21:47 +01:00
parent 7f8f15b6fa
commit 0c54e920d8
11 changed files with 402 additions and 238 deletions

View file

@ -1,73 +0,0 @@
<%+header%>
<%
local uci = require("luci.model.uci").cursor()
local sys = require "luci.sys"
local ifaces = sys.net:devices()
local net = require "luci.model.network".init()
%>
<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_mptcp(interface)
{
var trace = document.getElementById('tracebox');
if (trace)
{
trace.innerHTML =
'<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" /> ' + '<%:Waiting for command to complete...%>'
;
stxhr.post('<%=url('admin/system/openmptcprouter')%>/mptcp_check_trace/' + interface, { token: '<%=token%>' },
function(x)
{
if (x.responseText)
{
trace.innerHTML = String.format('<pre>%s</pre>', x.responseText );
} else {
trace.innerHTML = '<pre><%:Error%></pre>';
}
}
);
}
}
//]]></script>
<% if stderr and #stderr > 0 then %><pre class="error"><%=pcdata(stderr)%></pre><% end %>
<form class="inline" method="post" action="<%=url('admin/system/openmptcprouter/mptcp_check_trace')%>">
<div class="cbi-map">
<h2 name="content"><%:MPTCP Support Check%></h2>
<div class="cbi-map-descr"><%:Check if MPTCP between interface and server is working.%></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"><%:Interface%></label>
<div class="cbi-value-field">
<select class="cbi-input-select" name="interface" size="1">
<%
for _, iface in ipairs(net:get_networks()) do
local ifname = iface:name()
local multipath = uci:get("network",ifname,"multipath")
if multipath ~= "off" then
%>
<option value="<%=ifname%>"><%=ifname%></option>
<%
end
end
%>
</select>
</div>
</div>
<input type="button" value="<%:Test%>" class="cbi-button cbi-button-apply" onclick="update_mptcp(this.form.interface.value)" />
</fieldset>
</div>
</form>
<div class="cbi-section">
<span id="tracebox"></span>
</div>
<%+footer%>

View file

@ -5,6 +5,26 @@
<div class="cbi-map">
<h2 name="content"><%:Advanced Settings%></h2>
<fieldset class="cbi-section" id="networks">
<legend><%:VPS settings%></legend>
<div class="cbi-section-descr"></div>
<div class="cbi-value">
<label class="cbi-value-title"><%:Redirects all ports from VPS to OpenMPTCProuter%></label>
<div class="cbi-value-field">
<input type="checkbox" name="redirect_ports" class="cbi-input-checkbox" value="1" <% if luci.model.uci.cursor():get("openmptcprouter","vps","redirect_ports") == "1" then %>checked<% end %>>
</div>
</div>
<div class="cbi-value">
<label class="cbi-value-title"><%:Enable ShadowSocks OBFS%></label>
<div class="cbi-value-field">
<input type="checkbox" name="obfs" class="cbi-input-checkbox" value="1" <% if luci.model.uci.cursor():get("shadowsocks-libev","tracker","obfs") == "1" then %>checked<% end %>>
<br />
<div class="cbi-value-description">
<%:OBFS will be enabled on both side%>
</div>
</div>
</div>
</fieldset>
<fieldset class="cbi-section" id="networks">
<legend><%:Networks settings%></legend>
<div class="cbi-section-descr"></div>
<div class="cbi-value">
@ -35,16 +55,6 @@
</div>
</div>
</div>
<div class="cbi-value">
<label class="cbi-value-title"><%:Enable ShadowSocks OBFS%></label>
<div class="cbi-value-field">
<input type="checkbox" name="obfs" class="cbi-input-checkbox" value="1" <% if luci.model.uci.cursor():get("shadowsocks-libev","tracker","obfs") == "1" then %>checked<% end %>>
<br />
<div class="cbi-value-description">
<%:OBFS must be enabled on VPS%>
</div>
</div>
</div>
</fieldset>
<% if nixio.fs.access("/sys/devices/system/cpu/cpufreq/policy0/scaling_min_freq") then %>
<fieldset class="cbi-section" id="system">

View file

@ -22,7 +22,13 @@
-- Copyright 2018 Ycarus (Yannick Chabanois) ycarus@zugaina.org
--
-- Small changes to make this work with OpenMPTCProuter
-- New features: DNS detection, IPv6 route received,...
-- New features:
-- * DNS detection
-- * IPv6 route received
-- * latest version available
-- * MPTCP server status
-- * Server status, errors,icon,...
-- * Many tests
-%>
<%+header%>
<link rel="stylesheet" type="text/css" href="<%=resource%>/openmptcprouter/css/wanstatus.css?v=git-18.120.38690-2678b12"/>
@ -37,35 +43,45 @@
{
mArray.openmptcprouter.wan_addr=replaceLastNChars(mArray.openmptcprouter.wan_addr,"x",6);
mArray.openmptcprouter.wan_addr6=replaceLastNChars(mArray.openmptcprouter.wan_addr6,"x",10);
mArray.openmptcprouter.service_addr=replaceLastNChars(mArray.openmptcprouter.service_addr,"x",6);
}
var status = document.getElementById('openmptcprouter_status');
var stepbar = false;
var temp = '<figure class="tree">';
temp += '<ul>';
if (mArray.openmptcprouter)
{
temp += '<li class="remote-from-lease">';
temp += '<a href="#">';
var equipmentIcon = '<img src="<%=resource%>/computer.png" />';
if (mArray.openmptcprouter.remote_from_lease)
{
if (stepbar)
stepbar.securedNetwork.status = "done";
temp += '<li class="remote-from-lease">';
temp += '<a href="#">';
var equipmentIcon = '<img src="<%=resource%>/computer.png" />';
var title = String.format('<br /><strong>%s (%s)</strong>', mArray.openmptcprouter.remote_hostname ? mArray.openmptcprouter.remote_hostname : 'You', mArray.openmptcprouter.remote_addr)
var statusMessageClass = "";
var statusIcon = "<%=resource%>/openmptcprouter/images/statusOK.png";
var statusMessage = "";
var content = "";
temp += getNetworkNodeTemplate(equipmentIcon, statusIcon, title, statusMessageClass,statusMessage,content);
temp += '</a>'
} else {
var title = String.format("You (%s)", mArray.openmptcprouter.remote_addr);
var statusMessageClass = "warning";
var statusIcon = "<%=resource%>/openmptcprouter/images/statusWarning.png";
var statusMessage = "Your IP was not leased by openmptcprouter";
}
var content = "";
temp += '<li id="networkRootNode"><table><tr><td><a href="#">';
temp += getNetworkNodeTemplate(equipmentIcon, statusIcon, title, statusMessageClass,statusMessage,content);
temp += '</a>';
temp += '<li id="networkRootNode"><table><tr><td><table>';
if (mArray.wans)
{
for( var j = 0; j < mArray.wans.length; j++ )
{
temp += '<tr class="space"><td></td></tr>';
}
}
temp += '<tr><td></td></tr><tr><td><a href="#" id="omr">';
var equipmentIcon = '<img src="<%=resource%>/overthebox.png" style:"top: 0px;" />';
var title = String.format("openmptcprouter (%s)", mArray.openmptcprouter.wan_addr || mArray.openmptcprouter.ss_addr || mArray.openmptcprouter.local_addr);
var title = String.format("OpenMPTCProuter (%s)", mArray.openmptcprouter.local_addr);
var statusMessageClass = "";
var statusIcon = "<%=resource%>/openmptcprouter/images/statusOK.png";
var statusMessage = "";
@ -75,7 +91,7 @@
{
//content += "Version " + mArray.openmptcprouter.version.replace(/\"/g,'');
content += "Version " + mArray.openmptcprouter.version;
if (mArray.openmptcprouter.latest_version_omr != mArray.openmptcprouter.version)
if (mArray.openmptcprouter.latest_version_omr != mArray.openmptcprouter.version && mArray.openmptcprouter.latest_version_omr != "")
{
content += "<br><i>(Latest available version " + mArray.openmptcprouter.latest_version_omr + ")</i>";
}
@ -101,45 +117,27 @@
{
for ( dhcpd in mArray.openmptcprouter.dhcpd )
{
if (stepbar)
stepbar.dhcp.status = "done"
var dhcp = mArray.openmptcprouter.dhcpd[dhcpd];
content += String.format('<span style="text-transform:capitalize;">%s</span> address: %s<br />', dhcp.interface, dhcp.router)
content += String.format('<span style="text-transform:capitalize;">%s</span> range: %s - %s<br />', dhcp.interface, dhcp.range_start, dhcp.range_end)
content += String.format('<span style="text-transform:capitalize;">%s</span> address: %s<br />', dhcp.interface, dhcp.router);
content += String.format('<span style="text-transform:capitalize;">%s</span> range: %s - %s<br />', dhcp.interface, dhcp.range_start, dhcp.range_end);
}
}
else
{
temp += String.format('lan (%s)', mArray.openmptcprouter.local_addr);
}
if (mArray.openmptcprouter.socks_service_enabled == true) {
if (mArray.openmptcprouter.socks_service_enabled == true)
{
if (mArray.openmptcprouter.socks_service == false)
{
statusMessage += 'ShadowSocks is not running<br/>';
}
if (mArray.openmptcprouter.server_mptcp == "disabled")
{
statusMessage += 'MPTCP may not be enabled on the server<br/>';
}
}
if (mArray.openmptcprouter.tun_service == false)
{
statusMessage += 'GloryTUN is not running<br/>';
}
if (mArray.openmptcprouter.wan_addr == "" && mArray.openmptcprouter.ss_addr == "")
{
statusMessage += 'No VPS IP address, No WAN IP address<br/>';
}
if (mArray.openmptcprouter.dns == false)
{
statusMessage += 'DNS issue: can\'t resolve hostname<br/>';
}
if (mArray.openmptcprouter.wan_addr6)
{
content += "IPv6: " + mArray.openmptcprouter.wan_addr6;
content += "<br />";
}
if(statusMessage !== "")
{
@ -152,7 +150,7 @@
} else if (mArray.openmptcprouter.ss_addr == "")
{
statusMessage += 'Can\'t get public IP address from ShadowSocks<br/>';
}
}
if (mArray.openmptcprouter.tun_state == "DOWN")
{
statusMessage += 'VPN tunnel DOWN<br/>';
@ -174,7 +172,65 @@
}
}
temp += getNetworkNodeTemplate(equipmentIcon, statusIcon, title, statusMessageClass,statusMessage,content);
temp += '</a></td>'
temp += '</a>';
temp += '</td></tr>';
temp += '<tr><td><div class="vertdash" ></div></td></tr>';
temp += '<tr><td>';
temp += '<a href="#" id="omr-vps">';
var statusIcon = "<%=resource%>/openmptcprouter/images/statusOK.png";
var equipmentIcon = '<img src="<%=resource%>/server.png" />';
if (mArray.openmptcprouter.wan_addr == mArray.openmptcprouter.service_addr)
{
var title = String.format("OpenMPTCProuter Server (%s)", mArray.openmptcprouter.wan_addr);
} else if (mArray.openmptcprouter.wan_addr !== "")
{
var title = String.format("Direct output (%s)", mArray.openmptcprouter.wan_addr);
} else {
var title = "No output";
}
content = "";
statusMessage = "";
if (mArray.openmptcprouter.vps_status == "DOWN")
{
statusMessage += 'Can\'t ping server<br/>';
}
if (mArray.openmptcprouter.wan_addr == "" && mArray.openmptcprouter.ss_addr == "")
{
statusMessage += 'No VPS IP address, No WAN IP address<br/>';
}
if (mArray.openmptcprouter.socks_service_enabled == true && mArray.openmptcprouter.ss_addr == "")
{
statusMessage += 'Can\'t get public IP address from ShadowSocks<br/>';
}
if (statusMessage !== "")
{
statusMessageClass = "error";
statusIcon = "<%=resource%>/openmptcprouter/images/statusError.png";
}
if (mArray.openmptcprouter.vps_omr_version)
{
content += "Version " + mArray.openmptcprouter.vps_omr_version;
if (mArray.openmptcprouter.latest_version_vps !== mArray.openmptcprouter.vps_omr_version && mArray.openmptcprouter.latest_version_vps !== "")
{
content += "<br><i>(Latest available version " + mArray.openmptcprouter.latest_version_vps + ")</i>";
}
}
if (mArray.openmptcprouter.server_mptcp == "disabled")
{
statusMessage += 'MPTCP may not be enabled on the server<br/>';
statusMessageClass = "warning";
statusIcon = "<%=resource%>/openmptcprouter/images/statusWarning.png";
}
if (mArray.openmptcprouter.wan_addr6)
{
content += "IPv6: " + mArray.openmptcprouter.wan_addr6;
content += '<br />';
}
content += '<br />';
temp += getNetworkNodeTemplate(equipmentIcon, statusIcon, title, statusMessageClass,statusMessage,content);
temp += '</a></td></tr></table>';
temp += '</td>';
}
if (mArray.wans)
{
@ -241,7 +297,12 @@
}
var equipmentIcon = String.format('<embed id="modem_%s" onload="setColorSVG(\'modem_%s\', \'%s\')" src="<%=resource%>/modem.svg" />', mArray.wans[i].name, mArray.wans[i].name, mArray.wans[i].color);
var title = mArray.wans[i].label + " (" + mArray.wans[i].gateway + ")";
if (mArray.wans[i].gateway !== "")
{
var title = mArray.wans[i].label + " (" + mArray.wans[i].gateway + ")";
} else {
var title = mArray.wans[i].label;
}
//var content = String.format('%s<br />wan address: <strong>%s</strong><br />whois: %s<br />latency: %s ms<br />multipath: %s', stat, wanip, whois, latency, multipath);
var content = "";
if(wanip !== '')
@ -305,37 +366,10 @@
temp += '</a></li>';
}
// Check
if (mArray.openmptcprouter && mArray.openmptcprouter.remote_from_lease == false)
{
if (stepbar)
{
stepbar.securedNetwork.status = "doing";
}
temp += '<li>';
temp += '<a href="#">';
var equipmentIcon = '<img src="<%=resource%>/computer.png" />';
var title = String.format("You (%s)", mArray.openmptcprouter.remote_addr);
var statusMessageClass = "warning";
var statusIcon = "<%=resource%>/openmptcprouter/images/statusWarning.png";
var statusMessage = "Your IP was not leased by openmptcprouter";
//var content = "Please unplug and plug your ethernet cable or turn off and on your Wifi";
var content = ""
temp += getNetworkNodeTemplate(equipmentIcon, statusIcon, title, statusMessageClass,statusMessage,content);
temp += '</a></li>';
}
temp += '</ul></td></tr></table>';
temp += '</ul></td>';
temp += '</tr></table>';
}
temp += '</li>';
if (mArray.openmptcprouter && mArray.openmptcprouter.remote_from_lease)
temp += '</ul></li>';
// Close tree
temp += '</ul>';
temp += '</figure>';
@ -361,18 +395,18 @@
function getNetworkNodeTemplate(equipmentIcon, statusIcon, title, statusMessageClass, statusMessage, content)
{
return String.format( '<div class="network-node">' +
'<div class="equipment-icon">%s</div>' +
'<div class="status-icon"><img src="%s" /></div>' +
'<div class="info">' +
'<div class="title">%s</div>' +
'<div class="status-message %s">%s</div>' +
'<div class="content">%s</div>' +
'<div class="clear"></div>' +
'</div>' +
'<div class="clear"></div>' +
'</div>',
equipmentIcon, statusIcon, title, statusMessageClass, statusMessage, content);
return String.format('<div class="network-node">' +
'<div class="equipment-icon">%s</div>' +
'<div class="status-icon"><img src="%s" /></div>' +
'<div class="info">' +
'<div class="title">%s</div>' +
'<div class="status-message %s">%s</div>' +
'<div class="content">%s</div>' +
'<div class="clear"></div>' +
'</div>' +
'<div class="clear"></div>' +
'</div>',
equipmentIcon, statusIcon, title, statusMessageClass, statusMessage, content);
}
function stringToColour(str) {

View file

@ -33,13 +33,22 @@ 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/openmptcprouter/wizard_add')%>" enctype="multipart/form-data">
<div class="cbi-map">
<h2 name="content"><%:Wizard%></h2>
<fieldset class="cbi-section" id="server">
<legend><%:Server settings%></legend>
<legend><%:Server settings%></legend>
<div class="cbi-section-descr"><%:Put the values given by OpenMPTCProuter VPS script.%></div>
<div class="cbi-value cbi-value-last" id="server_ip" data-depends="[]" data-index="0">
<label class="cbi-value-title" for="server_ip"><%:Server IP%></label>
@ -66,16 +75,58 @@ end
</div>
</div>
<br />
<div class="cbi-value">
<label class="cbi-value-title"><%:Enable IPv6%></label>
<div class="cbi-value-field">
<input class="cbi-input-checkbox" type="checkbox" name="enableipv6" value="1" <% if tonumber((luci.sys.exec("sysctl net.ipv6.conf.all.disable_ipv6")):match(" %d+")) == 0 then %>checked<% end %> />
<br />
<div class="cbi-value-description">
<%:You should disable IPv6 here if server doesn't provide IPv6.%>
</div>
</div>
</div>
<br />
<div class="cbi-value">
<label class="cbi-value-title"><%:OpenMPTCProuter VPS key%></label>
<div class="cbi-value-field">
<input type="text" name="openmptcprouter_vps_key" placeholder="OpenMPTCProuter VPS key" class="cbi-input-text" value="<%=uci:get("openmptcprouter","vps","password")%>" data-type="base64">
<br />
<div class="cbi-value-description">
<%:Key to configure and retrieve others keys from OpenMPTCProuter VPS. Empty to disable.%>
</div>
</div>
</div>
<div class="cbi-value">
<label class="cbi-value-title"><%:Advanced settings%></label>
<div class="cbi-value-field">
<input type="checkbox" class="cbi-input-checkbox" id="showadv" value="1" onclick="jsshowadv()" />
</div>
</div>
</fieldset>
<span id="advancedsettings" style="display:none;">
<fieldset class="cbi-section" id="shadowsocks">
<legend><%:ShadowSocks settings%></legend>
<div class="cbi-section-descr"><%:By default ShadowSocks is used for TCP traffic.%></div>
<div class="cbi-value">
<label class="cbi-value-title"><%:ShadowSocks key%></label>
<div class="cbi-value-field">
<input type="text" name="shadowsocks_key" placeholder="ShadowSocks key" class="cbi-input-text" value="<%=uci:get("shadowsocks-libev","sss0","key")%>" data-type="base64">
<br />
<div class="cbi-value-description">
<%:ShadowSocks is used for TCP. Empty to disable.%>
<%:ShadowSocks is used for TCP.%>
</div>
</div>
</div>
<div class="cbi-value">
<label class="cbi-value-title"><%:Disable ShadowSocks%></label>
<div class="cbi-value-field">
<input class="cbi-input-checkbox" type="checkbox" name="disableshadowsocks" value="1" <% if uci:get("shadowsocks-libev","sss0","disabled") == 1 then %>checked<% end %> />
</div>
</div>
</fieldset>
<fieldset class="cbi-section" id="vpn">
<legend><%:VPN settings%></legend>
<div class="cbi-section-descr"><%:By default VPN is used for any traffic that is not TCP.%></div>
<% if nixio.fs.access("/usr/sbin/glorytun") or nixio.fs.access("/usr/sbin/glorytun-udp") then %>
<div class="cbi-value">
<label class="cbi-value-title"><%:Glorytun key%></label>
@ -129,17 +180,8 @@ end
</div>
</div>
</div>
<div class="cbi-value">
<label class="cbi-value-title"><%:Enable IPv6%></label>
<div class="cbi-value-field">
<input class="cbi-input-checkbox" type="checkbox" name="enableipv6" value="1" <% if tonumber((luci.sys.exec("sysctl net.ipv6.conf.all.disable_ipv6")):match(" %d+")) == 0 then %>checked<% end %> />
<br />
<div class="cbi-value-description">
<%:You should disable IPv6 here if server doesn't provide IPv6.%>
</div>
</div>
</div>
</fieldset>
</span>
<fieldset class="cbi-section" id="interfaces">
<legend><%:Interfaces settings%></legend>
<div class="cbi-section-descr"><%:You must disable DHCP on your modems and set IP in different networks.%></div>
@ -155,26 +197,40 @@ end
<h3><%=ifname%></h3>
<fieldset class="cbi-section-node" id="cbi-openmptcprouter-<%=ifname%>">
<input type="hidden" name="intf.<%=ifname%>" value="<%=ifname%>" />
<div class="cbi-value">
<div class="cbi-value" id="cbi-network-<%=ifname%>-proto" data-index="1">
<label class="cbi-value-title"><%:Protocol%></label>
<div class="cbi-value-field">
<select class="cbi-input-select" data-update="change" id="cbid.network.<%=ifname%>.proto" name="cbid.network.<%=ifname%>.proto" size="1">
<option id="cbid.network.<%=ifname%>.proto-static" value="static"<% if uci:get("network",ifname,"proto") == "static" then %>selected="selected"<% end %>><%:Static address%></option>
<option id="cbid.network.<%=ifname%>.proto-dhcp" value="dhcp"<% if uci:get("network",ifname,"proto") == "dhcp" then %>selected="selected"<% end %>><%:DHCP%></option>
<option id="cbid.network.<%=ifname%>.proto-other" value="other"<% if uci:get("network",ifname,"proto") ~= "static" and uci:get("network",ifname,"proto") ~= "dhcp" then %>selected="selected"<% end %>><%:Other%></option>
</select>
<br />
<div class="cbi-value-description">
<%:You can use DHCP if you have multiple real ethernet ports. Select other if you want to use another protocol available in Network Interfaces page.%>
</div>
</div>
</div>
<div class="cbi-value" id="cbi-network-<%=ifname%>-address" data-depends="[{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;static&#34;}]" data-index="2">
<label class="cbi-value-title"><%:IPv4 address%></label>
<div class="cbi-value-field">
<input type="text" name="cbid.network.<%=ifname%>.ipaddr" class="cbi-input-text" value="<%=uci:get("network",ifname,"ipaddr")%>" data-type="ip4addr">
<input type="text" id="cbid.network.<%=ifname%>.ipaddr" name="cbid.network.<%=ifname%>.ipaddr" class="cbi-input-text" value="<%=uci:get("network",ifname,"ipaddr")%>" data-type="ip4addr">
<br />
<div class="cbi-value-description">
<%:Set an IP in the same network as the modem%>
</div>
</div>
</div>
<div class="cbi-value">
<div class="cbi-value" id="cbi-network-<%=ifname%>-netmask" data-depends="[{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;static&#34;}]" data-index="3">
<label class="cbi-value-title"><%:IPv4 netmask%></label>
<div class="cbi-value-field">
<input type="text" name="cbid.network.<%=ifname%>.netmask" class="cbi-input-text" value="<%=uci:get("network",ifname,"netmask") or "255.255.255.0"%>" data-type="ip4addr">
<input type="text" id="cbid.network.<%=ifname%>.netmask" name="cbid.network.<%=ifname%>.netmask" class="cbi-input-text" value="<%=uci:get("network",ifname,"netmask") or "255.255.255.0"%>" data-type="ip4addr">
</div>
</div>
<div class="cbi-value">
<div class="cbi-value" id="cbi-network-<%=ifname%>-gateway" data-depends="[{&#34;cbid.network.<%=ifname%>.proto&#34;:&#34;static&#34;}]" data-index="4">
<label class="cbi-value-title"><%:IPv4 gateway%></label>
<div class="cbi-value-field">
<input type="text" name="cbid.network.<%=ifname%>.gateway" class="cbi-input-text" value="<%=uci:get("network",ifname,"gateway")%>" data-type="ip4addr">
<input type="text" id="cbid.network.<%=ifname%>.gateway" name="cbid.network.<%=ifname%>.gateway" class="cbi-input-text" value="<%=uci:get("network",ifname,"gateway")%>" data-type="ip4addr">
<br />
<div class="cbi-value-description">
<%:Set here IP of the modem%>
@ -192,7 +248,7 @@ end
upload = uci:get("qos",ifname,"upload")
end
%>
<div class="cbi-value">
<div class="cbi-value" data-index="5">
<label class="cbi-value-title"><%:Download speed (Kb/s)%></label>
<div class="cbi-value-field">
<input type="text" name="cbid.sqm.<%=ifname%>.download" class="cbi-input-text" value="<%=download%>" data-type="uinteger">
@ -202,7 +258,7 @@ end
</div>
</div>
</div>
<div class="cbi-value">
<div class="cbi-value" data-index="6">
<label class="cbi-value-title"><%:Upload speed (Kb/s)%></label>
<div class="cbi-value-field">
<input type="text" name="cbid.sqm.<%=ifname%>.upload" class="cbi-input-text" value="<%=upload%>" data-type="uinteger">