1use std::collections::HashMap;
7use std::net::SocketAddr;
8
9pub use lab_ops_lab_lib::TransportProtocol;
10use serde::Deserialize;
11use serde::Serialize;
12
13#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
15pub struct DockerPortMapRequest {
16 pub host_addr: SocketAddr,
17 pub container_addr: SocketAddr,
18 pub proto: TransportProtocol,
19}
20
21impl DockerPortMapRequest {
22 pub fn is_ipv6(&self) -> bool {
24 self.host_addr.is_ipv6()
25 }
26}
27
28#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
30pub struct DockerPortMap {
31 pub id: u64,
33 pub request: DockerPortMapRequest,
35 pub container_id: String,
37 pub container_name: String,
39 pub rule_comment: String,
41}
42
43impl DockerPortMap {
44 pub fn new(
48 id: u64,
49 request: DockerPortMapRequest,
50 container_id: String,
51 container_name: String,
52 ) -> Self {
53 let rule_comment = format!("natmap:{}:{}", container_id, request.host_addr.port());
54 Self {
55 id,
56 request,
57 container_id,
58 container_name,
59 rule_comment,
60 }
61 }
62}
63
64#[derive(Debug, Clone, Serialize, Deserialize)]
66pub struct DockerRemapRequest {
67 pub host_port: u16,
68 pub new_host_port: u16,
69}
70
71#[derive(Debug, Clone, Serialize, Deserialize, Default)]
77pub struct DockerAddMapRequest {
78 #[serde(default = "default_host_ip")]
80 pub host_ip: String,
81 pub host_port: u16,
83 pub container_port: u16,
85 #[serde(default)]
88 pub target_ip: Option<String>,
89 #[serde(default = "default_proto")]
91 pub proto: TransportProtocol,
92}
93
94fn default_host_ip() -> String {
95 "0.0.0.0".to_string()
96}
97
98fn default_proto() -> TransportProtocol {
99 TransportProtocol::default()
100}
101
102#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
106pub struct DnatConfig {
107 pub ext_ip: String,
109 pub int_ip: String,
111 pub ports: String,
113 pub proto: TransportProtocol,
115 pub ext_if: Option<String>,
117 #[serde(default)]
118 pub no_masquerade: bool,
119}
120
121impl DnatConfig {
122 pub fn rule_comment(&self) -> String {
124 format!("natmap:dnat:{}:{}", self.ext_ip, self.ports)
125 }
126}
127
128#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
130pub struct SnatConfig {
131 pub int_ip: String,
133 pub ext_ip: String,
135 pub ext_if: String,
137}
138
139impl SnatConfig {
140 pub fn rule_comment(&self) -> String {
142 format!("natmap:snat:{}:{}", self.int_ip, self.ext_ip)
143 }
144}
145
146#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
148pub struct HairpinConfig {
149 pub ext_ip: String,
151 pub int_ip: String,
153 pub ports: String,
155 pub proto: TransportProtocol,
157 #[serde(default, skip_serializing_if = "Option::is_none")]
161 pub lan_cidr: Option<String>,
162}
163
164impl HairpinConfig {
165 pub fn rule_comment(&self) -> String {
167 format!(
168 "natmap:hairpin:{}:{}:{}",
169 self.ext_ip, self.int_ip, self.ports
170 )
171 }
172}
173
174#[derive(Debug, Clone, Serialize, Deserialize)]
178pub struct DnatRequest {
179 pub ext_ip: String,
180 pub int_ip: String,
181 pub ports: String,
182 pub proto: TransportProtocol,
183 pub ext_if: Option<String>,
184 #[serde(default)]
185 pub no_masquerade: bool,
186}
187
188#[derive(Debug, Clone, Serialize, Deserialize)]
190pub struct SnatRequest {
191 pub int_ip: String,
192 pub ext_ip: String,
193 pub ext_if: String,
194}
195
196#[derive(Debug, Clone, Serialize, Deserialize)]
198pub struct HairpinRequest {
199 pub ext_ip: String,
200 pub int_ip: String,
201 pub ports: String,
202 pub proto: TransportProtocol,
203 #[serde(default)]
204 pub lan_cidr: Option<String>,
205}
206
207#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
208pub struct PolicyRouteConfig {
209 pub src_ip: String,
210 pub via: String,
211 pub table: u32,
212}
213
214#[derive(Debug, Clone, Serialize, Deserialize)]
215pub struct PolicyRouteRequest {
216 pub src_ip: String,
217 pub via: String,
218 pub table: u32,
219}
220
221#[derive(Debug, Clone, Serialize, Deserialize, Default)]
225pub struct DaemonState {
226 pub mapping: HashMap<String, Vec<DockerPortMap>>,
228 pub dnats: Vec<DnatConfig>,
230 pub snats: Vec<SnatConfig>,
232 pub hairpins: Vec<HairpinConfig>,
234 #[serde(default)]
236 pub policy_routes: Vec<PolicyRouteConfig>,
237}
238
239#[derive(Debug, Clone, Serialize, Deserialize)]
241pub struct ListResponse {
242 pub docker: Vec<DockerPortMap>,
243 pub dnats: Vec<DnatConfig>,
244 pub snats: Vec<SnatConfig>,
245 pub hairpins: Vec<HairpinConfig>,
246 pub policy_routes: Vec<PolicyRouteConfig>,
247}