use std::env;
use hashicorp_vault as vault;
use log::{error, info};
pub fn init() -> Result<(), String> {
let host_res = env::var("VAULT_ADDRESS");
let key_res = env::var("VAULT_KEY");
let token_res = env::var("VAULT_TOKEN");
if host_res.is_err() || key_res.is_err() && token_res.is_err() {
return Err("not found env: VAULT_ADDRESS,VAULT_KEY,VAULT_TOKEN".to_string());
}
let key_str = key_res.unwrap();
let host_str = host_res.unwrap();
let token_str = token_res.unwrap();
let client_res = vault::Client::new(host_str.clone(), token_str);
match client_res {
Ok(mut client) => {
let res = client.renew();
if res.is_err() {
error!("renew failed :{:?}", res.err().unwrap());
return Ok(());
}
let mut key_data: Vec<&str> = key_str.split('/').collect();
info!("key_data: {:?}", key_data);
let bk = key_data.first().unwrap().to_string();
info!("bk: {:?}", bk);
client.secret_backend(bk);
key_data.remove(0); key_data.remove(0); let key_str = key_data.join("/");
info!("key_str: {:?}", key_str);
if let Ok(res) = client.get_secret_wrapped(key_str, "5m") {
let wrapping_token = res.wrap_info.unwrap().token;
let c2 = vault::Client::new_no_lookup(host_str, wrapping_token).unwrap();
let res = c2.get_unwrapped_response().unwrap();
for (k, v) in res.data.unwrap() {
env::set_var(k, v)
}
} else {
error!("val get key failed :{:?}", res.err().unwrap());
}
}
Err(e) => {
return Err(format!("vault client err {}", e));
}
}
Ok(())
}