applications/luci-olsr: Add overview page, move old index to neigbors
[project/luci.git] / applications / luci-olsr / luasrc / controller / olsr.lua
index c80a75c..d5a212c 100644 (file)
@@ -1,7 +1,7 @@
 module("luci.controller.olsr", package.seeall)
 
 function index()
-       if not luci.fs.isfile("/etc/config/olsrd") then
+       if not nixio.fs.access("/etc/config/olsrd") then
                return
        end
 
@@ -9,18 +9,25 @@ function index()
        local i18n = luci.i18n.translate
 
        local page  = node("admin", "status", "olsr")
-       page.target = call("action_index")
+       page.target = template("status-olsr/overview")
        page.title  = "OLSR"
        page.i18n   = "olsr"
+       page.subindex = true
+
+       local page  = node("admin", "status", "olsr", "neighbors")
+       page.target = call("action_neigh")
+       page.title  = i18n("Neighbors")
+       page.subindex = true
+       page.order  = 5
 
        local page  = node("admin", "status", "olsr", "routes")
        page.target = call("action_routes")
-       page.title  = i18n("olsr_routes", "Routen")
+       page.title  = i18n("Routen")
        page.order  = 10
 
        local page  = node("admin", "status", "olsr", "topology")
        page.target = call("action_topology")
-       page.title  = i18n("olsr_topology", "Topologie")
+       page.title  = i18n("Topologie")
        page.order  = 20
 
        local page  = node("admin", "status", "olsr", "hna")
@@ -33,15 +40,32 @@ function index()
        page.title  = "MID"
        page.order  = 50
 
-       entry(
+       local page  = node("admin", "status", "olsr", "smartgw")
+       page.target = call("action_smartgw")
+       page.title  = "SmartGW"
+       page.order  = 60
+
+       local page  = node("admin", "status", "olsr", "interfaces")
+        page.target = call("action_interfaces")
+        page.title  = i18n("Interfaces")
+        page.order  = 70
+
+       local ol = entry(
                {"admin", "services", "olsrd"},
                cbi("olsr/olsrd"), "OLSR"
-       ).i18n = "olsr"
+       )
+       ol.i18n = "olsr"
+       ol.subindex = true
+
+       entry(
+               {"admin", "services", "olsrd", "iface"},
+               cbi("olsr/olsrdiface")
+       ).leaf = true
 
        entry(
                {"admin", "services", "olsrd", "hna"},
                cbi("olsr/olsrdhna"), "HNA Announcements"
-       ).i18n = "olsr"
+       )
 
        oplg = entry(
                {"admin", "services", "olsrd", "plugins"},
@@ -49,6 +73,7 @@ function index()
        )
        oplg.i18n = "olsr"
        oplg.leaf = true
+       oplg.subindex = true
 
        local uci = require("luci.model.uci").cursor()
        uci:foreach("olsrd", "LoadPlugin",
@@ -63,7 +88,7 @@ function index()
        )
 end
 
-function action_index()
+function action_neigh()
        local data = fetch_txtinfo("links")
 
        if not data or not data.Links then
@@ -88,7 +113,7 @@ function action_index()
 
        table.sort(data.Links, compare)
 
-       luci.template.render("status-olsr/index", {links=data.Links})
+       luci.template.render("status-olsr/neighbors", {links=data.Links})
 end
 
 function action_routes()
@@ -170,45 +195,166 @@ function action_mid()
        luci.template.render("status-olsr/mid", {mids=data.MID})
 end
 
+function action_smartgw()
+        local data = fetch_txtinfo("gateways")
 
--- Internal
-function fetch_txtinfo(otable)
-       require("luci.sys")
-       otable = otable or ""
-       local rawdata = luci.sys.httpget("http://127.0.0.1:2006/"..otable)
+        if not data or not data.Gateways then
+                luci.template.render("status-olsr/error_olsr")
+                return nil
+        end
 
-       if #rawdata == 0 then
-               return nil
-       end
+        local function compare(a, b)
+                return a["ETX"] < b["ETX"]
+        end
 
-       local data = {}
+        table.sort(data.Gateways, compare)
+
+        luci.template.render("status-olsr/smartgw", {gws=data.Gateways})
+end
+
+function action_interfaces()
+        local data = fetch_txtinfo("interfaces")
 
-       local tables = luci.util.split(luci.util.trim(rawdata), "\r?\n\r?\n", nil, true)
+        if not data or not data.Interfaces then
+                luci.template.render("status-olsr/error_olsr")
+                return nil
+        end
 
+        luci.template.render("status-olsr/interfaces", {iface=data.Interfaces})
+end
 
-       for i, tbl in ipairs(tables) do
-               local lines = luci.util.split(tbl, "\r?\n", nil, true)
-               local name  = table.remove(lines, 1):sub(8)
-               local keys  = luci.util.split(table.remove(lines, 1), "\t")
-               local split = #keys - 1
+-- Internal
+function fetch_txtinfo(otable)
+       require("luci.sys")
+       local uci = require "luci.model.uci".cursor_state()
+       otable = otable or ""
+       local rawdata = luci.sys.httpget("http://127.0.0.1:2006/"..otable)
+       local rawdatav6 = luci.sys.httpget("http://[::1]:2006/"..otable)
+       local data = {}
+       local dataindex = 0
+       local name = ""
+
+       if #rawdata ~= 0 then
+           local tables = luci.util.split(luci.util.trim(rawdata), "\r?\n\r?\n", nil, true)
+
+           for i, tbl in ipairs(tables) do
+                       local lines = luci.util.split(tbl, "\r?\n", nil, true)
+                       name  = table.remove(lines, 1):sub(8)
+                       local keys  = luci.util.split(table.remove(lines, 1), "\t")
+                       local split = #keys - 1
+                       if not data[name] then
+                               data[name] = {}
+                       end
 
-               data[name] = {}
+                       for j, line in ipairs(lines) do
+                               dataindex = ( dataindex + 1 )
+                               di = dataindex
+                               local fields = luci.util.split(line, "\t", split)
+                               data[name][di] = {}
+                               for k, key in pairs(keys) do
+                                       if key == "Remote IP" or key == "Dest. IP" or key == "Gateway IP" or key == "Gateway" then
+                                               hostname = nixio.getnameinfo(fields[k], "inet")
+                                               if hostname then
+                                                       data[name][di][key] = fields[k]
+                                                       data[name][di]["Hostname"] = hostname
+                                               else
+                                                       data[name][di][key] = fields[k]
+                                               end
+                                       elseif key == "Local IP" then
+                                               data[name][di][key] = fields[k]
+                                               data[name][di]['Local Device'] = fields[k]
+                                               uci:foreach("network", "interface",
+                                                       function(s)
+                                                               localip = string.gsub(fields[k], '      ', '')
+                                                               if s.ipaddr == localip then
+                                                                       data[name][di]['Local Device'] = s['.name'] or interface
+                                                               end
+                                                       end)
+                                       elseif key == "Interface" then
+                                               data[name][di][key] = fields[k]
+                                               uci:foreach("network", "interface",
+                                               function(s)
+                                                       interface = string.gsub(fields[k], '    ', '')
+                                                       if s.ifname == interface then
+                                                               data[name][di][key] = s['.name'] or interface
+                                                       end
+                                               end)
+                                       else
+                                           data[name][di][key] = fields[k]
+                               end
+                               end
+                               if data[name][di].Linkcost then
+                                 data[name][di].LinkQuality,
+                                 data[name][di].NLQ,
+                                 data[name][di].ETX =
+                                 data[name][di].Linkcost:match("([%w.]+)/([%w.]+)[%s]+([%w.]+)")
+                               end
+                       end
+               end
+       end
 
-               for j, line in ipairs(lines) do
+       if #rawdatav6 ~= 0 then
+           local tables = luci.util.split(luci.util.trim(rawdatav6), "\r?\n\r?\n", nil, true)
+           for i, tbl in ipairs(tables) do
+                 local lines = luci.util.split(tbl, "\r?\n", nil, true)
+                 name  = table.remove(lines, 1):sub(8)
+                 local keys  = luci.util.split(table.remove(lines, 1), "\t")
+                 local split = #keys - 1
+                 if not data[name] then
+                       data[name] = {}
+                 end
+                 for j, line in ipairs(lines) do
+                       dataindex = ( dataindex + 1 )
+                       di = dataindex
                        local fields = luci.util.split(line, "\t", split)
-                       data[name][j] = {}
+                       data[name][di] = {}
                        for k, key in pairs(keys) do
-                               data[name][j][key] = fields[k]
+                               if key == "Remote IP" then
+                                       hostname = nixio.getnameinfo(fields[k], "inet6")
+                                       if hostname then
+                                               data[name][di][key] = "[" .. fields[k] .. "]"
+                                               data[name][di]["Hostname"] = hostname
+                                       else
+                                               data[name][di][key] = "[" .. fields[k] .. "]"
+                                       end
+                               elseif key == "Local IP" then
+                                       data[name][di][key] = fields[k]
+                                       data[name][di]['Local Device'] = fields[k]
+                                       uci:foreach("network", "interface",
+                                       function(s)
+                                               local localip = string.gsub(fields[k], '        ', '')
+                                               if s.ip6addr then
+                                                       local ip6addr = string.gsub(s.ip6addr, '\/.*', '')
+                                                       if ip6addr == localip then
+                                                               data[name][di]['Local Device'] = s['.name'] or s.interface
+                                                       end
+                                               end
+                                       end)
+                               elseif key == "Dest. IP" then
+                                   data[name][di][key] = "[" .. fields[k] .. "]"
+                               elseif key == "Last hop IP" then
+                                   data[name][di][key] = "[" .. fields[k] .. "]"
+                               elseif key == "IP address" then
+                                   data[name][di][key] = "[" .. fields[k] .. "]"
+                               elseif key == "Gateway" then
+                                   data[name][di][key] = "[" .. fields[k] .. "]"
+                               else
+                                   data[name][di][key] = fields[k]
+                               end
                        end
-
-                       if data[name][j].Linkcost then
-                               data[name][j].LinkQuality,
-                               data[name][j].NLQ,
-                               data[name][j].ETX =
-                               data[name][j].Linkcost:match("([%w.]+)/([%w.]+)[%s]+([%w.]+)")
+                       
+                       if data[name][di].Linkcost then
+                               data[name][di].LinkQuality,
+                               data[name][di].NLQ,
+                               data[name][di].ETX =
+                               data[name][di].Linkcost:match("([%w.]+)/([%w.]+)[%s]+([%w.]+)")
                        end
                end
        end
+end
 
-       return data
+
+       if data then
+           return data
+       end
 end