b4b8478ec82c118cbf37dbe2abdf340dc5b02862
[lua-squid-acl-helper.git] / src / arpcache.lua
1 -- module to access linux ARP cache
2
3 config = require "config"
4
5 _arpcache = {}
6 _ARPCACHE4 = '/sbin/ip -4 n'
7
8 function _match_v4(ip)
9   return string.match(ip,"%d*%.%d*%.%d*%.%d*")
10 end
11
12 _arpcache.cache = {}
13
14 function _arpcache.get_mac(ip)
15
16   local rec = _arpcache.cache[ip]
17   if rec and rec.timestamp+config.arp_ttl > os.time() then
18     return rec["mac"]
19   end
20
21   local cmd
22   if _match_v4(ip) then
23     cmd = _ARPCACHE4
24   else
25     return "OK"
26   end
27
28   local f = io.popen(cmd)
29   local res = nil
30   local line, w
31   
32   while true do
33
34     line = f:read()
35     if not line then 
36       break
37     end
38
39     w = {}
40
41     for k in string.gmatch(line, "(%S+)") do
42       table.insert(w, k)
43     end
44
45     if w[1]==ip then
46       res = w[5]
47       
48       break
49     end
50
51   end 
52
53   if res then
54     _arpcache.cache[ip] = { mac = res, timestamp = os.time() }
55   end
56
57   f:close()
58   return res 
59
60 end
61
62 return _arpcache