ntopng/scripts/lua/modules/http_bridge_conf_utils.lua
Simone Mainardi 5ade224d85 Implements global host pools
Implements #4086

Refactors host pools to global

Implements host pools migration

Migration fixes

nEdge changes for host pools migration

Create README.host_pools_migration.md
2020-07-01 12:02:09 +02:00

176 lines
6.2 KiB
Lua

--
-- (C) 2017-20 - ntop.org
--
-- ######################################################################################
-- ################### HTTP HOST POOLS CONFIGURATION ####################################
-- ######################################################################################
dirs = ntop.getDirs()
package.path = dirs.installdir .. "/scripts/lua/modules/?.lua;" .. package.path
if(ntop.isPro()) then
package.path = dirs.installdir .. "/pro/scripts/lua/modules/?.lua;" .. package.path
package.path = dirs.installdir .. "/pro/scripts/callbacks/?.lua;" .. package.path
end
if ntop.isnEdge() then
package.path = dirs.installdir .. "/pro/scripts/lua/nedge/modules/?.lua;" .. package.path
end
require "lua_utils"
local json = require "dkjson"
local host_pools_utils = require "host_pools_utils"
local users_utils = require("users_utils")
local shaper_utils
if(ntop.isPro()) then
shaper_utils = require "shaper_utils"
end
local http_bridge_conf_utils = {}
-- set to a non-empty value to enable HTTP configuration, e.g.,
-- http_bridge_conf_utils.HTTP_BRIDGE_CONFIGURATION_URL = "localhost:8000"
http_bridge_conf_utils.HTTP_BRIDGE_CONFIGURATION_URL = ""
function http_bridge_conf_utils.configureBridge()
if not isEmptyString(http_bridge_conf_utils.HTTP_BRIDGE_CONFIGURATION_URL) then
-- CLEANUP
shaper_utils.clearShapers()
-- empty pool members but don't delete pools
host_pools_utils.emptyPools()
-- BASIC INITIALIZATION
host_pools_utils.initPools()
shaper_utils.initShapers()
-- RETRIEVE BRIDGE CONFIGURATION
-- EXAMPLE RESPONSE STRUCTURE:
local rsp = {
-- ["users"] = {
-- ["maina"] = {
-- ["full_name"] = "Maina Fast",
-- ["password"] = "ntop0101",
-- ["default_policy"] = "pass",
-- ["policies"] = {
-- [10] = "slow_pass", ["Facebook"] = "slower_pass", ["YouTube"] = "drop"
-- }
-- },
-- ["simon"] = {
-- ["full_name"] = "Simon Speed",
-- ["password"] = "ntop0202",
-- ["default_policy"] = "drop",
-- ["policies"] = {
-- ["MyCustomProtocol"]="pass", [20] = "slow_pass", [22] = "slower_pass"
-- }
-- }
-- }
}
local rsp = ntop.httpGet(http_bridge_conf_utils.HTTP_BRIDGE_CONFIGURATION_URL)
if rsp == nil then
host_pools_utils.traceHostPoolEvent(TRACE_ERROR, "Unable to obtain a valid configuration from "..http_bridge_conf_utils.HTTP_BRIDGE_CONFIGURATION_URL)
return
end
if rsp["CONTENT"] then rsp = rsp["CONTENT"] end
if not rsp then rsp = {} end
if type(rsp) == "string" then
rsp = json.decode(rsp)
if rsp == nil then
print("Unable to decode response as valid JSON")
end
end
local ndpi_protocols = {}
for proto_name, proto_id in pairs(interface.getnDPIProtocols()) do
-- case-insensitive
ndpi_protocols[string.lower(proto_name)] = proto_id
end
local nedge_shapers = {}
for _, shaper in ipairs(shaper_utils.nedge_shapers) do
nedge_shapers[string.lower(shaper.name)] = shaper
end
-- FOR EACH INTERFACE...
for _, ifname in pairs(interface.getIfNames()) do
interface.select(ifname)
local ifid = getInterfaceId(ifname)
-- SETUP HOST POOLS
for username, user_config in pairs(rsp["users"] or {}) do
if username ~= host_pools_utils.DEFAULT_POOL_NAME then
users_utils.addUserIfNotExists(ifid, username, user_config["password"] or "", user_config["full_name"] or "")
end
local pool_id = host_pools_utils.usernameToPoolId(username) or host_pools_utils.DEFAULT_POOL_ID
host_pools_utils.traceHostPoolEvent(TRACE_NORMAL, ifname..": creating user: "..username.. " pool id: "..pool_id)
if not isEmptyString(user_config["default_policy"]) then
local default_policy = string.lower(user_config["default_policy"])
if nedge_shapers[default_policy] and default_policy ~= "default" then -- default can't be default :)
shaper_utils.setPoolShaper(ifid, pool_id, nedge_shapers[default_policy].id)
end
for proto, policy in pairs(user_config["policies"] or {}) do
policy = nedge_shapers[string.lower(policy)]
if tonumber(proto) == nil then
proto = ndpi_protocols[string.lower(proto)]
end
if policy and tonumber(proto) ~= nil then
if (policy.name == "DEFAULT") and no_quota then
shaper_utils.deleteProtocol(ifid, pool_id, proto)
else
shaper_utils.setProtocolShapers(ifid, pool_id, proto,
policy.id, policy.id,
0 --[[traffic_quota--]], 0--[[time_quota--]])
-- tprint({proto=proto, name = interface.getnDPIProtoName(tonumber(proto)), pool_id=pool_id, policy_id=policy.id})
end
end
end
end
end
-- must leave it here as well to make sure the C part has updated with the new pools
ntop.reloadHostPools()
-- SETUP ASSOCIATIONS
for member, info in pairs(rsp["associations"] or {}) do
local pool = info["group"]
local connectivity = info["connectivity"]
local pool_id = host_pools_utils.usernameToPoolId(pool)
if pool == host_pools_utils.DEFAULT_POOL_NAME then
host_pools_utils.traceHostPoolEvent(TRACE_ERROR, ifname..": members are associated automatically with default pool "..host_pools_utils.DEFAULT_POOL_NAME.." skipping association with member: "..member)
elseif not pool_id then
host_pools_utils.traceHostPoolEvent(TRACE_ERROR, ifname..": pool: "..pool.. " not existing. Unable to set association with: "..member)
else
if connectivity == "pass" then
if host_pools_utils.addPoolMember(pool_id, member) == true then
host_pools_utils.traceHostPoolEvent(TRACE_NORMAL, ifname..": member "..member.. " successfully associated to pool: "..pool)
else
host_pools_utils.traceHostPoolEvent(TRACE_ERROR, ifname..": Unable to associate member "..member.. " to pool: "..pool)
end
end
end
end
end
ntop.reloadHostPools()
end
end
return http_bridge_conf_utils
-- ######################################################################################
-- ######################################################################################
-- ######################################################################################