--
-- (C) 2013-25 - ntop.org
--

--
-- Volatile (across ntopng restarts) in-memory cache
--

local dirs = ntop.getDirs()
package.path = dirs.installdir .. "/scripts/lua/modules/?.lua;" .. package.path

local json = require "dkjson"

local cache_utils = {}

-- ##############################################

-- Loaded at startup
function cache_utils.initialize()
   local basename = "ntopng.cachedsnmp."
   local len  = string.len(basename)

   -- system
   local keys = ntop.getKeysCache(basename.."*.system")

   for k,_ in pairs(keys or {}) do
      local system = json.decode(ntop.getCache(k))
      local ipaddr = string.sub(k, len+1, string.len(k)-7)

      cache_utils.sethostname(ipaddr, system.name)
   end

   -- interfaces
   keys = ntop.getKeysCache(basename.."*.interfaces")

   for k,_ in pairs(keys or {}) do
      local ifaces = json.decode(ntop.getCache(k))
      local ipaddr = string.sub(k, len+1, string.len(k)-11)

      -- tprint("Loading "..ipaddr)
      for if_id,if_v in pairs(ifaces) do
	 local val = if_v.alias or if_v.ifname or if_v.name

	 if(val ~= nil) then
	    cache_utils.setifname(ipaddr, if_id, val)
	 end
      end
   end

   -- Debug
   -- tprint(ntop.dumpLuaCache())
end

-- ##############################################

function cache_utils.gethostname(ipaddr)
   return(ntop.getLuaCache("host."..ipaddr))
end

-- ##############################################

function cache_utils.sethostname(ipaddr, name)
   if(debugme) then
      tprint("cache_utils.sethostname(".. ipaddr .. ", ".. name..")")
   end
   
   return(ntop.setLuaCache("host."..ipaddr, name or ipaddr))
end

-- ##############################################

function cache_utils.getifname(ipaddr, ifid)
   local ret = ntop.getLuaCache("iface."..ipaddr.."@"..ifid)

   if(isEmptyString(ret)) then
      ret = ifid
   end

   if(debugme) then
      tprint(debug.traceback())
      tprint("cache_utils.getifname(".. ipaddr .. ", ".. ifid..") = "..ret)
   end
   
   return(ret)
end

-- ##############################################

function cache_utils.setifname(ipaddr, ifid, ifname)
   if(ifname == nil) then
      tprint("cache_utils.setifname() ERROR on interface "..ipaddr.." / "..ifid)
      tprint(debug.traceback())
   end
   
   return(ntop.setLuaCache("iface."..ipaddr.."@"..ifid, ifname or ifid))
end

-- ##############################################

function cache_utils.set(key, val)
   ntop.setLuaCache(key, val)
end

-- ##############################################

return cache_utils
