Merge pull request #1526 from TDT-AG/pr/20180111-luci-app-mwan3-refactoring
authorHannu Nyman <hannu.nyman@iki.fi>
Thu, 11 Jan 2018 14:46:24 +0000 (16:46 +0200)
committerGitHub <noreply@github.com>
Thu, 11 Jan 2018 14:46:24 +0000 (16:46 +0200)
luci-app-mwan3: refactoring

27 files changed:
applications/luci-app-mwan3/luasrc/controller/mwan3.lua
applications/luci-app-mwan3/luasrc/model/cbi/mwan/advanced_hotplugscript.lua [deleted file]
applications/luci-app-mwan3/luasrc/model/cbi/mwan/advanced_mwanconfig.lua [deleted file]
applications/luci-app-mwan3/luasrc/model/cbi/mwan/advanced_networkconfig.lua [deleted file]
applications/luci-app-mwan3/luasrc/model/cbi/mwan/advanced_wirelessconfig.lua [deleted file]
applications/luci-app-mwan3/luasrc/model/cbi/mwan/interface.lua
applications/luci-app-mwan3/luasrc/model/cbi/mwan/interfaceconfig.lua
applications/luci-app-mwan3/luasrc/model/cbi/mwan/member.lua
applications/luci-app-mwan3/luasrc/model/cbi/mwan/memberconfig.lua
applications/luci-app-mwan3/luasrc/model/cbi/mwan/notify.lua [new file with mode: 0644]
applications/luci-app-mwan3/luasrc/model/cbi/mwan/policy.lua
applications/luci-app-mwan3/luasrc/model/cbi/mwan/policyconfig.lua
applications/luci-app-mwan3/luasrc/model/cbi/mwan/rule.lua
applications/luci-app-mwan3/luasrc/model/cbi/mwan/ruleconfig.lua
applications/luci-app-mwan3/luasrc/view/mwan/advanced_diagnostics.htm [deleted file]
applications/luci-app-mwan3/luasrc/view/mwan/advanced_hotplugscript.htm [deleted file]
applications/luci-app-mwan3/luasrc/view/mwan/advanced_mwanconfig.htm [deleted file]
applications/luci-app-mwan3/luasrc/view/mwan/advanced_networkconfig.htm [deleted file]
applications/luci-app-mwan3/luasrc/view/mwan/advanced_troubleshooting.htm [deleted file]
applications/luci-app-mwan3/luasrc/view/mwan/advanced_wirelessconfig.htm [deleted file]
applications/luci-app-mwan3/luasrc/view/mwan/openwrt_overview_status.htm
applications/luci-app-mwan3/luasrc/view/mwan/overview_detailed.htm [deleted file]
applications/luci-app-mwan3/luasrc/view/mwan/overview_interface.htm [deleted file]
applications/luci-app-mwan3/luasrc/view/mwan/status_detail.htm [new file with mode: 0644]
applications/luci-app-mwan3/luasrc/view/mwan/status_diagnostics.htm [new file with mode: 0644]
applications/luci-app-mwan3/luasrc/view/mwan/status_interface.htm [new file with mode: 0644]
applications/luci-app-mwan3/luasrc/view/mwan/status_troubleshooting.htm [new file with mode: 0644]

index c24beda..f429cc6 100644 (file)
@@ -10,59 +10,50 @@ function index()
                return
        end
 
-       entry({"admin", "network", "mwan"},
-               alias("admin", "network", "mwan", "overview"),
+       entry({"admin", "status", "mwan"},
+               alias("admin", "status", "mwan", "overview"),
                _("Load Balancing"), 600)
 
-       entry({"admin", "network", "mwan", "overview"},
-               alias("admin", "network", "mwan", "overview", "overview_interface"),
-               _("Overview"), 10)
-       entry({"admin", "network", "mwan", "overview", "overview_interface"},
-               template("mwan/overview_interface"))
-       entry({"admin", "network", "mwan", "overview", "interface_status"},
+       entry({"admin", "status", "mwan", "overview"},
+               template("mwan/status_interface"))
+       entry({"admin", "status", "mwan", "detail"},
+               template("mwan/status_detail"))
+       entry({"admin", "status", "mwan", "diagnostics"},
+               template("mwan/status_diagnostics"))
+       entry({"admin", "status", "mwan", "troubleshooting"},
+               template("mwan/status_troubleshooting"))
+       entry({"admin", "status", "mwan", "interface_status"},
                call("interfaceStatus"))
-       entry({"admin", "network", "mwan", "overview", "overview_detailed"},
-               template("mwan/overview_detailed"))
-       entry({"admin", "network", "mwan", "overview", "detailed_status"},
+       entry({"admin", "status", "mwan", "detailed_status"},
                call("detailedStatus"))
+       entry({"admin", "status", "mwan", "diagnostics_display"},
+               call("diagnosticsData"), nil).leaf = true
+       entry({"admin", "status", "mwan", "troubleshooting_display"},
+               call("troubleshootingData"))
+
+
+       entry({"admin", "network", "mwan"},
+               alias("admin", "network", "mwan", "interface"),
+               _("Load Balancing"), 600)
 
-       entry({"admin", "network", "mwan", "configuration"},
-               alias("admin", "network", "mwan", "configuration", "interface"),
-               _("Configuration"), 20)
-       entry({"admin", "network", "mwan", "configuration", "globals"},
-               cbi("mwan/globalsconfig"),_("Globals"), 5).leaf = true
-       entry({"admin", "network", "mwan", "configuration", "interface"},
+       entry({"admin", "network", "mwan", "globals"},
+               cbi("mwan/globalsconfig"),
+               _("Globals"), 5).leaf = true
+       entry({"admin", "network", "mwan", "interface"},
                arcombine(cbi("mwan/interface"), cbi("mwan/interfaceconfig")),
                _("Interfaces"), 10).leaf = true
-       entry({"admin", "network", "mwan", "configuration", "member"},
+       entry({"admin", "network", "mwan", "member"},
                arcombine(cbi("mwan/member"), cbi("mwan/memberconfig")),
                _("Members"), 20).leaf = true
-       entry({"admin", "network", "mwan", "configuration", "policy"},
+       entry({"admin", "network", "mwan", "policy"},
                arcombine(cbi("mwan/policy"), cbi("mwan/policyconfig")),
                _("Policies"), 30).leaf = true
-       entry({"admin", "network", "mwan", "configuration", "rule"},
+       entry({"admin", "network", "mwan", "rule"},
                arcombine(cbi("mwan/rule"), cbi("mwan/ruleconfig")),
                _("Rules"), 40).leaf = true
-
-       entry({"admin", "network", "mwan", "advanced"},
-               alias("admin", "network", "mwan", "advanced", "hotplugscript"),
-               _("Advanced"), 100)
-       entry({"admin", "network", "mwan", "advanced", "hotplugscript"},
-               form("mwan/advanced_hotplugscript"))
-       entry({"admin", "network", "mwan", "advanced", "mwanconfig"},
-               form("mwan/advanced_mwanconfig"))
-       entry({"admin", "network", "mwan", "advanced", "networkconfig"},
-               form("mwan/advanced_networkconfig"))
-       entry({"admin", "network", "mwan", "advanced", "wirelessconfig"},
-               form("mwan/advanced_wirelessconfig"))
-       entry({"admin", "network", "mwan", "advanced", "diagnostics"},
-               template("mwan/advanced_diagnostics"))
-       entry({"admin", "network", "mwan", "advanced", "diagnostics_display"},
-               call("diagnosticsData"), nil).leaf = true
-       entry({"admin", "network", "mwan", "advanced", "troubleshooting"},
-               template("mwan/advanced_troubleshooting"))
-       entry({"admin", "network", "mwan", "advanced", "troubleshooting_display"},
-               call("troubleshootingData"))
+       entry({"admin", "network", "mwan", "notify"},
+               cbi("mwan/notify"),
+               _("Notification"), 50).leaf = true
 end
 
 function getInterfaceStatus(ruleNumber, interfaceName)
diff --git a/applications/luci-app-mwan3/luasrc/model/cbi/mwan/advanced_hotplugscript.lua b/applications/luci-app-mwan3/luasrc/model/cbi/mwan/advanced_hotplugscript.lua
deleted file mode 100644 (file)
index 1b97080..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
--- ------ hotplug script configuration ------ --
-
-fs = require "nixio.fs"
-ut = require "luci.util"
-
-script = "/etc/mwan3.user"
-
-m5 = SimpleForm("luci", nil)
-       m5:append(Template("mwan/advanced_hotplugscript")) -- highlight current tab
-
-f = m5:section(SimpleSection, nil,
-       translate("This section allows you to modify the content of \"/etc/mwan3.user\".<br />" ..
-       "The file is also preserved during sysupgrade.<br />" ..
-       "<br />" ..
-       "Notes:<br />" ..
-       "This file is interpreted as a shell script.<br />" ..
-       "The first line of the script must be &#34;#!/bin/sh&#34; without quotes.<br />" ..
-       "Lines beginning with # are comments and are not executed.<br />" ..
-       "Put your custom mwan3 action here, they will<br />" ..
-       "be executed with each netifd hotplug interface event<br />" ..
-       "on interfaces for which mwan3 is enabled.<br />" ..
-       "<br />" ..
-       "There are three main environment variables that are passed to this script.<br />" ..
-       "<br />" ..
-       "$ACTION Either \"ifup\" or \"ifdown\"<br />" ..
-       "$INTERFACE Name of the interface which went up or down (e.g. \"wan\" or \"wwan\")<br />" ..
-       "$DEVICE Physical device name which interface went up or down (e.g. \"eth0\" or \"wwan0\")<br />" ..
-       "<br />"))
-
-t = f:option(TextValue, "lines")
-       t.rmempty = true
-       t.rows = 20
-       function t.cfgvalue()
-               return fs.readfile(script)
-       end
-       function t.write(self, section, data) -- format and write new data to script
-               return fs.writefile(script, ut.trim(data:gsub("\r\n", "\n")) .. "\n")
-       end
-
-return m5
diff --git a/applications/luci-app-mwan3/luasrc/model/cbi/mwan/advanced_mwanconfig.lua b/applications/luci-app-mwan3/luasrc/model/cbi/mwan/advanced_mwanconfig.lua
deleted file mode 100644 (file)
index e0a99e8..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
--- ------ mwan configuration ------ --
-
-ut = require "luci.util"
-
-mwanConfig = "/etc/config/mwan3"
-
-
-m5 = SimpleForm("luci", nil)
-       m5:append(Template("mwan/advanced_mwanconfig")) -- highlight current tab
-
-
-f = m5:section(SimpleSection, nil,
-       translate("This section allows you to modify the contents of /etc/config/mwan3"))
-
-t = f:option(TextValue, "lines")
-       t.rmempty = true
-       t.rows = 20
-
-       function t.cfgvalue()
-               return nixio.fs.readfile(mwanConfig) or ""
-       end
-
-       function t.write(self, section, data) -- format and write new data to script
-               return nixio.fs.writefile(mwanConfig, "\n" .. ut.trim(data:gsub("\r\n", "\n")) .. "\n")
-       end
-
-       function f.handle(self, state, data)
-               return true
-       end
-
-
-return m5
diff --git a/applications/luci-app-mwan3/luasrc/model/cbi/mwan/advanced_networkconfig.lua b/applications/luci-app-mwan3/luasrc/model/cbi/mwan/advanced_networkconfig.lua
deleted file mode 100644 (file)
index b93d897..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
--- ------ network configuration ------ --
-
-ut = require "luci.util"
-
-networkConfig = "/etc/config/network"
-
-
-m5 = SimpleForm("networkconf", nil)
-       m5:append(Template("mwan/advanced_networkconfig")) -- highlight current tab
-
-
-f = m5:section(SimpleSection, nil,
-       translate("This section allows you to modify the contents of /etc/config/network"))
-
-t = f:option(TextValue, "lines")
-       t.rmempty = true
-       t.rows = 20
-
-       function t.cfgvalue()
-               return nixio.fs.readfile(networkConfig) or ""
-       end
-
-       function t.write(self, section, data) -- format and write new data to script
-               return nixio.fs.writefile(networkConfig, "\n" .. ut.trim(data:gsub("\r\n", "\n")) .. "\n")
-       end
-
-       function f.handle(self, state, data)
-               return true
-       end
-
-
-return m5
diff --git a/applications/luci-app-mwan3/luasrc/model/cbi/mwan/advanced_wirelessconfig.lua b/applications/luci-app-mwan3/luasrc/model/cbi/mwan/advanced_wirelessconfig.lua
deleted file mode 100644 (file)
index 95e9f7c..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
--- ------ wireless configuration ------ --
-
-ut = require "luci.util"
-
-wirelessConfig = "/etc/config/wireless"
-
-
-m5 = SimpleForm("wirelessconf", nil)
-       m5:append(Template("mwan/advanced_wirelessconfig")) -- highlight current tab
-
-
-f = m5:section(SimpleSection, nil,
-       translate("This section allows you to modify the contents of /etc/config/wireless"))
-
-t = f:option(TextValue, "lines")
-       t.rmempty = true
-       t.rows = 20
-
-       function t.cfgvalue()
-               return nixio.fs.readfile(wirelessConfig) or ""
-       end
-
-       function t.write(self, section, data) -- format and write new data to script
-               return nixio.fs.writefile(wirelessConfig, "\n" .. ut.trim(data:gsub("\r\n", "\n")) .. "\n")
-       end
-
-       function f.handle(self, state, data)
-               return true
-       end
-
-
-return m5
index 5ee5fb3..77198d5 100644 (file)
@@ -114,11 +114,11 @@ mwan_interface = m5:section(TypedSection, "interface", translate("Interfaces"),
        mwan_interface.sectionhead = translate("Interface")
        mwan_interface.sortable = false
        mwan_interface.template = "cbi/tblsection"
-       mwan_interface.extedit = dsp.build_url("admin", "network", "mwan", "configuration", "interface", "%s")
+       mwan_interface.extedit = dsp.build_url("admin", "network", "mwan", "interface", "%s")
        function mwan_interface.create(self, section)
                TypedSection.create(self, section)
                m5.uci:save("mwan3")
-               luci.http.redirect(dsp.build_url("admin", "network", "mwan", "configuration", "interface", section))
+               luci.http.redirect(dsp.build_url("admin", "network", "mwan", "interface", section))
        end
 
 
index a7d7c5a..86e9597 100644 (file)
@@ -89,7 +89,7 @@ interfaceCheck()
 
 m5 = Map("mwan3", translatef("MWAN Interface Configuration - %s", arg[1]),
        interfaceWarnings())
-       m5.redirect = dsp.build_url("admin", "network", "mwan", "configuration", "interface")
+       m5.redirect = dsp.build_url("admin", "network", "mwan", "interface")
 
 
 mwan_interface = m5:section(NamedSection, arg[1], "interface", "")
index efbe8f7..b73ee57 100644 (file)
@@ -16,11 +16,11 @@ mwan_member = m5:section(TypedSection, "member", translate("Members"),
        mwan_member.sectionhead = translate("Member")
        mwan_member.sortable = true
        mwan_member.template = "cbi/tblsection"
-       mwan_member.extedit = ds.build_url("admin", "network", "mwan", "configuration", "member", "%s")
+       mwan_member.extedit = ds.build_url("admin", "network", "mwan", "member", "%s")
        function mwan_member.create(self, section)
                TypedSection.create(self, section)
                m5.uci:save("mwan3")
-               luci.http.redirect(ds.build_url("admin", "network", "mwan", "configuration", "member", section))
+               luci.http.redirect(ds.build_url("admin", "network", "mwan", "member", section))
        end
 
 
index dc2e0da..220c4bd 100644 (file)
@@ -15,7 +15,7 @@ arg[1] = arg[1] or ""
 
 
 m5 = Map("mwan3", translatef("MWAN Member Configuration - %s", arg[1]))
-       m5.redirect = dsp.build_url("admin", "network", "mwan", "configuration", "member")
+       m5.redirect = dsp.build_url("admin", "network", "mwan", "member")
 
 
 mwan_member = m5:section(NamedSection, arg[1], "member", "")
diff --git a/applications/luci-app-mwan3/luasrc/model/cbi/mwan/notify.lua b/applications/luci-app-mwan3/luasrc/model/cbi/mwan/notify.lua
new file mode 100644 (file)
index 0000000..20e86fc
--- /dev/null
@@ -0,0 +1,38 @@
+-- ------ hotplug script configuration ------ --
+
+local fs = require "nixio.fs"
+local ut = require "luci.util"
+script = "/etc/mwan3.user"
+
+m5 = SimpleForm("luci", nil)
+
+f = m5:section(SimpleSection, translate("MWAN Notification"),
+       translate("This section allows you to modify the content of \"/etc/mwan3.user\".<br />" ..
+       "The file is also preserved during sysupgrade.<br />" ..
+       "<br />" ..
+       "Notes:<br />" ..
+       "This file is interpreted as a shell script.<br />" ..
+       "The first line of the script must be &#34;#!/bin/sh&#34; without quotes.<br />" ..
+       "Lines beginning with # are comments and are not executed.<br />" ..
+       "Put your custom mwan3 action here, they will<br />" ..
+       "be executed with each netifd hotplug interface event<br />" ..
+       "on interfaces for which mwan3 is enabled.<br />" ..
+       "<br />" ..
+       "There are three main environment variables that are passed to this script.<br />" ..
+       "<br />" ..
+       "$ACTION Either \"ifup\" or \"ifdown\"<br />" ..
+       "$INTERFACE Name of the interface which went up or down (e.g. \"wan\" or \"wwan\")<br />" ..
+       "$DEVICE Physical device name which interface went up or down (e.g. \"eth0\" or \"wwan0\")<br />" ..
+       "<br />"))
+
+t = f:option(TextValue, "lines")
+t.rmempty = true
+t.rows = 20
+function t.cfgvalue()
+       return fs.readfile(script)
+end
+function t.write(self, section, data)
+       return fs.writefile(script, ut.trim(data:gsub("\r\n", "\n")) .. "\n")
+end
+
+return m5
index 6640564..495b45e 100644 (file)
@@ -45,11 +45,11 @@ mwan_policy = m5:section(TypedSection, "policy", translate("Policies"),
        mwan_policy.sectionhead = translate("Policy")
        mwan_policy.sortable = true
        mwan_policy.template = "cbi/tblsection"
-       mwan_policy.extedit = ds.build_url("admin", "network", "mwan", "configuration", "policy", "%s")
+       mwan_policy.extedit = ds.build_url("admin", "network", "mwan", "policy", "%s")
        function mwan_policy.create(self, section)
                TypedSection.create(self, section)
                m5.uci:save("mwan3")
-               luci.http.redirect(ds.build_url("admin", "network", "mwan", "configuration", "policy", section))
+               luci.http.redirect(ds.build_url("admin", "network", "mwan", "policy", section))
        end
 
 
index feb62dc..cdf6521 100644 (file)
@@ -34,7 +34,7 @@ policyCheck()
 
 m5 = Map("mwan3", translatef("MWAN Policy Configuration - %s", arg[1]),
        policyWarn())
-       m5.redirect = dsp.build_url("admin", "network", "mwan", "configuration", "policy")
+       m5.redirect = dsp.build_url("admin", "network", "mwan", "policy")
 
 
 mwan_policy = m5:section(NamedSection, arg[1], "policy", "")
index 9cb4756..586f174 100644 (file)
@@ -50,11 +50,11 @@ mwan_rule = m5:section(TypedSection, "rule", translate("Traffic Rules"),
        mwan_rule.sectionhead = translate("Rule")
        mwan_rule.sortable = true
        mwan_rule.template = "cbi/tblsection"
-       mwan_rule.extedit = dsp.build_url("admin", "network", "mwan", "configuration", "rule", "%s")
+       mwan_rule.extedit = dsp.build_url("admin", "network", "mwan", "rule", "%s")
        function mwan_rule.create(self, section)
                TypedSection.create(self, section)
                m5.uci:save("mwan3")
-               luci.http.redirect(dsp.build_url("admin", "network", "mwan", "configuration", "rule", section))
+               luci.http.redirect(dsp.build_url("admin", "network", "mwan", "rule", section))
        end
 
 
index cb1b45d..87c4691 100644 (file)
@@ -47,7 +47,7 @@ ruleCheck()
 
 m5 = Map("mwan3", translatef("MWAN Rule Configuration - %s", arg[1]),
        ruleWarn())
-       m5.redirect = dsp.build_url("admin", "network", "mwan", "configuration", "rule")
+       m5.redirect = dsp.build_url("admin", "network", "mwan", "rule")
 
 
 mwan_rule = m5:section(NamedSection, arg[1], "rule", "")
diff --git a/applications/luci-app-mwan3/luasrc/view/mwan/advanced_diagnostics.htm b/applications/luci-app-mwan3/luasrc/view/mwan/advanced_diagnostics.htm
deleted file mode 100644 (file)
index 4483485..0000000
+++ /dev/null
@@ -1,115 +0,0 @@
-<%+header%>
-
-<ul class="cbi-tabmenu">
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/hotplugscript")%>"><%:Hotplug Script%></a></li>
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/mwanconfig")%>"><%:MWAN Config%></a></li>
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/networkconfig")%>"><%:Network Config%></a></li>
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/wirelessconfig")%>"><%:Wireless Config%></a></li>
-       <li class="cbi-tab"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/diagnostics")%>"><%:Diagnostics%></a></li>
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/troubleshooting")%>"><%:Troubleshooting%></a></li>
-</ul>
-
-<%
-       local uci = require "luci.model.uci"
-
-       interfaceNames = ""
-       uci.cursor():foreach("mwan3", "interface",
-               function (section)
-                       interfaceNames = interfaceNames .. section[".name"] .. " "
-               end
-       )
-%>
-
-<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
-<script type="text/javascript">//<![CDATA[
-       var stxhr = new XHR();
-
-       function update_status(tool, task, task_name)
-       {
-               var iface = document.getElementById('mwaniface').value;
-               var output = document.getElementById('diag_output');
-
-               if (tool == "service")
-                       {
-                               output.innerHTML =
-                                       '<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="padding: 20px; vertical-align: middle;" /> ' +
-                                       String.format("<%:Waiting for MWAN to %s...%>", task_name)
-                               ;
-                       }
-                       else
-                       {
-                               output.innerHTML =
-                                       '<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="padding: 20px; vertical-align: middle;" /> ' +
-                                       "<%:Waiting for diagnostic results...%>"
-                               ;
-                       }
-
-               output.parentNode.style.display = 'block';
-               output.style.display = 'inline';
-
-               stxhr.get('<%=luci.dispatcher.build_url("admin", "network", "mwan", "advanced")%>/diagnostics_display' + '/' + iface + '/' + tool + '/' + task, null,
-                       function(x, mArray)
-                       {
-                               if (mArray.diagnostics)
-                               {
-                                       output.innerHTML = String.format('<pre id="diag_output_css">%h</pre>', mArray.diagnostics[0]);
-                               }
-                               else
-                               {
-                                       output.innerHTML = '<pre id="diag_output_css"><strong><%:No diagnostic results returned%></strong></pre>';
-                               }
-                       }
-               );
-       }
-//]]></script>
-
-<div id="mwan_diagnostics" class="cbi-map">
-       <fieldset id="diag_select" class="cbi-section">
-               <legend><%:MWAN Interface Diagnostics%></legend>
-               <select id="mwaniface">
-                       <% for z in interfaceNames:gmatch("[^ ]+") do -%><option value="<%=z%>"><%=z%></option><%- end %>
-               </select>
-               <div id="buttoncss">
-                       <input type="button" value="<%:Ping default gateway%>" class="cbi-button cbi-button-apply" onclick="update_status('ping', 'gateway', null)" />
-                       <input type="button" value="<%:Ping tracking IP%>" class="cbi-button cbi-button-apply" onclick="update_status('ping', 'track_ip', null)" />
-                       <input type="button" value="<%:Check IP rules%>" class="cbi-button cbi-button-apply" onclick="update_status('rulechk', null, null)" />
-                       <input type="button" value="<%:Check routing table%>" class="cbi-button cbi-button-apply" onclick="update_status('routechk', null, null)" />
-                       <input type="button" value="<%:Hotplug ifup%>" class="cbi-button cbi-button-apply" onclick="update_status('hotplug', 'ifup', null)" />
-                       <input type="button" value="<%:Hotplug ifdown%>" class="cbi-button cbi-button-apply" onclick="update_status('hotplug', 'ifdown', null)" />
-               </div>
-       </fieldset>
-       <fieldset id="diag_select" class="cbi-section">
-               <legend><%:MWAN Service Control%></legend>
-               <div id="buttoncss">
-                       <input type="button" value="<%:Restart MWAN%>" class="cbi-button cbi-button-apply" onclick="update_status('service', 'restart', '<%:restart%>')" />
-                       <input type="button" value="<%:Stop MWAN%>" class="cbi-button cbi-button-apply" onclick="update_status('service', 'stop', '<%:stop%>')" />
-                       <input type="button" value="<%:Start MWAN%>" class="cbi-button cbi-button-apply" onclick="update_status('service', 'start', '<%:start%>')" />
-               </div>
-       </fieldset>
-       <fieldset class="cbi-section" style="display:none">
-               <legend><%:Diagnostic Results%></legend>
-               <div id="diag_output"></div>
-       </fieldset>
-</div>
-
-<style type="text/css">
-  #mwaniface {
-       float: left;
-       margin: 8px 20px 0px 0px;
-  }
-  #buttoncss {
-       display: table;
-       float: left;
-       text-align: left;
-  }
-  .cbi-button {
-       margin: 8px 20px 0px 0px;
-       min-width: 153px;
-  }
-  #diag_output_css {
-       padding: 20px;
-       text-align: left;
-  }
-</style>
-
-<%+footer%>
diff --git a/applications/luci-app-mwan3/luasrc/view/mwan/advanced_hotplugscript.htm b/applications/luci-app-mwan3/luasrc/view/mwan/advanced_hotplugscript.htm
deleted file mode 100644 (file)
index 10b4f10..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-<ul class="cbi-tabmenu">
-       <li class="cbi-tab"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/hotplugscript")%>"><%:Hotplug Script%></a></li>
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/mwanconfig")%>"><%:MWAN Config%></a></li>
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/networkconfig")%>"><%:Network Config%></a></li>
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/wirelessconfig")%>"><%:Wireless Config%></a></li>
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/diagnostics")%>"><%:Diagnostics%></a></li>
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/troubleshooting")%>"><%:Troubleshooting%></a></li>
-</ul>
-
-<style type="text/css">
-  .cbi-section {
-       padding: 20px;
-  }
-</style>
diff --git a/applications/luci-app-mwan3/luasrc/view/mwan/advanced_mwanconfig.htm b/applications/luci-app-mwan3/luasrc/view/mwan/advanced_mwanconfig.htm
deleted file mode 100644 (file)
index 20ae603..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-<ul class="cbi-tabmenu">
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/hotplugscript")%>"><%:Hotplug Script%></a></li>
-       <li class="cbi-tab"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/mwanconfig")%>"><%:MWAN Config%></a></li>
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/networkconfig")%>"><%:Network Config%></a></li>
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/wirelessconfig")%>"><%:Wireless Config%></a></li>
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/diagnostics")%>"><%:Diagnostics%></a></li>
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/troubleshooting")%>"><%:Troubleshooting%></a></li>
-</ul>
-
-<style type="text/css">
-  .cbi-section {
-       padding: 20px;
-  }
-</style>
diff --git a/applications/luci-app-mwan3/luasrc/view/mwan/advanced_networkconfig.htm b/applications/luci-app-mwan3/luasrc/view/mwan/advanced_networkconfig.htm
deleted file mode 100644 (file)
index bed4310..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-<ul class="cbi-tabmenu">
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/hotplugscript")%>"><%:Hotplug Script%></a></li>
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/mwanconfig")%>"><%:MWAN Config%></a></li>
-       <li class="cbi-tab"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/networkconfig")%>"><%:Network Config%></a></li>
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/wirelessconfig")%>"><%:Wireless Config%></a></li>
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/diagnostics")%>"><%:Diagnostics%></a></li>
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/troubleshooting")%>"><%:Troubleshooting%></a></li>
-</ul>
-
-<style type="text/css">
-  .cbi-section {
-       padding: 20px;
-  }
-</style>
diff --git a/applications/luci-app-mwan3/luasrc/view/mwan/advanced_troubleshooting.htm b/applications/luci-app-mwan3/luasrc/view/mwan/advanced_troubleshooting.htm
deleted file mode 100644 (file)
index 4174ef4..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-<%+header%>
-
-<ul class="cbi-tabmenu">
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/hotplugscript")%>"><%:Hotplug Script%></a></li>
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/mwanconfig")%>"><%:MWAN Config%></a></li>
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/networkconfig")%>"><%:Network Config%></a></li>
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/wirelessconfig")%>"><%:Wireless Config%></a></li>
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/diagnostics")%>"><%:Diagnostics%></a></li>
-       <li class="cbi-tab"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/troubleshooting")%>"><%:Troubleshooting%></a></li>
-</ul>
-
-<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
-<script type="text/javascript">//<![CDATA[
-       XHR.poll(15, '<%=luci.dispatcher.build_url("admin", "network", "mwan", "advanced", "troubleshooting_display")%>', null,
-               function(x, mArray)
-               {
-                       var tshoot = document.getElementById('troubleshoot_text');
-                       if (mArray.versions)
-                       {
-                               var versions = '<span class="description">Software versions : </span><br /><br />';
-                               var mwanConfig = '<br /><br /><span class="description">Output of &#34;cat /etc/config/mwan3&#34; : </span><br /><br />';
-                               var netConfig = '<br /><br /><span class="description">Output of &#34;cat /etc/config/network&#34; : </span><br /><br />';
-                               var wifiConfig = '<br /><br /><span class="description">Output of &#34;cat /etc/config/wireless&#34; : </span><br /><br />';
-                               var ifconfig = '<br /><br /><span class="description">Output of &#34;ifconfig&#34; : </span><br /><br />';
-                               var ipRoute = '<br /><br /><span class="description">Output of &#34;route -n&#34; : </span><br /><br />';
-                               var ipRuleShow = '<br /><br /><span class="description">Output of &#34;ip rule show&#34; : </span><br /><br />';
-                               var routeListTable = '<br /><br /><span class="description">Output of &#34;ip route list table 1-250&#34; : </span><br /><br />';
-                               var firewallOut = '<br /><br /><span class="description">Firewall default output policy (must be ACCEPT) : </span><br /><br />';
-                               var iptables = '<br /><br /><span class="description">Output of &#34;iptables -L -t mangle -v -n&#34; : </span><br /><br />';
-                               tshoot.innerHTML = String.format(
-                                       '<pre>%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s</pre>',
-                                       versions, mArray.versions[0], mwanConfig, mArray.mwanconfig[0], netConfig, mArray.netconfig[0],
-                                       wifiConfig, mArray.wificonfig[0], ifconfig, mArray.ifconfig[0], ipRoute, mArray.routeshow[0],
-                                       ipRuleShow, mArray.iprule[0], routeListTable, mArray.routelist[0], firewallOut, mArray.firewallout[0],
-                                       iptables, mArray.iptables[0]
-                               );
-                       }
-                       else
-                       {
-                               tshoot.innerHTML = '<strong><%:Error collecting troubleshooting information%></strong>';
-                       }
-               }
-       );
-//]]></script>
-
-<div id="troubleshoot">
-       <fieldset class="cbi-section">
-               <legend><%:Troubleshooting Data%></legend>
-               <div id="troubleshoot_text"><img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" /><%:Collecting data...%></div>
-       </fieldset>
-</div>
-
-<style type="text/css">
-  #troubleshoot_text {
-       padding: 20px;
-       text-align: left;
-  }
-  .description {
-       background-color: rgb(78, 186, 241);
-  }
-</style>
-
-<%+footer%>
diff --git a/applications/luci-app-mwan3/luasrc/view/mwan/advanced_wirelessconfig.htm b/applications/luci-app-mwan3/luasrc/view/mwan/advanced_wirelessconfig.htm
deleted file mode 100644 (file)
index bb18d53..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-<ul class="cbi-tabmenu">
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/hotplugscript")%>"><%:Hotplug Script%></a></li>
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/mwanconfig")%>"><%:MWAN Config%></a></li>
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/networkconfig")%>"><%:Network Config%></a></li>
-       <li class="cbi-tab"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/wirelessconfig")%>"><%:Wireless Config%></a></li>
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/diagnostics")%>"><%:Diagnostics%></a></li>
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/advanced/troubleshooting")%>"><%:Troubleshooting%></a></li>
-</ul>
-
-<style type="text/css">
-  .cbi-section {
-       padding: 20px;
-  }
-</style>
index 7cef063..335c95c 100644 (file)
@@ -1,5 +1,5 @@
 <script type="text/javascript">//<![CDATA[
-       XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "network", "mwan", "overview", "interface_status")%>', null,
+       XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "status", "mwan", "interface_status")%>', null,
                function(x, mArray)
                {
                        var status = document.getElementById('mwan_status_text');
diff --git a/applications/luci-app-mwan3/luasrc/view/mwan/overview_detailed.htm b/applications/luci-app-mwan3/luasrc/view/mwan/overview_detailed.htm
deleted file mode 100644 (file)
index 6a800c3..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-<%+header%>
-
-<ul class="cbi-tabmenu">
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/overview")%>"><%:Interface Status%></a></li>
-       <li class="cbi-tab"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/overview/overview_detailed")%>"><%:Detailed Status%></a></li>
-</ul>
-
-<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
-<script type="text/javascript">//<![CDATA[
-       XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "network", "mwan", "overview", "detailed_status")%>', null,
-               function(x, mArray)
-               {
-                       var status = document.getElementById('mwan_detail_text');
-                       if (mArray.mwandetail)
-                       {
-                               status.innerHTML = String.format('<pre>%s</pre>', mArray.mwandetail[0]);
-                       }
-                       else
-                       {
-                               status.innerHTML = '<strong><%:No detailed status information available%></strong>';
-                       }
-               }
-       );
-//]]></script>
-
-<div id="mwan_detail_status">
-       <fieldset class="cbi-section">
-               <legend><%:MWAN Detailed Status%></legend>
-               <div id="mwan_detail_text"><img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" /><%:Collecting data...%></div>
-       </fieldset>
-</div>
-
-<style type="text/css">
-  #mwan_detail_text {
-       padding: 20px;
-       text-align: left;
-  }
-</style>
-
-<%+footer%>
diff --git a/applications/luci-app-mwan3/luasrc/view/mwan/overview_interface.htm b/applications/luci-app-mwan3/luasrc/view/mwan/overview_interface.htm
deleted file mode 100644 (file)
index 2929a6d..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-<%+header%>
-
-<ul class="cbi-tabmenu">
-       <li class="cbi-tab"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/overview")%>"><%:Interface Status%></a></li>
-       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/network/mwan/overview/overview_detailed")%>"><%:Detailed Status%></a></li>
-</ul>
-
-<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
-<script type="text/javascript">//<![CDATA[
-       XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "network", "mwan", "overview", "interface_status")%>', null,
-               function(x, mArray)
-               {
-                       var statusDiv = document.getElementById('mwan_status_text');
-                       if (mArray.wans)
-                       {
-                               var interfaceStatus = '';
-                               for ( var i = 0; i < mArray.wans.length; i++ )
-                               {
-                                       var status = '';
-                                       var css = '';
-                                       switch (mArray.wans[i].status)
-                                       {
-                                               case 'online':
-                                                       status = '<%:Online (tracking active)%>';
-                                                       css = 'wanon';
-                                                       break;
-                                               case 'notMonitored':
-                                                       status = '<%:Online (tracking off)%>';
-                                                       css = 'wanon';
-                                                       break;
-                                               case 'offline':
-                                                       status = '<%:Offline%>';
-                                                       css = 'wanoff';
-                                                       break;
-                                               case 'notEnabled':
-                                                       status = '<%:Disabled%>';
-                                                       css = 'wanoff';
-                                                       break;
-                                       }
-                                       interfaceStatus += String.format(
-                                               '<span class="%s"><strong>%s (<a href="%q">%s</a>)</strong><br />%s</span>',
-                                               css, mArray.wans[i].name, mArray.wans[i].link, mArray.wans[i].ifname, status
-                                       );
-                               }
-                               statusDiv.innerHTML = interfaceStatus;
-                       }
-                       else
-                       {
-                               statusDiv.innerHTML = '<strong><%:No MWAN interfaces found%></strong>';
-                       }
-
-                       var logs = document.getElementById('mwan_statuslog_text');
-                       if (mArray.mwanlog)
-                       {
-                               var mwanLog = '<%:Last 50 MWAN systemlog entries. Newest entries sorted at the top :%>';
-                               logs.innerHTML = String.format('<pre>%s<br /><br />%s</pre>', mwanLog, mArray.mwanlog[0]);
-                       }
-                       else
-                       {
-                               logs.innerHTML = '<strong><%:No MWAN systemlog history found%></strong>';
-                       }
-               }
-       );
-//]]></script>
-
-<div id="mwan_interface_status">
-       <fieldset id="interface_field" class="cbi-section">
-               <legend><%:MWAN Interface Live Status%></legend>
-               <div id="mwan_status_text"><img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" /><%:Collecting data...%></div>
-       </fieldset>
-       <fieldset class="cbi-section">
-               <legend><%:MWAN Interface Systemlog%></legend>
-               <div id="mwan_statuslog_text"><img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" /><%:Collecting data...%></div>
-       </fieldset>
-</div>
-
-<style type="text/css">
-  #mwan_status_text {
-       display: table;
-       font-size: 14px;
-       margin: auto;
-       max-width: 1044px;
-       min-width: 246px;
-       width: 100%;
-  }
-  .wanon {
-       background-color: rgb(144, 240, 144);
-  }
-  .wanoff {
-       background-color: rgb(240, 144, 144);
-  }
-  .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;
-  }
-  #mwan_statuslog_text {
-       padding: 20px;
-       text-align: left;
-  }
-</style>
-
-<%+footer%>
diff --git a/applications/luci-app-mwan3/luasrc/view/mwan/status_detail.htm b/applications/luci-app-mwan3/luasrc/view/mwan/status_detail.htm
new file mode 100644 (file)
index 0000000..0ff2824
--- /dev/null
@@ -0,0 +1,42 @@
+<%+header%>
+
+<ul class="cbi-tabmenu">
+       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/status/mwan/overview")%>"><%:Interface Status%></a></li>
+       <li class="cbi-tab"><a href="<%=luci.dispatcher.build_url("admin/status/mwan/detail")%>"><%:Detailed Status%></a></li>
+       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/status/mwan/diagnostics")%>"><%:Diagnostics%></a></li>
+       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/status/mwan/troubleshooting")%>"><%:Troubleshooting%></a></li>
+</ul>
+
+<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
+<script type="text/javascript">//<![CDATA[
+       XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "status", "mwan", "detailed_status")%>', null,
+               function(x, mArray)
+               {
+                       var status = document.getElementById('mwan_detail_text');
+                       if (mArray.mwandetail)
+                       {
+                               status.innerHTML = String.format('<pre>%s</pre>', mArray.mwandetail[0]);
+                       }
+                       else
+                       {
+                               status.innerHTML = '<strong><%:No detailed status information available%></strong>';
+                       }
+               }
+       );
+//]]></script>
+
+<div id="mwan_detail_status">
+       <fieldset class="cbi-section">
+               <legend><%:MWAN Detailed Status%></legend>
+               <div id="mwan_detail_text"><img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" /><%:Collecting data...%></div>
+       </fieldset>
+</div>
+
+<style type="text/css">
+  #mwan_detail_text {
+       padding: 20px;
+       text-align: left;
+  }
+</style>
+
+<%+footer%>
diff --git a/applications/luci-app-mwan3/luasrc/view/mwan/status_diagnostics.htm b/applications/luci-app-mwan3/luasrc/view/mwan/status_diagnostics.htm
new file mode 100644 (file)
index 0000000..19433f4
--- /dev/null
@@ -0,0 +1,113 @@
+<%+header%>
+
+<ul class="cbi-tabmenu">
+       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/status/mwan/overview")%>"><%:Interface Status%></a></li>
+       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/status/mwan/detail")%>"><%:Detailed Status%></a></li>
+       <li class="cbi-tab"><a href="<%=luci.dispatcher.build_url("admin/status/mwan/diagnostics")%>"><%:Diagnostics%></a></li>
+       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/status/mwan/troubleshooting")%>"><%:Troubleshooting%></a></li>
+</ul>
+
+<%
+       local uci = require "luci.model.uci"
+
+       interfaceNames = ""
+       uci.cursor():foreach("mwan3", "interface",
+               function (section)
+                       interfaceNames = interfaceNames .. section[".name"] .. " "
+               end
+       )
+%>
+
+<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
+<script type="text/javascript">//<![CDATA[
+       var stxhr = new XHR();
+
+       function update_status(tool, task, task_name)
+       {
+               var iface = document.getElementById('mwaniface').value;
+               var output = document.getElementById('diag_output');
+
+               if (tool == "service")
+                       {
+                               output.innerHTML =
+                                       '<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="padding: 20px; vertical-align: middle;" /> ' +
+                                       String.format("<%:Waiting for MWAN to %s...%>", task_name)
+                               ;
+                       }
+                       else
+                       {
+                               output.innerHTML =
+                                       '<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="padding: 20px; vertical-align: middle;" /> ' +
+                                       "<%:Waiting for diagnostic results...%>"
+                               ;
+                       }
+
+               output.parentNode.style.display = 'block';
+               output.style.display = 'inline';
+
+               stxhr.get('<%=luci.dispatcher.build_url("admin", "status", "mwan")%>/diagnostics_display' + '/' + iface + '/' + tool + '/' + task, null,
+                       function(x, mArray)
+                       {
+                               if (mArray.diagnostics)
+                               {
+                                       output.innerHTML = String.format('<pre id="diag_output_css">%h</pre>', mArray.diagnostics[0]);
+                               }
+                               else
+                               {
+                                       output.innerHTML = '<pre id="diag_output_css"><strong><%:No diagnostic results returned%></strong></pre>';
+                               }
+                       }
+               );
+       }
+//]]></script>
+
+<div id="mwan_diagnostics" class="cbi-map">
+       <fieldset id="diag_select" class="cbi-section">
+               <legend><%:MWAN Interface Diagnostics%></legend>
+               <select id="mwaniface">
+                       <% for z in interfaceNames:gmatch("[^ ]+") do -%><option value="<%=z%>"><%=z%></option><%- end %>
+               </select>
+               <div id="buttoncss">
+                       <input type="button" value="<%:Ping default gateway%>" class="cbi-button cbi-button-apply" onclick="update_status('ping', 'gateway', null)" />
+                       <input type="button" value="<%:Ping tracking IP%>" class="cbi-button cbi-button-apply" onclick="update_status('ping', 'track_ip', null)" />
+                       <input type="button" value="<%:Check IP rules%>" class="cbi-button cbi-button-apply" onclick="update_status('rulechk', null, null)" />
+                       <input type="button" value="<%:Check routing table%>" class="cbi-button cbi-button-apply" onclick="update_status('routechk', null, null)" />
+                       <input type="button" value="<%:Hotplug ifup%>" class="cbi-button cbi-button-apply" onclick="update_status('hotplug', 'ifup', null)" />
+                       <input type="button" value="<%:Hotplug ifdown%>" class="cbi-button cbi-button-apply" onclick="update_status('hotplug', 'ifdown', null)" />
+               </div>
+       </fieldset>
+       <fieldset id="diag_select" class="cbi-section">
+               <legend><%:MWAN Service Control%></legend>
+               <div id="buttoncss">
+                       <input type="button" value="<%:Restart MWAN%>" class="cbi-button cbi-button-apply" onclick="update_status('service', 'restart', '<%:restart%>')" />
+                       <input type="button" value="<%:Stop MWAN%>" class="cbi-button cbi-button-apply" onclick="update_status('service', 'stop', '<%:stop%>')" />
+                       <input type="button" value="<%:Start MWAN%>" class="cbi-button cbi-button-apply" onclick="update_status('service', 'start', '<%:start%>')" />
+               </div>
+       </fieldset>
+       <fieldset class="cbi-section" style="display:none">
+               <legend><%:Diagnostic Results%></legend>
+               <div id="diag_output"></div>
+       </fieldset>
+</div>
+
+<style type="text/css">
+  #mwaniface {
+       float: left;
+       margin: 8px 20px 0px 0px;
+  }
+  #buttoncss {
+       display: table;
+       float: left;
+       text-align: left;
+  }
+  .cbi-button {
+       margin: 8px 20px 0px 0px;
+       min-width: 153px;
+  }
+  #diag_output_css {
+       padding: 20px;
+       text-align: left;
+  }
+</style>
+
+<%+footer%>
diff --git a/applications/luci-app-mwan3/luasrc/view/mwan/status_interface.htm b/applications/luci-app-mwan3/luasrc/view/mwan/status_interface.htm
new file mode 100644 (file)
index 0000000..c7039f7
--- /dev/null
@@ -0,0 +1,110 @@
+<%+header%>
+
+<ul class="cbi-tabmenu">
+       <li class="cbi-tab"><a href="<%=luci.dispatcher.build_url("admin/status/mwan/overview")%>"><%:Interface Status%></a></li>
+       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/status/mwan/detail")%>"><%:Detailed Status%></a></li>
+       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/status/mwan/diagnostics")%>"><%:Diagnostics%></a></li>
+       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/status/mwan/troubleshooting")%>"><%:Troubleshooting%></a></li>
+</ul>
+
+<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
+<script type="text/javascript">//<![CDATA[
+       XHR.poll(5, '<%=luci.dispatcher.build_url("admin", "status", "mwan", "interface_status")%>', null,
+               function(x, mArray)
+               {
+                       var statusDiv = document.getElementById('mwan_status_text');
+                       if (mArray.wans)
+                       {
+                               var interfaceStatus = '';
+                               for ( var i = 0; i < mArray.wans.length; i++ )
+                               {
+                                       var status = '';
+                                       var css = '';
+                                       switch (mArray.wans[i].status)
+                                       {
+                                               case 'online':
+                                                       status = '<%:Online (tracking active)%>';
+                                                       css = 'wanon';
+                                                       break;
+                                               case 'notMonitored':
+                                                       status = '<%:Online (tracking off)%>';
+                                                       css = 'wanon';
+                                                       break;
+                                               case 'offline':
+                                                       status = '<%:Offline%>';
+                                                       css = 'wanoff';
+                                                       break;
+                                               case 'notEnabled':
+                                                       status = '<%:Disabled%>';
+                                                       css = 'wanoff';
+                                                       break;
+                                       }
+                                       interfaceStatus += String.format(
+                                               '<span class="%s"><strong>%s (<a href="%q">%s</a>)</strong><br />%s</span>',
+                                               css, mArray.wans[i].name, mArray.wans[i].link, mArray.wans[i].ifname, status
+                                       );
+                               }
+                               statusDiv.innerHTML = interfaceStatus;
+                       }
+                       else
+                       {
+                               statusDiv.innerHTML = '<strong><%:No MWAN interfaces found%></strong>';
+                       }
+
+                       var logs = document.getElementById('mwan_statuslog_text');
+                       if (mArray.mwanlog)
+                       {
+                               var mwanLog = '<%:Last 50 MWAN systemlog entries. Newest entries sorted at the top :%>';
+                               logs.innerHTML = String.format('<pre>%s<br /><br />%s</pre>', mwanLog, mArray.mwanlog[0]);
+                       }
+                       else
+                       {
+                               logs.innerHTML = '<strong><%:No MWAN systemlog history found%></strong>';
+                       }
+               }
+       );
+//]]></script>
+
+<div id="mwan_interface_status">
+       <fieldset id="interface_field" class="cbi-section">
+               <legend><%:MWAN Interface Live Status%></legend>
+               <div id="mwan_status_text"><img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" /><%:Collecting data...%></div>
+       </fieldset>
+       <fieldset class="cbi-section">
+               <legend><%:MWAN Interface Systemlog%></legend>
+               <div id="mwan_statuslog_text"><img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" /><%:Collecting data...%></div>
+       </fieldset>
+</div>
+
+<style type="text/css">
+  #mwan_status_text {
+       display: table;
+       font-size: 14px;
+       margin: auto;
+       max-width: 1044px;
+       min-width: 246px;
+       width: 100%;
+  }
+  .wanon {
+       background-color: rgb(144, 240, 144);
+  }
+  .wanoff {
+       background-color: rgb(240, 144, 144);
+  }
+  .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;
+  }
+  #mwan_statuslog_text {
+       padding: 20px;
+       text-align: left;
+  }
+</style>
+
+<%+footer%>
diff --git a/applications/luci-app-mwan3/luasrc/view/mwan/status_troubleshooting.htm b/applications/luci-app-mwan3/luasrc/view/mwan/status_troubleshooting.htm
new file mode 100644 (file)
index 0000000..483e289
--- /dev/null
@@ -0,0 +1,61 @@
+<%+header%>
+
+<ul class="cbi-tabmenu">
+       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/status/mwan/overview")%>"><%:Interface Status%></a></li>
+       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/status/mwan/detail")%>"><%:Detailed Status%></a></li>
+       <li class="cbi-tab-disabled"><a href="<%=luci.dispatcher.build_url("admin/status/mwan/diagnostics")%>"><%:Diagnostics%></a></li>
+       <li class="cbi-tab"><a href="<%=luci.dispatcher.build_url("admin/status/mwan/troubleshooting")%>"><%:Troubleshooting%></a></li>
+</ul>
+
+<script type="text/javascript" src="<%=resource%>/cbi.js"></script>
+<script type="text/javascript">//<![CDATA[
+       XHR.poll(15, '<%=luci.dispatcher.build_url("admin", "status", "mwan", "troubleshooting_display")%>', null,
+               function(x, mArray)
+               {
+                       var tshoot = document.getElementById('troubleshoot_text');
+                       if (mArray.versions)
+                       {
+                               var versions = '<span class="description">Software versions : </span><br /><br />';
+                               var mwanConfig = '<br /><br /><span class="description">Output of &#34;cat /etc/config/mwan3&#34; : </span><br /><br />';
+                               var netConfig = '<br /><br /><span class="description">Output of &#34;cat /etc/config/network&#34; : </span><br /><br />';
+                               var wifiConfig = '<br /><br /><span class="description">Output of &#34;cat /etc/config/wireless&#34; : </span><br /><br />';
+                               var ifconfig = '<br /><br /><span class="description">Output of &#34;ifconfig&#34; : </span><br /><br />';
+                               var ipRoute = '<br /><br /><span class="description">Output of &#34;route -n&#34; : </span><br /><br />';
+                               var ipRuleShow = '<br /><br /><span class="description">Output of &#34;ip rule show&#34; : </span><br /><br />';
+                               var routeListTable = '<br /><br /><span class="description">Output of &#34;ip route list table 1-250&#34; : </span><br /><br />';
+                               var firewallOut = '<br /><br /><span class="description">Firewall default output policy (must be ACCEPT) : </span><br /><br />';
+                               var iptables = '<br /><br /><span class="description">Output of &#34;iptables -L -t mangle -v -n&#34; : </span><br /><br />';
+                               tshoot.innerHTML = String.format(
+                                       '<pre>%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s</pre>',
+                                       versions, mArray.versions[0], mwanConfig, mArray.mwanconfig[0], netConfig, mArray.netconfig[0],
+                                       wifiConfig, mArray.wificonfig[0], ifconfig, mArray.ifconfig[0], ipRoute, mArray.routeshow[0],
+                                       ipRuleShow, mArray.iprule[0], routeListTable, mArray.routelist[0], firewallOut, mArray.firewallout[0],
+                                       iptables, mArray.iptables[0]
+                               );
+                       }
+                       else
+                       {
+                               tshoot.innerHTML = '<strong><%:Error collecting troubleshooting information%></strong>';
+                       }
+               }
+       );
+//]]></script>
+
+<div id="troubleshoot">
+       <fieldset class="cbi-section">
+               <legend><%:Troubleshooting Data%></legend>
+               <div id="troubleshoot_text"><img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" /><%:Collecting data...%></div>
+       </fieldset>
+</div>
+
+<style type="text/css">
+  #troubleshoot_text {
+       padding: 20px;
+       text-align: left;
+  }
+  .description {
+       background-color: rgb(78, 186, 241);
+  }
+</style>
+
+<%+footer%>