keyforkd: let server be runnable by other programs
This commit is contained in:
parent
a7feed1bcc
commit
d20d9d965d
|
@ -0,0 +1,70 @@
|
||||||
|
use std::{collections::HashMap, path::PathBuf};
|
||||||
|
|
||||||
|
use keyfork_mnemonic_util::Mnemonic;
|
||||||
|
use tower::ServiceBuilder;
|
||||||
|
|
||||||
|
#[cfg(feature = "tracing")]
|
||||||
|
use tracing::debug;
|
||||||
|
|
||||||
|
mod error;
|
||||||
|
mod middleware;
|
||||||
|
mod server;
|
||||||
|
mod service;
|
||||||
|
use error::KeyforkdError;
|
||||||
|
use server::UnixServer;
|
||||||
|
use service::Keyforkd;
|
||||||
|
|
||||||
|
pub async fn start_and_run_server(mnemonic: Mnemonic) -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
let service = ServiceBuilder::new()
|
||||||
|
.layer(middleware::SerdeLayer::new())
|
||||||
|
.service(Keyforkd::new(mnemonic));
|
||||||
|
|
||||||
|
let runtime_vars = std::env::vars()
|
||||||
|
.filter(|(key, _)| ["XDG_RUNTIME_DIR", "KEYFORKD_SOCKET_PATH"].contains(&key.as_str()))
|
||||||
|
.collect::<HashMap<String, String>>();
|
||||||
|
let mut runtime_path: PathBuf;
|
||||||
|
#[allow(clippy::single_match_else)]
|
||||||
|
match runtime_vars.get("KEYFORKD_SOCKET_PATH") {
|
||||||
|
Some(occupied) => {
|
||||||
|
runtime_path = PathBuf::from(occupied);
|
||||||
|
}
|
||||||
|
None => {
|
||||||
|
runtime_path = PathBuf::from(
|
||||||
|
runtime_vars
|
||||||
|
.get("XDG_RUNTIME_DIR")
|
||||||
|
.ok_or(KeyforkdError::NoSocketPath)?,
|
||||||
|
);
|
||||||
|
runtime_path.push("keyforkd");
|
||||||
|
#[cfg(feature = "tracing")]
|
||||||
|
debug!("ensuring directory exists: {}", runtime_path.display());
|
||||||
|
if !runtime_path.is_dir() {
|
||||||
|
tokio::fs::create_dir(&runtime_path).await?;
|
||||||
|
}
|
||||||
|
runtime_path.push("keyforkd.sock");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(feature = "tracing")]
|
||||||
|
debug!(
|
||||||
|
"binding UNIX socket in runtime dir: {}",
|
||||||
|
runtime_path.display()
|
||||||
|
);
|
||||||
|
|
||||||
|
let mut server = match UnixServer::bind(&runtime_path) {
|
||||||
|
Ok(s) => s,
|
||||||
|
Err(e) => {
|
||||||
|
#[cfg(feature = "tracing")]
|
||||||
|
debug!(%e, "Encountered error attempting to bind socket: {}", runtime_path.display());
|
||||||
|
return Err(e.into());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
match server.run(service).await {
|
||||||
|
Ok(_) => (),
|
||||||
|
Err(e) => {
|
||||||
|
#[cfg(feature = "tracing")]
|
||||||
|
debug!(%e, "Encountered error while running");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
|
@ -1,9 +1,6 @@
|
||||||
use std::{collections::HashMap, path::PathBuf};
|
|
||||||
|
|
||||||
use keyfork_mnemonic_util::Mnemonic;
|
use keyfork_mnemonic_util::Mnemonic;
|
||||||
|
|
||||||
use tokio::io::{self, AsyncBufReadExt, BufReader};
|
use tokio::io::{self, AsyncBufReadExt, BufReader};
|
||||||
use tower::ServiceBuilder;
|
|
||||||
|
|
||||||
#[cfg(feature = "tracing")]
|
#[cfg(feature = "tracing")]
|
||||||
use tracing::debug;
|
use tracing::debug;
|
||||||
|
@ -15,14 +12,6 @@ use tracing_subscriber::{
|
||||||
registry,
|
registry,
|
||||||
};
|
};
|
||||||
|
|
||||||
mod error;
|
|
||||||
mod server;
|
|
||||||
mod service;
|
|
||||||
mod middleware;
|
|
||||||
use error::KeyforkdError;
|
|
||||||
use server::UnixServer;
|
|
||||||
use service::Keyforkd;
|
|
||||||
|
|
||||||
type Result<T, E = Box<dyn std::error::Error>> = std::result::Result<T, E>;
|
type Result<T, E = Box<dyn std::error::Error>> = std::result::Result<T, E>;
|
||||||
|
|
||||||
async fn load_mnemonic() -> Result<Mnemonic> {
|
async fn load_mnemonic() -> Result<Mnemonic> {
|
||||||
|
@ -54,55 +43,5 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
debug!("reading mnemonic from standard input");
|
debug!("reading mnemonic from standard input");
|
||||||
let mnemonic = load_mnemonic().await?;
|
let mnemonic = load_mnemonic().await?;
|
||||||
|
|
||||||
let service = ServiceBuilder::new()
|
keyforkd::start_and_run_server(mnemonic).await
|
||||||
.layer(middleware::SerdeLayer::new())
|
|
||||||
.service(Keyforkd::new(mnemonic));
|
|
||||||
|
|
||||||
let runtime_vars = std::env::vars()
|
|
||||||
.filter(|(key, _)| ["XDG_RUNTIME_DIR", "KEYFORKD_SOCKET_PATH"].contains(&key.as_str()))
|
|
||||||
.collect::<HashMap<String, String>>();
|
|
||||||
let mut runtime_path: PathBuf;
|
|
||||||
#[allow(clippy::single_match_else)]
|
|
||||||
match runtime_vars.get("KEYFORKD_SOCKET_PATH") {
|
|
||||||
Some(occupied) => {
|
|
||||||
runtime_path = PathBuf::from(occupied);
|
|
||||||
}
|
|
||||||
None => {
|
|
||||||
runtime_path = PathBuf::from(
|
|
||||||
runtime_vars
|
|
||||||
.get("XDG_RUNTIME_DIR")
|
|
||||||
.ok_or(KeyforkdError::NoSocketPath)?,
|
|
||||||
);
|
|
||||||
runtime_path.push("keyforkd");
|
|
||||||
#[cfg(feature = "tracing")]
|
|
||||||
debug!("ensuring directory exists: {}", runtime_path.display());
|
|
||||||
if !runtime_path.is_dir() {
|
|
||||||
tokio::fs::create_dir(&runtime_path).await?;
|
|
||||||
}
|
|
||||||
runtime_path.push("keyforkd.sock");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(feature = "tracing")]
|
|
||||||
debug!(
|
|
||||||
"binding UNIX socket in runtime dir: {}",
|
|
||||||
runtime_path.display()
|
|
||||||
);
|
|
||||||
|
|
||||||
let mut server = match UnixServer::bind(&runtime_path) {
|
|
||||||
Ok(s) => s,
|
|
||||||
Err(e) => {
|
|
||||||
#[cfg(feature = "tracing")]
|
|
||||||
debug!(%e, "Encountered error attempting to bind socket: {}", runtime_path.display());
|
|
||||||
return Err(e.into());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
match server.run(service).await {
|
|
||||||
Ok(_) => (),
|
|
||||||
Err(e) => {
|
|
||||||
#[cfg(feature = "tracing")]
|
|
||||||
debug!(%e, "Encountered error while running");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Ok(())
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue