* Rewrote ffluci.util.split (optimizations)
* Added public pages for OLSR
This commit is contained in:
parent
f11c311535
commit
b98c0adcdd
12 changed files with 307 additions and 26 deletions
|
@ -1,3 +1,3 @@
|
||||||
#!/usr/bin/haserl --shell=luac
|
#!/usr/bin/haserl --shell=luac
|
||||||
print("Status: 302 Found")
|
print("Status: 302 Found")
|
||||||
print("Location: ffluci/admin\n")
|
print("Location: ffluci\n")
|
||||||
|
|
|
@ -162,7 +162,7 @@ end
|
||||||
|
|
||||||
-- Returns the binary IP to a given IP
|
-- Returns the binary IP to a given IP
|
||||||
function net.ip4bin(ip)
|
function net.ip4bin(ip)
|
||||||
local parts = ffluci.util.split(ip, '%.')
|
local parts = ffluci.util.split(ip, '.')
|
||||||
if #parts ~= 4 then
|
if #parts ~= 4 then
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
|
@ -265,7 +265,7 @@ function _parse_delimited_table(iter, delimiter)
|
||||||
local trim = ffluci.util.trim
|
local trim = ffluci.util.trim
|
||||||
local split = ffluci.util.split
|
local split = ffluci.util.split
|
||||||
|
|
||||||
local keys = split(trim(iter()), delimiter)
|
local keys = split(trim(iter()), delimiter, nil, true)
|
||||||
for i, j in pairs(keys) do
|
for i, j in pairs(keys) do
|
||||||
keys[i] = trim(keys[i])
|
keys[i] = trim(keys[i])
|
||||||
end
|
end
|
||||||
|
@ -274,7 +274,7 @@ function _parse_delimited_table(iter, delimiter)
|
||||||
local row = {}
|
local row = {}
|
||||||
line = trim(line)
|
line = trim(line)
|
||||||
if #line > 0 then
|
if #line > 0 then
|
||||||
for i, j in pairs(split(line, delimiter)) do
|
for i, j in pairs(split(line, delimiter, nil, true)) do
|
||||||
if keys[i] then
|
if keys[i] then
|
||||||
row[keys[i]] = j
|
row[keys[i]] = j
|
||||||
end
|
end
|
||||||
|
|
|
@ -145,32 +145,28 @@ function sessionid()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
-- Splits a string into an array (Adapted from lua-users.org)
|
-- Splits a string into an array
|
||||||
function split(str, pat, max)
|
function split(str, pat, max, regex)
|
||||||
pat = pat or "\n"
|
pat = pat or "\n"
|
||||||
max = max or -1
|
max = max or #str
|
||||||
|
|
||||||
local t = {}
|
local t = {}
|
||||||
local fpat = "(.-)" .. pat
|
local c = 1
|
||||||
local last_end = 1
|
|
||||||
local s, e, cap = str:find(fpat, 1)
|
|
||||||
|
|
||||||
while s do
|
if #pat == 0 then
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
if max == 0 then
|
||||||
|
return str
|
||||||
|
end
|
||||||
|
|
||||||
|
repeat
|
||||||
|
local s, e = str:find(pat, c, not regex)
|
||||||
|
table.insert(t, str:sub(c, s and s - 1))
|
||||||
max = max - 1
|
max = max - 1
|
||||||
if s ~= 1 or cap ~= "" then
|
c = e and e + 1 or #str + 1
|
||||||
table.insert(t,cap)
|
until not s or max < 0
|
||||||
end
|
|
||||||
last_end = e+1
|
|
||||||
if max == 0 then
|
|
||||||
break
|
|
||||||
end
|
|
||||||
s, e, cap = str:find(fpat, last_end)
|
|
||||||
end
|
|
||||||
|
|
||||||
if last_end <= #str then
|
|
||||||
cap = str:sub(last_end)
|
|
||||||
table.insert(t, cap)
|
|
||||||
end
|
|
||||||
|
|
||||||
return t
|
return t
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,6 +3,7 @@ require("ffluci.sys")
|
||||||
local load1, load5, load15 = ffluci.sys.loadavg()
|
local load1, load5, load15 = ffluci.sys.loadavg()
|
||||||
local req = require("ffluci.dispatcher").request
|
local req = require("ffluci.dispatcher").request
|
||||||
local menu = require("ffluci.menu").get()[req.category]
|
local menu = require("ffluci.menu").get()[req.category]
|
||||||
|
menu = menu or {}
|
||||||
require("ffluci.i18n").loadc("default")
|
require("ffluci.i18n").loadc("default")
|
||||||
require("ffluci.http").htmlheader()
|
require("ffluci.http").htmlheader()
|
||||||
%><?xml version="1.0" encoding="utf-8"?>
|
%><?xml version="1.0" encoding="utf-8"?>
|
||||||
|
|
136
module/public-core/src/controller/public/olsr.lua
Normal file
136
module/public-core/src/controller/public/olsr.lua
Normal file
|
@ -0,0 +1,136 @@
|
||||||
|
module("ffluci.controller.public.olsr", package.seeall)
|
||||||
|
require("ffluci.sys")
|
||||||
|
|
||||||
|
function action_index()
|
||||||
|
local data = fetch_txtinfo()
|
||||||
|
|
||||||
|
if not data or not data.Links then
|
||||||
|
ffluci.template.render("public_olsr/error_olsr")
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local function compare(a, b)
|
||||||
|
if tonumber(a.ETX) == 0 then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
if tonumber(b.ETX) == 0 then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
return tonumber(a.ETX) < tonumber(b.ETX)
|
||||||
|
end
|
||||||
|
|
||||||
|
table.sort(data.Links, compare)
|
||||||
|
|
||||||
|
ffluci.template.render("public_olsr/index", {links=data.Links})
|
||||||
|
end
|
||||||
|
|
||||||
|
function action_routes()
|
||||||
|
local data = fetch_txtinfo()
|
||||||
|
|
||||||
|
if not data or not data.Links then
|
||||||
|
ffluci.template.render("public_olsr/error_olsr")
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local function compare(a, b)
|
||||||
|
if tonumber(a.ETX) == 0 then
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
if tonumber(b.ETX) == 0 then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
|
return tonumber(a.ETX) < tonumber(b.ETX)
|
||||||
|
end
|
||||||
|
|
||||||
|
table.sort(data.Routes, compare)
|
||||||
|
|
||||||
|
ffluci.template.render("public_olsr/routes", {routes=data.Routes})
|
||||||
|
end
|
||||||
|
|
||||||
|
function action_topology()
|
||||||
|
local data = fetch_txtinfo()
|
||||||
|
|
||||||
|
if not data or not data.Links then
|
||||||
|
ffluci.template.render("public_olsr/error_olsr")
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local function compare(a, b)
|
||||||
|
return a["Destination IP"] < b["Destination IP"]
|
||||||
|
end
|
||||||
|
|
||||||
|
table.sort(data.Topology, compare)
|
||||||
|
|
||||||
|
ffluci.template.render("public_olsr/topology", {routes=data.Topology})
|
||||||
|
end
|
||||||
|
|
||||||
|
function action_hna()
|
||||||
|
local data = fetch_txtinfo()
|
||||||
|
|
||||||
|
if not data or not data.Links then
|
||||||
|
ffluci.template.render("public_olsr/error_olsr")
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local function compare(a, b)
|
||||||
|
return a.Network < b.Network
|
||||||
|
end
|
||||||
|
|
||||||
|
table.sort(data.HNA, compare)
|
||||||
|
|
||||||
|
ffluci.template.render("public_olsr/hna", {routes=data.HNA})
|
||||||
|
end
|
||||||
|
|
||||||
|
function action_mid()
|
||||||
|
local data = fetch_txtinfo()
|
||||||
|
|
||||||
|
if not data or not data.Links then
|
||||||
|
ffluci.template.render("public_olsr/error_olsr")
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local function compare(a, b)
|
||||||
|
return a.IP < b.IP
|
||||||
|
end
|
||||||
|
|
||||||
|
table.sort(data.MID, compare)
|
||||||
|
|
||||||
|
ffluci.template.render("public_olsr/mid", {mids=data.MID})
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
-- Internal
|
||||||
|
function fetch_txtinfo()
|
||||||
|
local rawdata = ffluci.sys.httpget("http://127.0.0.1:2006")
|
||||||
|
|
||||||
|
if #rawdata == 0 then
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
local data = {}
|
||||||
|
|
||||||
|
local tables = ffluci.util.split(ffluci.util.trim(rawdata), "\n\n")
|
||||||
|
|
||||||
|
|
||||||
|
for i, tbl in ipairs(tables) do
|
||||||
|
local lines = ffluci.util.split(tbl, "\n")
|
||||||
|
local name = table.remove(lines, 1):sub(8)
|
||||||
|
local keys = ffluci.util.split(table.remove(lines, 1), "\t")
|
||||||
|
|
||||||
|
data[name] = {}
|
||||||
|
|
||||||
|
for j, line in ipairs(lines) do
|
||||||
|
local fields = ffluci.util.split(line, "\t")
|
||||||
|
data[name][j] = {}
|
||||||
|
for k, key in pairs(keys) do
|
||||||
|
data[name][j][key] = fields[k]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
return data
|
||||||
|
end
|
|
@ -5,3 +5,9 @@ add("public", "status", "Status", 20)
|
||||||
act("routes", "Routingtabelle")
|
act("routes", "Routingtabelle")
|
||||||
act("internet", "Internetzugang")
|
act("internet", "Internetzugang")
|
||||||
act("iwscan", "WLAN-Scan")
|
act("iwscan", "WLAN-Scan")
|
||||||
|
|
||||||
|
add("public", "olsr", "OLSR", 30)
|
||||||
|
act("routes", "Routen")
|
||||||
|
act("topology", "Topologie")
|
||||||
|
act("hna", "HNA")
|
||||||
|
act("mid", "MID")
|
||||||
|
|
6
module/public-core/src/view/public_olsr/error_olsr.htm
Normal file
6
module/public-core/src/view/public_olsr/error_olsr.htm
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
<%+header%>
|
||||||
|
<h1><%:olsr OLSR%></h1>
|
||||||
|
<p class="error"><%:olsrerror1 Es konnte keine Verbindung zum OLSR-Daemon hergestellt werden!%></p>
|
||||||
|
<p><%:olsrerror2 Um die Statusinformationen abfragen zu können muss der OLSR-Daemon gestartet
|
||||||
|
und das Plugin "txtinfo" geladen sein.%></p>
|
||||||
|
<%+footer%>
|
17
module/public-core/src/view/public_olsr/hna.htm
Normal file
17
module/public-core/src/view/public_olsr/hna.htm
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
<%+header%>
|
||||||
|
<h1><%:olsrhna OLSR-HNA%></h1>
|
||||||
|
<br />
|
||||||
|
<table cellspacing="0" cellpadding="6">
|
||||||
|
<tr>
|
||||||
|
<th><%:destination Ziel%></th>
|
||||||
|
<th><%:gateway Gateway%></th>
|
||||||
|
</tr>
|
||||||
|
<% for k, route in ipairs(routes) do %>
|
||||||
|
<tr>
|
||||||
|
<td><%=route.Network%>/<%=route.Netmask%></td>
|
||||||
|
<td><a href="http://<%=route.Gateway%>"><%=route.Gateway%></a></td>
|
||||||
|
</tr>
|
||||||
|
<% end %>
|
||||||
|
</table>
|
||||||
|
<br />
|
||||||
|
<%+footer%>
|
43
module/public-core/src/view/public_olsr/index.htm
Normal file
43
module/public-core/src/view/public_olsr/index.htm
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
<%+header%>
|
||||||
|
<h1><%:olsrlinks OLSR-Verbindungen%></h1>
|
||||||
|
<p><%:olsrlinks1 Übersicht über aktuell bestehende OLSR-Verbindungen%></p>
|
||||||
|
<br />
|
||||||
|
<table cellspacing="0" cellpadding="6">
|
||||||
|
<tr>
|
||||||
|
<th><%:destination Ziel%></th>
|
||||||
|
<th><%:local Lokal%></th>
|
||||||
|
<th>LQ</th>
|
||||||
|
<th>NLQ</th>
|
||||||
|
<th>ETX</th>
|
||||||
|
</tr>
|
||||||
|
<% for k, link in ipairs(links) do
|
||||||
|
local color = "#bb3333"
|
||||||
|
|
||||||
|
link.ETX = tonumber(link.ETX)
|
||||||
|
if link.ETX == 0 then
|
||||||
|
color = "#bb3333"
|
||||||
|
elseif link.ETX < 4 then
|
||||||
|
color = "#00cc00"
|
||||||
|
elseif link.ETX < 10 then
|
||||||
|
color = "#ffcb05"
|
||||||
|
elseif link.ETX < 100 then
|
||||||
|
color = "#ff6600"
|
||||||
|
end
|
||||||
|
%>
|
||||||
|
<tr>
|
||||||
|
<td><a href="http://<%=link["remote IP"]%>"><%=link["remote IP"]%></a></td>
|
||||||
|
<td><%=link["Local IP"]%></td>
|
||||||
|
<td><%=link.LinkQuality%></td>
|
||||||
|
<td><%=link.NLQ%></td>
|
||||||
|
<td style="background-color:<%=color%>"><%=link.ETX%></td>
|
||||||
|
</tr>
|
||||||
|
<% end %>
|
||||||
|
</table>
|
||||||
|
<br />
|
||||||
|
<h3><%:legend Legende%>:</h3>
|
||||||
|
<ul>
|
||||||
|
<li><strong>LQ: </strong><%:lq1 Erfolgsquote gesendeter Pakete%></li>
|
||||||
|
<li><strong>NLQ: </strong><%:nlq1 Erfolgsquote empfangener Pakete%></li>
|
||||||
|
<li><strong>ETX: </strong><%:etx1 Zu erwartende Sendeversuche pro Paket%></li>
|
||||||
|
</ul>
|
||||||
|
<%+footer%>
|
17
module/public-core/src/view/public_olsr/mid.htm
Normal file
17
module/public-core/src/view/public_olsr/mid.htm
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
<%+header%>
|
||||||
|
<h1><%:olsrmid OLSR-MID%></h1>
|
||||||
|
<br />
|
||||||
|
<table cellspacing="0" cellpadding="6">
|
||||||
|
<tr>
|
||||||
|
<th><%:node Knoten%></th>
|
||||||
|
<th><%:aliases Aliasse%></th>
|
||||||
|
</tr>
|
||||||
|
<% for k, mid in ipairs(mids) do %>
|
||||||
|
<tr>
|
||||||
|
<td><a href="http://<%=mid.IP%>"><%=mid.IP%></a></td>
|
||||||
|
<td><%=mid.Aliases%></td>
|
||||||
|
</tr>
|
||||||
|
<% end %>
|
||||||
|
</table>
|
||||||
|
<br />
|
||||||
|
<%+footer%>
|
36
module/public-core/src/view/public_olsr/routes.htm
Normal file
36
module/public-core/src/view/public_olsr/routes.htm
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
<%+header%>
|
||||||
|
<h1><%:olsrlinks OLSR-Routen%></h1>
|
||||||
|
<br />
|
||||||
|
<table cellspacing="0" cellpadding="6">
|
||||||
|
<tr>
|
||||||
|
<th><%:destination Ziel%></th>
|
||||||
|
<th><%:gateway Gateway%></th>
|
||||||
|
<th><%:interface Schnittstelle%></th>
|
||||||
|
<th><%:metric Metrik%></th>
|
||||||
|
<th>ETX</th>
|
||||||
|
</tr>
|
||||||
|
<% for k, route in ipairs(routes) do
|
||||||
|
local color = "#bb3333"
|
||||||
|
|
||||||
|
route.ETX = tonumber(route.ETX)
|
||||||
|
if route.ETX == 0 then
|
||||||
|
color = "#bb3333"
|
||||||
|
elseif route.ETX < 4 then
|
||||||
|
color = "#00cc00"
|
||||||
|
elseif route.ETX < 10 then
|
||||||
|
color = "#ffcb05"
|
||||||
|
elseif route.ETX < 100 then
|
||||||
|
color = "#ff6600"
|
||||||
|
end
|
||||||
|
%>
|
||||||
|
<tr>
|
||||||
|
<td><%=route.Destination%></td>
|
||||||
|
<td><%=route.Gateway%></td>
|
||||||
|
<td><%=route.Interface%></td>
|
||||||
|
<td><%=route.Metric%></td>
|
||||||
|
<td style="background-color:<%=color%>"><%=route.ETX%></td>
|
||||||
|
</tr>
|
||||||
|
<% end %>
|
||||||
|
</table>
|
||||||
|
<br />
|
||||||
|
<%+footer%>
|
23
module/public-core/src/view/public_olsr/topology.htm
Normal file
23
module/public-core/src/view/public_olsr/topology.htm
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
<%+header%>
|
||||||
|
<h1><%:olsrtopo OLSR-Topologie%></h1>
|
||||||
|
<br />
|
||||||
|
<table cellspacing="0" cellpadding="6">
|
||||||
|
<tr>
|
||||||
|
<th><%:destination Ziel%></th>
|
||||||
|
<th><%:lasthop Letzter Router%></th>
|
||||||
|
<th>LQ</th>
|
||||||
|
<th>ILQ</th>
|
||||||
|
<th>ETX</th>
|
||||||
|
</tr>
|
||||||
|
<% for k, route in ipairs(routes) do %>
|
||||||
|
<tr>
|
||||||
|
<td><a href="http://<%=route["Destination IP"]%>"><%=route["Destination IP"]%></a></td>
|
||||||
|
<td><a href="http://<%=route["Last hop IP"]%>"><%=route["Last hop IP"]%></a></td>
|
||||||
|
<td><%=route.LQ%></td>
|
||||||
|
<td><%=route.ILQ%></td>
|
||||||
|
<td><%=route.ETX%></td>
|
||||||
|
</tr>
|
||||||
|
<% end %>
|
||||||
|
</table>
|
||||||
|
<br />
|
||||||
|
<%+footer%>
|
Loading…
Reference in a new issue