aboutsummaryrefslogtreecommitdiff
path: root/src/acme.rs
blob: c6dbc5be97617475c7d49b178f216b0f56607101 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
use std::collections::HashSet;

use log::*;
use anyhow::Result;
use tokio::{sync::watch, time::sleep};

use acme_micro::{Error, Certificate, Directory, DirectoryUrl};
use acme_micro::create_p384_key;

use crate::consul::Consul;
use crate::proxy_config::ProxyConfig;

pub async fn acme_task(mut consul: Consul, mut rx_proxy_config: watch::Receiver<ProxyConfig>) {
	while rx_proxy_config.changed().await.is_ok() {
		let mut domains: HashSet<String> = HashSet::new();

		for ent in rx_proxy_config.borrow().entries.iter() {
			domains.insert(ent.host.clone());
		}
		info!("Ensuring we have certs for domains: {:#?}", domains);
		
		let results = futures::future::join_all(
			domains.iter()
			.map(|dom| renew_cert(dom, &consul))
		).await;

		for (res, dom) in results.iter().zip(domains.iter()) {
			if let Err(e) = res {
				error!("{}: {}", dom, e);
			}
		}
	}
}

async fn renew_cert(dom: &str, consul: &Consul) -> Result<()> {
	let dir = Directory::from_url(DirectoryUrl::LetsEncrypt)?;
	let contact = vec!["mailto:alex@adnab.me".to_string()];
	let acc = dir.register_account(contact.clone())?;
	// TODO
	unimplemented!()
}