add proper command line options and logging

This commit is contained in:
2022-10-21 17:51:47 +08:00
parent e871ec2b29
commit 05e5344b92
6 changed files with 95 additions and 14 deletions

View File

@ -1,13 +1,41 @@
use std::collections::HashMap;
use std::{collections::HashMap, str::FromStr};
use rand_core::OsRng;
use tokio::sync::RwLock;
use x25519_dalek::{PublicKey, StaticSecret};
use clap::Parser;
#[derive(clap::Parser, Debug)]
struct Args {
#[clap(
short = 'c',
long = "connect",
help = "server address to connect to",
default_value = "grpc://127.0.0.1:8877"
)]
endpoint: String,
#[clap(short, long, default_value = "1")]
workers: u8,
#[clap(short, long, default_value = "INFO")]
log_level: String,
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let client =
libvanity::worker::worker_client::WorkerClient::connect("grpc://127.0.0.1:8877").await?;
let args = Args::parse();
if args.workers < 1 {
return Ok(());
}
let level = tracing::Level::from_str(&args.log_level)?;
tracing_subscriber::FmtSubscriber::builder()
.with_max_level(level)
.init();
let client = libvanity::worker::worker_client::WorkerClient::connect(args.endpoint).await?;
let (tx, rx) = tokio::sync::mpsc::channel(128);
@ -29,10 +57,12 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
match new_or_done {
New(request) => {
let mut writer = requests.write().await;
tracing::debug!("new work received: {}", request.id);
writer.insert(request.id, request.pattern);
}
Done(response) => {
let mut writer = requests.write().await;
tracing::debug!("stop signal received: {}", response);
writer.remove(&response);
}
}
@ -40,14 +70,17 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
}
});
let worker_threads = Vec::from_iter(1..10).into_iter().map(|id| {
let worker_threads = Vec::from_iter(0..args.workers).into_iter().map(|id| {
let requests = requests.clone();
let tx = tx.clone();
let _id = id.clone();
let id = id.clone();
tracing::trace!("spawning worker {}", id);
tokio::spawn(async move {
tracing::trace!("worker {} started", id);
loop {
let requests = requests.read().await.clone();
if requests.is_empty() {
tracing::trace!("no work found on {}", id);
tokio::time::sleep(std::time::Duration::from_millis(10)).await;
continue;
}
@ -60,6 +93,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
let matcher = matcher.clone();
let public_b64 = base64::encode(public.as_bytes());
if matcher.is_match(&public_b64) {
tracing::trace!("match found on {}: {}", id, public_b64);
let mut result = libvanity::worker::Result::default();
result.id = id.clone();
result.result = base64::encode(private.to_bytes());