diff --git a/src/config.rs b/src/config.rs index 24c3b47..394b38a 100644 --- a/src/config.rs +++ b/src/config.rs @@ -16,7 +16,17 @@ pub enum AcmeAlgo { Rsa(u32), } +impl Default for AcmeAlgo { + fn default() -> Self { + Self::Ec384 + } +} + impl AcmeAlgo { + pub fn parse_or_default(s: &str) -> AcmeAlgo { + Self::parse(s).unwrap_or_else(|_| Default::default()) + } + pub fn parse(s: &str) -> XResult { match s { "ec256" => Ok(AcmeAlgo::Ec256), @@ -35,7 +45,17 @@ pub enum AcmeMode { Test, } +impl Default for AcmeMode { + fn default() -> Self { + Self::Prod + } +} + impl AcmeMode { + pub fn parse_or_default(s: &str) -> AcmeMode { + Self::parse(s).unwrap_or_else(|_| Default::default()) + } + pub fn parse(s: &str) -> XResult { match s { "prod" => Ok(AcmeMode::Prod), diff --git a/src/main.rs b/src/main.rs index d017e72..1ba68a2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -16,6 +16,8 @@ use std::collections::BTreeMap; use tide::Request; use std::process::exit; use std::time::Duration; +use async_std::task; +use async_std::channel; use async_std::channel::Sender; use config::AcmeAlgo; use config::AcmeMode; @@ -29,7 +31,7 @@ lazy_static! { static ref TOKEN_MAP: RwLock> = RwLock::new(BTreeMap::new()); } -#[derive(Debug)] +#[derive(Debug, Default)] struct AcmeRequest<'a> { contract_email: &'a str, primary_name: &'a str, @@ -38,6 +40,8 @@ struct AcmeRequest<'a> { mode: AcmeMode, dir: &'a str, timeout: u64, + key_file: Option, + cert_file: Option, } #[async_std::main] @@ -121,10 +125,10 @@ async fn main() -> tide::Result<()> { exit(1); }); - let (s, r) = async_std::channel::bounded(1); + let (s, r) = channel::bounded(1); startup_http_server(s, port); r.recv().await.ok(); - async_std::task::sleep(Duration::from_millis(500)).await; + task::sleep(Duration::from_millis(500)).await; let domains: Vec<&str> = domains_val.collect::>(); let primary_name = domains[0]; @@ -138,6 +142,7 @@ async fn main() -> tide::Result<()> { mode, dir, timeout, + ..Default::default() }; if let Err(e) = request_domains(acme_request) { failure!("Request certificate by acme failed: {}", e); @@ -199,7 +204,7 @@ fn request_domains(acme_request: AcmeRequest) -> XResult<()> { } fn startup_http_server(s: Sender, port: u16) { - async_std::task::spawn(async move { + task::spawn(async move { information!("Listen at 0.0.0.0:{}", port); let mut app = tide::new(); app.at("/.well-known/acme-challenge/:token").get(|req: Request<()>| async move {