2016-07-16 14:24:57 +02:00
|
|
|
// Copyright 2015, 2016 Ethcore (UK) Ltd.
|
|
|
|
// This file is part of Parity.
|
|
|
|
|
|
|
|
// Parity is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU General Public License as published by
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version.
|
|
|
|
|
|
|
|
// Parity is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU General Public License for more details.
|
|
|
|
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
use std::sync::Arc;
|
2016-07-20 18:13:56 +02:00
|
|
|
use ethcore::client::BlockChainClient;
|
|
|
|
use hypervisor::Hypervisor;
|
2016-08-05 10:32:04 +02:00
|
|
|
use ethsync::{SyncConfig, NetworkConfiguration, NetworkError};
|
2016-07-20 18:13:56 +02:00
|
|
|
#[cfg(not(feature="ipc"))]
|
|
|
|
use self::no_ipc_deps::*;
|
|
|
|
#[cfg(feature="ipc")]
|
|
|
|
use self::ipc_deps::*;
|
2016-07-25 16:09:47 +02:00
|
|
|
use ethcore_logger::Config as LogConfig;
|
2016-08-22 18:41:58 +02:00
|
|
|
use std::path::Path;
|
2016-07-20 18:13:56 +02:00
|
|
|
|
2016-07-26 00:21:08 +02:00
|
|
|
pub mod service_urls {
|
2016-08-22 18:41:58 +02:00
|
|
|
use std::path::PathBuf;
|
|
|
|
|
|
|
|
pub const CLIENT: &'static str = "parity-chain.ipc";
|
|
|
|
pub const SYNC: &'static str = "parity-sync.ipc";
|
|
|
|
pub const SYNC_NOTIFY: &'static str = "parity-sync-notify.ipc";
|
|
|
|
pub const NETWORK_MANAGER: &'static str = "parity-manage-net.ipc";
|
2016-08-24 18:35:38 +02:00
|
|
|
#[cfg(feature="stratum")]
|
|
|
|
pub const STRATUM: &'static str = "parity-stratum.ipc";
|
|
|
|
#[cfg(feature="stratum")]
|
|
|
|
pub const MINING_JOB_DISPATCHER: &'static str = "parity-mining-jobs.ipc";
|
|
|
|
|
2016-08-22 18:41:58 +02:00
|
|
|
|
|
|
|
pub fn with_base(data_dir: &str, service_path: &str) -> String {
|
|
|
|
let mut path = PathBuf::from(data_dir);
|
|
|
|
path.push(service_path);
|
|
|
|
|
|
|
|
format!("ipc://{}", path.to_str().unwrap())
|
|
|
|
}
|
2016-07-26 00:21:08 +02:00
|
|
|
}
|
|
|
|
|
2016-07-20 18:13:56 +02:00
|
|
|
#[cfg(not(feature="ipc"))]
|
|
|
|
mod no_ipc_deps {
|
|
|
|
pub use ethsync::{EthSync, SyncProvider, ManageNetwork};
|
|
|
|
pub use ethcore::client::ChainNotify;
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(feature="ipc")]
|
|
|
|
pub type SyncModules = (
|
|
|
|
GuardedSocket<SyncClient<NanoSocket>>,
|
|
|
|
GuardedSocket<NetworkManagerClient<NanoSocket>>,
|
|
|
|
GuardedSocket<ChainNotifyClient<NanoSocket>>
|
|
|
|
);
|
|
|
|
|
|
|
|
#[cfg(not(feature="ipc"))]
|
|
|
|
pub type SyncModules = (Arc<SyncProvider>, Arc<ManageNetwork>, Arc<ChainNotify>);
|
|
|
|
|
|
|
|
#[cfg(feature="ipc")]
|
|
|
|
mod ipc_deps {
|
|
|
|
pub use ethsync::{SyncClient, NetworkManagerClient, ServiceConfiguration};
|
|
|
|
pub use ethcore::client::ChainNotifyClient;
|
2016-08-22 18:41:58 +02:00
|
|
|
pub use hypervisor::{SYNC_MODULE_ID, BootArgs, HYPERVISOR_IPC_URL};
|
2016-07-20 18:13:56 +02:00
|
|
|
pub use nanoipc::{GuardedSocket, NanoSocket, init_client};
|
|
|
|
pub use ipc::IpcSocket;
|
|
|
|
pub use ipc::binary::serialize;
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(feature="ipc")]
|
2016-08-22 18:41:58 +02:00
|
|
|
pub fn hypervisor(base_path: &Path) -> Option<Hypervisor> {
|
|
|
|
Some(Hypervisor
|
|
|
|
::with_url(&service_urls::with_base(base_path.to_str().unwrap(), HYPERVISOR_IPC_URL))
|
|
|
|
.io_path(base_path.to_str().unwrap()))
|
2016-07-20 18:13:56 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(not(feature="ipc"))]
|
2016-08-22 18:41:58 +02:00
|
|
|
pub fn hypervisor(_: &Path) -> Option<Hypervisor> {
|
2016-07-20 18:13:56 +02:00
|
|
|
None
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(feature="ipc")]
|
2016-08-22 18:41:58 +02:00
|
|
|
fn sync_arguments(io_path: &str, sync_cfg: SyncConfig, net_cfg: NetworkConfiguration, log_settings: &LogConfig) -> BootArgs {
|
2016-07-20 18:13:56 +02:00
|
|
|
let service_config = ServiceConfiguration {
|
|
|
|
sync: sync_cfg,
|
|
|
|
net: net_cfg,
|
2016-08-22 18:41:58 +02:00
|
|
|
io_path: io_path.to_owned(),
|
2016-07-20 18:13:56 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
// initialisation payload is passed via stdin
|
|
|
|
let service_payload = serialize(&service_config).expect("Any binary-derived struct is serializable by definition");
|
|
|
|
|
|
|
|
// client service url and logging settings are passed in command line
|
|
|
|
let mut cli_args = Vec::new();
|
2016-07-26 00:21:08 +02:00
|
|
|
cli_args.push("sync".to_owned());
|
2016-07-20 18:13:56 +02:00
|
|
|
if !log_settings.color { cli_args.push("--no-color".to_owned()); }
|
2016-07-26 00:21:08 +02:00
|
|
|
if let Some(ref mode) = log_settings.mode {
|
2016-07-20 18:13:56 +02:00
|
|
|
cli_args.push("-l".to_owned());
|
2016-07-26 00:21:08 +02:00
|
|
|
cli_args.push(mode.to_owned());
|
2016-07-20 18:13:56 +02:00
|
|
|
}
|
|
|
|
if let Some(ref file) = log_settings.file {
|
|
|
|
cli_args.push("--log-file".to_owned());
|
|
|
|
cli_args.push(file.to_owned());
|
|
|
|
}
|
|
|
|
|
|
|
|
BootArgs::new().stdin(service_payload).cli(cli_args)
|
|
|
|
}
|
2016-07-19 09:25:51 +02:00
|
|
|
|
2016-07-16 14:24:57 +02:00
|
|
|
#[cfg(feature="ipc")]
|
2016-07-20 18:13:56 +02:00
|
|
|
pub fn sync
|
|
|
|
(
|
|
|
|
hypervisor_ref: &mut Option<Hypervisor>,
|
|
|
|
sync_cfg: SyncConfig,
|
|
|
|
net_cfg: NetworkConfiguration,
|
|
|
|
_client: Arc<BlockChainClient>,
|
2016-07-25 16:09:47 +02:00
|
|
|
log_settings: &LogConfig,
|
2016-07-20 18:13:56 +02:00
|
|
|
)
|
2016-08-05 10:32:04 +02:00
|
|
|
-> Result<SyncModules, NetworkError>
|
2016-07-16 14:24:57 +02:00
|
|
|
{
|
2016-07-20 18:13:56 +02:00
|
|
|
let mut hypervisor = hypervisor_ref.take().expect("There should be hypervisor for ipc configuration");
|
2016-08-22 18:41:58 +02:00
|
|
|
let args = sync_arguments(&hypervisor.io_path, sync_cfg, net_cfg, log_settings);
|
|
|
|
hypervisor = hypervisor.module(SYNC_MODULE_ID, args);
|
2016-07-20 18:13:56 +02:00
|
|
|
|
|
|
|
hypervisor.start();
|
|
|
|
hypervisor.wait_for_startup();
|
|
|
|
|
2016-08-22 18:41:58 +02:00
|
|
|
let sync_client = init_client::<SyncClient<_>>(
|
|
|
|
&service_urls::with_base(&hypervisor.io_path, service_urls::SYNC)).unwrap();
|
|
|
|
let notify_client = init_client::<ChainNotifyClient<_>>(
|
|
|
|
&service_urls::with_base(&hypervisor.io_path, service_urls::SYNC_NOTIFY)).unwrap();
|
|
|
|
let manage_client = init_client::<NetworkManagerClient<_>>(
|
|
|
|
&service_urls::with_base(&hypervisor.io_path, service_urls::NETWORK_MANAGER)).unwrap();
|
2016-07-20 18:13:56 +02:00
|
|
|
|
|
|
|
*hypervisor_ref = Some(hypervisor);
|
|
|
|
Ok((sync_client, manage_client, notify_client))
|
2016-07-16 14:24:57 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(not(feature="ipc"))]
|
2016-07-20 18:13:56 +02:00
|
|
|
pub fn sync
|
|
|
|
(
|
|
|
|
_hypervisor: &mut Option<Hypervisor>,
|
|
|
|
sync_cfg: SyncConfig,
|
|
|
|
net_cfg: NetworkConfiguration,
|
|
|
|
client: Arc<BlockChainClient>,
|
2016-07-25 16:09:47 +02:00
|
|
|
_log_settings: &LogConfig,
|
2016-07-20 18:13:56 +02:00
|
|
|
)
|
2016-08-05 10:32:04 +02:00
|
|
|
-> Result<SyncModules, NetworkError>
|
2016-07-16 14:24:57 +02:00
|
|
|
{
|
2016-08-05 10:32:04 +02:00
|
|
|
let eth_sync = try!(EthSync::new(sync_cfg, client, net_cfg));
|
2016-07-16 14:24:57 +02:00
|
|
|
Ok((eth_sync.clone() as Arc<SyncProvider>, eth_sync.clone() as Arc<ManageNetwork>, eth_sync.clone() as Arc<ChainNotify>))
|
|
|
|
}
|