Добавлено кеширование привязки IP-mac.
authorRoman Bazalevsky <rvb@rvb.name>
Fri, 1 Nov 2019 20:08:29 +0000 (23:08 +0300)
committerRoman Bazalevsky <rvb@rvb.name>
Fri, 1 Nov 2019 20:08:29 +0000 (23:08 +0300)
src/arpcache.lua
src/config.lua
src/connection.lua
src/helper.lua

index 1ae8136f09bb18d1bfa96ddaea99a6ae3e20baaa..b4b8478ec82c118cbf37dbe2abdf340dc5b02862 100644 (file)
@@ -4,19 +4,25 @@ config = require "config"
 
 _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)
@@ -38,11 +44,16 @@ function _arpcache.get_mac(ip)
 
     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 
 
index 6c427cb13660e2369db15cedd03ad0e3d4f33a5e..842b445c63e36ed1b0103ee95634dc4a8659ff28 100644 (file)
@@ -36,6 +36,12 @@ function _config.read(file)
       end
     end 
   end
+
+  _config.arp_ttl = 60
+
+  if cfg["arp-ttl"] then
+    _config.arp_ttl = tonumber(cfg["arp-ttl"])
+  end
   
 end
 
index e1eff467dbfa22249e02d0c10fdaad76220a792e..f40dead190770d13fa0b7cd8f4b2af06e6f7baf3 100644 (file)
@@ -7,14 +7,15 @@ arpcache = require "arpcache"
 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  
index 79711e2370098ff47aad2c683743744d1d22b709..53712c4644379dd66b376d7c23877b36d5475d4f 100755 (executable)
@@ -25,7 +25,9 @@ function main()
   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")