2018-12-14 17:42:46 -08:00
|
|
|
use clap::{crate_version, App, Arg};
|
2019-03-08 17:23:07 -08:00
|
|
|
use solana::cluster_info::Node;
|
|
|
|
use solana::contact_info::ContactInfo;
|
2018-11-02 08:40:29 -07:00
|
|
|
use solana::replicator::Replicator;
|
2018-12-14 17:42:46 -08:00
|
|
|
use solana::socketaddr;
|
2019-03-04 14:27:06 -08:00
|
|
|
use solana_sdk::signature::{read_keypair, Keypair, KeypairUtil};
|
2019-03-08 19:28:19 -08:00
|
|
|
use std::net::Ipv4Addr;
|
2018-09-21 15:32:15 -07:00
|
|
|
use std::process::exit;
|
2019-03-06 19:09:37 -08:00
|
|
|
use std::sync::Arc;
|
2018-09-21 15:32:15 -07:00
|
|
|
|
|
|
|
fn main() {
|
2018-12-14 12:36:50 -08:00
|
|
|
solana_logger::setup();
|
2018-09-27 10:48:40 -07:00
|
|
|
|
2018-09-21 15:32:15 -07:00
|
|
|
let matches = App::new("replicator")
|
|
|
|
.version(crate_version!())
|
|
|
|
.arg(
|
|
|
|
Arg::with_name("identity")
|
|
|
|
.short("i")
|
|
|
|
.long("identity")
|
|
|
|
.value_name("PATH")
|
|
|
|
.takes_value(true)
|
2019-03-04 14:27:06 -08:00
|
|
|
.help("File containing an identity (keypair)"),
|
2018-12-07 19:01:28 -08:00
|
|
|
)
|
|
|
|
.arg(
|
2018-09-21 15:32:15 -07:00
|
|
|
Arg::with_name("network")
|
|
|
|
.short("n")
|
|
|
|
.long("network")
|
|
|
|
.value_name("HOST:PORT")
|
|
|
|
.takes_value(true)
|
2019-01-02 11:02:15 -08:00
|
|
|
.required(true)
|
2018-09-21 15:32:15 -07:00
|
|
|
.help("Rendezvous with the network at this gossip entry point"),
|
2018-12-07 19:01:28 -08:00
|
|
|
)
|
|
|
|
.arg(
|
2018-09-21 15:32:15 -07:00
|
|
|
Arg::with_name("ledger")
|
|
|
|
.short("l")
|
|
|
|
.long("ledger")
|
|
|
|
.value_name("DIR")
|
|
|
|
.takes_value(true)
|
|
|
|
.required(true)
|
|
|
|
.help("use DIR as persistent ledger location"),
|
2018-12-07 19:01:28 -08:00
|
|
|
)
|
2019-03-04 14:27:06 -08:00
|
|
|
.arg(
|
|
|
|
clap::Arg::with_name("public_address")
|
|
|
|
.long("public-address")
|
|
|
|
.takes_value(false)
|
|
|
|
.help("Advertise public machine address in gossip. By default the local machine address is advertised"),
|
|
|
|
)
|
2018-12-07 19:01:28 -08:00
|
|
|
.get_matches();
|
2018-09-21 15:32:15 -07:00
|
|
|
|
2019-01-31 12:44:09 -08:00
|
|
|
let ledger_path = matches.value_of("ledger").unwrap();
|
2018-09-21 15:32:15 -07:00
|
|
|
|
2019-03-04 14:27:06 -08:00
|
|
|
let keypair = if let Some(identity) = matches.value_of("identity") {
|
|
|
|
read_keypair(identity).unwrap_or_else(|err| {
|
|
|
|
eprintln!("{}: Unable to open keypair file: {}", err, identity);
|
2018-09-21 15:32:15 -07:00
|
|
|
exit(1);
|
2019-03-04 14:27:06 -08:00
|
|
|
})
|
2018-09-21 15:32:15 -07:00
|
|
|
} else {
|
2019-03-04 14:27:06 -08:00
|
|
|
Keypair::new()
|
2018-09-21 15:32:15 -07:00
|
|
|
};
|
|
|
|
|
2019-03-04 14:27:06 -08:00
|
|
|
let gossip_addr = {
|
|
|
|
let mut addr = socketaddr!([127, 0, 0, 1], 8700);
|
|
|
|
if matches.is_present("public_address") {
|
|
|
|
addr.set_ip(solana_netutil::get_public_ip_addr().unwrap());
|
|
|
|
} else {
|
|
|
|
addr.set_ip(solana_netutil::get_ip_addr(false).unwrap());
|
|
|
|
}
|
|
|
|
addr
|
|
|
|
};
|
2019-03-09 19:28:43 -08:00
|
|
|
let node = Node::new_with_external_ip(&keypair.pubkey(), &gossip_addr);
|
2018-09-21 15:32:15 -07:00
|
|
|
|
|
|
|
println!(
|
2019-03-04 14:27:06 -08:00
|
|
|
"replicating the data with keypair={:?} gossip_addr={:?}",
|
2018-09-21 15:32:15 -07:00
|
|
|
keypair.pubkey(),
|
2019-03-04 14:27:06 -08:00
|
|
|
gossip_addr
|
2018-09-21 15:32:15 -07:00
|
|
|
);
|
|
|
|
|
|
|
|
let network_addr = matches
|
|
|
|
.value_of("network")
|
2018-11-02 08:40:29 -07:00
|
|
|
.map(|network| network.parse().expect("failed to parse network address"))
|
|
|
|
.unwrap();
|
2018-09-21 15:32:15 -07:00
|
|
|
|
2019-03-08 17:23:07 -08:00
|
|
|
let leader_info = ContactInfo::new_gossip_entry_point(&network_addr);
|
2018-09-27 10:48:40 -07:00
|
|
|
|
2019-03-12 11:37:48 -07:00
|
|
|
let mut replicator =
|
|
|
|
Replicator::new(ledger_path, node, leader_info, Arc::new(keypair), None).unwrap();
|
2018-10-02 11:47:51 -07:00
|
|
|
|
2019-03-12 11:37:48 -07:00
|
|
|
replicator.run();
|
|
|
|
|
|
|
|
replicator.close();
|
2018-09-21 15:32:15 -07:00
|
|
|
}
|