use std::collections::HashMap;
use std::net::SocketAddr;
pub use lab_ops_lab_lib::TransportProtocol;
use serde::Deserialize;
use serde::Serialize;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct DockerPortMapRequest {
pub host_addr: SocketAddr,
pub container_addr: SocketAddr,
pub proto: TransportProtocol,
}
impl DockerPortMapRequest {
pub fn is_ipv6(&self) -> bool {
self.host_addr.is_ipv6()
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct DockerPortMap {
pub id: u64,
pub request: DockerPortMapRequest,
pub container_id: String,
pub container_name: String,
pub rule_comment: String,
}
impl DockerPortMap {
pub fn new(
id: u64,
request: DockerPortMapRequest,
container_id: String,
container_name: String,
) -> Self {
let rule_comment = format!("natmap:{}:{}", container_id, request.host_addr.port());
Self {
id,
request,
container_id,
container_name,
rule_comment,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DockerRemapRequest {
pub host_port: u16,
pub new_host_port: u16,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct DockerAddMapRequest {
#[serde(default = "default_host_ip")]
pub host_ip: String,
pub host_port: u16,
pub container_port: u16,
#[serde(default)]
pub target_ip: Option<String>,
#[serde(default = "default_proto")]
pub proto: TransportProtocol,
}
fn default_host_ip() -> String {
"0.0.0.0".to_string()
}
fn default_proto() -> TransportProtocol {
TransportProtocol::default()
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct DnatConfig {
pub ext_ip: String,
pub int_ip: String,
pub ports: String,
pub proto: TransportProtocol,
pub ext_if: Option<String>,
#[serde(default)]
pub no_masquerade: bool,
}
impl DnatConfig {
pub fn rule_comment(&self) -> String {
format!("natmap:dnat:{}:{}", self.ext_ip, self.ports)
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct SnatConfig {
pub int_ip: String,
pub ext_ip: String,
pub ext_if: String,
}
impl SnatConfig {
pub fn rule_comment(&self) -> String {
format!("natmap:snat:{}:{}", self.int_ip, self.ext_ip)
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct HairpinConfig {
pub ext_ip: String,
pub int_ip: String,
pub ports: String,
pub proto: TransportProtocol,
}
impl HairpinConfig {
pub fn rule_comment(&self) -> String {
format!(
"natmap:hairpin:{}:{}:{}",
self.ext_ip, self.int_ip, self.ports
)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DnatRequest {
pub ext_ip: String,
pub int_ip: String,
pub ports: String,
pub proto: TransportProtocol,
pub ext_if: Option<String>,
#[serde(default)]
pub no_masquerade: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SnatRequest {
pub int_ip: String,
pub ext_ip: String,
pub ext_if: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HairpinRequest {
pub ext_ip: String,
pub int_ip: String,
pub ports: String,
pub proto: TransportProtocol,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct PolicyRouteConfig {
pub src_ip: String,
pub via: String,
pub table: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PolicyRouteRequest {
pub src_ip: String,
pub via: String,
pub table: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct DaemonState {
pub mapping: HashMap<String, Vec<DockerPortMap>>,
pub dnats: Vec<DnatConfig>,
pub snats: Vec<SnatConfig>,
pub hairpins: Vec<HairpinConfig>,
#[serde(default)]
pub policy_routes: Vec<PolicyRouteConfig>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListResponse {
pub docker: Vec<DockerPortMap>,
pub dnats: Vec<DnatConfig>,
pub snats: Vec<SnatConfig>,
pub hairpins: Vec<HairpinConfig>,
pub policy_routes: Vec<PolicyRouteConfig>,
}