89de989ad1
* WIP * NS agent calls probe as lib * Clippy: ns agent * Fix submit_v2 on API * Adjust dockerfile, deployment details for the new flow * Bump package versions * PR feedback * Fix CI * Final version
232 lines
9.5 KiB
Rust
232 lines
9.5 KiB
Rust
// Copyright 2026 - Nym Technologies SA <contact@nymtech.net>
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
|
use clap::Args;
|
|
|
|
#[derive(Args, Clone, Debug)]
|
|
pub struct NetstackArgs {
|
|
#[arg(long, hide = true, env = "PROBE_NETSTACK_DOWNLOAD_TIMEOUT_SEC", default_value_t = NetstackArgs::default().netstack_download_timeout_sec)]
|
|
pub netstack_download_timeout_sec: u64,
|
|
|
|
#[arg(long, hide = true, env = "PROBE_METADATA_TIMEOUT_SEC", default_value_t = NetstackArgs::default().metadata_timeout_sec)]
|
|
pub metadata_timeout_sec: u64,
|
|
|
|
#[arg(long, hide = true, env = "PROBE_NETSTACK_V4_DNS", default_value_t = NetstackArgs::default().netstack_v4_dns)]
|
|
pub netstack_v4_dns: String,
|
|
|
|
#[arg(long, hide = true, env = "PROBE_NETSTACK_V6_DNS", default_value_t = NetstackArgs::default().netstack_v6_dns)]
|
|
pub netstack_v6_dns: String,
|
|
|
|
#[arg(long, hide = true, env = "PROBE_NETSTACK_NUM_PING", default_value_t = NetstackArgs::default().netstack_num_ping)]
|
|
pub netstack_num_ping: u8,
|
|
|
|
#[arg(long, hide = true, env = "PROBE_NETSTACK_SEND_TIMEOUT_SEC", default_value_t = NetstackArgs::default().netstack_send_timeout_sec)]
|
|
pub netstack_send_timeout_sec: u64,
|
|
|
|
#[arg(long, hide = true, env = "PROBE_NETSTACK_RECV_TIMEOUT_SEC", default_value_t = NetstackArgs::default().netstack_recv_timeout_sec)]
|
|
pub netstack_recv_timeout_sec: u64,
|
|
|
|
#[arg(long, hide = true, env = "PROBE_NETSTACK_PING_HOSTS_V4", default_values_t = NetstackArgs::default().netstack_ping_hosts_v4)]
|
|
pub netstack_ping_hosts_v4: Vec<String>,
|
|
|
|
#[arg(long, hide = true, env = "PROBE_NETSTACK_PING_IPS_V4", default_values_t = NetstackArgs::default().netstack_ping_ips_v4)]
|
|
pub netstack_ping_ips_v4: Vec<String>,
|
|
|
|
#[arg(long, hide = true, env = "PROBE_NETSTACK_PING_HOSTS_V6", default_values_t = NetstackArgs::default().netstack_ping_hosts_v6)]
|
|
pub netstack_ping_hosts_v6: Vec<String>,
|
|
|
|
#[arg(long, hide = true, env = "PROBE_NETSTACK_PING_IPS_V6", default_values_t = NetstackArgs::default().netstack_ping_ips_v6)]
|
|
pub netstack_ping_ips_v6: Vec<String>,
|
|
}
|
|
|
|
impl Default for NetstackArgs {
|
|
fn default() -> Self {
|
|
Self {
|
|
netstack_download_timeout_sec: 180,
|
|
metadata_timeout_sec: 30,
|
|
netstack_v4_dns: String::from("1.1.1.1"),
|
|
netstack_v6_dns: String::from("2606:4700:4700::1111"),
|
|
netstack_num_ping: 5,
|
|
netstack_send_timeout_sec: 3,
|
|
netstack_recv_timeout_sec: 3,
|
|
netstack_ping_hosts_v4: vec!["nym.com".to_string()],
|
|
netstack_ping_ips_v4: vec!["1.1.1.1".to_string()],
|
|
netstack_ping_hosts_v6: vec!["cloudflare.com".to_string()],
|
|
netstack_ping_ips_v6: vec![
|
|
"2001:4860:4860::8888".to_string(),
|
|
"2606:4700:4700::1111".to_string(),
|
|
"2620:fe::fe".to_string(),
|
|
],
|
|
}
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
use super::*;
|
|
|
|
#[test]
|
|
fn test_netstack_args_default_values() {
|
|
// Test that the default values are correctly set in the struct definition
|
|
// This validates that our changes to the default values are correct
|
|
|
|
// Create a default instance to test the values
|
|
let args = NetstackArgs {
|
|
netstack_download_timeout_sec: 180,
|
|
metadata_timeout_sec: 30,
|
|
netstack_v4_dns: "1.1.1.1".to_string(),
|
|
netstack_v6_dns: "2606:4700:4700::1111".to_string(),
|
|
netstack_num_ping: 5,
|
|
netstack_send_timeout_sec: 3,
|
|
netstack_recv_timeout_sec: 3,
|
|
netstack_ping_hosts_v4: vec!["nym.com".to_string()],
|
|
netstack_ping_ips_v4: vec!["1.1.1.1".to_string()],
|
|
netstack_ping_hosts_v6: vec!["cloudflare.com".to_string()],
|
|
netstack_ping_ips_v6: vec![
|
|
"2001:4860:4860::8888".to_string(),
|
|
"2606:4700:4700::1111".to_string(),
|
|
"2620:fe::fe".to_string(),
|
|
],
|
|
};
|
|
|
|
// Test IPv4 defaults
|
|
assert_eq!(args.netstack_ping_hosts_v4, vec!["nym.com"]);
|
|
assert_eq!(args.netstack_ping_ips_v4, vec!["1.1.1.1"]);
|
|
assert_eq!(args.netstack_v4_dns, "1.1.1.1");
|
|
|
|
// Test IPv6 defaults
|
|
assert_eq!(args.netstack_ping_hosts_v6, vec!["cloudflare.com"]);
|
|
assert_eq!(
|
|
args.netstack_ping_ips_v6,
|
|
vec![
|
|
"2001:4860:4860::8888",
|
|
"2606:4700:4700::1111",
|
|
"2620:fe::fe"
|
|
]
|
|
);
|
|
assert_eq!(args.netstack_v6_dns, "2606:4700:4700::1111");
|
|
|
|
// Test other defaults
|
|
assert_eq!(args.netstack_download_timeout_sec, 180);
|
|
assert_eq!(args.netstack_num_ping, 5);
|
|
assert_eq!(args.netstack_send_timeout_sec, 3);
|
|
assert_eq!(args.netstack_recv_timeout_sec, 3);
|
|
}
|
|
|
|
#[test]
|
|
fn test_netstack_args_custom_construction() {
|
|
// Test that we can create instances with custom values
|
|
let args = NetstackArgs {
|
|
netstack_download_timeout_sec: 300,
|
|
metadata_timeout_sec: 30,
|
|
netstack_v4_dns: "8.8.8.8".to_string(),
|
|
netstack_v6_dns: "2001:4860:4860::8888".to_string(),
|
|
netstack_num_ping: 10,
|
|
netstack_send_timeout_sec: 5,
|
|
netstack_recv_timeout_sec: 5,
|
|
netstack_ping_hosts_v4: vec!["example.com".to_string()],
|
|
netstack_ping_ips_v4: vec!["8.8.8.8".to_string()],
|
|
netstack_ping_hosts_v6: vec!["ipv6.example.com".to_string()],
|
|
netstack_ping_ips_v6: vec!["2001:4860:4860::8888".to_string()],
|
|
};
|
|
|
|
assert_eq!(args.netstack_ping_hosts_v4, vec!["example.com"]);
|
|
assert_eq!(args.netstack_ping_hosts_v6, vec!["ipv6.example.com"]);
|
|
assert_eq!(args.netstack_ping_ips_v4, vec!["8.8.8.8"]);
|
|
assert_eq!(args.netstack_ping_ips_v6, vec!["2001:4860:4860::8888"]);
|
|
assert_eq!(args.netstack_v4_dns, "8.8.8.8");
|
|
assert_eq!(args.netstack_v6_dns, "2001:4860:4860::8888");
|
|
assert_eq!(args.netstack_download_timeout_sec, 300);
|
|
assert_eq!(args.netstack_num_ping, 10);
|
|
assert_eq!(args.netstack_send_timeout_sec, 5);
|
|
assert_eq!(args.netstack_recv_timeout_sec, 5);
|
|
}
|
|
|
|
#[test]
|
|
fn test_netstack_args_multiple_values() {
|
|
// Test that multiple hosts and IPs can be stored
|
|
let args = NetstackArgs {
|
|
netstack_download_timeout_sec: 180,
|
|
metadata_timeout_sec: 30,
|
|
netstack_v4_dns: "1.1.1.1".to_string(),
|
|
netstack_v6_dns: "2606:4700:4700::1111".to_string(),
|
|
netstack_num_ping: 5,
|
|
netstack_send_timeout_sec: 3,
|
|
netstack_recv_timeout_sec: 3,
|
|
netstack_ping_hosts_v4: vec!["nym.com".to_string(), "example.com".to_string()],
|
|
netstack_ping_ips_v4: vec!["1.1.1.1".to_string(), "8.8.8.8".to_string()],
|
|
netstack_ping_hosts_v6: vec![
|
|
"cloudflare.com".to_string(),
|
|
"ipv6.example.com".to_string(),
|
|
],
|
|
netstack_ping_ips_v6: vec![
|
|
"2001:4860:4860::8888".to_string(),
|
|
"2606:4700:4700::1111".to_string(),
|
|
],
|
|
};
|
|
|
|
assert_eq!(args.netstack_ping_hosts_v4, vec!["nym.com", "example.com"]);
|
|
assert_eq!(
|
|
args.netstack_ping_hosts_v6,
|
|
vec!["cloudflare.com", "ipv6.example.com"]
|
|
);
|
|
assert_eq!(args.netstack_ping_ips_v4, vec!["1.1.1.1", "8.8.8.8"]);
|
|
assert_eq!(
|
|
args.netstack_ping_ips_v6,
|
|
vec!["2001:4860:4860::8888", "2606:4700:4700::1111"]
|
|
);
|
|
}
|
|
|
|
#[test]
|
|
fn test_netstack_args_edge_cases() {
|
|
// Test edge cases like zero values and empty vectors
|
|
let args = NetstackArgs {
|
|
netstack_download_timeout_sec: 0,
|
|
metadata_timeout_sec: 30,
|
|
netstack_v4_dns: "1.1.1.1".to_string(),
|
|
netstack_v6_dns: "2606:4700:4700::1111".to_string(),
|
|
netstack_num_ping: 0,
|
|
netstack_send_timeout_sec: 0,
|
|
netstack_recv_timeout_sec: 0,
|
|
netstack_ping_hosts_v4: vec![],
|
|
netstack_ping_ips_v4: vec![],
|
|
netstack_ping_hosts_v6: vec![],
|
|
netstack_ping_ips_v6: vec![],
|
|
};
|
|
|
|
assert_eq!(args.netstack_num_ping, 0);
|
|
assert_eq!(args.netstack_send_timeout_sec, 0);
|
|
assert_eq!(args.netstack_recv_timeout_sec, 0);
|
|
assert_eq!(args.netstack_download_timeout_sec, 0);
|
|
assert!(args.netstack_ping_hosts_v4.is_empty());
|
|
assert!(args.netstack_ping_ips_v4.is_empty());
|
|
assert!(args.netstack_ping_hosts_v6.is_empty());
|
|
assert!(args.netstack_ping_ips_v6.is_empty());
|
|
}
|
|
|
|
#[test]
|
|
fn test_netstack_args_domain_validation() {
|
|
// Test that our domain choices are reasonable
|
|
let args = NetstackArgs {
|
|
netstack_download_timeout_sec: 180,
|
|
metadata_timeout_sec: 30,
|
|
netstack_v4_dns: "1.1.1.1".to_string(),
|
|
netstack_v6_dns: "2606:4700:4700::1111".to_string(),
|
|
netstack_num_ping: 5,
|
|
netstack_send_timeout_sec: 3,
|
|
netstack_recv_timeout_sec: 3,
|
|
netstack_ping_hosts_v4: vec!["nym.com".to_string()],
|
|
netstack_ping_ips_v4: vec!["1.1.1.1".to_string()],
|
|
netstack_ping_hosts_v6: vec!["cloudflare.com".to_string()],
|
|
netstack_ping_ips_v6: vec!["2001:4860:4860::8888".to_string()],
|
|
};
|
|
|
|
assert!(args.netstack_ping_hosts_v4[0].contains("nym"));
|
|
|
|
assert!(args.netstack_ping_hosts_v6[0].contains("cloudflare"));
|
|
|
|
assert_eq!(args.netstack_v4_dns, "1.1.1.1");
|
|
assert_eq!(args.netstack_v6_dns, "2606:4700:4700::1111");
|
|
}
|
|
}
|