use anyhow::Result;
use log::*;
use tokio::{
select,
sync::watch,
time::{self, Duration},
};
use crate::config::RuntimeConfigAcme;
use crate::messages;
pub struct AcmeActor {
email: String,
//last_ports: messages::PublicExposedPorts,
refresh: Duration,
rx_ports: watch::Receiver<messages::PublicExposedPorts>,
}
impl AcmeActor {
pub async fn new(
config: Option<RuntimeConfigAcme>,
rxp: &watch::Receiver<messages::PublicExposedPorts>,
) -> Result<Option<Self>> {
if config.is_none() {
return Ok(None);
}
let config = config.unwrap();
let ctx = Self {
email: config.email,
//last_ports: messages::PublicExposedPorts::new(),
refresh: config.refresh_time,
rx_ports: rxp.clone(),
};
Ok(Some(ctx))
}
pub async fn listen(&mut self) -> Result<()> {
let mut interval = time::interval(self.refresh);
loop {
select! {
Some(ports) = self.rx_ports.recv() => {
match self.do_acme(ports).await {
Ok(()) => debug!("Successfully updated ACME"),
Err(e) => error!("An error occured while updating ACME. {}", e),
}
},
_ = interval.tick() => continue,
else => break // Sender dropped, terminate loop.
}
}
Ok(())
}
pub async fn do_acme(&self, ports: messages::PublicExposedPorts) -> Result<()> {
if ports.acme.is_empty() {
return Ok(());
}
let primary_url = &ports.acme[0];
let secondary_urls = &ports.acme[1..];
println!("Doing ACME!!!");
println!("Primary URL: {:?}", primary_url);
println!("Secondary URLs: {:?}", secondary_urls);
Ok(())
}
}