diplonat/src/diplonat.rs

79 lines
2.0 KiB
Rust
Raw Permalink Normal View History

2023-04-20 12:14:30 +00:00
use anyhow::{Context, Result};
use futures::future::FutureExt;
2020-05-22 17:21:11 +00:00
use tokio::try_join;
use crate::{
config::ConfigOpts, consul_actor::ConsulActor, fw_actor::FirewallActor, igd_actor::IgdActor,
stun_actor::StunActor,
};
2020-05-21 20:25:33 +00:00
2020-05-22 16:41:13 +00:00
pub struct Diplonat {
consul: ConsulActor,
firewall: FirewallActor,
2023-04-05 07:47:58 +00:00
igd: Option<IgdActor>,
stun: StunActor,
}
2020-05-22 16:41:13 +00:00
impl Diplonat {
pub async fn new() -> Result<Self> {
2023-04-20 12:14:30 +00:00
let rt_cfg = ConfigOpts::from_env().context("Parse configuration")?;
println!("{:#?}", rt_cfg);
let ca = ConsulActor::new(&rt_cfg.consul, &rt_cfg.consul.node_name);
2023-04-05 07:47:58 +00:00
let fw = FirewallActor::new(
rt_cfg.firewall.ipv6_only,
rt_cfg.firewall.refresh_time,
&ca.rx_open_ports,
)
2023-04-20 12:14:30 +00:00
.await
.context("Setup fireall actor")?;
2023-04-05 07:47:58 +00:00
let ia = match rt_cfg.igd {
Some(igdc) => Some(
IgdActor::new(
igdc.private_ip,
igdc.refresh_time,
igdc.expiration_time,
&ca.rx_open_ports,
)
2023-04-20 12:14:30 +00:00
.await
.context("Setup IGD actor")?,
2023-04-05 07:47:58 +00:00
),
None => None,
};
let sa = StunActor::new(&rt_cfg.consul, &rt_cfg.stun, &rt_cfg.consul.node_name);
let ctx = Self {
consul: ca,
igd: ia,
firewall: fw,
stun: sa,
};
Ok(ctx)
}
pub async fn listen(&mut self) -> Result<()> {
2023-04-05 07:47:58 +00:00
let igd_opt = &mut self.igd;
try_join!(
2023-04-20 12:14:30 +00:00
self.consul.listen().map(|x| x.context("Run consul actor")),
2023-04-05 07:47:58 +00:00
async {
if let Some(igd) = igd_opt {
2023-04-20 12:14:30 +00:00
igd.listen().await.context("Run IGD actor")
2023-04-05 07:47:58 +00:00
} else {
Ok(())
}
},
2023-04-20 12:14:30 +00:00
self.firewall
.listen()
.map(|x| x.context("Run firewall actor")),
self.stun.listen().map(|x| x.context("Run STUN actor")),
)?;
Ok(())
}
}