use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
use serde::{Deserialize, Serialize};
use crate::dns::Nameserver;
use crate::policy::NetworkPolicy;
use crate::secrets::config::SecretsConfig;
use crate::tls::TlsConfig;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NetworkConfig {
#[serde(default = "default_true")]
pub enabled: bool,
#[serde(default)]
pub interface: InterfaceOverrides,
#[serde(default)]
pub ports: Vec<PublishedPort>,
#[serde(default)]
pub policy: NetworkPolicy,
#[serde(default)]
pub dns: DnsConfig,
#[serde(default)]
pub tls: TlsConfig,
#[serde(default)]
pub secrets: SecretsConfig,
#[serde(default)]
pub max_connections: Option<usize>,
#[serde(default)]
pub trust_host_cas: bool,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct InterfaceOverrides {
#[serde(default)]
pub mac: Option<[u8; 6]>,
#[serde(default)]
pub mtu: Option<u16>,
#[serde(default)]
pub ipv4_address: Option<Ipv4Addr>,
#[serde(default)]
pub ipv6_address: Option<Ipv6Addr>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DnsConfig {
#[serde(default = "default_true")]
pub rebind_protection: bool,
#[serde(default)]
pub nameservers: Vec<Nameserver>,
#[serde(default = "default_query_timeout_ms")]
pub query_timeout_ms: u64,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PublishedPort {
pub host_port: u16,
pub guest_port: u16,
#[serde(default)]
pub protocol: PortProtocol,
#[serde(default = "default_host_bind")]
pub host_bind: IpAddr,
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)]
pub enum PortProtocol {
#[default]
Tcp,
Udp,
}
impl Default for NetworkConfig {
fn default() -> Self {
Self {
enabled: true,
interface: InterfaceOverrides::default(),
ports: Vec::new(),
policy: NetworkPolicy::default(),
dns: DnsConfig::default(),
tls: TlsConfig::default(),
secrets: SecretsConfig::default(),
max_connections: None,
trust_host_cas: false,
}
}
}
impl Default for DnsConfig {
fn default() -> Self {
Self {
rebind_protection: true,
nameservers: Vec::new(),
query_timeout_ms: default_query_timeout_ms(),
}
}
}
fn default_true() -> bool {
true
}
fn default_host_bind() -> IpAddr {
IpAddr::V4(Ipv4Addr::LOCALHOST)
}
fn default_query_timeout_ms() -> u64 {
5000
}