20260519_2 收紧CCR/CIR四文件分诊
This commit is contained in:
@@ -303,9 +303,9 @@ fn build_compare_view_fallback(
|
||||
|
||||
fn decode_views(
|
||||
content_info: &CcrContentInfo,
|
||||
trust_anchor: &str,
|
||||
_trust_anchor: &str,
|
||||
) -> Result<(BTreeSet<VrpCompareRow>, BTreeSet<VapCompareRow>), String> {
|
||||
decode_ccr_compare_views(content_info, trust_anchor)
|
||||
decode_ccr_compare_views(content_info)
|
||||
}
|
||||
|
||||
fn compare_sets<T: Ord + Clone>(ours: &BTreeSet<T>, rpki_client: &BTreeSet<T>) -> SetSummary<T> {
|
||||
|
||||
@@ -6,18 +6,14 @@ struct Args {
|
||||
ccr_path: Option<std::path::PathBuf>,
|
||||
vrps_out_path: Option<std::path::PathBuf>,
|
||||
vaps_out_path: Option<std::path::PathBuf>,
|
||||
trust_anchor: String,
|
||||
}
|
||||
|
||||
fn usage() -> &'static str {
|
||||
"Usage: ccr_to_compare_views --ccr <path> --vrps-out <path> --vaps-out <path> [--trust-anchor <name>]"
|
||||
"Usage: ccr_to_compare_views --ccr <path> --vrps-out <path> --vaps-out <path> [--trust-anchor <ignored>]"
|
||||
}
|
||||
|
||||
fn parse_args(argv: &[String]) -> Result<Args, String> {
|
||||
let mut args = Args {
|
||||
trust_anchor: "unknown".to_string(),
|
||||
..Args::default()
|
||||
};
|
||||
let mut args = Args::default();
|
||||
let mut i = 1usize;
|
||||
while i < argv.len() {
|
||||
match argv[i].as_str() {
|
||||
@@ -38,8 +34,7 @@ fn parse_args(argv: &[String]) -> Result<Args, String> {
|
||||
}
|
||||
"--trust-anchor" => {
|
||||
i += 1;
|
||||
let v = argv.get(i).ok_or("--trust-anchor requires a value")?;
|
||||
args.trust_anchor = v.clone();
|
||||
argv.get(i).ok_or("--trust-anchor requires a value")?;
|
||||
}
|
||||
"-h" | "--help" => return Err(usage().to_string()),
|
||||
other => return Err(format!("unknown argument: {other}\n{}", usage())),
|
||||
@@ -64,8 +59,7 @@ fn main() -> Result<(), String> {
|
||||
let bytes = std::fs::read(ccr_path)
|
||||
.map_err(|e| format!("read ccr failed: {}: {e}", ccr_path.display()))?;
|
||||
let content_info = decode_content_info(&bytes).map_err(|e| e.to_string())?;
|
||||
let (vrps, vaps) =
|
||||
decode_ccr_compare_views(&content_info, &args.trust_anchor).map_err(|e| e.to_string())?;
|
||||
let (vrps, vaps) = decode_ccr_compare_views(&content_info).map_err(|e| e.to_string())?;
|
||||
write_vrp_csv(args.vrps_out_path.as_ref().unwrap(), &vrps)?;
|
||||
write_vap_csv(args.vaps_out_path.as_ref().unwrap(), &vaps)?;
|
||||
println!(
|
||||
@@ -106,7 +100,6 @@ mod tests {
|
||||
args.vaps_out_path.as_deref(),
|
||||
Some(std::path::Path::new("vaps.csv"))
|
||||
);
|
||||
assert_eq!(args.trust_anchor, "apnic");
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
@@ -5,18 +5,14 @@ use std::io::Write;
|
||||
struct Args {
|
||||
ccr_path: Option<std::path::PathBuf>,
|
||||
out_path: Option<std::path::PathBuf>,
|
||||
trust_anchor: String,
|
||||
}
|
||||
|
||||
fn usage() -> &'static str {
|
||||
"Usage: ccr_to_routinator_csv --ccr <path> --out <path> [--trust-anchor <name>]"
|
||||
"Usage: ccr_to_routinator_csv --ccr <path> --out <path> [--trust-anchor <ignored>]"
|
||||
}
|
||||
|
||||
fn parse_args(argv: &[String]) -> Result<Args, String> {
|
||||
let mut args = Args {
|
||||
trust_anchor: "unknown".to_string(),
|
||||
..Args::default()
|
||||
};
|
||||
let mut args = Args::default();
|
||||
let mut i = 1usize;
|
||||
while i < argv.len() {
|
||||
match argv[i].as_str() {
|
||||
@@ -32,8 +28,7 @@ fn parse_args(argv: &[String]) -> Result<Args, String> {
|
||||
}
|
||||
"--trust-anchor" => {
|
||||
i += 1;
|
||||
let v = argv.get(i).ok_or("--trust-anchor requires a value")?;
|
||||
args.trust_anchor = v.clone();
|
||||
argv.get(i).ok_or("--trust-anchor requires a value")?;
|
||||
}
|
||||
"-h" | "--help" => return Err(usage().to_string()),
|
||||
other => return Err(format!("unknown argument: {other}\n{}", usage())),
|
||||
@@ -74,8 +69,7 @@ fn main() -> Result<(), String> {
|
||||
);
|
||||
writeln!(file, "ASN,IP Prefix,Max Length,Trust Anchor").map_err(|e| e.to_string())?;
|
||||
for (asn, prefix, max_len) in rows {
|
||||
writeln!(file, "AS{asn},{prefix},{max_len},{}", args.trust_anchor)
|
||||
.map_err(|e| e.to_string())?;
|
||||
writeln!(file, "AS{asn},{prefix},{max_len},unknown").map_err(|e| e.to_string())?;
|
||||
}
|
||||
println!("{}", out_path.display());
|
||||
Ok(())
|
||||
@@ -105,7 +99,6 @@ mod tests {
|
||||
args.out_path.as_deref(),
|
||||
Some(std::path::Path::new("out.csv"))
|
||||
);
|
||||
assert_eq!(args.trust_anchor, "apnic");
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
||||
@@ -117,8 +117,8 @@ fn main() -> Result<(), String> {
|
||||
&std::fs::read(&ccr_path).map_err(|e| format!("read ccr failed: {e}"))?,
|
||||
)
|
||||
.map_err(|e| format!("decode ccr failed: {e}"))?;
|
||||
let (vrps, vaps) = decode_ccr_compare_views(&ccr, "unknown")
|
||||
.map_err(|e| format!("decode compare views failed: {e}"))?;
|
||||
let (vrps, vaps) =
|
||||
decode_ccr_compare_views(&ccr).map_err(|e| format!("decode compare views failed: {e}"))?;
|
||||
let report: serde_json::Value = serde_json::from_slice(
|
||||
&std::fs::read(&report_path).map_err(|e| format!("read report failed: {e}"))?,
|
||||
)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -50,21 +50,18 @@ pub fn canonical_vrp_prefix(prefix: &crate::data_model::roa::IpPrefix) -> String
|
||||
}
|
||||
}
|
||||
|
||||
pub fn build_vrp_compare_rows(vrps: &[Vrp], trust_anchor: &str) -> BTreeSet<VrpCompareRow> {
|
||||
pub fn build_vrp_compare_rows(vrps: &[Vrp]) -> BTreeSet<VrpCompareRow> {
|
||||
vrps.iter()
|
||||
.map(|vrp| VrpCompareRow {
|
||||
asn: normalize_asn(vrp.asn),
|
||||
ip_prefix: canonical_vrp_prefix(&vrp.prefix),
|
||||
max_length: vrp.max_length.to_string(),
|
||||
trust_anchor: trust_anchor.to_ascii_lowercase(),
|
||||
trust_anchor: "unknown".to_string(),
|
||||
})
|
||||
.collect()
|
||||
}
|
||||
|
||||
pub fn build_vap_compare_rows(
|
||||
aspas: &[AspaAttestation],
|
||||
trust_anchor: &str,
|
||||
) -> BTreeSet<VapCompareRow> {
|
||||
pub fn build_vap_compare_rows(aspas: &[AspaAttestation]) -> BTreeSet<VapCompareRow> {
|
||||
aspas
|
||||
.iter()
|
||||
.map(|aspa| {
|
||||
@@ -78,7 +75,7 @@ pub fn build_vap_compare_rows(
|
||||
.map(normalize_asn)
|
||||
.collect::<Vec<_>>()
|
||||
.join(";"),
|
||||
trust_anchor: trust_anchor.to_ascii_lowercase(),
|
||||
trust_anchor: "unknown".to_string(),
|
||||
}
|
||||
})
|
||||
.collect()
|
||||
@@ -86,7 +83,6 @@ pub fn build_vap_compare_rows(
|
||||
|
||||
pub fn decode_ccr_compare_views(
|
||||
content_info: &CcrContentInfo,
|
||||
trust_anchor: &str,
|
||||
) -> Result<(BTreeSet<VrpCompareRow>, BTreeSet<VapCompareRow>), String> {
|
||||
let vrps = extract_vrp_rows(content_info)
|
||||
.map_err(|e| format!("extract vrp rows from ccr failed: {e}"))?
|
||||
@@ -95,7 +91,7 @@ pub fn decode_ccr_compare_views(
|
||||
asn: normalize_asn(asn),
|
||||
ip_prefix: prefix,
|
||||
max_length: max_length.to_string(),
|
||||
trust_anchor: trust_anchor.to_ascii_lowercase(),
|
||||
trust_anchor: "unknown".to_string(),
|
||||
})
|
||||
.collect::<BTreeSet<_>>();
|
||||
|
||||
@@ -116,7 +112,7 @@ pub fn decode_ccr_compare_views(
|
||||
.map(normalize_asn)
|
||||
.collect::<Vec<_>>()
|
||||
.join(";"),
|
||||
trust_anchor: trust_anchor.to_ascii_lowercase(),
|
||||
trust_anchor: "unknown".to_string(),
|
||||
})
|
||||
.collect::<BTreeSet<_>>()
|
||||
})
|
||||
@@ -178,17 +174,14 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn build_vap_compare_rows_sorts_and_dedups_providers() {
|
||||
let rows = build_vap_compare_rows(
|
||||
&[AspaAttestation {
|
||||
customer_as_id: 64496,
|
||||
provider_as_ids: vec![64498, 64497, 64498],
|
||||
}],
|
||||
"APNIC",
|
||||
);
|
||||
let rows = build_vap_compare_rows(&[AspaAttestation {
|
||||
customer_as_id: 64496,
|
||||
provider_as_ids: vec![64498, 64497, 64498],
|
||||
}]);
|
||||
let row = rows.iter().next().expect("one row");
|
||||
assert_eq!(row.customer_asn, "AS64496");
|
||||
assert_eq!(row.providers, "AS64497;AS64498");
|
||||
assert_eq!(row.trust_anchor, "apnic");
|
||||
assert_eq!(row.trust_anchor, "unknown");
|
||||
}
|
||||
|
||||
#[test]
|
||||
@@ -219,7 +212,7 @@ mod tests {
|
||||
rks: None,
|
||||
});
|
||||
let (vrp_rows, vap_rows) =
|
||||
decode_ccr_compare_views(&content, "apnic").expect("decode compare views");
|
||||
decode_ccr_compare_views(&content).expect("decode compare views");
|
||||
assert_eq!(vrp_rows.len(), 1);
|
||||
assert_eq!(vap_rows.len(), 1);
|
||||
assert_eq!(vap_rows.iter().next().unwrap().providers, "AS64497");
|
||||
@@ -227,18 +220,15 @@ mod tests {
|
||||
|
||||
#[test]
|
||||
fn build_vrp_compare_rows_canonicalizes_ipv6_prefix_text() {
|
||||
let rows = build_vrp_compare_rows(
|
||||
&[Vrp {
|
||||
asn: 64496,
|
||||
prefix: IpPrefix {
|
||||
afi: RoaAfi::Ipv6,
|
||||
prefix_len: 32,
|
||||
addr: [0x20, 0x01, 0x0d, 0xb8, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
|
||||
},
|
||||
max_length: 48,
|
||||
}],
|
||||
"APNIC",
|
||||
);
|
||||
let rows = build_vrp_compare_rows(&[Vrp {
|
||||
asn: 64496,
|
||||
prefix: IpPrefix {
|
||||
afi: RoaAfi::Ipv6,
|
||||
prefix_len: 32,
|
||||
addr: [0x20, 0x01, 0x0d, 0xb8, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
|
||||
},
|
||||
max_length: 48,
|
||||
}]);
|
||||
let row = rows.iter().next().expect("row");
|
||||
assert_eq!(row.ip_prefix, "2001:db8::/32");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user