forked from Deuxfleurs/diplonat
Handle UDP/TCP
This commit is contained in:
parent
ec777652c1
commit
5fafc1cb64
3 changed files with 25 additions and 11 deletions
|
@ -59,6 +59,8 @@ To test the Consul Catalog part, you can do:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
consul agent -dev #in a separate terminal, if not already running
|
consul agent -dev #in a separate terminal, if not already running
|
||||||
consul services register -name=example -port=1337 -tag="(diplonat (port 1337) (port 1338 1339))"
|
consul services register -name=fake_leet -tag="(diplonat (tcp_port 1337) (tcp_port 1338 1339))"
|
||||||
|
consul services register -name=fake_dns -tag="(diplonat (udp_port 53) (tcp_port 53))"
|
||||||
|
consul services register -name=fake_irc -tag="(diplonat (udp_port 6667 6666))"
|
||||||
consul services -id=example
|
consul services -id=example
|
||||||
```
|
```
|
||||||
|
|
|
@ -11,7 +11,8 @@ use crate::consul;
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug)]
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
pub enum DiplonatParameter {
|
pub enum DiplonatParameter {
|
||||||
port(Vec<u16>)
|
tcp_port(Vec<u16>),
|
||||||
|
udp_port(Vec<u16>)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug)]
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
|
@ -20,12 +21,12 @@ pub enum DiplonatConsul {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct ConsulActor {
|
pub struct ConsulActor {
|
||||||
pub rx_open_ports: watch::Receiver<messages::OpenPorts>,
|
pub rx_open_ports: watch::Receiver<messages::PublicExposedPorts>,
|
||||||
|
|
||||||
consul: consul::Consul,
|
consul: consul::Consul,
|
||||||
node: String,
|
node: String,
|
||||||
retries: u32,
|
retries: u32,
|
||||||
tx_open_ports: watch::Sender<messages::OpenPorts>
|
tx_open_ports: watch::Sender<messages::PublicExposedPorts>
|
||||||
}
|
}
|
||||||
|
|
||||||
fn retry_to_time(retries: u32, max_time: Duration) -> Duration {
|
fn retry_to_time(retries: u32, max_time: Duration) -> Duration {
|
||||||
|
@ -34,8 +35,12 @@ fn retry_to_time(retries: u32, max_time: Duration) -> Duration {
|
||||||
return Duration::from_secs(cmp::min(max_time.as_secs(), 1.2f64.powf(retries as f64) as u64))
|
return Duration::from_secs(cmp::min(max_time.as_secs(), 1.2f64.powf(retries as f64) as u64))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn from_catalog_to_open_ports(catalog: &consul::CatalogNode) -> messages::OpenPorts {
|
fn from_catalog_to_open_ports(catalog: &consul::CatalogNode) -> messages::PublicExposedPorts {
|
||||||
let mut op = messages::OpenPorts { ports: Vec::new() };
|
let mut op = messages::PublicExposedPorts {
|
||||||
|
tcp_ports: Vec::new(),
|
||||||
|
udp_ports: Vec::new()
|
||||||
|
};
|
||||||
|
|
||||||
for (_, service_info) in &catalog.Services {
|
for (_, service_info) in &catalog.Services {
|
||||||
for tag in &service_info.Tags {
|
for tag in &service_info.Tags {
|
||||||
let diplo_conf: error::Result<DiplonatConsul> = from_str(tag);
|
let diplo_conf: error::Result<DiplonatConsul> = from_str(tag);
|
||||||
|
@ -43,8 +48,10 @@ fn from_catalog_to_open_ports(catalog: &consul::CatalogNode) -> messages::OpenPo
|
||||||
Ok(conf) => {
|
Ok(conf) => {
|
||||||
let DiplonatConsul::diplonat(c) = conf;
|
let DiplonatConsul::diplonat(c) = conf;
|
||||||
for parameter in &c {
|
for parameter in &c {
|
||||||
let DiplonatParameter::port(p) = parameter;
|
match parameter {
|
||||||
op.ports.extend(p);
|
DiplonatParameter::tcp_port(p) => op.tcp_ports.extend(p),
|
||||||
|
DiplonatParameter::udp_port(p) => op.udp_ports.extend(p),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Err(e) => debug!("Failed to parse entry {}. {}", tag, e),
|
Err(e) => debug!("Failed to parse entry {}. {}", tag, e),
|
||||||
|
@ -56,7 +63,11 @@ fn from_catalog_to_open_ports(catalog: &consul::CatalogNode) -> messages::OpenPo
|
||||||
|
|
||||||
impl ConsulActor {
|
impl ConsulActor {
|
||||||
pub fn new(url: &str, node: &str) -> Self {
|
pub fn new(url: &str, node: &str) -> Self {
|
||||||
let (tx, rx) = watch::channel(messages::OpenPorts{ports: Vec::new() });
|
let (tx, rx) = watch::channel(messages::PublicExposedPorts{
|
||||||
|
tcp_ports: Vec::new(),
|
||||||
|
udp_ports: Vec::new()
|
||||||
|
});
|
||||||
|
|
||||||
return Self {
|
return Self {
|
||||||
consul: consul::Consul::new(url),
|
consul: consul::Consul::new(url),
|
||||||
rx_open_ports: rx,
|
rx_open_ports: rx,
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct OpenPorts {
|
pub struct PublicExposedPorts {
|
||||||
pub ports: Vec<u16>
|
pub tcp_ports: Vec<u16>,
|
||||||
|
pub udp_ports: Vec<u16>
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue