luci-app-bmx: Redesign Makefile. Split JS libraries. Clean package
[feed/routing.git] / luci-app-bmx6 / bmx6 / usr / lib / lua / luci / controller / bmx6.lua
diff --git a/luci-app-bmx6/bmx6/usr/lib/lua/luci/controller/bmx6.lua b/luci-app-bmx6/bmx6/usr/lib/lua/luci/controller/bmx6.lua
new file mode 100644 (file)
index 0000000..5842fc9
--- /dev/null
@@ -0,0 +1,277 @@
+--[[
+    Copyright (C) 2011 Pau Escrich <pau@dabax.net>
+    Contributors Jo-Philipp Wich <xm@subsignal.org>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License along
+    with this program; if not, write to the Free Software Foundation, Inc.,
+    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+    The full GNU General Public License is included in this distribution in
+    the file called "COPYING".
+--]]
+
+local bmx6json = require("luci.model.bmx6json")
+
+module("luci.controller.bmx6", package.seeall)
+
+function index()
+       local place = {}
+       local ucim = require "luci.model.uci"
+       local uci = ucim.cursor()
+
+       -- checking if ignore is on
+       if uci:get("luci-bmx6","luci","ignore") == "1" then
+               return nil
+       end
+
+       -- getting value from uci database
+       local uci_place = uci:get("luci-bmx6","luci","place")
+
+       -- default values
+       if uci_place == nil then
+               place = {"bmx6"}
+       else
+               local util = require "luci.util"
+               place = util.split(uci_place," ")
+       end
+
+       -- getting position of menu
+       local uci_position = uci:get("luci-bmx6","luci","position")
+
+       ---------------------------
+       -- Starting with the pages
+       ---------------------------
+
+       --- status (default)
+       entry(place,call("action_nodes_j"),place[#place],tonumber(uci_position))            
+
+       table.insert(place,"Status")
+       entry(place,call("action_status_j"),"Status",0)
+       table.remove(place)
+
+       --- nodes
+       table.insert(place,"Nodes")
+       entry(place,call("action_nodes_j"),"Nodes",1)
+       table.remove(place)
+
+       --- links
+       table.insert(place,"Links")
+       entry(place,call("action_links"),"Links",2).leaf = true
+       table.remove(place)
+
+       -- Tunnels
+       table.insert(place,"Tunnels")
+       entry(place,call("action_tunnels_j"), "Tunnels", 3).leaf = true
+       table.remove(place)
+
+       --- Chat
+       table.insert(place,"Chat")
+       entry(place,call("action_chat"),"Chat",5)
+       table.remove(place)
+
+       --- Graph
+       table.insert(place,"Graph")
+       entry(place, template("bmx6/graph"), "Graph",4)
+       table.remove(place)
+
+       --- Topology (hidden)
+       table.insert(place,"topology")
+       entry(place, call("action_topology"), nil)
+       table.remove(place)
+
+       --- configuration (CBI)
+       table.insert(place,"Configuration")
+       entry(place, cbi("bmx6/main"), "Configuration",6).dependent=false
+
+       table.insert(place,"General")
+       entry(place, cbi("bmx6/main"), "General",1)
+       table.remove(place)
+
+       table.insert(place,"Advanced")
+       entry(place, cbi("bmx6/advanced"), "Advanced",5)
+       table.remove(place)
+
+       table.insert(place,"Interfaces")
+       entry(place, cbi("bmx6/interfaces"), "Interfaces",2)
+       table.remove(place)
+
+       table.insert(place,"Tunnels")
+        entry(place, cbi("bmx6/tunnels"), "Tunnels",3)
+        table.remove(place)
+
+       table.insert(place,"Plugins")
+       entry(place, cbi("bmx6/plugins"), "Plugins",6)
+       table.remove(place)
+
+       table.insert(place,"HNAv6")
+       entry(place, cbi("bmx6/hna"), "HNAv6",4)
+       table.remove(place)
+
+       table.remove(place)
+
+end
+
+function action_status_j()
+       luci.template.render("bmx6/status_j", {})
+end
+
+
+function action_nodes_j()
+       local http = require "luci.http"
+       local link_non_js = "/cgi-bin/luci" .. http.getenv("PATH_INFO") .. '/nodes_nojs'
+
+       luci.template.render("bmx6/nodes_j", {link_non_js=link_non_js})
+end
+
+function action_gateways_j()
+       luci.template.render("bmx6/gateways_j", {})
+end
+
+function action_tunnels_j()
+        luci.template.render("bmx6/tunnels_j", {})
+end
+
+function action_links(host)
+       local links = bmx6json.get("links", host)
+       local devlinks = {}
+       local _,l
+
+       if links ~= nil then
+               links = links.links
+               for _,l in ipairs(links) do
+                       devlinks[l.viaDev] = {}
+               end
+               for _,l in ipairs(links) do
+                       l.name = luci.util.split(l.name,'.')[1]
+                       table.insert(devlinks[l.viaDev],l)
+               end
+       end
+
+       luci.template.render("bmx6/links", {links=devlinks})
+end
+
+function action_topology()
+       local originators = bmx6json.get("originators/all")
+       local o,i,l,i2
+       local first = true
+       local topology = '[ '
+       local cache = '/tmp/bmx6-topology.json'
+       local offset = 60
+
+       local cachefd = io.open(cache,r)
+       local update = false
+
+       if cachefd ~= nil then
+               local lastupdate = tonumber(cachefd:read("*line")) or 0
+               if os.time() >= lastupdate + offset then
+                       update = true
+               else
+                       topology = cachefd:read("*all")
+               end
+               cachefd:close()
+       end
+
+       if cachefd == nil or update then
+               for i,o in ipairs(originators) do
+                       local links = bmx6json.get("links",o.primaryIp)
+                       if links then
+                               if first then
+                                       first = false
+                               else
+                                               topology = topology .. ', '
+                               end
+           
+                                       topology = topology .. '{ "name": "%s", "links": [' %o.name
+           
+                               local first2 = true
+           
+                               for i2,l in ipairs(links.links) do
+                                       if first2 then
+                                               first2 = false
+                                       else
+                                               topology = topology .. ', '
+                                               end
+                                               name = l.name or l.llocalIp or "unknown"
+                                               topology = topology .. '{ "name": "%s", "rxRate": %s, "txRate": %s }'
+                                                       %{ name, l.rxRate, l.txRate }
+           
+                               end
+           
+                               topology = topology .. ']}'
+                       end
+           
+               end
+               
+               topology = topology .. ' ]'
+
+               -- Upgrading the content of the cache file
+               cachefd = io.open(cache,'w+')
+               cachefd:write(os.time()..'\n')
+               cachefd:write(topology)
+               cachefd:close()
+       end
+
+       luci.http.prepare_content("application/json")
+       luci.http.write(topology)
+end
+
+
+function action_chat()
+       local sms_dir = "/var/run/bmx6/sms"
+       local rcvd_dir = sms_dir .. "/rcvdSms"
+       local send_file = sms_dir .. "/sendSms/chat"
+       local sms_list = bmx6json.get("rcvdSms")
+       local sender = ""
+       local sms_file = ""
+       local chat = {}
+       local to_send = nil
+       local sent = ""
+       local fd = nil
+
+       if luci.sys.call("test -d " .. sms_dir) ~= 0 then
+               luci.template.render("bmx6/error", {txt="sms plugin disabled or some problem with directory " .. sms_dir})
+               return nil
+       end
+
+       sms_list = luci.util.split(luci.util.exec("ls "..rcvd_dir.."/*:chat"))
+
+       for _,sms_path in ipairs(sms_list) do
+         if #sms_path > #rcvd_dir then
+               sms_file = luci.util.split(sms_path,'/')
+               sms_file = sms_file[#sms_file]
+               sender = luci.util.split(sms_file,':')[1]
+
+               -- Trying to clean the name
+               if string.find(sender,".") ~= nil then
+                       sender = luci.util.split(sender,".")[1]
+               end
+
+               fd = io.open(sms_path,"r")
+               chat[sender] = fd:read()
+               fd:close()
+         end
+       end
+
+       to_send = luci.http.formvalue("toSend")
+       if to_send ~= nil and #to_send > 1  then
+               fd = io.open(send_file,"w")
+               fd:write(to_send)
+               fd:close()
+               sent = to_send
+       else
+               sent = luci.util.exec("cat "..send_file)
+       end
+
+       luci.template.render("bmx6/chat", {chat=chat,sent=sent})
+end
+