keyfork/keyforkd/src/main.rs

73 lines
2.0 KiB
Rust
Raw Normal View History

2023-08-25 06:32:21 +00:00
use keyfork_mnemonic_util::Mnemonic;
use tokio::io::{self, AsyncBufReadExt, BufReader};
#[cfg(feature = "tracing")]
use tracing::debug;
#[cfg(feature = "tracing")]
use tracing_subscriber::{
filter::{EnvFilter, LevelFilter},
fmt::{format::FmtSpan, layer},
prelude::*,
registry,
};
mod error;
mod service;
mod server;
use error::KeycloakdError;
use service::Keyforkd;
use server::UnixServer;
type Result<T, E = Box<dyn std::error::Error>> = std::result::Result<T, E>;
async fn load_mnemonic() -> Result<Mnemonic> {
let mut stdin = BufReader::new(io::stdin());
let mut line = String::new();
stdin.read_line(&mut line).await?;
Ok(line.parse()?)
}
#[cfg(feature = "tracing")]
fn setup_registry() {
let envfilter = EnvFilter::builder()
.with_default_directive(LevelFilter::DEBUG.into())
.from_env_lossy();
registry()
.with(envfilter)
.with(layer().with_span_events(FmtSpan::CLOSE))
.with(tracing_error::ErrorLayer::default())
.init();
}
#[cfg_attr(feature = "multithread", tokio::main)]
#[cfg_attr(not(feature = "multithread"), tokio::main(flavor = "current_thread"))]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
#[cfg(feature = "tracing")]
setup_registry();
#[cfg(feature = "tracing")]
debug!("reading mnemonic from standard input");
let mnemonic = load_mnemonic().await?;
let service = Keyforkd::new(mnemonic);
let mut runtime_dir = dirs::runtime_dir().ok_or(KeycloakdError::NoRuntimeDir)?;
runtime_dir.push("keyforkd");
#[cfg(feature = "tracing")]
debug!("ensuring directory exists: {}", runtime_dir.display());
if !runtime_dir.is_dir() {
tokio::fs::create_dir(&runtime_dir).await?;
}
runtime_dir.push("keyforkd.sock");
#[cfg(feature = "tracing")]
debug!(
"binding UNIX socket in runtime dir: {}",
runtime_dir.display()
);
let mut server = UnixServer::bind(&runtime_dir)?;
let _ = server.run(service).await;
Ok(())
}