use crate::Result;
use crate::rpki::rpki_client::RpkiClientData;
use crate::rpki::{Rir, RpkiFile, RpkiTrie};
use chrono::{Datelike, NaiveDate, Utc};
use tracing::info;
pub fn list_ripe_files(date: NaiveDate) -> Result<Vec<RpkiFile>> {
let mut files = vec![];
for rir in [
Rir::AFRINIC,
Rir::APNIC,
Rir::ARIN,
Rir::LACNIC,
Rir::RIPENCC,
] {
let base_url = rir.to_ripe_ftp_root_url();
let url = format!(
"{}/{:04}/{:02}/{:02}/output.json.xz",
base_url,
date.year(),
date.month(),
date.day()
);
files.push(RpkiFile {
url,
timestamp: date
.and_hms_opt(0, 0, 0)
.unwrap()
.and_utc()
.fixed_offset()
.with_timezone(&Utc),
size: None,
rir: Some(rir),
collector: None,
});
}
Ok(files)
}
impl RpkiTrie {
pub fn from_ripe_historical(date: NaiveDate) -> Result<Self> {
let mut trie = RpkiTrie::new(Some(date));
for rir in [
Rir::AFRINIC,
Rir::APNIC,
Rir::ARIN,
Rir::LACNIC,
Rir::RIPENCC,
] {
let url = format!(
"{}/{:04}/{:02}/{:02}/output.json.xz",
rir.to_ripe_ftp_root_url(),
date.year(),
date.month(),
date.day()
);
info!("loading {} ROAs from {}", rir, url);
let data = RpkiClientData::from_url(&url)?;
trie.merge_rpki_client_data(data);
}
Ok(trie)
}
pub fn from_ripe_files(urls: &[String], date: Option<NaiveDate>) -> Result<Self> {
let mut trie = RpkiTrie::new(date);
for url in urls {
info!("loading ROAs from {}", url);
let data = RpkiClientData::from_url(url)?;
trie.merge_rpki_client_data(data);
}
Ok(trie)
}
}