diff options
author | Alex Auvolat <alex@adnab.me> | 2021-12-30 20:08:10 +0100 |
---|---|---|
committer | Alex Auvolat <alex@adnab.me> | 2021-12-30 20:08:10 +0100 |
commit | bcc185df400f0b459d78d6bdd3084ef5b6ac5e8a (patch) | |
tree | 839ab4adf9597b0ac7364a4b348bf4b0d279c263 /src/consul.rs | |
parent | d13066b12bc03e49c233a065294595c2da3b1f3d (diff) | |
download | tricot-bcc185df400f0b459d78d6bdd3084ef5b6ac5e8a.tar.gz tricot-bcc185df400f0b459d78d6bdd3084ef5b6ac5e8a.zip |
Add support for Consul TLS
Diffstat (limited to 'src/consul.rs')
-rw-r--r-- | src/consul.rs | 39 |
1 files changed, 34 insertions, 5 deletions
diff --git a/src/consul.rs b/src/consul.rs index ee1935c..8eafcc2 100644 --- a/src/consul.rs +++ b/src/consul.rs @@ -1,4 +1,6 @@ use std::collections::HashMap; +use std::fs::File; +use std::io::Read; use anyhow::Result; use bytes::Bytes; @@ -6,6 +8,13 @@ use log::*; use reqwest::StatusCode; use serde::{Deserialize, Serialize}; +pub struct ConsulConfig { + pub addr: String, + pub ca_cert: Option<String>, + pub client_cert: Option<String>, + pub client_key: Option<String>, +} + // ---- Watch and retrieve Consul catalog ---- // #[derive(Serialize, Deserialize, Debug)] @@ -76,13 +85,33 @@ pub struct Consul { } impl Consul { - pub fn new(url: &str, kv_prefix: &str, local_node: &str) -> Self { - return Self { - client: reqwest::Client::new(), - url: url.trim_end_matches('/').to_string(), + pub fn new(config: ConsulConfig, kv_prefix: &str, local_node: &str) -> Result<Self> { + let client = match (&config.ca_cert, &config.client_cert, &config.client_key) { + (Some(ca_cert), Some(client_cert), Some(client_key)) => { + let mut ca_cert_buf = vec![]; + File::open(ca_cert)?.read_to_end(&mut ca_cert_buf)?; + + let mut client_cert_buf = vec![]; + File::open(client_cert)?.read_to_end(&mut client_cert_buf)?; + + let mut client_key_buf = vec![]; + File::open(client_key)?.read_to_end(&mut client_key_buf)?; + + reqwest::Client::builder() + .use_rustls_tls() + .add_root_certificate(reqwest::Certificate::from_pem(&ca_cert_buf[..])?) + .identity(reqwest::Identity::from_pem(&[&client_cert_buf[..], &client_key_buf[..]].concat()[..])?) + .build()? + } + _ => reqwest::Client::new(), + }; + + Ok(Self { + client, + url: config.addr.trim_end_matches('/').to_string(), kv_prefix: kv_prefix.to_string(), local_node: local_node.into(), - }; + }) } pub async fn list_nodes(&self) -> Result<Vec<String>> { |