-- Usage:
-- 1. Save file to /etc/astra/scan.lua
-- 2. Change s and e values (s is a start address, e is an end address)
-- 3. Launch: astra /etc/astra/scan.lua
-- Config
timeout = 5
s = "239.255.1.0"
e = "239.255.4.255"
-- App
function ip_to_number(ip)
ip = ip:split("%.")
if #ip ~= 4 then return 0 end
for k,v in ipairs(ip) do
ip[k] = tonumber(v)
if not ip[k] then return 0 end
end
return bit32.lshift(ip[1], 24) + bit32.lshift(ip[2], 16) + bit32.lshift(ip[3], 8) + (ip[4])
end
function number_to_ip(num)
local ip1 = math.fmod(bit32.rshift(num, 24), 0x100)
local ip2 = math.fmod(bit32.rshift(num, 16), 0x100)
local ip3 = math.fmod(bit32.rshift(num, 8), 0x100)
local ip4 = math.fmod(num, 0x100)
return ip1 .. "." .. ip2 .. "." .. ip3 .. "." .. ip4
end
s = ip_to_number(s)
e = ip_to_number(e)
c = {}
function start_next()
c.t:close()
c.t = nil
c.i = nil
c.a = nil
collectgarbage()
s = s + 1
if s >= e then
log.info("Stop scan")
astra.exit()
else
scan_address()
end
end
function scan_address()
c.t = timer({
interval = timeout,
callback = function()
start_next()
end
})
local addr = number_to_ip(s)
local name = "scan " .. addr
c.i = udp_input({
name = name,
addr = addr,
port = 1234,
})
c.a = analyze({
upstream = c.i:stream(),
name = name,
join_pid = true,
callback = function(data)
if data.on_air then
log.info(addr)
start_next()
end
end,
})
end
scan_address()
Comments