* Rewrote ffluci.util.split (optimizations)
authorSteven Barth <steven@midlink.org>
Mon, 21 Apr 2008 17:25:01 +0000 (17:25 +0000)
committerSteven Barth <steven@midlink.org>
Mon, 21 Apr 2008 17:25:01 +0000 (17:25 +0000)
* Added public pages for OLSR

12 files changed:
core/contrib/index.cgi
core/src/ffluci/sys.lua
core/src/ffluci/util.lua
core/src/ffluci/view/header.htm
module/public-core/src/controller/public/olsr.lua [new file with mode: 0644]
module/public-core/src/model/menu/00public.lua
module/public-core/src/view/public_olsr/error_olsr.htm [new file with mode: 0644]
module/public-core/src/view/public_olsr/hna.htm [new file with mode: 0644]
module/public-core/src/view/public_olsr/index.htm [new file with mode: 0644]
module/public-core/src/view/public_olsr/mid.htm [new file with mode: 0644]
module/public-core/src/view/public_olsr/routes.htm [new file with mode: 0644]
module/public-core/src/view/public_olsr/topology.htm [new file with mode: 0644]

index c9c98b0b29f84839805811b4bd184620c568b12c..31705ccf27e663ea6b1df641f8062510374a10e6 100755 (executable)
@@ -1,3 +1,3 @@
 #!/usr/bin/haserl --shell=luac
 print("Status: 302 Found")
-print("Location: ffluci/admin\n")
+print("Location: ffluci\n")
index f50b014f08eba034aa95a072ffd75d7645ad34b3..b9d529a8c8a89b895b379f6ec5d827acde7e9441 100644 (file)
@@ -162,7 +162,7 @@ end
 
 -- Returns the binary IP to a given IP
 function net.ip4bin(ip)
-       local parts = ffluci.util.split(ip, '%.')
+       local parts = ffluci.util.split(ip, '.')
        if #parts ~= 4 then
                return nil
        end
@@ -265,7 +265,7 @@ function _parse_delimited_table(iter, delimiter)
        local trim  = ffluci.util.trim
        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
                keys[i] = trim(keys[i])
        end
@@ -274,7 +274,7 @@ function _parse_delimited_table(iter, delimiter)
                local row = {}
                line = trim(line)
                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
                                        row[keys[i]] = j
                                end
index dfc88e3e41fd1cf552ff8f21c10a76d44853994d..9cb1e1420c644f5ae38b5159bbab027728049bb0 100644 (file)
@@ -145,33 +145,29 @@ function sessionid()
 end
 
 
--- Splits a string into an array (Adapted from lua-users.org)
-function split(str, pat, max)
+-- Splits a string into an array
+function split(str, pat, max, regex)
        pat = pat or "\n"
-       max = max or -1
+       max = max or #str
        
        local t = {}
-       local fpat = "(.-)" .. pat
-       local last_end = 1
-       local s, e, cap = str:find(fpat, 1)
+       local c = 1
        
-       while s do
-               max = max - 1
-               if s ~= 1 or cap ~= "" then
-                       table.insert(t,cap)
-               end
-               last_end = e+1
-               if max == 0 then
-                       break
-               end
-               s, e, cap = str:find(fpat, last_end)
+       if #pat == 0 then
+               return nil
        end
        
-       if last_end <= #str then
-               cap = str:sub(last_end)
-               table.insert(t, cap)
+       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
+               c = e and e + 1 or #str + 1
+       until not s or max < 0
+       
        return t
 end
 
index 1bfc7a02db758ab2afb778830032aee849df8ab4..ac76e0ab5191680d91ee113dee05ac2e29c022ab 100644 (file)
@@ -3,6 +3,7 @@ require("ffluci.sys")
 local load1, load5, load15 = ffluci.sys.loadavg()
 local req  = require("ffluci.dispatcher").request
 local menu = require("ffluci.menu").get()[req.category]
+menu = menu or {}
 require("ffluci.i18n").loadc("default")
 require("ffluci.http").htmlheader()
 %><?xml version="1.0" encoding="utf-8"?>
diff --git a/module/public-core/src/controller/public/olsr.lua b/module/public-core/src/controller/public/olsr.lua
new file mode 100644 (file)
index 0000000..a2ce03e
--- /dev/null
@@ -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
\ No newline at end of file
index 2e96a5b3c826956e8181980b2e98220a2dc1328d..3339dd0ff28f627366973146e16b533e7bd94367 100644 (file)
@@ -4,4 +4,10 @@ act("contact", "Kontakt")
 add("public", "status", "Status", 20)
 act("routes", "Routingtabelle")
 act("internet", "Internetzugang")
-act("iwscan", "WLAN-Scan")
\ No newline at end of file
+act("iwscan", "WLAN-Scan")
+
+add("public", "olsr", "OLSR", 30)
+act("routes", "Routen")
+act("topology", "Topologie")
+act("hna", "HNA")
+act("mid", "MID")
diff --git a/module/public-core/src/view/public_olsr/error_olsr.htm b/module/public-core/src/view/public_olsr/error_olsr.htm
new file mode 100644 (file)
index 0000000..25426f5
--- /dev/null
@@ -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%>
\ No newline at end of file
diff --git a/module/public-core/src/view/public_olsr/hna.htm b/module/public-core/src/view/public_olsr/hna.htm
new file mode 100644 (file)
index 0000000..c13369f
--- /dev/null
@@ -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%>
\ No newline at end of file
diff --git a/module/public-core/src/view/public_olsr/index.htm b/module/public-core/src/view/public_olsr/index.htm
new file mode 100644 (file)
index 0000000..0633d1f
--- /dev/null
@@ -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%>
\ No newline at end of file
diff --git a/module/public-core/src/view/public_olsr/mid.htm b/module/public-core/src/view/public_olsr/mid.htm
new file mode 100644 (file)
index 0000000..6553237
--- /dev/null
@@ -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%>
\ No newline at end of file
diff --git a/module/public-core/src/view/public_olsr/routes.htm b/module/public-core/src/view/public_olsr/routes.htm
new file mode 100644 (file)
index 0000000..f3a0fd3
--- /dev/null
@@ -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%>
\ No newline at end of file
diff --git a/module/public-core/src/view/public_olsr/topology.htm b/module/public-core/src/view/public_olsr/topology.htm
new file mode 100644 (file)
index 0000000..c622026
--- /dev/null
@@ -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%>
\ No newline at end of file