119
parity/boot.rs
119
parity/boot.rs
@@ -1,119 +0,0 @@
|
||||
// Copyright 2015-2017 Parity Technologies (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/>.
|
||||
|
||||
//! Parity micro-service helpers
|
||||
|
||||
use nanoipc;
|
||||
use ipc;
|
||||
use std;
|
||||
use std::sync::Arc;
|
||||
use hypervisor::HypervisorServiceClient;
|
||||
use hypervisor::service::IpcModuleId;
|
||||
use ctrlc::CtrlC;
|
||||
use std::sync::atomic::{AtomicBool, Ordering};
|
||||
use nanoipc::{IpcInterface, GuardedSocket, NanoSocket};
|
||||
use ipc::WithSocket;
|
||||
use ethcore_logger::{Config as LogConfig, setup_log};
|
||||
use docopt::Docopt;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum BootError {
|
||||
ReadArgs(std::io::Error),
|
||||
DecodeArgs(ipc::binary::BinaryError),
|
||||
DependencyConnect(nanoipc::SocketError),
|
||||
}
|
||||
|
||||
pub fn host_service<T: ?Sized + Send + Sync + 'static>(addr: &str, stop_guard: Arc<AtomicBool>, service: Arc<T>) where T: IpcInterface {
|
||||
let socket_url = addr.to_owned();
|
||||
std::thread::spawn(move || {
|
||||
let mut worker = nanoipc::Worker::<T>::new(&service);
|
||||
worker.add_reqrep(&socket_url).unwrap();
|
||||
|
||||
while !stop_guard.load(Ordering::SeqCst) {
|
||||
worker.poll();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
pub fn payload<B: ipc::BinaryConvertable>() -> Result<B, BootError> {
|
||||
use std::io;
|
||||
use std::io::Read;
|
||||
|
||||
let mut buffer = Vec::new();
|
||||
io::stdin().read_to_end(&mut buffer).map_err(BootError::ReadArgs)?;
|
||||
|
||||
ipc::binary::deserialize::<B>(&buffer).map_err(BootError::DecodeArgs)
|
||||
}
|
||||
|
||||
pub fn register(hv_url: &str, control_url: &str, module_id: IpcModuleId) -> GuardedSocket<HypervisorServiceClient<NanoSocket>>{
|
||||
let hypervisor_client = nanoipc::fast_client::<HypervisorServiceClient<_>>(hv_url).unwrap();
|
||||
hypervisor_client.handshake().unwrap();
|
||||
hypervisor_client.module_ready(module_id, control_url.to_owned());
|
||||
|
||||
hypervisor_client
|
||||
}
|
||||
|
||||
pub fn dependency<C: WithSocket<NanoSocket>>(url: &str)
|
||||
-> Result<GuardedSocket<C>, BootError>
|
||||
{
|
||||
nanoipc::generic_client::<C>(url).map_err(BootError::DependencyConnect)
|
||||
}
|
||||
|
||||
pub fn main_thread() -> Arc<AtomicBool> {
|
||||
let stop = Arc::new(AtomicBool::new(false));
|
||||
let ctrc_stop = stop.clone();
|
||||
CtrlC::set_handler(move || {
|
||||
ctrc_stop.store(true, Ordering::Relaxed);
|
||||
});
|
||||
stop
|
||||
}
|
||||
|
||||
pub fn setup_cli_logger(svc_name: &str) {
|
||||
let usage = format!("
|
||||
Ethcore {} service
|
||||
Usage:
|
||||
parity {} [options]
|
||||
|
||||
Options:
|
||||
-l --logging LOGGING Specify the logging level. Must conform to the same
|
||||
format as RUST_LOG.
|
||||
--log-file FILENAME Specify a filename into which logging should be
|
||||
directed.
|
||||
--no-color Don't use terminal color codes in output.
|
||||
", svc_name, svc_name);
|
||||
|
||||
#[derive(Debug, RustcDecodable)]
|
||||
struct Args {
|
||||
flag_logging: Option<String>,
|
||||
flag_log_file: Option<String>,
|
||||
flag_no_color: bool,
|
||||
}
|
||||
|
||||
impl Args {
|
||||
pub fn log_settings(&self) -> LogConfig {
|
||||
LogConfig {
|
||||
color: self.flag_no_color || cfg!(windows),
|
||||
mode: self.flag_logging.clone(),
|
||||
file: self.flag_log_file.clone(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let args: Args = Docopt::new(usage)
|
||||
.and_then(|d| d.decode())
|
||||
.unwrap_or_else(|e| e.exit());
|
||||
setup_log(&args.log_settings()).expect("Log initialization failure");
|
||||
}
|
||||
103
parity/sync.rs
103
parity/sync.rs
@@ -1,103 +0,0 @@
|
||||
// Copyright 2015-2017 Parity Technologies (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/>.
|
||||
|
||||
//! Parity sync service
|
||||
|
||||
use std::sync::Arc;
|
||||
use std::sync::atomic::AtomicBool;
|
||||
use hypervisor::{SYNC_MODULE_ID, HYPERVISOR_IPC_URL, ControlService};
|
||||
use ethcore::client::ChainNotify;
|
||||
use ethcore::client::remote::RemoteClient;
|
||||
use ethcore::snapshot::remote::RemoteSnapshotService;
|
||||
use light::remote::LightProviderClient;
|
||||
use ethsync::{SyncProvider, EthSync, ManageNetwork, ServiceConfiguration};
|
||||
use modules::service_urls;
|
||||
use boot;
|
||||
use nanoipc;
|
||||
|
||||
#[derive(Default)]
|
||||
struct SyncControlService {
|
||||
pub stop: Arc<AtomicBool>,
|
||||
}
|
||||
|
||||
impl ControlService for SyncControlService {
|
||||
fn shutdown(&self) -> bool {
|
||||
trace!(target: "hypervisor", "Received shutdown from control service");
|
||||
self.stop.store(true, ::std::sync::atomic::Ordering::SeqCst);
|
||||
true
|
||||
}
|
||||
}
|
||||
|
||||
pub fn main() {
|
||||
boot::setup_cli_logger("sync");
|
||||
|
||||
let service_config: ServiceConfiguration = boot::payload()
|
||||
.unwrap_or_else(|e| panic!("Fatal: error reading boot arguments ({:?})", e));
|
||||
|
||||
let remote_client = dependency!(RemoteClient, &service_urls::with_base(&service_config.io_path, service_urls::CLIENT));
|
||||
let remote_snapshot = dependency!(RemoteSnapshotService, &service_urls::with_base(&service_config.io_path, service_urls::SNAPSHOT));
|
||||
let remote_provider = dependency!(LightProviderClient, &service_urls::with_base(&service_config.io_path, service_urls::LIGHT_PROVIDER));
|
||||
|
||||
let sync = EthSync::new(Params {
|
||||
config: service_config.sync,
|
||||
chain: remote_client.service().clone(),
|
||||
snapshot_service: remote_snapshot.service().clone(),
|
||||
provider: remote_provider.service().clone(),
|
||||
network_config: service_config.net
|
||||
attached_protos: Vec::new(),
|
||||
}).unwrap();
|
||||
|
||||
let _ = boot::main_thread();
|
||||
let service_stop = Arc::new(AtomicBool::new(false));
|
||||
|
||||
let hypervisor = boot::register(
|
||||
&service_urls::with_base(&service_config.io_path, HYPERVISOR_IPC_URL),
|
||||
&service_urls::with_base(&service_config.io_path, service_urls::SYNC_CONTROL),
|
||||
SYNC_MODULE_ID
|
||||
);
|
||||
|
||||
boot::host_service(
|
||||
&service_urls::with_base(&service_config.io_path, service_urls::SYNC),
|
||||
service_stop.clone(),
|
||||
sync.clone() as Arc<SyncProvider>
|
||||
);
|
||||
boot::host_service(
|
||||
&service_urls::with_base(&service_config.io_path, service_urls::NETWORK_MANAGER),
|
||||
service_stop.clone(),
|
||||
sync.clone() as Arc<ManageNetwork>
|
||||
);
|
||||
boot::host_service(
|
||||
&service_urls::with_base(&service_config.io_path, service_urls::SYNC_NOTIFY),
|
||||
service_stop.clone(),
|
||||
sync.clone() as Arc<ChainNotify>
|
||||
);
|
||||
|
||||
let control_service = Arc::new(SyncControlService::default());
|
||||
let as_control = control_service.clone() as Arc<ControlService>;
|
||||
let mut worker = nanoipc::Worker::<ControlService>::new(&as_control);
|
||||
let thread_stop = control_service.stop.clone();
|
||||
worker.add_reqrep(
|
||||
&service_urls::with_base(&service_config.io_path, service_urls::SYNC_CONTROL)
|
||||
).unwrap();
|
||||
|
||||
while !thread_stop.load(::std::sync::atomic::Ordering::SeqCst) {
|
||||
worker.poll();
|
||||
}
|
||||
service_stop.store(true, ::std::sync::atomic::Ordering::SeqCst);
|
||||
|
||||
hypervisor.module_shutdown(SYNC_MODULE_ID);
|
||||
trace!(target: "hypervisor", "Sync process terminated gracefully");
|
||||
}
|
||||
Reference in New Issue
Block a user