mirror of
https://github.com/darkrenaissance/darkfi.git
synced 2026-04-28 03:00:18 -04:00
repo: updated all bins to use new signals handling
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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(())
|
||||
}
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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>) {
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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?;
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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?;
|
||||
|
||||
@@ -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"]}
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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,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"
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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>,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user