summaryrefslogtreecommitdiffhomepage
path: root/contrib/package/ffluci-splash/src/luci-splash.lua
diff options
context:
space:
mode:
authorSteven Barth <steven@midlink.org>2008-04-27 11:06:07 +0000
committerSteven Barth <steven@midlink.org>2008-04-27 11:06:07 +0000
commitace012a0325a4ad2249b137a0d7c7edcc2a71f54 (patch)
tree71051f83388ea5a5092f86f13e3bd6aa4a519591 /contrib/package/ffluci-splash/src/luci-splash.lua
parent706da44cf275dc20426a55a4d01ed79026d3eb80 (diff)
Diffstat (limited to 'contrib/package/ffluci-splash/src/luci-splash.lua')
-rw-r--r--contrib/package/ffluci-splash/src/luci-splash.lua173
1 files changed, 0 insertions, 173 deletions
diff --git a/contrib/package/ffluci-splash/src/luci-splash.lua b/contrib/package/ffluci-splash/src/luci-splash.lua
deleted file mode 100644
index 54c32add6..000000000
--- a/contrib/package/ffluci-splash/src/luci-splash.lua
+++ /dev/null
@@ -1,173 +0,0 @@
-#!/usr/bin/lua
-package.path = "/usr/lib/lua/?.lua;/usr/lib/lua/?/init.lua;" .. package.path
-package.cpath = "/usr/lib/lua/?.so;" .. package.cpath
-
-require("ffluci.http")
-require("ffluci.sys")
-require("ffluci.model.uci")
-
--- Init state session
-uci = ffluci.model.uci.Session("/var/state")
-
-
--- Parse stdin and do something
-function main(argv)
- local cmd = argv[1]
- local arg = argv[2]
-
- if not cmd then
- print("Usage: " .. argv[0] .. " <status|add|remove|sync> [MAC]")
- os.exit(1)
- elseif cmd == "status" then
- if not arg then
- os.exit(1)
- end
-
- if iswhitelisted(arg) then
- print("whitelisted")
- os.exit(0)
- end
-
- if haslease(arg) then
- print("lease")
- os.exit(0)
- end
-
- print("unknown")
- os.exit(0)
- elseif cmd == "add" then
- if not arg then
- os.exit(1)
- end
-
- if not haslease(arg) then
- add_lease(arg)
- else
- print("already leased!")
- os.exit(2)
- end
- os.exit(0)
- elseif cmd == "remove" then
- if not cmd[2] then
- os.exit(1)
- end
-
- remove_lease(arg)
- os.exit(0)
- elseif cmd == "sync" then
- sync()
- os.exit(0)
- end
-end
-
--- Add a lease to state and invoke add_rule
-function add_lease(mac)
- local key = uci:add("luci_splash", "lease")
- uci:set("luci_splash", key, "mac", mac)
- uci:set("luci_splash", key, "start", os.time())
- add_rule(mac)
-end
-
-
--- Remove a lease from state and invoke remove_rule
-function remove_lease(mac)
- mac = mac:lower()
-
- for k, v in pairs(uci:show("luci_splash").luci_splash) do
- if v.mac:lower() == mac then
- remove_rule(mac)
- uci:del("luci_splash", k)
- end
- end
-end
-
-
--- Add an iptables rule
-function add_rule(mac)
- return os.execute("iptables -t nat -I luci_splash_leases -m mac --mac-source '"..mac.."' -j RETURN")
-end
-
-
--- Remove an iptables rule
-function remove_rule(mac)
- return os.execute("iptables -t nat -D luci_splash_leases -m mac --mac-source '"..mac.."' -j RETURN")
-end
-
-
--- Check whether a MAC-Address is listed in the lease state list
-function haslease(mac)
- mac = mac:lower()
-
- for k, v in pairs(uci:show("luci_splash").luci_splash) do
- if v[".type"] == "lease" and v.mac and v.mac:lower() == mac then
- return true
- end
- end
-
- return false
-end
-
-
--- Check whether a MAC-Address is whitelisted
-function iswhitelisted(mac)
- mac = mac:lower()
-
- for k, v in pairs(uci:show("luci_splash").luci_splash) do
- if v[".type"] == "whitelist" and v.mac and v.mac:lower() == mac then
- return true
- end
- end
-
- return false
-end
-
-
--- Returns a list of MAC-Addresses for which a rule is existing
-function listrules()
- local cmd = "iptables -t nat -L luci_splash_leases | grep RETURN |"
- cmd = cmd .. "egrep -io [0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+"
- return ffluci.util.split(ffluci.sys.exec(cmd))
-end
-
-
--- Synchronise leases, remove abandoned rules
-function sync()
- local written = {}
- local time = os.time()
-
- -- Current leases in state files
- local leases = uci:show("luci_splash").luci_splash
-
- -- Convert leasetime to seconds
- local leasetime = tonumber(uci:get("luci_splash", "general", "leasetime")) * 3600
-
- -- Clean state file
- uci:revert("luci_splash")
-
-
- -- For all leases
- for k, v in pairs(uci:show("luci_splash")) do
- if v[".type"] == "lease" then
- if os.difftime(time, tonumber(v.start)) > leasetime then
- -- Remove expired
- remove_rule(v.mac)
- else
- -- Rewrite state
- local n = uci:add("luci_splash", "lease")
- uci:set("luci_splash", n, "mac", v.mac)
- uci:set("luci_splash", n, "start", v.start)
- written[v.mac] = 1
- end
- end
- end
-
-
- -- Delete rules without state
- for i, r in ipairs(listrules()) do
- if #r > 0 and not written[r] then
- remove_rule(r)
- end
- end
-end
-
-main(arg) \ No newline at end of file