commit
f84ffdbfef
9
Cargo.lock
generated
9
Cargo.lock
generated
@ -4,6 +4,7 @@ version = "0.9.99"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"clippy 0.0.41 (registry+https://github.com/rust-lang/crates.io-index)",
|
"clippy 0.0.41 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"ctrlc 1.0.1 (git+https://github.com/tomusdrw/rust-ctrlc.git)",
|
"ctrlc 1.0.1 (git+https://github.com/tomusdrw/rust-ctrlc.git)",
|
||||||
|
"daemonize 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"docopt 0.6.78 (registry+https://github.com/rust-lang/crates.io-index)",
|
"docopt 0.6.78 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"docopt_macros 0.6.81 (registry+https://github.com/rust-lang/crates.io-index)",
|
"docopt_macros 0.6.81 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"env_logger 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"env_logger 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -108,6 +109,14 @@ dependencies = [
|
|||||||
"winapi 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
"winapi 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "daemonize"
|
||||||
|
version = "0.2.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"libc 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "docopt"
|
name = "docopt"
|
||||||
version = "0.6.78"
|
version = "0.6.78"
|
||||||
|
@ -19,6 +19,7 @@ ethsync = { path = "sync" }
|
|||||||
ethcore-rpc = { path = "rpc", optional = true }
|
ethcore-rpc = { path = "rpc", optional = true }
|
||||||
fdlimit = { path = "util/fdlimit" }
|
fdlimit = { path = "util/fdlimit" }
|
||||||
target_info = "0.1"
|
target_info = "0.1"
|
||||||
|
daemonize = "0.2"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["rpc"]
|
default = ["rpc"]
|
||||||
|
150
parity/main.rs
150
parity/main.rs
@ -18,18 +18,19 @@
|
|||||||
|
|
||||||
#![warn(missing_docs)]
|
#![warn(missing_docs)]
|
||||||
#![feature(plugin)]
|
#![feature(plugin)]
|
||||||
#![plugin(docopt_macros)]
|
|
||||||
#![plugin(clippy)]
|
#![plugin(clippy)]
|
||||||
extern crate docopt;
|
extern crate docopt;
|
||||||
extern crate rustc_serialize;
|
extern crate rustc_serialize;
|
||||||
extern crate ethcore_util as util;
|
extern crate ethcore_util as util;
|
||||||
extern crate ethcore;
|
extern crate ethcore;
|
||||||
extern crate ethsync;
|
extern crate ethsync;
|
||||||
|
#[macro_use]
|
||||||
extern crate log as rlog;
|
extern crate log as rlog;
|
||||||
extern crate env_logger;
|
extern crate env_logger;
|
||||||
extern crate ctrlc;
|
extern crate ctrlc;
|
||||||
extern crate fdlimit;
|
extern crate fdlimit;
|
||||||
extern crate target_info;
|
extern crate target_info;
|
||||||
|
extern crate daemonize;
|
||||||
|
|
||||||
#[cfg(feature = "rpc")]
|
#[cfg(feature = "rpc")]
|
||||||
extern crate ethcore_rpc as rpc;
|
extern crate ethcore_rpc as rpc;
|
||||||
@ -47,20 +48,24 @@ use ethcore::service::{ClientService, NetSyncMessage};
|
|||||||
use ethcore::ethereum;
|
use ethcore::ethereum;
|
||||||
use ethcore::blockchain::CacheSize;
|
use ethcore::blockchain::CacheSize;
|
||||||
use ethsync::EthSync;
|
use ethsync::EthSync;
|
||||||
|
use docopt::Docopt;
|
||||||
use target_info::Target;
|
use target_info::Target;
|
||||||
|
use daemonize::Daemonize;
|
||||||
|
|
||||||
docopt!(Args derive Debug, "
|
const USAGE: &'static str = "
|
||||||
Parity. Ethereum Client.
|
Parity. Ethereum Client.
|
||||||
By Wood/Paronyan/Kotewicz/Drwięga/Volf.
|
By Wood/Paronyan/Kotewicz/Drwięga/Volf.
|
||||||
Copyright 2015, 2016 Ethcore (UK) Limited
|
Copyright 2015, 2016 Ethcore (UK) Limited
|
||||||
|
|
||||||
Usage:
|
Usage:
|
||||||
|
parity daemon <pid-file> [options] [ --no-bootstrap | <enode>... ]
|
||||||
parity [options] [ --no-bootstrap | <enode>... ]
|
parity [options] [ --no-bootstrap | <enode>... ]
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
--chain CHAIN Specify the blockchain type. CHAIN may be either a JSON chain specification file
|
--chain CHAIN Specify the blockchain type. CHAIN may be either a JSON chain specification file
|
||||||
or frontier, mainnet, morden, or testnet [default: frontier].
|
or frontier, mainnet, morden, or testnet [default: frontier].
|
||||||
-d --db-path PATH Specify the database & configuration directory path [default: $HOME/.parity]
|
-d --db-path PATH Specify the database & configuration directory path [default: $HOME/.parity]
|
||||||
|
--keys-path PATH Specify the path for JSON key files to be found [default: $HOME/.web3/keys]
|
||||||
|
|
||||||
--no-bootstrap Don't bother trying to connect to any nodes initially.
|
--no-bootstrap Don't bother trying to connect to any nodes initially.
|
||||||
--listen-address URL Specify the IP/port on which to listen for peers [default: 0.0.0.0:30304].
|
--listen-address URL Specify the IP/port on which to listen for peers [default: 0.0.0.0:30304].
|
||||||
@ -78,9 +83,31 @@ Options:
|
|||||||
-l --logging LOGGING Specify the logging level.
|
-l --logging LOGGING Specify the logging level.
|
||||||
-v --version Show information about version.
|
-v --version Show information about version.
|
||||||
-h --help Show this screen.
|
-h --help Show this screen.
|
||||||
", flag_cache_pref_size: usize, flag_cache_max_size: usize, flag_address: Option<String>, flag_node_key: Option<String>);
|
";
|
||||||
|
|
||||||
fn setup_log(init: &str) {
|
#[derive(Debug, RustcDecodable)]
|
||||||
|
struct Args {
|
||||||
|
cmd_daemon: bool,
|
||||||
|
arg_pid_file: String,
|
||||||
|
arg_enode: Vec<String>,
|
||||||
|
flag_chain: String,
|
||||||
|
flag_db_path: String,
|
||||||
|
flag_keys_path: String,
|
||||||
|
flag_no_bootstrap: bool,
|
||||||
|
flag_listen_address: String,
|
||||||
|
flag_public_address: String,
|
||||||
|
flag_address: Option<String>,
|
||||||
|
flag_upnp: bool,
|
||||||
|
flag_node_key: Option<String>,
|
||||||
|
flag_cache_pref_size: usize,
|
||||||
|
flag_cache_max_size: usize,
|
||||||
|
flag_jsonrpc: bool,
|
||||||
|
flag_jsonrpc_url: String,
|
||||||
|
flag_logging: Option<String>,
|
||||||
|
flag_version: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn setup_log(init: &Option<String>) {
|
||||||
let mut builder = LogBuilder::new();
|
let mut builder = LogBuilder::new();
|
||||||
builder.filter(None, LogLevelFilter::Info);
|
builder.filter(None, LogLevelFilter::Info);
|
||||||
|
|
||||||
@ -88,7 +115,9 @@ fn setup_log(init: &str) {
|
|||||||
builder.parse(&env::var("RUST_LOG").unwrap());
|
builder.parse(&env::var("RUST_LOG").unwrap());
|
||||||
}
|
}
|
||||||
|
|
||||||
builder.parse(init);
|
if let Some(ref s) = *init {
|
||||||
|
builder.parse(s);
|
||||||
|
}
|
||||||
|
|
||||||
builder.init().unwrap();
|
builder.init().unwrap();
|
||||||
}
|
}
|
||||||
@ -128,7 +157,7 @@ struct Configuration {
|
|||||||
impl Configuration {
|
impl Configuration {
|
||||||
fn parse() -> Self {
|
fn parse() -> Self {
|
||||||
Configuration {
|
Configuration {
|
||||||
args: Args::docopt().decode().unwrap_or_else(|e| e.exit())
|
args: Docopt::new(USAGE).and_then(|d| d.decode()).unwrap_or_else(|e| e.exit()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -136,6 +165,10 @@ impl Configuration {
|
|||||||
self.args.flag_db_path.replace("$HOME", env::home_dir().unwrap().to_str().unwrap())
|
self.args.flag_db_path.replace("$HOME", env::home_dir().unwrap().to_str().unwrap())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn keys_path(&self) -> String {
|
||||||
|
self.args.flag_keys_path.replace("$HOME", env::home_dir().unwrap().to_str().unwrap())
|
||||||
|
}
|
||||||
|
|
||||||
fn spec(&self) -> Spec {
|
fn spec(&self) -> Spec {
|
||||||
match self.args.flag_chain.as_ref() {
|
match self.args.flag_chain.as_ref() {
|
||||||
"frontier" | "mainnet" => ethereum::new_frontier(),
|
"frontier" | "mainnet" => ethereum::new_frontier(),
|
||||||
@ -149,7 +182,7 @@ impl Configuration {
|
|||||||
if self.args.flag_no_bootstrap { Vec::new() } else {
|
if self.args.flag_no_bootstrap { Vec::new() } else {
|
||||||
match self.args.arg_enode.len() {
|
match self.args.arg_enode.len() {
|
||||||
0 => spec.nodes().clone(),
|
0 => spec.nodes().clone(),
|
||||||
_ => self.args.arg_enode.clone(),
|
_ => self.args.arg_enode.clone(), // TODO check format first.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -171,6 +204,63 @@ impl Configuration {
|
|||||||
|
|
||||||
(listen_address, public_address)
|
(listen_address, public_address)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn execute(&self) {
|
||||||
|
if self.args.flag_version {
|
||||||
|
print_version();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if self.args.cmd_daemon {
|
||||||
|
let daemonize = Daemonize::new().pid_file(self.args.arg_pid_file.clone()).chown_pid_file(true);
|
||||||
|
match daemonize.start() {
|
||||||
|
Ok(_) => info!("Daemonized"),
|
||||||
|
Err(e) => { error!("{}", e); return; },
|
||||||
|
}
|
||||||
|
}
|
||||||
|
self.execute_client();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn execute_client(&self) {
|
||||||
|
// Setup logging
|
||||||
|
setup_log(&self.args.flag_logging);
|
||||||
|
// Raise fdlimit
|
||||||
|
unsafe { ::fdlimit::raise_fd_limit(); }
|
||||||
|
|
||||||
|
let spec = self.spec();
|
||||||
|
|
||||||
|
// Configure network
|
||||||
|
let mut net_settings = NetworkConfiguration::new();
|
||||||
|
net_settings.nat_enabled = self.args.flag_upnp;
|
||||||
|
net_settings.boot_nodes = self.init_nodes(&spec);
|
||||||
|
let (listen, public) = self.net_addresses();
|
||||||
|
net_settings.listen_address = listen;
|
||||||
|
net_settings.public_address = public;
|
||||||
|
net_settings.use_secret = self.args.flag_node_key.as_ref().map(|s| Secret::from_str(&s).expect("Invalid key string"));
|
||||||
|
|
||||||
|
// Build client
|
||||||
|
let mut service = ClientService::start(spec, net_settings, &Path::new(&self.path())).unwrap();
|
||||||
|
let client = service.client().clone();
|
||||||
|
client.configure_cache(self.args.flag_cache_pref_size, self.args.flag_cache_max_size);
|
||||||
|
|
||||||
|
// Sync
|
||||||
|
let sync = EthSync::register(service.network(), client);
|
||||||
|
|
||||||
|
// Setup rpc
|
||||||
|
if self.args.flag_jsonrpc {
|
||||||
|
setup_rpc_server(service.client(), sync.clone(), &self.args.flag_jsonrpc_url);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Register IO handler
|
||||||
|
let io_handler = Arc::new(ClientIoHandler {
|
||||||
|
client: service.client(),
|
||||||
|
info: Default::default(),
|
||||||
|
sync: sync
|
||||||
|
});
|
||||||
|
service.io().register_handler(io_handler).expect("Error registering IO handler");
|
||||||
|
|
||||||
|
// Handle exit
|
||||||
|
wait_for_exit(&service);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn wait_for_exit(client_service: &ClientService) {
|
fn wait_for_exit(client_service: &ClientService) {
|
||||||
@ -186,51 +276,7 @@ fn wait_for_exit(client_service: &ClientService) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let conf = Configuration::parse();
|
Configuration::parse().execute();
|
||||||
if conf.args.flag_version {
|
|
||||||
print_version();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let spec = conf.spec();
|
|
||||||
|
|
||||||
// Setup logging
|
|
||||||
setup_log(&conf.args.flag_logging);
|
|
||||||
// Raise fdlimit
|
|
||||||
unsafe { ::fdlimit::raise_fd_limit(); }
|
|
||||||
|
|
||||||
// Configure network
|
|
||||||
let mut net_settings = NetworkConfiguration::new();
|
|
||||||
net_settings.nat_enabled = conf.args.flag_upnp;
|
|
||||||
net_settings.boot_nodes = conf.init_nodes(&spec);
|
|
||||||
let (listen, public) = conf.net_addresses();
|
|
||||||
net_settings.listen_address = listen;
|
|
||||||
net_settings.public_address = public;
|
|
||||||
net_settings.use_secret = conf.args.flag_node_key.as_ref().map(|s| Secret::from_str(&s).expect("Invalid key string"));
|
|
||||||
|
|
||||||
// Build client
|
|
||||||
let mut service = ClientService::start(spec, net_settings, &Path::new(&conf.path())).unwrap();
|
|
||||||
let client = service.client().clone();
|
|
||||||
client.configure_cache(conf.args.flag_cache_pref_size, conf.args.flag_cache_max_size);
|
|
||||||
|
|
||||||
// Sync
|
|
||||||
let sync = EthSync::register(service.network(), client);
|
|
||||||
|
|
||||||
// Setup rpc
|
|
||||||
if conf.args.flag_jsonrpc {
|
|
||||||
setup_rpc_server(service.client(), sync.clone(), &conf.args.flag_jsonrpc_url);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Register IO handler
|
|
||||||
let io_handler = Arc::new(ClientIoHandler {
|
|
||||||
client: service.client(),
|
|
||||||
info: Default::default(),
|
|
||||||
sync: sync
|
|
||||||
});
|
|
||||||
service.io().register_handler(io_handler).expect("Error registering IO handler");
|
|
||||||
|
|
||||||
// Handle exit
|
|
||||||
wait_for_exit(&service);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Informant {
|
struct Informant {
|
||||||
|
Loading…
Reference in New Issue
Block a user