From d05c191cc717ad87cd8d5fa241b91f35ed466335 Mon Sep 17 00:00:00 2001 From: Simone Mainardi Date: Wed, 8 Jul 2020 14:42:48 +0200 Subject: [PATCH] Implements lua class local_network_pools.lua to handle network pools --- include/Ntop.h | 2 +- scripts/lua/modules/pools/base_pools.lua | 1 - .../lua/modules/pools/local_network_pools.lua | 56 ++++++++++++++++++ src/LocalHost.cpp | 2 +- src/LuaEngineNtop.cpp.inc | 18 +++++- src/NetworkStats.cpp | 2 +- tests/lua/test_pools.lua | 57 +++++++++++++++++-- 7 files changed, 128 insertions(+), 10 deletions(-) create mode 100644 scripts/lua/modules/pools/local_network_pools.lua diff --git a/include/Ntop.h b/include/Ntop.h index fc305f77e7..f479ffb075 100644 --- a/include/Ntop.h +++ b/include/Ntop.h @@ -428,7 +428,7 @@ class Ntop { inline bool isStarted() { return(is_started); } bool isLocalInterfaceAddress(int family, void *addr) { return(local_interface_addresses.findAddress(family, addr) == -1 ? false : true); }; inline u_int8_t getLocalNetworkId(const char *network_name) { return(address->get_local_network_id(network_name)); } - inline char* getLocalNetworkName(int16_t local_network_id) { + inline const char* getLocalNetworkName(int16_t local_network_id) { return(address->get_local_network((u_int8_t)local_network_id)); }; void getLocalNetworkIp(int16_t local_network_id, IpAddress **network_ip, u_int8_t *network_prefix); diff --git a/scripts/lua/modules/pools/base_pools.lua b/scripts/lua/modules/pools/base_pools.lua index 5e38002457..7514c9a66e 100644 --- a/scripts/lua/modules/pools/base_pools.lua +++ b/scripts/lua/modules/pools/base_pools.lua @@ -400,7 +400,6 @@ end function base_pools:are_valid_members(members) for _, member in pairs(members) do if not self:is_valid_member(member) then - tprint("not found") return false end end diff --git a/scripts/lua/modules/pools/local_network_pools.lua b/scripts/lua/modules/pools/local_network_pools.lua new file mode 100644 index 0000000000..a558db17a1 --- /dev/null +++ b/scripts/lua/modules/pools/local_network_pools.lua @@ -0,0 +1,56 @@ +-- +-- (C) 2017-20 - ntop.org +-- + +package.path = dirs.installdir .. "/scripts/lua/modules/pools/?.lua;" .. package.path +local base_pools = require "base_pools" +local local_network_pools = {} + +-- ############################################## + +function local_network_pools:create() + -- Instance of the base class + local _local_network_pools = base_pools:create() + + -- Subclass using the base class instance + self.key = "local_network" + -- self is passed as argument so it will be set as base class metatable + -- and this will actually make it possible to override functions + local _local_network_pools_instance = _local_network_pools:create(self) + + -- Return the instance + return _local_network_pools_instance +end + +-- ############################################## + +-- @brief Given a member key, returns a table of member details such as member name. +function local_network_pools:get_member_details(member) + -- Only the name is relevant for local_networks + local details = {name = ntop.getNetworkIdByName(member), name = member} + + local alias = getLocalNetworkAlias(member) + if alias ~= member then + details["alias"] = alias + end + + return details +end + +-- ############################################## + +-- @brief Returns a table of all possible local_network ids, both assigned and unassigned to pool members +function local_network_pools:get_all_members() + local res = {} + + for local_network, _ in pairs(ntop.getNetworks()) do + -- The key is the member id itself, which in this case is the local_network id + res[local_network] = self:get_member_details(local_network) + end + + return res +end + +-- ############################################## + +return local_network_pools diff --git a/src/LocalHost.cpp b/src/LocalHost.cpp index 99b8ac60d6..621a7904d5 100644 --- a/src/LocalHost.cpp +++ b/src/LocalHost.cpp @@ -227,7 +227,7 @@ void LocalHost::lua(lua_State* vm, AddressTree *ptree, bool host_details, bool verbose, bool returnHost, bool asListElement) { char buf_id[64], *host_id = buf_id; - char *local_net; + const char *local_net; bool mask_host = Utils::maskHost(isLocalHost()); if((ptree && (!match(ptree))) || mask_host) diff --git a/src/LuaEngineNtop.cpp.inc b/src/LuaEngineNtop.cpp.inc index aa0af2e99c..0315b8252c 100644 --- a/src/LuaEngineNtop.cpp.inc +++ b/src/LuaEngineNtop.cpp.inc @@ -5414,7 +5414,7 @@ static int ntop_rrd_fetch_columns(lua_State* vm) { static int ntop_network_name_by_id(lua_State* vm) { int id; - char *name; + const char *name; ntop->getTrace()->traceEvent(TRACE_DEBUG, "%s() called", __FUNCTION__); @@ -5453,6 +5453,21 @@ static int ntop_network_id_by_name(lua_State* vm) { /* ****************************************** */ +static int ntop_get_networks(lua_State* vm) { + u_int8_t num_local_networks = ntop->getNumLocalNetworks(); + + ntop->getTrace()->traceEvent(TRACE_INFO, "%s() called", __FUNCTION__); + + lua_newtable(vm); + + for(u_int8_t network_id = 0; network_id < num_local_networks; network_id++) + lua_push_uint64_table_entry(vm, ntop->getLocalNetworkName(network_id), network_id); + + return(CONST_LUA_OK); +} + +/* ****************************************** */ + static int ntop_push_sqlite_alert(lua_State* vm) { struct ntopngLuaContext *ctx = getLuaVMContext(vm); const char *alert; @@ -5725,6 +5740,7 @@ static const luaL_Reg ntop_reg[] = { { "isLoginBlacklisted", ntop_is_login_blacklisted }, { "getNetworkNameById", ntop_network_name_by_id }, { "getNetworkIdByName", ntop_network_id_by_name }, + { "getNetworks", ntop_get_networks }, { "isGuiAccessRestricted", ntop_is_gui_access_restricted }, { "serviceRestart", ntop_service_restart }, diff --git a/src/NetworkStats.cpp b/src/NetworkStats.cpp index 189d2280e9..11427101b4 100644 --- a/src/NetworkStats.cpp +++ b/src/NetworkStats.cpp @@ -24,7 +24,7 @@ /* *************************************** */ NetworkStats::NetworkStats(NetworkInterface *iface, u_int8_t _network_id) : AlertableEntity(iface, alert_entity_network), GenericTrafficElement() { - char *netname; + const char *netname; network_id = _network_id; numHosts = 0; syn_recvd_last_min = synack_sent_last_min = 0; diff --git a/tests/lua/test_pools.lua b/tests/lua/test_pools.lua index 11b01becf6..4da005d7ff 100644 --- a/tests/lua/test_pools.lua +++ b/tests/lua/test_pools.lua @@ -14,16 +14,17 @@ require "lua_utils" package.path = dirs.installdir .. "/scripts/lua/modules/pools/?.lua;" .. package.path local interface_pools = require "interface_pools" +local local_network_pools = require "local_network_pools" -- interface_pools.get_available_members() --- test interface pools +-- TEST interface pools local s = interface_pools:create() -- Cleanup s:cleanup() -- Creation -local new_pool_id = s:add_pool('my_pool', {"0"} --[[ an array of valid interface ids]], 0 --[[ a valid configset_id --]]) +local new_pool_id = s:add_pool('my_pool', {"5"} --[[ an array of valid interface ids]], 0 --[[ a valid configset_id --]]) assert(new_pool_id == 1) -- Getter (by id) @@ -41,7 +42,7 @@ assert(pool_details["name"] == "my_pool") assert(not s:get_pool_by_name('my_non_existing_name')) -- Edit -s:edit_pool(new_pool_id, 'my_renewed_pool', {"0"}, 0) +s:edit_pool(new_pool_id, 'my_renewed_pool', {"5"}, 0) pool_details = s:get_pool(new_pool_id) assert(pool_details["name"] == "my_renewed_pool") @@ -51,11 +52,11 @@ pool_details = s:get_pool(new_pool_id) assert(pool_details == nil) -- Addition of another pool -local second_pool_id = s:add_pool('my_second_pool', {"0"} --[[ an array of valid interface ids]], 0 --[[ a valid configset_id --]]) +local second_pool_id = s:add_pool('my_second_pool', {"5"} --[[ an array of valid interface ids]], 0 --[[ a valid configset_id --]]) assert(second_pool_id == 2) -- Edit of the second pool -s:edit_pool(second_pool_id, 'my_second_pool_edited', {"0"}, 0) +s:edit_pool(second_pool_id, 'my_second_pool_edited', {"5"}, 0) pool_details = s:get_pool(second_pool_id) assert(second_pool_id == 2) @@ -67,6 +68,52 @@ assert(second_pool_id == 2) -- s:delete_pool(new_pool_id) -- tprint(s:get_all_pools()) +-- Cleanup +s:cleanup() + +-- TEST local network pools +local s = local_network_pools:create() + +-- Cleanup +s:cleanup() + +-- Creation +local new_pool_id = s:add_pool('my_local_network_pool', {"127.0.0.0/8"} --[[ an array of valid local networks ]], 0 --[[ a valid configset_id --]]) +assert(new_pool_id == 1) + +-- Getter (by id) +local pool_details = s:get_pool(new_pool_id) +assert(pool_details["name"] == "my_local_network_pool") + +-- Getter (a non-existing id) +assert(not s:get_pool(999)) + +-- Getter (by name) +pool_details = s:get_pool_by_name('my_local_network_pool') +assert(pool_details["name"] == "my_local_network_pool") + +-- Getter (a non-existing name) +assert(not s:get_pool_by_name('my_local_network_non_existing_name')) + +-- Edit +s:edit_pool(new_pool_id, 'my_local_network_renewed_pool', {"192.168.2.0/24"}, 0) +pool_details = s:get_pool(new_pool_id) +assert(pool_details["name"] == "my_local_network_renewed_pool") + +-- Delete +s:delete_pool(new_pool_id) +pool_details = s:get_pool(new_pool_id) +assert(pool_details == nil) + +-- Addition of another pool +local second_pool_id = s:add_pool('my_local_network_second_pool', {"127.0.0.0/8"} --[[ an array of valid local networks ]], 0 --[[ a valid configset_id --]]) +assert(second_pool_id == 2) + +-- Edit of the second pool +s:edit_pool(second_pool_id, 'my_local_network_second_pool_edited', {"127.0.0.0/8"}, 0) +pool_details = s:get_pool(second_pool_id) +assert(second_pool_id == 2) + s:cleanup() print("OK\n")