luci-0.8: splash: add controller actions for new interactive status page
authorJo-Philipp Wich <jow@openwrt.org>
Sat, 6 Jun 2009 09:02:37 +0000 (09:02 +0000)
committerJo-Philipp Wich <jow@openwrt.org>
Sat, 6 Jun 2009 09:02:37 +0000 (09:02 +0000)
applications/luci-splash/luasrc/controller/splash/splash.lua

index 8603b141fab5979c973c20710767e2f116afa8e0..88aafcdf5256f208209259b05a400658d213a2d2 100644 (file)
@@ -6,6 +6,8 @@ function index()
        node("splash").target = call("action_dispatch")
        node("splash", "activate").target = call("action_activate")
        node("splash", "splash").target   = template("splash_splash/splash")
+
+       entry({"admin", "status", "splash"}, call("action_status_admin"), "Client-Splash")
 end
 
 function action_dispatch()
@@ -28,3 +30,69 @@ function action_activate()
                luci.http.redirect(luci.dispatcher.build_url())
        end
 end
+
+function action_status_admin()
+       local uci = luci.model.uci.cursor_state()
+       local macs = luci.http.formvaluetable("save")
+
+       local function delete_mac(what, mac)
+               uci:delete_all("luci_splash", what,
+                       function(s)
+                               return ( s.mac and s.mac:lower() == mac )
+                       end)
+       end
+
+       local function leases(mac)
+               local leases = { }
+
+               uci:foreach("luci_splash", "lease", function(s)
+                       if s.start and s.mac and s.mac:lower() ~= mac then
+                               leases[#leases+1] = {
+                                       start = s.start,
+                                       mac   = s.mac
+                               }
+                       end
+               end)
+
+               uci:revert("luci_splash")
+
+               return leases
+       end
+
+       local function commit(leases, no_commit)
+               if not no_commit then
+                       uci:save("luci_splash")
+                       uci:commit("luci_splash")
+               end
+
+               for _, l in ipairs(leases) do
+                       uci:section("luci_splash", "lease", nil, l)
+               end
+
+               uci:save("luci_splash")
+               os.execute("/etc/init.d/luci_splash restart")
+       end
+
+       for key, _ in pairs(macs) do
+               local policy = luci.http.formvalue("policy.%s" % key)
+               local mac    = luci.http.protocol.urldecode(key)
+               local lslist = leases(policy ~= "kick" and mac)
+
+               delete_mac("blacklist", mac)
+               delete_mac("whitelist", mac)
+
+               if policy == "whitelist" or policy == "blacklist" then
+                       uci:section("luci_splash", policy, nil, { mac = mac })
+               elseif policy == "normal" then                  
+                       lslist[#lslist+1] = { mac = mac, start = os.time() }
+               elseif policy == "kick" then
+                       for _, l in ipairs(lslist) do
+                               if l.mac:lower() == mac then l.kicked="1" end
+                       end
+               end
+
+               commit(lslist)
+       end
+
+       luci.template.render("admin_status/splash", { is_admin = true })
+end