diff options
5 files changed, 210 insertions, 0 deletions
diff --git a/applications/luci-freifunk-diagnostics/Makefile b/applications/luci-freifunk-diagnostics/Makefile new file mode 100644 index 000000000..f7fac7740 --- /dev/null +++ b/applications/luci-freifunk-diagnostics/Makefile @@ -0,0 +1,2 @@ +include ../../build/config.mk +include ../../build/module.mk diff --git a/applications/luci-freifunk-diagnostics/ipkg/postinst b/applications/luci-freifunk-diagnostics/ipkg/postinst new file mode 100644 index 000000000..cc814c365 --- /dev/null +++ b/applications/luci-freifunk-diagnostics/ipkg/postinst @@ -0,0 +1,4 @@ +#!/bin/sh +[ -n "${IPKG_INSTROOT}" ] || { + ( . /etc/uci-defaults/luci-freifunk-diagnostics ) && rm -f /etc/uci-defaults/luci-freifunk-diagnostics +} diff --git a/applications/luci-freifunk-diagnostics/luasrc/controller/freifunk/diag.lua b/applications/luci-freifunk-diagnostics/luasrc/controller/freifunk/diag.lua new file mode 100644 index 000000000..2a5db6751 --- /dev/null +++ b/applications/luci-freifunk-diagnostics/luasrc/controller/freifunk/diag.lua @@ -0,0 +1,82 @@ +--[[ +LuCI - Lua Configuration Interface + +Copyright 2008 Steven Barth <steven@midlink.org> +Copyright 2011 Jo-Philipp Wich <xm@subsignal.org> +Copyright 2013 Manuel Munz <freifunk@somakoma.de> + +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 + +]]-- + +module("luci.controller.freifunk.diag", package.seeall) + +function index() + local uci = require("luci.model.uci").cursor() + local page + page = node("freifunk", "status", "diagnostics") + page.target = template("freifunk/diagnostics") + page.title = _("Diagnostics") + page.order = 60 + + page = entry({"freifunk", "status", "diag_ping"}, call("diag_ping"), nil) + page.leaf = true + + page = entry({"freifunk", "status", "diag_nslookup"}, call("diag_nslookup"), nil) + page.leaf = true + + page = entry({"freifunk", "status", "diag_traceroute"}, call("diag_traceroute"), nil) + page.leaf = true + + page = entry({"freifunk", "status", "diag_ping6"}, call("diag_ping6"), nil) + page.leaf = true + + page = entry({"freifunk", "status", "diag_traceroute6"}, call("diag_traceroute6"), nil) + page.leaf = true +end + +function diag_command(cmd, addr) + 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(addr) + diag_command("ping -c 5 -W 1 %q 2>&1", addr) +end + +function diag_traceroute(addr) + diag_command("traceroute -q 1 -w 1 -n %q 2>&1", addr) +end + +function diag_nslookup(addr) + diag_command("nslookup %q 2>&1", addr) +end + +function diag_ping6(addr) + diag_command("ping6 -c 5 %q 2>&1", addr) +end + +function diag_traceroute6(addr) + diag_command("traceroute6 -q 1 -w 2 -n %q 2>&1", addr) +end diff --git a/applications/luci-freifunk-diagnostics/luasrc/view/freifunk/diagnostics.htm b/applications/luci-freifunk-diagnostics/luasrc/view/freifunk/diagnostics.htm new file mode 100644 index 000000000..5794a433e --- /dev/null +++ b/applications/luci-freifunk-diagnostics/luasrc/view/freifunk/diagnostics.htm @@ -0,0 +1,120 @@ +<%# +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%> + +<% +local fs = require "nixio.fs" +local has_ping6 = fs.access("/bin/ping6") or fs.access("/usr/bin/ping6") +local has_traceroute6 = fs.access("/usr/bin/traceroute6") +%> + +<script type="text/javascript" src="<%=resource%>/cbi.js"></script> +<script type="text/javascript">//<![CDATA[ + var stxhr = new XHR(); + + function update_status(field, proto) + { + var tool = field.name; + var addr = field.value; + var protocol = proto ? "6" : ""; + + 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 command to complete...%>' + ; + + legend.parentNode.style.display = 'block'; + legend.style.display = 'inline'; + + stxhr.get('<%=luci.dispatcher.build_url("admin", "network")%>/diag_' + tool + protocol + '/' + 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"> + <input style="margin: 5px 0" type="text" value="openwrt.org" name="ping" /><br /> + <% if has_ping6 then %> + <select name="ping_proto" style="width:auto"> + <option value="" selected="selected"><%:IPv4%></option> + <option value="6"><%:IPv6%></option> + </select> + <input type="button" value="<%:Ping%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.ping, this.form.ping_proto.selectedIndex)" /> + <% else %> + <input type="button" value="<%:Ping%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.ping)" /> + <% end %> + </div> + + <div style="width:33%; float:left"> + <input style="margin: 5px 0" type="text" value="openwrt.org" name="traceroute" /><br /> + <% if has_traceroute6 then %> + <select name="traceroute_proto" style="width:auto"> + <option value="" selected="selected"><%:IPv4%></option> + <option value="6"><%:IPv6%></option> + </select> + <input type="button" value="<%:Traceroute%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.traceroute, this.form.traceroute_proto.selectedIndex)" /> + <% else %> + <input type="button" value="<%:Traceroute%>" class="cbi-button cbi-button-apply" onclick="update_status(this.form.traceroute)" /> + <% end %> + <% if not has_traceroute6 then %> + <p> </p> + <p><%:Install iputils-traceroute6 for IPv6 traceroute%></p> + <% end %> + </div> + + <div style="width:33%; float:left;"> + <input style="margin: 5px 0" type="text" value="openwrt.org" name="nslookup" /><br /> + <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%> diff --git a/applications/luci-freifunk-diagnostics/root/etc/uci-defaults/luci-freifunk-diagnostics b/applications/luci-freifunk-diagnostics/root/etc/uci-defaults/luci-freifunk-diagnostics new file mode 100644 index 000000000..963d8a4ef --- /dev/null +++ b/applications/luci-freifunk-diagnostics/root/etc/uci-defaults/luci-freifunk-diagnostics @@ -0,0 +1,2 @@ +#!/bin/sh +rm -f /tmp/luci-indexcache |