ntopng/scripts/lua/find_host.lua
2018-10-02 15:33:15 +02:00

100 lines
2.8 KiB
Lua

--
-- (C) 2013-18 - ntop.org
--
local dirs = ntop.getDirs()
package.path = dirs.installdir .. "/scripts/lua/modules/?.lua;" .. package.path
require "lua_utils"
local json = require "dkjson"
if ntop.isPro() then
package.path = dirs.installdir .. "/scripts/lua/pro/modules/?.lua;" .. package.path
require("snmp_utils")
end
sendHTTPHeader('application/json')
local max_num_to_find = 5
local already_printed = {}
local results = {}
local query = _GET["query"]
if(query == nil) then query = "" end
interface.select(ifname)
local res = interface.findHost(query)
-- Also look at the custom names
local ip_to_name = ntop.getHashAllCache(getHostAltNamesKey()) or {}
for ip,name in pairs(ip_to_name) do
if string.contains(string.lower(name), string.lower(query)) then
res[ip] = hostVisualization(ip, name)
end
end
-- Also look at the DHCP cache
local mac_to_name = ntop.getHashAllCache(getDhcpNamesKey(getInterfaceId(ifname))) or {}
for mac, name in pairs(mac_to_name) do
if string.contains(string.lower(name), string.lower(query)) then
res[mac] = hostVisualization(mac, name)
end
end
-- Check also in the mac addresses of snmp devices
-- The query can be partial so we can't use functions to
-- test if it'a an IPv4, an IPv6, or a mac as they would yield
-- wrong results. We can just check for a dot in the string as if
-- there's a dot then we're sure it can't be a mac
if ntop.isEnterprise() and not query:find("%.") then
local mac = string.upper(query)
local devices = get_snmp_devices()
local matches = find_mac_snmp_ports(mac, true)
for _, snmp_port in ipairs(matches) do
local snmp_device_ip = snmp_port["snmp_device_ip"]
local matching_mac = snmp_port["mac"]
local snmp_port_idx = snmp_port["id"]
local snmp_port_name = snmp_port["name"]
local title = get_localized_snmp_device_and_interface_label(snmp_device_ip, {index = snmp_port_idx, name = snmp_port_name})
results[#results + 1] = {
name = matching_mac .. ' '..title, type = "snmp",
ip = snmp_device_ip, snmp_port_idx = snmp_port_idx}
if #results >= max_num_to_find then
break
end
end
end
if #results < max_num_to_find and res ~= nil then
for k, v in pairs(res) do
if isIPv6(v) and (not string.contains(v, "%[IPv6%]")) then
v = v.." [IPv6]"
end
if((v ~= "") and (already_printed[v] == nil)) then
if isMacAddress(v) then
results[#results + 1] = {name = v, ip = v, type = "mac"}
elseif isMacAddress(k) then
results[#results + 1] = {name = v, ip = k, type = "mac"}
else
results[#results + 1] = {name = v, ip = k, type = "ip"}
end
already_printed[v] = true
end -- if
if #results >= max_num_to_find then
break
end
end -- for
end -- if
local resp = {interface = ifname,
results = results}
print(json.encode(resp))