_arpcache = {}
_ARPCACHE4 = '/sbin/ip -4 n'
-_ARPCACHE6 = '/sbin/ip -6 n'
function _match_v4(ip)
return string.match(ip,"%d*%.%d*%.%d*%.%d*")
end
+_arpcache.cache = {}
+
function _arpcache.get_mac(ip)
+ local rec = _arpcache.cache[ip]
+ if rec and rec.timestamp+config.arp_ttl > os.time() then
+ return rec["mac"]
+ end
+
local cmd
if _match_v4(ip) then
cmd = _ARPCACHE4
else
- cmd = _ARPCACHE6
+ return "OK"
end
local f = io.popen(cmd)
if w[1]==ip then
res = w[5]
+
break
end
end
+ if res then
+ _arpcache.cache[ip] = { mac = res, timestamp = os.time() }
+ end
+
f:close()
return res
end
end
end
+
+ _config.arp_ttl = 60
+
+ if cfg["arp-ttl"] then
+ _config.arp_ttl = tonumber(cfg["arp-ttl"])
+ end
end
function _connection.auth(serv, localport, remoteport)
local user = config.map_ip(serv)
+ local mac = nil
if not user then
- local mac = arpcache.get_mac(serv)
+ mac = arpcache.get_mac(serv)
if mac then
user = config.map_mac(mac)
end
end
-
+
if user == "*ident" then
user = ident.resolve(serv,localport,config.map_port(remoteport))
end
while true do
str=io.read()
vals = str:split(" ")
- status, res = pcall(connection.auth,vals[1],vals[2],vals[3])
+-- status, res = pcall(connection.auth,vals[1],vals[2],vals[3])
+ status = 1
+ res = connection.auth(vals[1],vals[2],vals[3])
if status then
if res and res ~= "" then
io.write("OK user="..res.."\n")