ntopng/scripts/lua/modules/bgp_utils.lua
2026-04-16 15:48:06 +00:00

127 lines
4 KiB
Lua

--
-- (C) 2013-26 - ntop.org
--
local dirs = ntop.getDirs()
package.path = dirs.installdir .. "/scripts/lua/modules/?.lua;" .. package.path
require "ntop_utils"
require "lua_utils_gui"
-- ######################################
local bgp_utils = {}
-- ######################################
function bgp_utils.formatBgpBmpInfo(bgp_info)
local rsp = {}
for prefix, peers in pairs(bgp_info or {}) do
local peer_list = {}
local peer_id = {}
local asn_list = {}
local bgp_origin = {}
local bgp_next_hop = {}
local as_path = {}
local communities = {}
local med_list = {}
local local_pref_list = {}
for bgp_id, info in pairs(peers) do
peer_list[#peer_list + 1] = {
id = bgp_id,
info = info
}
end
local max_len = (#peer_list > 2) and 8 or 32
for _, peer in ipairs(peer_list) do
peer_id[#peer_id + 1] = {
name = formatNextHop(peer.id),
value = peer.id
}
asn_list[#asn_list + 1] = {
name = string.format("%s (%s)", peer.info.asn, ntop.getASNameFromASN(tonumber(peer.info.asn))),
url = string.format("%s/lua/hosts_stats.lua?asn=%s", ntop.getHttpPrefix(), peer.info.asn),
value = peer.info.asn
}
bgp_origin[#bgp_origin + 1] = {
name = string.upper(peer.info["origin"] or ""),
value = peer.info["origin"] or ""
}
bgp_next_hop[#bgp_next_hop + 1] = {
name = peer.info["next_hop"] or "",
value = peer.info["next_hop"] or ""
}
med_list[#med_list + 1] = {
name = ((peer.info["med"] ~= nil) and tostring(peer.info["med"]) or "")
}
local_pref_list[#local_pref_list + 1] = {
name = ((peer.info["local_pref"] ~= nil) and tostring(peer.info["local_pref"]) or "")
}
-- Formatting AS Path list
if peer.info["as_path"] and #peer.info["as_path"] > 0 then
local parts = {}
for _, asn in ipairs(peer.info["as_path"]) do
as_path[#as_path + 1] = {
name = string.format("%d (%s)", tonumber(asn), ntop.getASNameFromASN(tonumber(asn))),
url = string.format("%s/lua/hosts_stats.lua?asn=%s", ntop.getHttpPrefix(), asn),
value = asn
}
end
end
-- Formatting Communities list
if peer.info["communities"] and #peer.info["communities"] > 0 then
for _, c in ipairs(peer.info["communities"]) do
communities[#communities + 1] = {
name = c,
value = c
}
end
end
end
rsp[#rsp + 1] = {
name = "bgp_prefix",
value = prefix
}
rsp[#rsp + 1] = {
name = "bgp_peer_id",
value = peer_id
}
rsp[#rsp + 1] = {
name = "bgp_peer_asn",
value = asn_list
}
rsp[#rsp + 1] = {
name = "bgp_origin",
value = bgp_origin
}
rsp[#rsp + 1] = {
name = "bgp_next_hop",
value = bgp_next_hop
}
rsp[#rsp + 1] = {
name = "bgp_as_path",
value = as_path
}
if not ((#bgp_info == 1) and (#peer_list > 0)) then
rsp[#rsp + 1] = {
name = "bgp_med",
value = med_list
}
rsp[#rsp + 1] = {
name = "bgp_local_pref",
value = local_pref_list
}
rsp[#rsp + 1] = {
name = "bgp_communities",
value = communities
}
end
end
return rsp
end
-- ######################################
return bgp_utils