diff options
Diffstat (limited to 'modules/admin-full')
-rw-r--r-- | modules/admin-full/luasrc/controller/admin/network.lua | 50 | ||||
-rw-r--r-- | modules/admin-full/luasrc/view/admin_network/diagnostics.htm | 93 |
2 files changed, 143 insertions, 0 deletions
diff --git a/modules/admin-full/luasrc/controller/admin/network.lua b/modules/admin-full/luasrc/controller/admin/network.lua index f28f6077c..f2f629b6d 100644 --- a/modules/admin-full/luasrc/controller/admin/network.lua +++ b/modules/admin-full/luasrc/controller/admin/network.lua @@ -111,6 +111,19 @@ function index() page.title = i18n("Static Routes") page.order = 50 + page = node("admin", "network", "diagnostics") + page.target = template("admin_network/diagnostics") + page.title = i18n("Diagnostics") + page.order = 60 + + page = entry({"admin", "network", "diag_ping"}, call("diag_ping"), nil) + page.leaf = true + + page = entry({"admin", "network", "diag_nslookup"}, call("diag_nslookup"), nil) + page.leaf = true + + page = entry({"admin", "network", "diag_traceroute"}, call("diag_traceroute"), nil) + page.leaf = true end function wifi_join() @@ -371,3 +384,40 @@ function lease_status() luci.http.prepare_content("application/json") luci.http.write_json(rv) end + +function diag_command(cmd) + local path = luci.dispatcher.context.requestpath + local addr = path[#path] + + if addr and addr:match("^[a-zA-Z0-9%-%.:_]+$") then + luci.http.prepare_content("text/plain") + + local util = io.popen(cmd % addr) + if util then + while true do + local ln = util:read("*l") + if not ln then break end + luci.http.write(ln) + luci.http.write("\n") + end + + util:close() + end + + return + end + + luci.http.status(500, "Bad address") +end + +function diag_ping() + diag_command("ping -c 5 -W 1 %q 2>&1") +end + +function diag_traceroute() + diag_command("traceroute -q 1 -w 1 -n %q 2>&1") +end + +function diag_nslookup() + diag_command("nslookup %q 2>&1") +end diff --git a/modules/admin-full/luasrc/view/admin_network/diagnostics.htm b/modules/admin-full/luasrc/view/admin_network/diagnostics.htm new file mode 100644 index 000000000..304e71741 --- /dev/null +++ b/modules/admin-full/luasrc/view/admin_network/diagnostics.htm @@ -0,0 +1,93 @@ +<%# +LuCI - Lua Configuration Interface +Copyright 2010 Jo-Philipp Wich <xm@subsignal.org> + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +$Id$ + +-%> + +<%+header%> + +<script type="text/javascript" src="<%=resource%>/cbi.js"></script> +<script type="text/javascript">//<![CDATA[ + var stxhr = new XHR(); + + function update_status(field) + { + var tool = field.name; + var addr = field.value; + + var legend = document.getElementById('diag-rc-legend'); + var output = document.getElementById('diag-rc-output'); + + if (legend && output) + { + output.innerHTML = + '<img src="<%=resource%>/icons/loading.gif" alt="<%:Loading%>" style="vertical-align:middle" /> ' + + '<%:Waiting for router...%>' + ; + + legend.style.display = null; + legend.parentNode.style.display = 'block'; + + stxhr.get('<%=luci.dispatcher.build_url("admin", "network")%>/diag_' + tool + '/' + addr, null, + function(x) + { + if (x.responseText) + { + legend.style.display = 'none'; + output.innerHTML = String.format('<pre>%h</pre>', x.responseText); + } + else + { + legend.style.display = 'none'; + output.innerHTML = '<span class="error"><%:Bad address specified!%></span>'; + } + } + ); + } + } +//]]></script> + +<form method="post" action="<%=pcdata(luci.http.getenv("REQUEST_URI"))%>"> + <div class="cbi-map"> + <h2><a id="content" name="content"><%:Diagnostics%></a></h2> + + <fieldset class="cbi-section"> + <legend><%:Network Utilities%></legend> + + <br /> + + <div style="width:30%; float:left; text-align:center"> + <input class="cbi-input-text" type="text" value="openwrt.org" name="ping" /> + <input type="button" value="Ping" class="cbi-button cbi-button-apply" onclick="update_status(this.form.ping)" /> + </div> + + <div style="width:30%; float:left; text-align:center"> + <input class="cbi-input-text" type="text" value="openwrt.org" name="traceroute" /> + <input type="button" value="Traceroute" class="cbi-button cbi-button-apply" onclick="update_status(this.form.traceroute)" /> + </div> + + <div style="width:30%; float:left; text-align:center"> + <input class="cbi-input-text" type="text" value="openwrt.org" name="nslookup" /> + <input type="button" value="Nslookup" class="cbi-button cbi-button-apply" onclick="update_status(this.form.nslookup)" /> + </div> + + <br style="clear:both" /><br /> + + </fieldset> + </div> + + <fieldset class="cbi-section" style="display:none"> + <legend id="diag-rc-legend"><%:Collecting data...%></legend> + <span id="diag-rc-output"></span> + </fieldset> +</form> + +<%+footer%> |