Добыча MAC для IPv6 (с предварительным "прощупыванием" хоста для его попадания в...
[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 _PING6     = '/bin/ping6 -c 1 -W 1'
8 _ARPCACHE6 = '/sbin/ip -6 n'
9
10 function _match_v4(ip)
11   return string.match(ip,"%d*%.%d*%.%d*%.%d*")
12 end
13
14 _arpcache.cache = {}
15
16 function _arpcache.get_mac(ip)
17
18   local rec = _arpcache.cache[ip]
19   if rec and rec.timestamp+config.arp_ttl > os.time() then
20     return rec["mac"]
21   end
22
23   local cmd
24   if _match_v4(ip) then
25     cmd = _ARPCACHE4
26   else
27     os.execute(_PING6..' '..ip)
28     cmd = _ARPCACHE6
29   end
30
31   local f = io.popen(cmd)
32   local res = nil
33   local line, w
34   
35   while true do
36
37     line = f:read()
38     if not line then 
39       break
40     end
41
42     w = {}
43
44     for k in string.gmatch(line, "(%S+)") do
45       table.insert(w, k)
46     end
47
48     if w[1]==ip then
49       res = w[5]
50       
51       break
52     end
53
54   end 
55
56   if res then
57     _arpcache.cache[ip] = { mac = res, timestamp = os.time() }
58   end
59
60   f:close()
61   return res 
62
63 end
64
65 return _arpcache