Parcourir la source

repo: updated all bins to use new signals handling

aggstam il y a 3 ans
Parent
commit
997f6015cf

+ 1 - 0
.gitignore

@@ -19,6 +19,7 @@
 /daod
 /dhtd
 /darkfid
+/darkfid2
 /darkotc
 /dnetview
 /drk

+ 18 - 4
Cargo.lock

@@ -1781,7 +1781,6 @@ dependencies = [
  "async-trait",
  "blake3",
  "bs58",
- "ctrlc",
  "darkfi",
  "darkfi-sdk",
  "darkfi-serial",
@@ -1789,6 +1788,8 @@ dependencies = [
  "log",
  "serde",
  "serde_json",
+ "signal-hook",
+ "signal-hook-async-std",
  "simplelog",
  "sled",
  "smol",
@@ -1833,6 +1834,7 @@ dependencies = [
  "easy-parallel",
  "futures",
  "hex",
+ "libsqlite3-sys",
  "log",
  "rand 0.8.5",
  "ripemd",
@@ -2197,6 +2199,7 @@ dependencies = [
  "darkfi",
  "darkfi-serial",
  "easy-parallel",
+ "libsqlite3-sys",
  "log",
  "rand 0.8.5",
  "simplelog",
@@ -2306,6 +2309,7 @@ dependencies = [
  "darkfi",
  "easy-parallel",
  "hex",
+ "libsqlite3-sys",
  "log",
  "rand 0.8.5",
  "serde",
@@ -2818,6 +2822,7 @@ dependencies = [
  "async-std",
  "clap 4.3.10",
  "darkfi",
+ "libsqlite3-sys",
  "log",
  "serde_json",
  "simplelog",
@@ -2831,13 +2836,15 @@ dependencies = [
  "async-std",
  "async-trait",
  "blake3",
- "ctrlc",
  "darkfi",
  "darkfi-serial",
  "easy-parallel",
+ "libsqlite3-sys",
  "log",
  "serde",
  "serde_json",
+ "signal-hook",
+ "signal-hook-async-std",
  "simplelog",
  "smol",
  "structopt",
@@ -2982,6 +2989,7 @@ dependencies = [
  "clap 4.3.10",
  "darkfi",
  "darkfi-serial",
+ "libsqlite3-sys",
  "log",
  "serde",
  "serde_json",
@@ -2995,13 +3003,15 @@ version = "0.4.1"
 dependencies = [
  "async-std",
  "async-trait",
- "ctrlc",
  "darkfi",
  "darkfi-serial",
  "easy-parallel",
+ "libsqlite3-sys",
  "log",
  "serde",
  "serde_json",
+ "signal-hook",
+ "signal-hook-async-std",
  "simplelog",
  "smol",
  "structopt",
@@ -3600,6 +3610,7 @@ dependencies = [
  "darkfi",
  "easy-parallel",
  "futures",
+ "libsqlite3-sys",
  "log",
  "semver 1.0.17",
  "serde",
@@ -5877,6 +5888,7 @@ dependencies = [
  "clap 4.3.10",
  "colored",
  "darkfi",
+ "libsqlite3-sys",
  "log",
  "prettytable-rs",
  "serde",
@@ -5896,17 +5908,19 @@ dependencies = [
  "bs58",
  "chrono",
  "crypto_box",
- "ctrlc",
  "darkfi",
  "darkfi-serial",
  "easy-parallel",
  "futures",
  "hex",
  "libc",
+ "libsqlite3-sys",
  "log",
  "rand 0.8.5",
  "serde",
  "serde_json",
+ "signal-hook",
+ "signal-hook-async-std",
  "simplelog",
  "smol",
  "structopt",

+ 0 - 2
Cargo.toml

@@ -31,8 +31,6 @@ members = [
     "bin/genev/genev-cli",
     "bin/darkirc",
     "bin/dnetview",
-    #"bin/dao/daod",
-    #"bin/dao/dao-cli",
     "bin/tau/taud",
     "bin/tau/tau-cli",
     #"bin/darkwiki/darkwikid",

+ 8 - 5
bin/darkfid/Cargo.toml

@@ -9,22 +9,25 @@ license = "AGPL-3.0-only"
 edition = "2021"
 
 [dependencies]
-async-std = "1.12.0"
 async-trait = "0.1.68"
 blake3 = "1.4.0"
 bs58 = "0.5.0"
-ctrlc = { version = "3.4.0", features = ["termination"] }
 darkfi = {path = "../../", features = ["blockchain", "wallet", "rpc", "net", "zkas"]}
 darkfi-sdk = {path = "../../src/sdk"}
 darkfi-serial = {path = "../../src/serial"}
-easy-parallel = "3.3.0"
 log = "0.4.19"
 serde_json = "1.0.96"
-simplelog = "0.12.1"
 sled = "0.34.7"
-smol = "1.3.0"
 url = "2.4.0"
 
+# Daemon
+async-std = "1.12.0"
+easy-parallel = "3.3.0"
+signal-hook-async-std = "0.2.2"
+signal-hook = "0.3.15"
+simplelog = "0.12.1"
+smol = "1.3.0"
+
 # Argument parsing
 serde = {version = "1.0.164", features = ["derive"]}
 structopt = "0.3.26"

+ 11 - 13
bin/darkfid/src/main.rs

@@ -18,7 +18,10 @@
 
 use std::{path::Path, str::FromStr};
 
-use async_std::sync::{Arc, Mutex};
+use async_std::{
+    stream::StreamExt,
+    sync::{Arc, Mutex},
+};
 use async_trait::async_trait;
 use darkfi_sdk::crypto::PublicKey;
 use log::{error, info};
@@ -171,6 +174,10 @@ struct Args {
     /// Verify system clock is correct
     clock_sync: bool,
 
+    #[structopt(short, long)]
+    /// Set log file to ouput into
+    log: Option<String>,
+
     #[structopt(short, parse(from_occurrences))]
     /// Increase verbosity (-vvv supported)
     verbose: u8,
@@ -287,15 +294,6 @@ async fn realmain(args: Args, ex: Arc<smol::Executor<'_>>) -> Result<()> {
         };
     }
 
-    // We use this handler to block this function after detaching all
-    // tasks, and to catch a shutdown signal, where we can clean up and
-    // exit gracefully.
-    let (signal, shutdown) = smol::channel::bounded::<()>(1);
-    ctrlc::set_handler(move || {
-        async_std::task::block_on(signal.send(())).unwrap();
-    })
-    .unwrap();
-
     // Initialize or load wallet
     let wallet = WalletDb::new(Some(expand_path(&args.wallet_path)?), &args.wallet_pass).await?;
 
@@ -486,9 +484,9 @@ async fn realmain(args: Args, ex: Arc<smol::Executor<'_>>) -> Result<()> {
         info!("Not starting consensus P2P network");
     }
 
-    // Wait for SIGINT
-    shutdown.recv().await?;
-    print!("\r");
+    // Signal handling for graceful termination.
+    let (signals_handler, signals_task) = SignalHandler::new()?;
+    signals_handler.wait_termination(signals_task).await?;
     info!("Caught termination signal, cleaning up and exiting...");
 
     // TODO: STOP P2P NETS

+ 3 - 4
bin/darkfid2/src/main.rs

@@ -71,9 +71,6 @@ async_daemonize!(realmain);
 async fn realmain(args: Args, _ex: Arc<smol::Executor<'_>>) -> Result<()> {
     info!("Initializing DarkFi node...");
 
-    // Signal handling for graceful termination.
-    let (signals_handler, signals_task) = SignalHandler::new()?;
-
     // NOTE: everything is dummy for now
     // Initialize or open sled database
     let sled_db = sled::Config::new().temporary(true).open()?;
@@ -95,8 +92,10 @@ async fn realmain(args: Args, _ex: Arc<smol::Executor<'_>>) -> Result<()> {
     let _darkfid = Darkfid::new(validator).await;
     info!("Node initialized successfully!");
 
-    // Wait for termination signal
+    // Signal handling for graceful termination.
+    let (signals_handler, signals_task) = SignalHandler::new()?;
     signals_handler.wait_termination(signals_task).await?;
     info!("Caught termination signal, cleaning up and exiting...");
+
     Ok(())
 }

+ 19 - 16
bin/darkirc/Cargo.toml

@@ -13,36 +13,39 @@ darkfi = {path = "../../", features = ["event-graph", "rpc", "bs58"]}
 darkfi-serial = {path = "../../src/serial"}
 
 # Async
-smol = "1.3.0"
-futures = "0.3.28"
 async-rustls = "0.4.0"
-rustls-pemfile = "1.0.2"
-async-std = "1.12.0"
 async-trait = "0.1.68"
-easy-parallel = "3.3.0"
+futures = "0.3.28"
+rustls-pemfile = "1.0.2"
 
 # Crypto
 crypto_box = "0.8.2"
 rand = "0.8.5"
 
-# db
-sled = "0.34.7"
-
 # Misc
 clap = {version = "4.3.3", features = ["derive"]}
-log = "0.4.19"
-simplelog = "0.12.1"
-signal-hook-async-std = "0.2.2"
-signal-hook = "0.3.15"
-url = "2.4.0"
 chrono = "0.4.26"
+libsqlite3-sys = {version = "0.26.0", features = ["bundled-sqlcipher"]}
+log = "0.4.19"
 ripemd = "0.1.3"
+sled = "0.34.7"
+url = "2.4.0"
 
 # Encoding and parsing
+bs58 = "0.5.0"
+hex = "0.4.3"
 serde_json = "1.0.96"
+toml = "0.7.4"
+
+# Daemon
+async-std = "1.12.0"
+easy-parallel = "3.3.0"
+signal-hook-async-std = "0.2.2"
+signal-hook = "0.3.15"
+simplelog = "0.12.1"
+smol = "1.3.0"
+
+# Argument parsing
 serde = {version = "1.0.164", features = ["derive"]}
 structopt = "0.3.26"
 structopt-toml = "0.5.1"
-bs58 = "0.5.0"
-toml = "0.7.4"
-hex = "0.4.3"

+ 17 - 48
bin/darkirc/src/main.rs

@@ -24,10 +24,8 @@ use async_std::{
 
 use chrono::{Duration, Utc};
 use irc::ClientSubMsg;
-use log::{debug, error, info, warn};
+use log::{debug, info};
 use rand::rngs::OsRng;
-use signal_hook::consts::{SIGHUP, SIGINT, SIGQUIT, SIGTERM};
-use signal_hook_async_std::Signals;
 use structopt_toml::StructOptToml;
 
 use darkfi::{
@@ -62,11 +60,9 @@ use crate::{
 async_daemonize!(realmain);
 async fn realmain(settings: Args, executor: Arc<smol::Executor<'_>>) -> Result<()> {
     // Signal handling for config reload and graceful termination.
-    let clients_subscriptions = Subscriber::new();
-    let signals = Signals::new([SIGHUP, SIGTERM, SIGINT, SIGQUIT])?;
-    let handle = signals.handle();
-    let (term_tx, term_rx) = smol::channel::bounded::<()>(1);
-    let signals_task = task::spawn(handle_signals(signals, term_tx, clients_subscriptions.clone()));
+    let (signals_handler, signals_task) = SignalHandler::new()?;
+    let client_sub = Subscriber::new();
+    task::spawn(parse_signals(signals_handler.sighup_sub.clone(), client_sub.clone()));
 
     ////////////////////
     // Generate new keypair and exit
@@ -146,14 +142,9 @@ async fn realmain(settings: Args, executor: Arc<smol::Executor<'_>>) -> Result<(
     ////////////////////
 
     // New irc server
-    let irc_server = IrcServer::new(
-        settings.clone(),
-        p2p.clone(),
-        model_clone,
-        view.clone(),
-        clients_subscriptions,
-    )
-    .await?;
+    let irc_server =
+        IrcServer::new(settings.clone(), p2p.clone(), model_clone, view.clone(), client_sub)
+            .await?;
 
     // Start the irc server and detach it
     let executor_cloned = executor.clone();
@@ -162,48 +153,26 @@ async fn realmain(settings: Args, executor: Arc<smol::Executor<'_>>) -> Result<(
     // Reset root task
     executor.spawn(async move { reset_root(model_clone2).await }).detach();
 
-    ////////////////////
     // Wait for termination signal
-    ////////////////////
-    term_rx.recv().await?;
-    print!("\r");
+    signals_handler.wait_termination(signals_task).await?;
     info!("Caught termination signal, cleaning up and exiting...");
-    handle.close();
-    signals_task.await?;
 
     // stop p2p
     p2p2.stop().await;
     Ok(())
 }
 
-async fn handle_signals(
-    mut signals: Signals,
-    term_tx: smol::channel::Sender<()>,
-    subscriber: SubscriberPtr<ClientSubMsg>,
+async fn parse_signals(
+    sighup_sub: SubscriberPtr<Args>,
+    client_sub: SubscriberPtr<ClientSubMsg>,
 ) -> Result<()> {
-    debug!("Started signal handler");
-    while let Some(signal) = signals.next().await {
-        match signal {
-            SIGHUP => {
-                let args = Args::from_args_with_toml("").unwrap();
-                let cfg_path = darkfi::util::path::get_config_path(args.config, CONFIG_FILE)?;
-                darkfi::util::cli::spawn_config(&cfg_path, CONFIG_FILE_CONTENTS.as_bytes())?;
-                let args = Args::from_args_with_toml(&std::fs::read_to_string(cfg_path)?);
-                if args.is_err() {
-                    error!("Error parsing the config file");
-                    continue
-                }
-                let new_config = IrcConfig::new(&args.unwrap())?;
-                subscriber.notify(ClientSubMsg::Config(new_config)).await;
-            }
-            SIGTERM | SIGINT | SIGQUIT => {
-                term_tx.send(()).await?;
-            }
-
-            _ => warn!("Unsupported signal"),
-        }
+    debug!("Started signal parsing handler");
+    let subscription = sighup_sub.subscribe().await;
+    loop {
+        let args = subscription.receive().await;
+        let new_config = IrcConfig::new(&args)?;
+        client_sub.notify(ClientSubMsg::Config(new_config)).await;
     }
-    Ok(())
 }
 
 async fn reset_root(model: ModelPtr<PrivMsgEvent>) {

+ 4 - 0
bin/darkirc/src/settings.rs

@@ -86,6 +86,10 @@ pub struct Args {
     #[structopt(flatten)]
     pub net: SettingsOpt,
 
+    #[structopt(short, long)]
+    /// Set log file to ouput into
+    pub log: Option<String>,
+
     /// Increase verbosity
     #[structopt(short, parse(from_occurrences))]
     pub verbose: u8,

+ 1 - 0
bin/dhtd/dhtd/Cargo.toml

@@ -15,6 +15,7 @@ blake3 = "1.4.0"
 darkfi = {path = "../../../", features = ["dht"]}
 darkfi-serial = {path = "../../../src/serial", features = ["derive", "crypto"]}
 easy-parallel = "3.3.0"
+libsqlite3-sys = {version = "0.26.0", features = ["bundled-sqlcipher"]}
 log = "0.4.19"
 rand = "0.8.5"
 simplelog = "0.12.1"

+ 1 - 0
bin/dnetview/Cargo.toml

@@ -27,6 +27,7 @@ async-channel = "1.8.0"
 clap = {version = "4.3.3", features = ["derive"]}
 rand = "0.8.5"
 simplelog = "0.12.1"
+libsqlite3-sys = {version = "0.26.0", features = ["bundled-sqlcipher"]}
 log = "0.4.19"
 url = "2.4.0"
 thiserror = "1.0.40"

+ 7 - 5
bin/faucetd/Cargo.toml

@@ -9,7 +9,6 @@ license = "AGPL-3.0-only"
 edition = "2021"
 
 [dependencies]
-async-std = "1.12.0"
 async-trait = "0.1.68"
 blake3 = "1.4.0"
 chrono = "0.4.26"
@@ -17,17 +16,20 @@ darkfi = {path = "../../", features = ["blockchain", "wallet", "rpc", "net", "zk
 darkfi-serial = {path = "../../src/serial"}
 darkfi-sdk = {path = "../../src/sdk"}
 darkfi-money-contract = {path = "../../src/contract/money", features = ["no-entrypoint", "client"]}
-easy-parallel = "3.3.0"
 log = "0.4.19"
 rand = "0.8.5"
 rusqlite = "0.29.0"
 serde_json = "1.0.96"
-signal-hook = "0.3.15"
+sled = "0.34.7"
+url = "2.4.0"
+
+# Daemon
+async-std = "1.12.0"
+easy-parallel = "3.3.0"
 signal-hook-async-std = "0.2.2"
+signal-hook = "0.3.15"
 simplelog = "0.12.1"
-sled = "0.34.7"
 smol = "1.3.0"
-url = "2.4.0"
 
 # Argument parsing
 serde = {version = "1.0.164", features = ["derive"]}

+ 9 - 47
bin/faucetd/src/main.rs

@@ -16,16 +16,11 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-use std::{
-    collections::HashMap,
-    path::{Path, PathBuf},
-    str::FromStr,
-};
+use std::{collections::HashMap, path::Path, str::FromStr};
 
 use async_std::{
     stream::StreamExt,
     sync::{Arc, Mutex, RwLock},
-    task,
 };
 use async_trait::async_trait;
 use chrono::Utc;
@@ -50,8 +45,6 @@ use darkfi_serial::{deserialize, serialize, Encodable};
 use log::{debug, error, info};
 use rand::rngs::OsRng;
 use serde_json::{json, Value};
-use signal_hook::consts::{SIGHUP, SIGINT, SIGQUIT, SIGTERM};
-use signal_hook_async_std::Signals;
 use structopt_toml::{serde::Deserialize, structopt::StructOpt, StructOptToml};
 use url::Url;
 
@@ -78,11 +71,7 @@ use darkfi::{
     },
     runtime::vm_runtime::SMART_CONTRACT_ZKAS_DB_NAME,
     tx::Transaction,
-    util::{
-        async_util::sleep,
-        parse::decode_base10,
-        path::{expand_path, get_config_path},
-    },
+    util::{async_util::sleep, parse::decode_base10, path::expand_path},
     wallet::{WalletDb, WalletPtr},
     zk::{halo2::Field, proof::ProvingKey, vm::ZkCircuit, vm_heap::empty_witnesses},
     zkas::ZkBinary,
@@ -167,6 +156,10 @@ struct Args {
     /// Airdrop amount limit
     airdrop_limit: String, // We convert this to u64 with decode_base10
 
+    #[structopt(short, long)]
+    /// Set log file to ouput into
+    log: Option<String>,
+
     #[structopt(short, parse(from_occurrences))]
     /// Increase verbosity (-vvv supported)
     verbose: u8,
@@ -626,37 +619,8 @@ async fn prune_airdrop_maps(rate_map: AirdropMap, challenge_map: ChallengeMap, t
     }
 }
 
-async fn handle_signals(
-    mut signals: Signals,
-    _cfg_path: PathBuf,
-    term_tx: smol::channel::Sender<()>,
-) {
-    debug!("Started signal handler");
-    while let Some(signal) = signals.next().await {
-        match signal {
-            SIGHUP => {
-                info!("Caught SIGHUP");
-            }
-
-            SIGTERM | SIGINT | SIGQUIT => {
-                term_tx.send(()).await.unwrap();
-            }
-
-            _ => unreachable!(),
-        }
-    }
-}
-
 async_daemonize!(realmain);
 async fn realmain(args: Args, ex: Arc<smol::Executor<'_>>) -> Result<()> {
-    let cfg_path = get_config_path(args.config, CONFIG_FILE)?;
-
-    // Signal handling for config reload and graceful termination.
-    let signals = Signals::new([SIGHUP, SIGTERM, SIGINT, SIGQUIT])?;
-    let handle = signals.handle();
-    let (term_tx, term_rx) = smol::channel::bounded::<()>(1);
-    let signals_task = task::spawn(handle_signals(signals, cfg_path.clone(), term_tx));
-
     // Initialize or load wallet
     let wallet = WalletDb::new(Some(expand_path(&args.wallet_path)?), &args.wallet_pass).await?;
 
@@ -792,12 +756,10 @@ async fn realmain(args: Args, ex: Arc<smol::Executor<'_>>) -> Result<()> {
         Err(e) => error!("Failed syncing blockchain: {}", e),
     }
 
-    // Wait for termination signal
-    term_rx.recv().await?;
-    print!("\r");
+    // Signal handling for graceful termination.
+    let (signals_handler, signals_task) = SignalHandler::new()?;
+    signals_handler.wait_termination(signals_task).await?;
     info!("Caught termination signal, cleaning up and exiting...");
-    handle.close();
-    signals_task.await;
 
     info!("Flushing database...");
     let flushed_bytes = sled_db.flush_async().await?;

+ 1 - 0
bin/fud/fu/Cargo.toml

@@ -16,6 +16,7 @@ async-std = {version = "1.12.0", features = ["attributes"]}
 
 # Misc
 clap = {version = "4.3.3", features = ["derive"]}
+libsqlite3-sys = {version = "0.26.0", features = ["bundled-sqlcipher"]}
 log = "0.4.19"
 serde_json = "1.0.96"
 simplelog = "0.12.1"

+ 10 - 8
bin/fud/fud/Cargo.toml

@@ -12,20 +12,22 @@ repository = "https://github.com/darkrenaissance/darkfi"
 darkfi = {path = "../../../", features = ["dht", "rpc"]}
 darkfi-serial = {path = "../../../src/serial"}
 
-# Async
-async-std = "1.12.0"
-async-trait = "0.1.68"
-ctrlc = { version = "3.4.0", features = ["termination"] }
-easy-parallel = "3.3.0"
-smol = "1.3.0"
-
 # Misc
+async-trait = "0.1.68"
 blake3 = "1.4.0"
+libsqlite3-sys = {version = "0.26.0", features = ["bundled-sqlcipher"]}
 log = "0.4.19"
 serde_json = "1.0.96"
-simplelog = "0.12.1"
 url = "2.4.0"
 
+# Daemon
+async-std = "1.12.0"
+easy-parallel = "3.3.0"
+signal-hook-async-std = "0.2.2"
+signal-hook = "0.3.15"
+simplelog = "0.12.1"
+smol = "1.3.0"
+
 # Argument parsing
 serde = {version = "1.0.164", features = ["derive"]}
 structopt = "0.3.26"

+ 10 - 13
bin/fud/fud/src/main.rs

@@ -18,7 +18,7 @@
 
 use std::{collections::HashSet, fs, path::PathBuf};
 
-use async_std::sync::Arc;
+use async_std::{stream::StreamExt, sync::Arc};
 use async_trait::async_trait;
 use darkfi_serial::serialize;
 use log::{debug, error, info, warn};
@@ -95,6 +95,10 @@ struct Args {
     /// Enable channel log
     channel_log: bool,
 
+    #[structopt(short, long)]
+    /// Set log file to ouput into
+    log: Option<String>,
+
     #[structopt(short, parse(from_occurrences))]
     /// Increase verbosity (-vvv supported)
     verbose: u8,
@@ -386,14 +390,8 @@ impl RequestHandler for Fud {
 
 async_daemonize!(realmain);
 async fn realmain(args: Args, ex: Arc<smol::Executor<'_>>) -> Result<()> {
-    // We use this handler to block this function after detaching all
-    // tasks, and to catch a shutdown signal, where we can clean up and
-    // exit gracefully.
-    let (signal, shutdown) = smol::channel::bounded::<()>(1);
-    ctrlc::set_handler(move || {
-        async_std::task::block_on(signal.send(())).unwrap();
-    })
-    .unwrap();
+    // Signal handling for graceful termination.
+    let (signals_handler, signals_task) = SignalHandler::new()?;
 
     // P2P network
     let network_settings = net::Settings {
@@ -410,7 +408,7 @@ async fn realmain(args: Args, ex: Arc<smol::Executor<'_>>) -> Result<()> {
     let p2p = net::P2p::new(network_settings).await;
 
     // Initialize daemon dht
-    let dht = Dht::new(None, p2p.clone(), shutdown.clone(), ex.clone()).await?;
+    let dht = Dht::new(None, p2p.clone(), signals_handler.term_rx.clone(), ex.clone()).await?;
 
     // Initialize daemon
     let folder = expand_path(&args.folder)?;
@@ -435,9 +433,8 @@ async fn realmain(args: Args, ex: Arc<smol::Executor<'_>>) -> Result<()> {
 
     fud.init().await?;
 
-    // Wait for SIGINT
-    shutdown.recv().await?;
-    print!("\r");
+    // Wait for termination signal
+    signals_handler.wait_termination(signals_task).await?;
     info!("Caught termination signal, cleaning up and exiting...");
 
     fud.disconnect().await?;

+ 1 - 0
bin/genev/genev-cli/Cargo.toml

@@ -14,6 +14,7 @@ darkfi-serial = {path = "../../../src/serial"}
 
 async-std = {version = "1.12.0", features = ["attributes"]}
 clap = {version = "4.3.3", features = ["derive"]}
+libsqlite3-sys = {version = "0.26.0", features = ["bundled-sqlcipher"]}
 log = "0.4.19"
 simplelog = "0.12.1"
 serde = {version = "1.0.164", features = ["derive"]}

+ 11 - 6
bin/genev/genevd/Cargo.toml

@@ -12,17 +12,22 @@ repository = "https://github.com/darkrenaissance/darkfi"
 darkfi = {path = "../../../", features = ["event-graph", "rpc", "bs58", "util"]}
 darkfi-serial = {path = "../../../src/serial"}
 
-async-std = {version = "1.12.0", features = ["attributes"]}
+# Misc
 async-trait = "0.1.68"
-ctrlc = { version = "3.4.0", features = ["termination"] }
+libsqlite3-sys = {version = "0.26.0", features = ["bundled-sqlcipher"]}
+log = "0.4.19"
+serde_json = "1.0.96"
+url = "2.4.0"
+
+# Daemon
+async-std = "1.12.0"
 easy-parallel = "3.3.0"
+signal-hook-async-std = "0.2.2"
+signal-hook = "0.3.15"
 simplelog = "0.12.1"
 smol = "1.3.0"
-log = "0.4.19"
-url = "2.4.0"
 
 # Argument parsing
 serde = {version = "1.0.164", features = ["derive"]}
-serde_json = "1.0.96"
 structopt = "0.3.26"
-structopt-toml = "0.5.1"
+structopt-toml = "0.5.1"

+ 12 - 15
bin/genev/genevd/src/main.rs

@@ -16,9 +16,12 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-use async_std::sync::{Arc, Mutex};
+use async_std::{
+    stream::StreamExt,
+    sync::{Arc, Mutex},
+};
 
-use log::{info, warn};
+use log::info;
 use structopt_toml::{serde::Deserialize, structopt::StructOpt, StructOptToml};
 
 use darkfi::{
@@ -60,6 +63,10 @@ struct Args {
     #[structopt(flatten)]
     pub net: SettingsOpt,
 
+    #[structopt(short, long)]
+    /// Set log file to ouput into
+    log: Option<String>,
+
     #[structopt(short, parse(from_occurrences))]
     /// Increase verbosity (-vvv supported)
     verbose: u8,
@@ -144,19 +151,9 @@ async fn realmain(args: Args, executor: Arc<smol::Executor<'_>>) -> Result<()> {
     let _ex = executor.clone();
     executor.spawn(listen_and_serve(args.rpc_listen.clone(), rpc_interface, _ex)).detach();
 
-    ////////////////////
-    // Wait for SIGINT
-    ////////////////////
-    let (signal, shutdown) = smol::channel::bounded::<()>(1);
-    ctrlc::set_handler(move || {
-        warn!(target: "ircd", "ircd start Exit Signal");
-        // cleaning up tasks running in the background
-        async_std::task::block_on(signal.send(())).unwrap();
-    })
-    .unwrap();
-
-    shutdown.recv().await?;
-    print!("\r");
+    // Signal handling for graceful termination.
+    let (signals_handler, signals_task) = SignalHandler::new()?;
+    signals_handler.wait_termination(signals_task).await?;
     info!("Caught termination signal, cleaning up and exiting...");
 
     // stop p2p

+ 11 - 10
bin/lilith/Cargo.toml

@@ -11,24 +11,25 @@ repository = "https://github.com/darkrenaissance/darkfi"
 [dependencies]
 darkfi = {path = "../../", features = ["net", "rpc"]}
 
-# Async
-async-std = "1.12.0"
+# Misc
 async-trait = "0.1.68"
 futures = "0.3.28"
-signal-hook-async-std = "0.2.2"
-signal-hook = "0.3.15"
-easy-parallel = "3.3.0"
-smol = "1.3.0"
-
-# Misc
+libsqlite3-sys = {version = "0.26.0", features = ["bundled-sqlcipher"]}
 log = "0.4.19"
 semver = "1.0.17"
 serde_json = "1.0.96"
-simplelog = "0.12.1"
+toml = "0.7.4"
 url = "2.4.0"
 
+# Daemon
+async-std = "1.12.0"
+easy-parallel = "3.3.0"
+signal-hook-async-std = "0.2.2"
+signal-hook = "0.3.15"
+simplelog = "0.12.1"
+smol = "1.3.0"
+
 # Argument parsing
 serde = {version = "1.0.164", features = ["derive"]}
 structopt = "0.3.26"
 structopt-toml = "0.5.1"
-toml = "0.7.4"

+ 7 - 31
bin/lilith/src/main.rs

@@ -28,8 +28,6 @@ use futures::future::join_all;
 use log::{debug, error, info, warn};
 use semver::Version;
 use serde_json::json;
-use signal_hook::consts::{SIGHUP, SIGINT, SIGQUIT, SIGTERM};
-use signal_hook_async_std::Signals;
 use smol::Executor;
 use structopt::StructOpt;
 use structopt_toml::StructOptToml;
@@ -77,6 +75,10 @@ struct Args {
     /// Hosts .tsv file to use
     pub hosts_file: String,
 
+    #[structopt(short, long)]
+    /// Set log file to ouput into
+    log: Option<String>,
+
     #[structopt(short, parse(from_occurrences))]
     /// Increase verbosity (-vvv supported)
     pub verbose: u8,
@@ -238,25 +240,6 @@ impl RequestHandler for Lilith {
     }
 }
 
-async fn handle_signals(mut signals: Signals, term_tx: smol::channel::Sender<()>) -> Result<()> {
-    debug!("Started signal handler");
-    while let Some(signal) = signals.next().await {
-        match signal {
-            SIGHUP => {
-                info!("Caught SIGHUP");
-            }
-
-            SIGTERM | SIGINT | SIGQUIT => {
-                term_tx.send(()).await?;
-                return Ok(())
-            }
-
-            s => debug!("Caught unhandled {} signal", s),
-        }
-    }
-    Ok(())
-}
-
 /// Attempt to read existing hosts tsv
 fn load_hosts(path: &Path, networks: &[&str]) -> HashMap<String, HashSet<Url>> {
     let mut saved_hosts = HashMap::new();
@@ -472,12 +455,6 @@ async fn realmain(args: Args, ex: Arc<Executor<'_>>) -> Result<()> {
         }
     }
 
-    // Signal handling for config reload and graceful termination.
-    let signals = Signals::new([SIGHUP, SIGTERM, SIGINT, SIGQUIT])?;
-    let handle = signals.handle();
-    let (term_tx, term_rx) = smol::channel::bounded::<()>(1);
-    ex.spawn(handle_signals(signals, term_tx)).detach();
-
     // Set up main daemon and background tasks
     let lilith = Arc::new(Lilith { networks });
     for network in &lilith.networks {
@@ -490,11 +467,10 @@ async fn realmain(args: Args, ex: Arc<Executor<'_>>) -> Result<()> {
     let _ex = ex.clone();
     ex.spawn(listen_and_serve(args.rpc_listen, lilith.clone(), _ex)).detach();
 
-    // Wait for termination signal
-    term_rx.recv().await?;
-    print!("\r");
+    // Signal handling for graceful termination.
+    let (signals_handler, signals_task) = SignalHandler::new()?;
+    signals_handler.wait_termination(signals_task).await?;
     info!("Caught termination signal, cleaning up and exiting...");
-    handle.close();
 
     // Save in-memory hosts to tsv file
     save_hosts(&expand_path(&args.hosts_file)?, &lilith.networks).await;

+ 1 - 0
bin/tau/tau-cli/Cargo.toml

@@ -17,6 +17,7 @@ async-std = {version = "1.12.0", features = ["attributes"]}
 # Misc
 chrono = "0.4.26"
 colored = "2.0.0"
+libsqlite3-sys = {version = "0.26.0", features = ["bundled-sqlcipher"]}
 log = "0.4.19"
 prettytable-rs = "0.10.0"
 simplelog = "0.12.1"

+ 17 - 15
bin/tau/taud/Cargo.toml

@@ -12,29 +12,31 @@ repository = "https://github.com/darkrenaissance/darkfi"
 darkfi = { path = "../../../", features = ["event-graph", "rpc", "bs58"]}
 darkfi-serial = { path = "../../../src/serial" }
 
-# Async
-smol = "1.3.0"
-async-std = {version = "1.12.0", features = ["attributes"]}
+# Misc
 async-trait = "0.1.68"
-easy-parallel = "3.3.0"
+bs58 = "0.5.0"
+chrono = "0.4.26"
+crypto_box = {version = "0.8.2", features = ["std"]}
 futures = "0.3.28"
-
-# Misc
+hex = "0.4.3"
 libc = "0.2.144"
+libsqlite3-sys = {version = "0.26.0", features = ["bundled-sqlcipher"]}
 log = "0.4.19"
-simplelog = "0.12.1"
 rand = "0.8.5"
-chrono = "0.4.26"
+serde_json = "1.0.96"
 thiserror = "1.0.40"
-ctrlc = { version = "3.4.0", features = ["termination"] }
+toml = "0.7.4"
 url = "2.4.0"
 
-# Encoding and parsing
+# Daemon
+async-std = {version = "1.12.0", features = ["attributes"]}
+easy-parallel = "3.3.0"
+signal-hook-async-std = "0.2.2"
+signal-hook = "0.3.15"
+simplelog = "0.12.1"
+smol = "1.3.0"
+
+# Argument parsing
 serde = {version = "1.0.164", features = ["derive"]}
-serde_json = "1.0.96"
 structopt = "0.3.26"
 structopt-toml = "0.5.1"
-crypto_box = {version = "0.8.2", features = ["std"]}
-hex = "0.4.3"
-bs58 = "0.5.0"
-toml = "0.7.4"

+ 8 - 17
bin/tau/taud/src/main.rs

@@ -16,7 +16,10 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 
-use async_std::sync::{Arc, Mutex};
+use async_std::{
+    stream::StreamExt,
+    sync::{Arc, Mutex},
+};
 use libc::mkfifo;
 use std::{
     collections::HashMap,
@@ -34,7 +37,7 @@ use crypto_box::{
 };
 use darkfi_serial::{deserialize, serialize, SerialDecodable, SerialEncodable};
 use futures::{select, FutureExt};
-use log::{debug, error, info, warn};
+use log::{debug, error, info};
 use structopt_toml::StructOptToml;
 
 use darkfi::{
@@ -382,21 +385,9 @@ async fn realmain(settings: Args, executor: Arc<smol::Executor<'_>>) -> Result<(
     let _ex = executor.clone();
     executor.spawn(listen_and_serve(settings.rpc_listen.clone(), rpc_interface, _ex)).detach();
 
-    //
-    // Waiting Exit signal
-    //
-    let (signal, shutdown) = smol::channel::bounded::<()>(1);
-    ctrlc::set_handler(move || {
-        warn!(target: "tau", "Catch exit signal");
-        // cleaning up tasks running in the background
-        if let Err(e) = async_std::task::block_on(signal.send(())) {
-            error!("Error on sending exit signal: {}", e);
-        }
-    })
-    .unwrap();
-
-    shutdown.recv().await?;
-    print!("\r");
+    // Signal handling for graceful termination.
+    let (signals_handler, signals_task) = SignalHandler::new()?;
+    signals_handler.wait_termination(signals_task).await?;
     info!("Caught termination signal, cleaning up and exiting...");
 
     p2p.stop().await;

+ 4 - 0
bin/tau/taud/src/settings.rs

@@ -70,4 +70,8 @@ pub struct Args {
     // Whether to pipe notifications or not
     #[structopt(long)]
     pub piped: bool,
+
+    #[structopt(short, long)]
+    /// Set log file to ouput into
+    pub log: Option<String>,
 }