X-Git-Url: http://git.archive.openwrt.org/?a=blobdiff_plain;f=applications%2Fluci-splash%2Froot%2Fusr%2Fsbin%2Fluci-splash;h=6b1e41edbde7c63ec07c38da766476fce14a3768;hb=9edd0e46c3f880727738ce8ca6ff1c8b85f99ef4;hp=316552b0c23b6e60f55bea31eb44131870ebcc09;hpb=69792fa157f97939a66c763d8a997b77e39d7da6;p=project%2Fluci.git diff --git a/applications/luci-splash/root/usr/sbin/luci-splash b/applications/luci-splash/root/usr/sbin/luci-splash index 316552b0c..6b1e41edb 100755 --- a/applications/luci-splash/root/usr/sbin/luci-splash +++ b/applications/luci-splash/root/usr/sbin/luci-splash @@ -13,19 +13,12 @@ local net = sys.net local fs = require "luci.fs" local ip = require "luci.ip" -local debug = true +local debug = false local has_ipv6 = fs.access("/proc/net/ipv6_route") and fs.access("/usr/sbin/ip6tables") -function lock() - os.execute("lock /var/run/luci_splash.lock") -end - -function unlock() - os.execute("lock -u /var/run/luci_splash.lock") -end - function exec(cmd) + -- executes a cmd and gets its output if debug then local ret = sys.exec(cmd) print('+ ' .. cmd) @@ -37,6 +30,23 @@ function exec(cmd) end end +function call(cmd) + -- just calls a command + if debug then + print('+ ' .. cmd) + end + os.execute(cmd) +end + + +function lock() + call("lock /var/run/luci_splash.lock") +end + +function unlock() + call("lock -u /var/run/luci_splash.lock") +end + function get_id(ip) local o3, o4 = ip:match("[0-9]+%.[0-9]+%.([0-9]+)%.([0-9]+)") if o3 and 04 then @@ -46,7 +56,7 @@ function get_id(ip) end end -function update_stats(leased, whitelisted, whitelisttotal, blacklisted, blacklisttotal) +function update_stats(leased, whitelisted, whitelisttotal, blacklisted, blacklisttotal) local leases = uci:get_all("luci_splash_leases", "stats") uci:delete("luci_splash_leases", "stats") uci:section("luci_splash_leases", "stats", "stats", { @@ -59,6 +69,7 @@ function update_stats(leased, whitelisted, whitelisttotal, blacklisted, blacklis uci:save("luci_splash_leases") end + function get_device_for_ip(ipaddr) local dev uci:foreach("network", "interface", function(s) @@ -239,13 +250,13 @@ function main(argv) else print("The mac %s is not known" % mac) end + else print("Can not find mac for ip %s" % argv[i]) end end - unlock() - os.exit(0) + os.exit(0) elseif cmd == "sync" then sync() os.exit(0) @@ -280,20 +291,28 @@ function get_known_macs(list) local leased_macs = { } if not list or list == "lease" then - uci:foreach("luci_splash_leases", "lease", - function(s) leased_macs[s.mac:lower()] = true end) + uci:foreach("luci_splash_leases", "lease", function(s) + if s.mac then + leased_macs[s.mac:lower()] = true + end + end) end if not list or list == "whitelist" then - uci:foreach("luci_splash", "whitelist", - function(s) leased_macs[s.mac:lower()] = true end) + uci:foreach("luci_splash", "whitelist", function(s) + if s.mac then + leased_macs[s.mac:lower()] = true + end + end) end if not list or list == "blacklist" then - uci:foreach("luci_splash", "blacklist", - function(s) leased_macs[s.mac:lower()] = true end) + uci:foreach("luci_splash", "blacklist", function(s) + if s.mac then + leased_macs[s.mac:lower()] = true + end + end) end - return leased_macs end @@ -381,16 +400,17 @@ function remove_lease(mac) uci:delete_all("luci_splash_leases", "lease", function(s) if s.mac:lower() == mac then - remove_lease_rule(mac, s.ipaddr, s.device, tonumber(s.limit_up), tonumber(s.limit_down)) + local leased = uci:get("luci_splash_leases", "stats", "leases") if type(tonumber(leased)) == "number" and tonumber(leased) > 0 then update_stats(leased - 1, nil, nil, nil, nil) end + remove_lease_rule(mac, s.ipaddr, s.device, tonumber(s.limit_up), tonumber(s.limit_down)) return true end return false end) - + uci:save("luci_splash_leases") end @@ -474,6 +494,7 @@ function add_lease_rule(mac, ipaddr, device) end --for ipv6: need to use the mac here + if has_ipv6 then exec("ip6tables -t mangle -I luci_splash_mark_out -m mac --mac-source %q -j MARK --set-mark 79" % mac) if id and device and tonumber(limit_down) then @@ -501,6 +522,7 @@ end -- Remove lease, black- or whitelist rules function remove_lease_rule(mac, ipaddr, device, limit_up, limit_down) + local id if ipaddr then id = get_id(ipaddr) @@ -524,14 +546,12 @@ function remove_lease_rule(mac, ipaddr, device, limit_up, limit_down) print('Warning! Could not get a handle for %s parent :ffff on interface %s' % { mac, device }) end end - -- remove clients class if device and id then exec('tc class del dev "%s" classid 1:%s' % {device, id}) exec('tc filter del dev "%s" parent 1:0 prio 1' % device) -- ipv6 rule - exec('tc qdisc del dev "%s" parent 1:%s sfq perturb 10' % { device, id }) + --exec('tc qdisc del dev "%s" parent 1:%s sfq perturb 10' % { device, id }) end - end @@ -576,9 +596,19 @@ function sync() -- Clean state file uci:load("luci_splash_leases") uci:revert("luci_splash_leases") - - -- For all leases + + + local arpcache = get_arpcache() + + local blackwhitelist = uci:get_all("luci_splash") + local whitelist_total = 0 + local whitelist_online = 0 + local blacklist_total = 0 + local blacklist_online = 0 local leasecount = 0 + local leases_online = 0 + + -- For all leases for k, v in pairs(leases) do if v[".type"] == "lease" then if os.difftime(time, tonumber(v.start)) > leasetime then @@ -586,6 +616,12 @@ function sync() remove_lease_rule(v.mac, v.ipaddr, v.device, tonumber(v.limit_up), tonumber(v.limit_down)) else leasecount = leasecount + 1 + + -- only count leases_online for connected clients + if arpcache[v.mac] then + leases_online = leases_online + 1 + end + -- Rewrite state uci:section("luci_splash_leases", "lease", convert_mac_to_secname(v.mac), { mac = v.mac, @@ -599,16 +635,6 @@ function sync() end end - -- Get the mac addresses of current leases - local macs = get_known_macs() - local arpcache = get_arpcache() - - local blackwhitelist = uci:get_all("luci_splash") - local whitelist_total = 0 - local whitelist_online = 0 - local blacklist_total = 0 - local blacklist_online = 0 - -- Whitelist, Blacklist for _, s in utl.spairs(blackwhitelist, function(a,b) return blackwhitelist[a][".type"] > blackwhitelist[b][".type"] end @@ -633,10 +659,16 @@ function sync() end end - update_stats(leasecount, whitelist_online, whitelist_total, blacklist_online, blacklist_total) + -- ToDo: + -- include a new field "leases_online" in stats to differ between active clients and leases: + -- update_stats(leasecount, leases_online, whitelist_online, whitelist_total, blacklist_online, blacklist_total) later: + update_stats(leases_online, whitelist_online, whitelist_total, blacklist_online, blacklist_total) uci:save("luci_splash_leases") + -- Get the mac addresses of current leases + local macs = get_known_macs() + ipt:resync() ipt_delete_all({table="filter", chain="luci_splash_filter", options={"MAC"}},