applications: add luci-freifunk-diagnostics which is a clone of diagnostics in admin...
authorManuel Munz <freifunk@somakoma.de>
Wed, 9 Jan 2013 18:50:07 +0000 (18:50 +0000)
committerManuel Munz <freifunk@somakoma.de>
Wed, 9 Jan 2013 18:50:07 +0000 (18:50 +0000)
applications/luci-freifunk-diagnostics/Makefile [new file with mode: 0644]
applications/luci-freifunk-diagnostics/ipkg/postinst [new file with mode: 0644]
applications/luci-freifunk-diagnostics/luasrc/controller/freifunk/diag.lua [new file with mode: 0644]
applications/luci-freifunk-diagnostics/luasrc/view/freifunk/diagnostics.htm [new file with mode: 0644]
applications/luci-freifunk-diagnostics/root/etc/uci-defaults/luci-freifunk-diagnostics [new file with mode: 0644]

diff --git a/applications/luci-freifunk-diagnostics/Makefile b/applications/luci-freifunk-diagnostics/Makefile
new file mode 100644 (file)
index 0000000..f7fac77
--- /dev/null
@@ -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 (file)
index 0000000..cc814c3
--- /dev/null
@@ -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 (file)
index 0000000..2a5db67
--- /dev/null
@@ -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 (file)
index 0000000..5794a43
--- /dev/null
@@ -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>&nbsp;</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 (file)
index 0000000..963d8a4
--- /dev/null
@@ -0,0 +1,2 @@
+#!/bin/sh
+rm -f /tmp/luci-indexcache