OpenWrt: простой lua-скрипт для мониторинга коннектов

Информация, статьи, патчи, исходные коды и т.д.
Post Reply
sva
Администратор
Posts: 125
Joined: 01 May 2015, 19:56

OpenWrt: простой lua-скрипт для мониторинга коннектов

Post by sva »

Захотелось через веб мониторить коннекты пользователей на OpenWrt. Так как в качестве языка CGI там используется - Lua, то пришлось погуглить по нему документацию, почитать и... через час скрипт был готов. Тут делюсь им, может кому-нить пригодится.

Code: Select all

#!/usr/bin/lua

function splits(str, sep)
if sep == nil then
  return {str}
end

local parts = {} --parts array
local first = 1
local ostart, oend = string.find(str, sep, first, true) --regexp disabled search
while ostart do
  local part = string.sub(str, first, ostart - 1)
  table.insert(parts, part)
  first = oend + 1
  ostart, oend = string.find(str, sep, first, true)
end

local part = string.sub(str, first)
table.insert(parts, part)
return parts
end

print ("Content-type: Text/html\n")
print("sva's simple monitoring script!\n<br />")

print("<table border=1><tr><th>proto</th><th>state</th><th>src ip</th><th>src port</th><th>dst ip</th><th>dst port</th><th>packets</th><th>bytes</th><th>unknow1</th><th>unknow2</th></tr>")

for line in io.lines("/proc/net/nf_conntrack") do
-- print(line, "<br />\n")
while string.find(line, "  ") do
  line = string.gsub(line, "  ", " ")
end

li = splits(line, " ")

for i=1, table.maxn(li), 1 do
  if string.find(li[i], "=") ~= nil then
   li[i] = string.sub(li[i], string.find(li[i], "=")+1)
  end
end

if li[3] == "tcp" then
  --print(line, "<br />\n")
  print("<tr><td>", li[3], "</td>") -- proto
  if li[6] == "ESTABLISHED" then
   print("<td bgcolor=lightgreen>", li[6], "</td>")  -- state
  else
   print("<td>", li[6], "</td>")       -- state
  end
  print("<td>", li[7], "</td>")  -- src ip
  print("<td>", li[9], "</td>")  -- src port
  print("<td>", li[8], "</td>")  -- dst ip
  print("<td>", li[10], "</td>")  -- dst port
  print("<td>", li[11], "</td>")  -- packets
  print("<td>", li[12], "</td>")  -- bytes
  print("<td>", li[17], "</td>")  -- unknow1
  print("<td>", li[18], "</td></tr>") -- unknow2
elseif li[3] == "udp" then
  print("<tr><td>", li[3], "</td>") -- proto
  print("<td>", "---", "</td>")  -- state
  print("<td>", li[6], "</td>")  -- src ip
  print("<td>", li[8], "</td>")  -- src port
  print("<td>", li[7], "</td>")  -- dst ip
  print("<td>", li[9], "</td>")  -- dst port
  print("<td>", li[10], "</td>")  -- packets
  print("<td>", li[11], "</td>")  -- bytes
  print("<td>", "---", "</td>")  -- unknow1
  print("<td>", "---", "</td></tr>") -- unknow2
else
  print("</table>")
  print("<br />", line, "<br />\n")
  print("<table border=1><tr><th>proto</th><th>state</th><th>src ip</th><th>src port</th><th>dst ip</th><th>dst port</th><th>packets</th><th>bytes</th><th>unknow1</th><th>unknow2</th></tr>")
end

-- break
end

print("</table>")
Post Reply