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

Add OpenMPTCProuter status view

This commit is contained in:
Ycarus 2018-03-28 10:57:02 +02:00
parent 8b4c845a9e
commit 144e0f45b9
15 changed files with 787 additions and 3 deletions

View file

@ -1,3 +1,6 @@
local tools = require "luci.tools.status"
local sys = require "luci.sys"
local json = require("luci.json")
local ucic = uci.cursor()
module("luci.controller.openmptcprouter", package.seeall)
@ -5,8 +8,11 @@ function index()
-- entry({"admin", "openmptcprouter"}, firstchild(), _("OpenMPTCProuter"), 19).index = true
-- entry({"admin", "openmptcprouter", "wizard"}, template("openmptcprouter/wizard"), _("Wizard"), 1).leaf = true
-- entry({"admin", "openmptcprouter", "wizard_add"}, post("wizard_add")).leaf = true
entry({"admin", "system", "openmptcprouter"}, template("openmptcprouter/wizard"), _("Settings Wizard"), 1)
entry({"admin", "system", "openmptcprouter"}, alias("admin", "system", "openmptcprouter", "wizard"), _("OpenMPTCProuter"))
entry({"admin", "system", "openmptcprouter", "wizard"}, template("openmptcprouter/wizard"), _("Settings Wizard"), 1)
entry({"admin", "system", "openmptcprouter", "wizard_add"}, post("wizard_add"))
entry({"admin", "system", "openmptcprouter", "status"}, template("openmptcprouter/wanstatus"), _("Status"), 2).leaf = true
entry({"admin", "system", "openmptcprouter", "interfaces_status"}, call("interfaces_status")).leaf = true
end
function wizard_add()
@ -47,6 +53,144 @@ function wizard_add()
ucic:commit("network")
luci.sys.call("(env -i /bin/ubus call network reload) >/dev/null 2>/dev/null")
luci.sys.call("/etc/init.d/glorytun restart >/dev/null 2>/dev/null")
luci.http.redirect(luci.dispatcher.build_url("admin/network/network"))
luci.http.redirect(luci.dispatcher.build_url("admin/system/openmptcprouter/status"))
return
end
-- This function come from OverTheBox by OVH with very small changes
function interfaces_status()
local ut = require "luci.util"
local ntm = require "luci.model.network".init()
local uci = require "luci.model.uci".cursor()
local mArray = {}
-- OpenMPTCProuter info
mArray.openmptcprouter = {}
mArray.openmptcprouter["version"] = ut.trim(sys.exec("cat /etc/os-release | grep VERSION= | sed -e 's:VERSION=::'"))
-- Check that requester is in same network
mArray.openmptcprouter["service_addr"] = uci:get("shadowsocks", "proxy", "server") or "0.0.0.0"
mArray.openmptcprouter["local_addr"] = uci:get("network", "lan", "ipaddr")
mArray.openmptcprouter["wan_addr"] = "0.0.0.0"
-- wanaddr
mArray.openmptcprouter["wan_addr"] = sys.exec("wget -4 -qO- -T 1 http://ip.openmptcprouter.com")
mArray.openmptcprouter["remote_addr"] = luci.http.getenv("REMOTE_ADDR") or ""
mArray.openmptcprouter["remote_from_lease"] = false
local leases=tools.dhcp_leases()
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
-- Check openmptcprouter service are running
mArray.openmptcprouter["tun_service"] = false
if string.find(sys.exec("/usr/bin/pgrep '^(/usr/sbin/)?glorytun(-udp)?$'"), "%d+") then
mArray.openmptcprouter["tun_service"] = true
end
mArray.openmptcprouter["socks_service"] = false
if string.find(sys.exec("/usr/bin/pgrep ss-redir"), "%d+") then
mArray.openmptcprouter["socks_service"] = true
end
-- Add DHCP infos by parsing dnsmasq config file
mArray.openmptcprouter.dhcpd = {}
dnsmasq = ut.trim(sys.exec("cat /var/etc/dnsmasq.conf*"))
for itf, range_start, range_end, mask, leasetime in dnsmasq:gmatch("range=[%w,!:-]*set:(%w+),(%d+\.%d+\.%d+\.%d+),(%d+\.%d+\.%d+\.%d+),(%d+\.%d+\.%d+\.%d+),(%w+)") do
mArray.openmptcprouter.dhcpd[itf] = {}
mArray.openmptcprouter.dhcpd[itf].interface = itf
mArray.openmptcprouter.dhcpd[itf].range_start = range_start
mArray.openmptcprouter.dhcpd[itf].range_end = range_end
mArray.openmptcprouter.dhcpd[itf].netmask = mask
mArray.openmptcprouter.dhcpd[itf].leasetime = leasetime
mArray.openmptcprouter.dhcpd[itf].router = mArray.openmptcprouter["local_addr"]
mArray.openmptcprouter.dhcpd[itf].dns = mArray.openmptcprouter["local_addr"]
end
for itf, option, value in dnsmasq:gmatch("option=(%w+),([%w:-]+),(%d+\.%d+\.%d+\.%d+)") do
if mArray.openmptcprouter.dhcpd[itf] then
if option == "option:router" or option == "6" then
mArray.openmptcprouter.dhcpd[itf].router = value
end
if option == "option:dns-server" or option == "" then
mArray.openmptcprouter.dhcpd[itf].dns = value
end
end
end
-- Parse mptcp kernel info
local mptcp = {}
local fullmesh = ut.trim(sys.exec("cat /proc/net/mptcp_fullmesh"))
for ind, addressId, backup, ipaddr in fullmesh:gmatch("(%d+), (%d+), (%d+), (%d+\.%d+\.%d+\.%d+)") do
mptcp[ipaddr] = {}
mptcp[ipaddr].index = ind
mptcp[ipaddr].id = addressId
mptcp[ipaddr].backup= backup
mptcp[ipaddr].ipaddr= ipaddr
end
-- retrieve core temperature
--mArray.openmptcprouter["core_temp"] = sys.exec("cat /sys/devices/platform/coretemp.0/hwmon/hwmon0/temp2_input 2>/dev/null"):match("%d+")
mArray.openmptcprouter["loadavg"] = sys.exec("cat /proc/loadavg 2>/dev/null"):match("[%d%.]+ [%d%.]+ [%d%.]+")
mArray.openmptcprouter["uptime"] = sys.exec("cat /proc/uptime 2>/dev/null"):match("[%d%.]+")
-- overview status
mArray.wans = {}
mArray.tunnels = {}
uci:foreach("network", "interface", function (section)
local interface = section[".name"]
local net = ntm:get_network(interface)
local ipaddr = net:ipaddr()
local gateway = section['gateway']
local multipath = section['multipath']
--if not ipaddr or not gateway then return end
-- Don't show if0 in the overview
--if interface == "lo" then return end
local ifname = section['ifname']
if multipath == "off" and not ifname:match("^tun.*") then return end
local asn
local connectivity
local multipath_state = ut.trim(sys.exec("multipath " .. ifname .. " | grep deactivated"))
if multipath_state == "" then
connectivity = 'OK'
else
connectivity = 'ERROR'
end
local publicIP = "-"
local latency = "-"
local data = {
label = section['label'] or interface,
name = interface,
link = net:adminlink(),
ifname = ifname,
ipaddr = ipaddr,
gateway = gateway,
multipath = section['multipath'],
status = connectivity,
wanip = publicIP,
latency = latency,
whois = asn and asn.as_description or "unknown",
qos = section['trafficcontrol'],
download = section['download'],
upload = section['upload'],
}
if ifname:match("^tun.*") then
table.insert(mArray.tunnels, data);
else
table.insert(mArray.wans, data);
end
end)
luci.http.prepare_content("application/json")
luci.http.write_json(mArray)
end

View file

@ -0,0 +1,284 @@
<%
-- Copyright 2015 OVH (OverTheBox@ovh.net)
-- Simon Lelievre (simon.lelievre@corp.ovh.com)
-- Sebastien Duponcheel (sebastien.duponcheel@ovh.net)
--
-- This file is part of OverTheBox for OpenWrt.
--
-- OverTheBox is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- OverTheBox is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with OverTheBox. If not, see (http://www.gnu.org/licenses/)
-%>
<%
-- Copyright 2018 Ycarus (Yannick Chabanois) ycarus@zugaina.org
--
-- Small changes to make this work with OpenMPTCProuter
-%>
<%+header%>
<link rel="stylesheet" type="text/css" href="<%=resource%>/openmptcprouter/css/wanstatus.css"/>
<script type="text/javascript" src="<%=resource%>/seedrandom.js"></script>
<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
<script type="text/javascript">//<![CDATA[
XHR.poll(5, '/cgi-bin/luci/admin/system/openmptcprouter/interfaces_status', null,
function(x, mArray)
{
var status = document.getElementById('openmptcprouter_status');
var stepbar = false;
var temp = '<figure class="tree">';
temp += '<ul>';
if (mArray.openmptcprouter)
{
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>'
}
temp += '<li id="networkRootNode"><table><tr><td><a href="#">';
var equipmentIcon = '<img src="<%=resource%>/overthebox.png" style:"top: 0px;" />';
var title = String.format("openmptcprouter (%s)", mArray.openmptcprouter.wan_addr || mArray.openmptcprouter.local_addr);
var statusMessageClass = "";
var statusIcon = "<%=resource%>/openmptcprouter/images/statusOK.png";
var statusMessage = "";
var content = "";
if (mArray.openmptcprouter.version)
{
content += "Version " + mArray.openmptcprouter.version;
content += "<br />";
}
if (mArray.openmptcprouter.loadavg)
{
content += "Load : " + mArray.openmptcprouter.loadavg;
content += "<br />";
}
if (mArray.openmptcprouter.core_temp)
{
content += "Core temp : " + (mArray.openmptcprouter.core_temp / 1000).toFixed(1) + " &#176;";
content += "<br />";
}
if (mArray.openmptcprouter.uptime)
{
var date = new Date(null);
content += "Uptime : " + String.format('%t', mArray.openmptcprouter.uptime);
content += "<br />";
}
if (mArray.openmptcprouter.dhcpd)
{
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)
}
}
else
{
temp += String.format('lan (%s)', mArray.openmptcprouter.local_addr);
}
if (mArray.openmptcprouter.socks_service == false)
{
statusMessage += 'Socks service is not running<br/>';
}
if (mArray.openmptcprouter.tun_service == false)
{
statusMessage += 'TUN service is not running';
}
if(statusMessage !== "")
{
statusMessageClass = "error";
statusIcon = "<%=resource%>/openmptcprouter/images/statusError.png";
}
temp += getNetworkNodeTemplate(equipmentIcon, statusIcon, title, statusMessageClass,statusMessage,content);
temp += '</a></td>'
}
if (mArray.wans)
{
temp += '<td><ul>';
for( var i = 0; i < mArray.wans.length; i++ )
{
// Get link color
mArray.wans[i].color = stringToColour(mArray.wans[i].name)
// Mwan status infos and colors
var stat = '';
var cssc = '';
switch (mArray.wans[i].status)
{
case 'OK':
stat = 'Online';
cssc = 'rgb(144, 240, 144)';
statusIcon = "<%=resource%>/openmptcprouter/images/statusOK.png";
statusMessageClass = "";
statusMessage = "";
break;
case 'ERROR':
stat = 'Offline';
cssc = 'rgb(240, 144, 144)';
statusIcon = "<%=resource%>/openmptcprouter/images/statusError.png";
statusMessageClass = "error";
statusMessage = "";
break;
default:
stat = 'Unknown';
cssc = 'rgb(144, 240, 144)';
statusIcon = "<%=resource%>/openmptcprouter/images/statusWarning.png";
statusMessageClass = "warning";
statusMessage = "";
}
// Populate info
var wanip = mArray.wans[i].wanip;
var ipaddr = mArray.wans[i].ipaddr;
var whois = mArray.wans[i].whois;
var multipath = mArray.wans[i].multipath;
var latency = mArray.wans[i].latency;
// Generate template
if(mArray.openmptcprouter.remote_from_lease == true && mArray.wans.length == 1)
{
temp += String.format('<li class="subnode-only-child"><a href="%q">', mArray.wans[i].link);
}else{
temp += String.format('<li><a href="%q">', mArray.wans[i].link);
}
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 + ")";
//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 = String.format('ip address: <strong>%s</strong><br />multipath: %s', ipaddr,multipath);
if(mArray.wans[i].qos && mArray.wans[i].download > 0 && mArray.wans[i].upload > 0)
{
content += String.format('<br />traffic control: %s/%s kbps (%s)', mArray.wans[i].download, mArray.wans[i].upload, mArray.wans[i].qos)
}
temp += getNetworkNodeTemplate(equipmentIcon, statusIcon, title, statusMessageClass,statusMessage,content);
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 += '</li>';
if (mArray.openmptcprouter && mArray.openmptcprouter.remote_from_lease)
temp += '</ul></li>';
// Close tree
temp += '</ul>';
temp += '</figure>';
status.innerHTML = temp;
}
);
function setColorSVG(embed_id, color)
{
var embed = document.getElementById(embed_id);
try {
svg = embed.getSVGDocument ? embed.getSVGDocument() : embed.contentDocument;
}
catch(e) {
svg = document.embeds[embed_id].getSVGDocument();
}
if(svg)
{
var back = svg.getElementById('backgound_modem');
back.setAttribute('style', 'fill: ' + color + ';fill-opacity:0.6;');
}
}
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);
}
function stringToColour(str) {
if(str == "wan1")
return "BlueViolet";
if(str == "wan2")
return "DeepSkyBlue";
if(str == "wan3")
return "LightGreen";
if(str == "wan4")
return "PowderBlue";
if(str == "wan5")
return "PaleGreen";
if(str == "wan6")
return "YellowGreen";
if(str == "wan7")
return "SeaGreen";
if(str == "wan8")
return "SteelBlue";
// Generate a color folowing the name
Math.seedrandom(str);
var rand = Math.random() * Math.pow(255,3);
Math.seedrandom(); // don't leave a non-random seed in the generator
for (var i = 0, colour = "#"; i < 3; colour += ("00" + ((rand >> i++ * 8) & 0xFF).toString(16)).slice(-2));
return colour;
}
//]]></script>
<h2><%:Network overview%></h2>
<fieldset id="interface_field" class="cbi-section">
<!-- <legend><%:Network overview%></legen> -->
<div id="openmptcprouter_status"></div>
</fieldset>
<%+footer%>