diff --git a/scripts/callbacks/system/startup.lua b/scripts/callbacks/system/startup.lua index e98ff57219..1203a82cc8 100644 --- a/scripts/callbacks/system/startup.lua +++ b/scripts/callbacks/system/startup.lua @@ -344,4 +344,23 @@ asset_utils.updateLastSeen() ntop.reloadServersConfiguration() +-- Migrate assets table content. Change manufacturer from empty to unknown +traceError(TRACE_NORMAL, TRACE_CONSOLE, "Migrating empty manufacturer column to unknown in assets table") +interface.select(getSystemInterfaceId()) + +if(ntop.isPro()) then + -- Clickhouse migration + if ntop.isClickHouseEnabled() then + local query = "ALTER TABLE assets UPDATE manufacturer = 'unknown' WHERE manufacturer = ''" + local success = interface.execSQLQuery(query) + + traceError(TRACE_NORMAL, TRACE_CONSOLE, "Assets manufacturer migration completed for ClickHouse") + end +else + -- MySQL migration + local query = "UPDATE assets SET manufacturer = 'unknown' WHERE manufacturer = '' OR manufacturer IS NULL" + local success = interface.execSQLQuery(query) + traceError(TRACE_NORMAL, TRACE_CONSOLE, "Assets manufacturer migration completed for MySQL") +end + traceError(TRACE_NORMAL, TRACE_CONSOLE, "Completed startup.lua") diff --git a/scripts/lua/modules/asset_utils.lua b/scripts/lua/modules/asset_utils.lua index 5f1bcd3a60..7143057dd0 100644 --- a/scripts/lua/modules/asset_utils.lua +++ b/scripts/lua/modules/asset_utils.lua @@ -188,6 +188,7 @@ end local function updateData(entry, ifid, type) local data = getAssetInfo(ifid, entry.key, type) local version = 1 + if data and table.len(data) > 0 then data = data[1] if data.version and tonumber(data.version) then @@ -279,8 +280,8 @@ end -- This is used for the details table page local function getNumAssets(ifid, filters, asset_type, check_last_seen) if not ifid then ifid = interface.getId() end - local where = build_where(ifid, filters) + local where = build_where(ifid, filters) local query = nil if hasClickHouseSupport() then query = string.format( @@ -316,10 +317,12 @@ function asset_utils.insertHost(entry, ifid) tprint(entry) return end + + -- if manufacturer is unknown push it to db + local manufacturer = entry["manufacturer"] if isEmptyString(entry["manufacturer"]) then - entry["manufacturer"] = "unknown" - tprint("Empty manufacturer") + manufacturer = "unknown" end if hasClickHouseSupport() then @@ -332,9 +335,9 @@ function asset_utils.insertHost(entry, ifid) ternary(not isEmptyString(entry["name"]), string.format("'%s'", entry["name"]), "NULL"), entry["device_type"], - ternary(not isEmptyString(entry["manufacturer"]), + ternary(not isEmptyString(manufacturer), string.format("'%s'", - entry["manufacturer"]), + manufacturer), "NULL"), entry["first_seen"], entry["last_seen"] or 0, version, entry["json_info"] or "") @@ -349,9 +352,9 @@ function asset_utils.insertHost(entry, ifid) ternary(not isEmptyString(entry["name"]), string.format("'%s'", entry["name"]), "NULL"), entry["device_type"], - ternary(not isEmptyString(entry["manufacturer"]), + ternary(not isEmptyString(manufacturer), string.format("'%s'", - entry["manufacturer"]), + manufacturer), "NULL"), entry["first_seen"], entry["last_seen"] or 0, entry["json_info"] or "", entry["last_seen"] or 0, entry["first_seen"] or 0) @@ -368,13 +371,21 @@ function asset_utils.insertMac(entry, ifid) local query = nil local version = 1 version, entry = updateData(entry, ifid, "mac") + + -- if manufacturer is unknown push it to db as string + local manufacturer = entry["manufacturer"] + + if isEmptyString(entry["manufacturer"]) then + manufacturer = "unknown" + end + if hasClickHouseSupport() then query = string.format("INSERT INTO %s " .. "(type, key, ifid, mac, manufacturer, vlan, device_type, first_seen, last_seen, version, json_info) " .. "SELECT '%s','%s', %u, '%s','%s', %u, %u, %u, %u, %u, '%s'", table_name, entry["type"], entry["key"], tonumber(ifid), entry["mac"], - entry["manufacturer"], 0, -- VLAN + manufacturer, 0, -- VLAN tonumber(entry["device_type"]), tonumber(entry["first_seen"]), tonumber(entry["last_seen"] or 0), tonumber(version), entry["json_info"] or "") @@ -385,7 +396,7 @@ function asset_utils.insertMac(entry, ifid) "ON CONFLICT(key) DO UPDATE SET last_seen = %u, first_seen = %u;", table_name, entry["type"], entry["key"], tonumber(ifid), entry["mac"], - entry["manufacturer"], + manufacturer, tonumber(entry["device_type"] or 0), tonumber(entry["first_seen"] or 0), tonumber(entry["last_seen"] or 0), diff --git a/scripts/lua/rest/v2/get/host/assets.lua b/scripts/lua/rest/v2/get/host/assets.lua index 14f98c713b..91658aa027 100644 --- a/scripts/lua/rest/v2/get/host/assets.lua +++ b/scripts/lua/rest/v2/get/host/assets.lua @@ -58,15 +58,17 @@ local tot_assets = asset_utils.getNumAssets(ifid, filters)[1].count local assets = asset_utils.getHostsAssets(ifid, order, gui_to_db_columns[sort], start, length, filters) for _, value in pairs(assets or {}) do + local record = {} local json_info = json.decode(value.json_info or "") or {} - + local column_ip = { ip = value.ip } if not isEmptyString(value.os) then column_ip.os = tonumber(value.os) end + if value["systemhost"] then column_ip.system_host = true end @@ -159,7 +161,14 @@ for _, value in pairs(assets or {}) do date = date, timestamp = last_seen } + + -- Format table value. manufacturer is "unknown" in db + if value["manufacturer"] == "unknown" then + value["manufacturer"] = i18n("unknown") + end + record["manufacturer"] = value["manufacturer"] + record["key"] = value["key"] rsp[#rsp + 1] = record end diff --git a/scripts/lua/rest/v2/get/host/assets_filters.lua b/scripts/lua/rest/v2/get/host/assets_filters.lua index e19be84a6f..ad0aa09f01 100644 --- a/scripts/lua/rest/v2/get/host/assets_filters.lua +++ b/scripts/lua/rest/v2/get/host/assets_filters.lua @@ -24,9 +24,25 @@ local rsp = {} local filters = {} for _, value in pairs(available_filters or {}) do - if not filters[value.filter] then filters[value.filter] = {} end - if value.value then filters[value.filter][value.value] = value.count end + --[[ + Value is a table as below: + table + value string Super Micro Computer, Inc. + count string 9 + filter string manufacturer + ]] + + -- Empty filter + if not filters[value.filter] then + filters[value.filter] = {} + end + + -- If the filter has a name, add the count of devices to the filters list + if value.value then + filters[value.filter][value.value] = value.count + end + end for key, value in pairsByKeys(filters or {}, asc) do @@ -40,8 +56,10 @@ for key, value in pairsByKeys(filters or {}, asc) do end for name, count in pairsByKeys(value or {}) do local value = name + if isEmptyString(value) then goto continue end if tonumber(name) then value = tonumber(name) end + if formatter then name = formatter(name) if isEmptyString(name) then name = value end @@ -59,6 +77,12 @@ for key, value in pairsByKeys(filters or {}, asc) do end name = discover_utils.getOsName(name) end + + -- Empty manufacturer filter formatting for dropdown + if name == "unknown" then + name = i18n("unknown") + end + filter_list[#filter_list + 1] = { key = key, value = value, @@ -107,4 +131,5 @@ rsp[#rsp + 1] = { value = server_filters } + rest_utils.answer(rest_utils.consts.success.ok, rsp)