#![doc(
html_logo_url = "https://raw.githubusercontent.com/bgpkit/assets/main/logos/icon-transparent.png",
html_favicon_url = "https://raw.githubusercontent.com/bgpkit/assets/main/logos/favicon.ico"
)]
#[cfg(feature = "as2rel")]
pub mod as2rel;
#[cfg(feature = "asinfo")]
pub mod asinfo;
#[cfg(feature = "bogons")]
pub mod bogons;
#[cfg(feature = "countries")]
pub mod countries;
#[cfg(feature = "mrt_collectors")]
pub mod mrt_collectors;
#[cfg(feature = "rpki")]
pub mod rpki;
pub mod errors;
pub use errors::{BgpkitCommonsError, Result};
pub trait LazyLoadable {
fn reload(&mut self) -> Result<()>;
fn is_loaded(&self) -> bool;
fn loading_status(&self) -> &'static str;
}
#[derive(Default)]
pub struct BgpkitCommons {
#[cfg(feature = "countries")]
countries: Option<crate::countries::Countries>,
#[cfg(feature = "rpki")]
rpki_trie: Option<crate::rpki::RpkiTrie>,
#[cfg(feature = "mrt_collectors")]
mrt_collectors: Option<Vec<crate::mrt_collectors::MrtCollector>>,
#[cfg(feature = "mrt_collectors")]
mrt_collector_peers: Option<Vec<crate::mrt_collectors::MrtCollectorPeer>>,
#[cfg(feature = "bogons")]
bogons: Option<crate::bogons::Bogons>,
#[cfg(feature = "asinfo")]
asinfo: Option<crate::asinfo::AsInfoUtils>,
#[cfg(feature = "as2rel")]
as2rel: Option<crate::as2rel::As2relBgpkit>,
}
impl BgpkitCommons {
pub fn new() -> Self {
Self::default()
}
pub fn reload(&mut self) -> Result<()> {
#[cfg(feature = "countries")]
if self.countries.is_some() {
self.load_countries()?;
}
#[cfg(feature = "rpki")]
if let Some(rpki) = self.rpki_trie.as_mut() {
rpki.reload()?;
}
#[cfg(feature = "mrt_collectors")]
if self.mrt_collectors.is_some() {
self.load_mrt_collectors()?;
}
#[cfg(feature = "mrt_collectors")]
if self.mrt_collector_peers.is_some() {
self.load_mrt_collector_peers()?;
}
#[cfg(feature = "bogons")]
if self.bogons.is_some() {
self.load_bogons()?;
}
#[cfg(feature = "asinfo")]
if let Some(asinfo) = self.asinfo.as_mut() {
asinfo.reload()?;
}
#[cfg(feature = "as2rel")]
if self.as2rel.is_some() {
self.load_as2rel()?;
}
Ok(())
}
pub fn loading_status(&self) -> Vec<(&'static str, &'static str)> {
#[allow(unused_mut)] let mut status = Vec::new();
#[cfg(feature = "countries")]
if let Some(ref countries) = self.countries {
status.push(("countries", countries.loading_status()));
} else {
status.push(("countries", "Countries data not loaded"));
}
#[cfg(feature = "bogons")]
if let Some(ref bogons) = self.bogons {
status.push(("bogons", bogons.loading_status()));
} else {
status.push(("bogons", "Bogons data not loaded"));
}
#[cfg(feature = "rpki")]
if let Some(ref rpki) = self.rpki_trie {
status.push(("rpki", rpki.loading_status()));
} else {
status.push(("rpki", "RPKI data not loaded"));
}
#[cfg(feature = "asinfo")]
if let Some(ref asinfo) = self.asinfo {
status.push(("asinfo", asinfo.loading_status()));
} else {
status.push(("asinfo", "ASInfo data not loaded"));
}
#[cfg(feature = "as2rel")]
if let Some(ref as2rel) = self.as2rel {
status.push(("as2rel", as2rel.loading_status()));
} else {
status.push(("as2rel", "AS2Rel data not loaded"));
}
#[cfg(feature = "mrt_collectors")]
{
if self.mrt_collectors.is_some() {
status.push(("mrt_collectors", "MRT collectors data loaded"));
} else {
status.push(("mrt_collectors", "MRT collectors data not loaded"));
}
if self.mrt_collector_peers.is_some() {
status.push(("mrt_collector_peers", "MRT collector peers data loaded"));
} else {
status.push(("mrt_collector_peers", "MRT collector peers data not loaded"));
}
}
status
}
#[cfg(feature = "countries")]
pub fn load_countries(&mut self) -> Result<()> {
self.countries = Some(crate::countries::Countries::new()?);
Ok(())
}
#[cfg(feature = "rpki")]
pub fn load_rpki(&mut self, date_opt: Option<chrono::NaiveDate>) -> Result<()> {
if let Some(date) = date_opt {
self.rpki_trie = Some(rpki::RpkiTrie::from_ripe_historical(date)?);
} else {
self.rpki_trie = Some(rpki::RpkiTrie::from_cloudflare()?);
}
Ok(())
}
#[cfg(feature = "rpki")]
pub fn load_rpki_historical(
&mut self,
date: chrono::NaiveDate,
source: rpki::HistoricalRpkiSource,
) -> Result<()> {
match source {
rpki::HistoricalRpkiSource::Ripe => {
self.rpki_trie = Some(rpki::RpkiTrie::from_ripe_historical(date)?);
}
rpki::HistoricalRpkiSource::RpkiViews(collector) => {
self.rpki_trie = Some(rpki::RpkiTrie::from_rpkiviews(collector, date)?);
}
rpki::HistoricalRpkiSource::RpkiSpools(collector) => {
self.rpki_trie = Some(rpki::RpkiTrie::from_rpkispools(collector, date)?);
}
}
Ok(())
}
#[cfg(feature = "rpki")]
pub fn load_rpki_from_files(
&mut self,
urls: &[String],
source: rpki::HistoricalRpkiSource,
date: Option<chrono::NaiveDate>,
) -> Result<()> {
match source {
rpki::HistoricalRpkiSource::Ripe => {
self.rpki_trie = Some(rpki::RpkiTrie::from_ripe_files(urls, date)?);
}
rpki::HistoricalRpkiSource::RpkiViews(_) => {
self.rpki_trie = Some(rpki::RpkiTrie::from_rpkiviews_files(urls, date)?);
}
rpki::HistoricalRpkiSource::RpkiSpools(_) => {
if let Some(url) = urls.first() {
self.rpki_trie = Some(rpki::RpkiTrie::from_rpkispools_url(url, date)?);
}
}
}
Ok(())
}
#[cfg(feature = "rpki")]
pub fn list_rpki_files(
&self,
date: chrono::NaiveDate,
source: rpki::HistoricalRpkiSource,
) -> Result<Vec<rpki::RpkiFile>> {
match source {
rpki::HistoricalRpkiSource::Ripe => rpki::list_ripe_files(date),
rpki::HistoricalRpkiSource::RpkiViews(collector) => {
rpki::list_rpkiviews_files(collector, date)
}
rpki::HistoricalRpkiSource::RpkiSpools(collector) => {
rpki::list_rpkispools_files(collector, date)
}
}
}
#[cfg(feature = "mrt_collectors")]
pub fn load_mrt_collectors(&mut self) -> Result<()> {
self.mrt_collectors = Some(crate::mrt_collectors::get_all_collectors()?);
Ok(())
}
#[cfg(feature = "mrt_collectors")]
pub fn load_mrt_collector_peers(&mut self) -> Result<()> {
self.mrt_collector_peers = Some(crate::mrt_collectors::get_mrt_collector_peers()?);
Ok(())
}
#[cfg(feature = "bogons")]
pub fn load_bogons(&mut self) -> Result<()> {
self.bogons = Some(crate::bogons::Bogons::new()?);
Ok(())
}
#[cfg(feature = "asinfo")]
pub fn load_asinfo(
&mut self,
load_as2org: bool,
load_population: bool,
load_hegemony: bool,
load_peeringdb: bool,
) -> Result<()> {
self.asinfo = Some(crate::asinfo::AsInfoUtils::new(
load_as2org,
load_population,
load_hegemony,
load_peeringdb,
)?);
Ok(())
}
#[cfg(feature = "asinfo")]
pub fn load_asinfo_cached(&mut self) -> Result<()> {
self.asinfo = Some(crate::asinfo::AsInfoUtils::new_from_cached()?);
Ok(())
}
#[cfg(feature = "asinfo")]
pub fn asinfo_builder(&self) -> crate::asinfo::AsInfoBuilder {
crate::asinfo::AsInfoBuilder::new()
}
#[cfg(feature = "asinfo")]
pub fn load_asinfo_with(&mut self, builder: crate::asinfo::AsInfoBuilder) -> Result<()> {
self.asinfo = Some(builder.build()?);
Ok(())
}
#[cfg(feature = "as2rel")]
pub fn load_as2rel(&mut self) -> Result<()> {
self.as2rel = Some(crate::as2rel::As2relBgpkit::new()?);
Ok(())
}
}