repo: updated all bins to use new signals handling

This commit is contained in:
aggstam
2023-07-04 16:21:25 +03:00
parent a63a808992
commit 997f6015cf
25 changed files with 196 additions and 263 deletions

View File

@@ -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"

View File

@@ -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

View File

@@ -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(())
}

View File

@@ -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"

View File

@@ -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>) {

View File

@@ -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,

View File

@@ -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"

View File

@@ -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"

View File

@@ -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,18 +16,21 @@ 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"
signal-hook-async-std = "0.2.2"
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"

View File

@@ -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?;

View File

@@ -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"

View File

@@ -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"

View File

@@ -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?;

View File

@@ -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"]}

View File

@@ -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"

View File

@@ -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

View File

@@ -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"

View File

@@ -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;

View File

@@ -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"

View File

@@ -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"]}
async-trait = "0.1.68"
easy-parallel = "3.3.0"
futures = "0.3.28"
# Misc
libc = "0.2.144"
log = "0.4.19"
simplelog = "0.12.1"
rand = "0.8.5"
async-trait = "0.1.68"
bs58 = "0.5.0"
chrono = "0.4.26"
crypto_box = {version = "0.8.2", features = ["std"]}
futures = "0.3.28"
hex = "0.4.3"
libc = "0.2.144"
libsqlite3-sys = {version = "0.26.0", features = ["bundled-sqlcipher"]}
log = "0.4.19"
rand = "0.8.5"
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"

View File

@@ -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;

View File

@@ -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>,
}