<%# LuCI - Lua Configuration Interface Copyright 2009 Jo-Philipp Wich Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 $Id$ -%> <%- local utl = require "luci.util" local ipt = require "luci.sys.iptparser".IptParser() local uci = require "luci.model.uci".cursor_state() local wat = require "luci.tools.webadmin" local clients = { } local leasetime = tonumber(uci:get("luci_splash", "general", "leasetime") or 1) * 60 * 60 local leasefile = "/tmp/dhcp.leases" uci:foreach("dhcp", "dnsmasq", function(s) if s.leasefile then leasefile = s.leasefile end end) uci:foreach("luci_splash", "lease", function(s) if s.start and s.mac then clients[s.mac:lower()] = { start = tonumber(s.start), limit = ( tonumber(s.start) + leasetime ), mac = s.mac:upper(), policy = "normal", packets = 0, bytes = 0, kicked = s.kicked and true or false } end end) for _, r in ipairs(ipt:find({table="nat", chain="luci_splash_leases"})) do if r.options and #r.options >= 2 and r.options[1] == "MAC" then if not clients[r.options[2]:lower()] then clients[r.options[2]:lower()] = { start = 0, limit = 0, mac = r.options[2]:upper(), policy = ( r.target == "RETURN" ) and "whitelist" or "blacklist", packets = 0, bytes = 0 } end end end for _, r in ipairs(ipt:find({table="filter", chain="luci_splash_counter"})) do if r.options and #r.options >= 2 and r.options[1] == "MAC" then local c = clients[r.options[2]:lower()] if c and c.packets == 0 then c.bytes = tonumber(r.bytes) c.packets = tonumber(r.packets) end end end uci:foreach("luci_splash", "whitelist", function(s) if s.mac and clients[s.mac:lower()] then clients[s.mac:lower()].policy="whitelist" end end) uci:foreach("luci_splash", "blacklist", function(s) if s.mac and clients[s.mac:lower()] then clients[s.mac:lower()].policy=(s.kicked and "kicked" or "blacklist") end end) if luci.fs.access(leasefile) then for l in io.lines(leasefile) do local time, mac, ip, name = l:match("^(%d+) (%S+) (%S+) (%S+)") if time and mac and ip then local c = clients[mac:lower()] if c then c.ip = ip c.hostname = ( name ~= "*" ) and name or nil end end end end for i, a in ipairs(luci.sys.net.arptable()) do local c = clients[a["HW address"]:lower()] if c and not c.ip then c.ip = a["IP address"] end end local function showmac(mac) if not is_admin then mac = mac:gsub("(%S%S:%S%S):%S%S:%S%S:(%S%S:%S%S)", "%1:XX:XX:%2") end return mac end -%> <%+header%>

<%:ff_splash Client-Splash%>

<%:ff_splash_clients Active Clients%>
<% if is_admin then %>
<% end %> <%- local count = 0 for _, c in utl.spairs(clients, function(a,b) if clients[a].policy == clients[b].policy then return (clients[a].start > clients[b].start) else return (clients[a].policy > clients[b].policy) end end) do if c.ip then count = count + 1 -%> <%- end end if count == 0 then -%> <%- end -%>
<%:ff_splash_hostname Hostname%> <%:ff_splash_ip IP Address%> <%:ff_splash_mac MAC Address%> <%:ff_splash_timeleft Time remaining%> <%:ff_splash_traffic Outgoing traffic%> <%:ff_splash_policy Policy%>
<%=c.hostname or "" .. translate("ff_splash_unknown", "unknown") .. ""%> <%=c.ip or "" .. translate("ff_splash_unknown", "unknown") .. ""%> <%=showmac(c.mac)%> <%= (c.limit >= os.time()) and wat.date_format(c.limit-os.time()) or (c.policy ~= "normal") and "-" or "" .. translate("ff_splash_expired", "expired") .. "" %> <%=wat.byte_format(c.bytes)%> <% if is_admin then %> <% else %> <%=c.policy%> <% end %>

<%:ff_splash_noclients No clients connected%>
<% if is_admin then %>
<% end %>
<%+footer%>