-- -- (C) 2017 - ntop.org -- dirs = ntop.getDirs() package.path = dirs.installdir .. "/scripts/lua/modules/?.lua;" .. package.path require "lua_utils" local host_pools_utils = require "host_pools_utils" local template = require "template_utils" if(ntop.isPro()) then package.path = dirs.installdir .. "/pro/scripts/lua/modules/?.lua;" .. package.path shaper_utils = require "shaper_utils" end -- Administrator check if not isAdministrator() then return end local pool_add_warnings = {} if _POST["edit_pools"] ~= nil then local config = paramsPairsDecode(_POST, true) for pool_id, pool_name in pairs(config) do -- Filter pool ids only if tonumber(pool_id) ~= nil then local children_safe = nil if config["_csafe_"..pool_id] ~= nil then children_safe = config["_csafe_"..pool_id] end local enforce_quotas_per_pool_member = nil if config["_qts_per_member_"..pool_id] ~= nil then enforce_quotas_per_pool_member = config["_qts_per_member_"..pool_id] end -- create or rename host_pools_utils.createPool(ifId, pool_id, pool_name, children_safe, enforce_quotas_per_pool_member) if(interface.isBridgeInterface(ifId) == true) then -- create default shapers shaper_utils.initDefaultShapers(ifid, pool_id) end end end -- Reload is required here to load the new metadata interface.reloadHostPools() elseif _POST["pool_to_delete"] ~= nil then local pool_id = _POST["pool_to_delete"] host_pools_utils.deletePool(ifId, pool_id) if(interface.isBridgeInterface(ifId) == true) then shaper_utils.flushPoolRules(ifId, pool_id) end -- Note: this will also reload the shaping rules interface.reloadHostPools() elseif (_POST["edit_members"] ~= nil) then local pool_to_edit = _POST["pool"] local config = paramsPairsDecode(_POST, true) -- First of all, normalize new networks (extract their prefix) -- Note: alias/device type mapping will not be preserved for masked networks, and this is ok since networks do not have such information for new_member, old_member in pairs(table.clone(config) --[[ Work on a copy to modify the original while iterating ]]) do if not starts(new_member, "_") then if not isValidPoolMember(new_member) then http_lint.validationError(_POST, "new_member", new_member, "Invalid pool member") end if (not isEmptyString(old_member)) and (not isValidPoolMember(old_member)) then http_lint.validationError(_POST, "old_member", old_member, "Invalid pool member") end local hostinfo = hostkey2hostinfo(new_member) local network, prefix = splitNetworkPrefix(hostinfo.host) if prefix ~= nil then local masked = ntop.networkPrefix(network, prefix) if masked ~= network then local new_key = host2member(masked, hostinfo.vlan, prefix) config[new_member] = nil config[new_key] = old_member pool_add_warnings[#pool_add_warnings + 1] = i18n("host_pools.network_normalized", { network = hostinfo2hostkey(hostkey2hostinfo(new_member)), network_normalized = hostinfo2hostkey(hostkey2hostinfo(new_key)) }) end end end end -- This code handles member address changes. The starting '_' is used for icons and alias -- delete old addresses for k,old_member in pairs(table.clone(config) --[[ Work on a copy to modify the original while iterating ]]) do if not starts(k, "_") then if((not isEmptyString(old_member)) and (k ~= old_member)) then if config[old_member] then -- Do not delete and re-add members which have only changed their list index config[old_member] = old_member else host_pools_utils.deletePoolMember(ifId, pool_to_edit, old_member) end end end end -- add new addresses for new_member,k in pairs(config) do if not starts(new_member, "_") then local is_new_member = (k ~= new_member) if is_new_member then local res, info = host_pools_utils.addPoolMember(ifId, pool_to_edit, new_member) if (res == false) and (info.existing_member_pool ~= nil) then -- remove @0 local member_to_print = hostinfo2hostkey(hostkey2hostinfo(new_member)) pool_add_warnings[#pool_add_warnings + 1] = i18n("host_pools.member_exists", { member_name = member_to_print, member_pool = host_pools_utils.getPoolName(ifId, info.existing_member_pool) }) end end local host_key, is_network = host_pools_utils.getMemberKey(new_member) if not is_network then local alias = config["_alias_" .. new_member] local skip_alias = false if isMacAddress(new_member) then local manuf = ntop.getMacManufacturer(new_member) if (manuf ~= nil) and (manuf.extended == alias) then -- this is not the alias, it is the manufacturer skip_alias = true end end if(((not is_new_member) or (not isEmptyString(alias))) and (not skip_alias)) then setHostAltName(host_key, alias) end local icon = config["_icon_" .. new_member] if((not is_new_member) or (not isEmptyString(icon))) then setHostIcon(host_key, icon) end end end end interface.reloadHostPools() elseif _POST["member_to_delete"] ~= nil then local pool_to_edit = _POST["pool"] host_pools_utils.deletePoolMember(ifId, pool_to_edit, _POST["member_to_delete"]) interface.reloadHostPools() elseif _POST["empty_pool"] ~= nil then host_pools_utils.emptyPool(ifId, _POST["empty_pool"]) interface.reloadHostPools() elseif (_POST["member"] ~= nil) and (_POST["pool"] ~= nil) then -- change member pool host_pools_utils.changeMemberPool(ifId, _POST["member"], _POST["pool"], nil, true --[[do not consider host MAC]]) interface.reloadHostPools() end function printPoolNameField(pool_id_str) print[[