use std::time::Duration;
use serde::{Deserialize, Serialize};
use crate::connection::ConnectionId;
use crate::dns::DnsResolution;
use crate::link::{L4Proto, Link, Neighbor, Route};
use crate::path::ProbeResults;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Layer {
Link,
Address,
Gateway,
Dns,
Internet,
Firewall,
Service,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Severity {
Info,
Warn,
Broken,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Finding {
pub layer: Layer,
pub severity: Severity,
pub summary: String,
pub detail: Option<String>,
pub remedy: Option<Remedy>,
pub evidence: Evidence,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum Remedy {
Run { cmd: String },
Check { what: String },
Reconnect { id: ConnectionId },
ElevatePrivileges,
None,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum Evidence {
Link { link: Link },
Neighbor { neighbor: Neighbor },
Route { route: Route },
Dns { dns: DnsResolution },
Probe { probe: Box<ProbeResults> },
Text { text: String },
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "snake_case")]
pub enum Health {
Ok,
Degraded { findings: Vec<Finding> },
Broken { findings: Vec<Finding> },
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum CheckScope {
Quick,
Full,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum FirewallVerdict {
Allow,
Drop,
Reject,
NoMatch,
Unknown,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum FirewallBackend {
Nftables,
Iptables,
Unknown,
}
#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
pub struct ProbeCapabilities {
pub has_ping: bool,
pub has_traceroute: bool,
pub has_mtr: bool,
pub has_tracepath: bool,
pub unprivileged_icmp: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct PingOpts {
pub count: u32,
pub timeout: Duration,
}
impl Default for PingOpts {
fn default() -> Self {
Self {
count: 2,
timeout: Duration::from_secs(1),
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct TraceOpts {
pub max_hops: u8,
pub timeout_per_hop: Duration,
pub proto: L4Proto,
}
impl Default for TraceOpts {
fn default() -> Self {
Self {
max_hops: 20,
timeout_per_hop: Duration::from_secs(1),
proto: L4Proto::Udp,
}
}
}