2018-09-21 15:32:15 -07:00
|
|
|
#[macro_use]
|
|
|
|
extern crate clap;
|
|
|
|
extern crate getopts;
|
|
|
|
extern crate serde_json;
|
|
|
|
#[macro_use]
|
|
|
|
extern crate solana;
|
2018-11-16 08:04:46 -08:00
|
|
|
extern crate solana_drone;
|
2018-11-29 16:18:47 -08:00
|
|
|
extern crate solana_sdk;
|
2018-09-21 15:32:15 -07:00
|
|
|
|
|
|
|
use clap::{App, Arg};
|
2018-11-02 08:40:29 -07:00
|
|
|
use solana::cluster_info::{Node, NodeInfo};
|
2018-09-21 15:32:15 -07:00
|
|
|
use solana::fullnode::Config;
|
|
|
|
use solana::logger;
|
2018-11-02 08:40:29 -07:00
|
|
|
use solana::replicator::Replicator;
|
2018-12-03 10:26:28 -08:00
|
|
|
use solana_sdk::signature::{Keypair, KeypairUtil};
|
2018-09-21 15:32:15 -07:00
|
|
|
use std::fs::File;
|
|
|
|
use std::net::{Ipv4Addr, SocketAddr};
|
|
|
|
use std::process::exit;
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
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)
|
|
|
|
.help("Run with the identity found in FILE"),
|
|
|
|
).arg(
|
|
|
|
Arg::with_name("network")
|
|
|
|
.short("n")
|
|
|
|
.long("network")
|
|
|
|
.value_name("HOST:PORT")
|
|
|
|
.takes_value(true)
|
|
|
|
.help("Rendezvous with the network at this gossip entry point"),
|
|
|
|
).arg(
|
|
|
|
Arg::with_name("ledger")
|
|
|
|
.short("l")
|
|
|
|
.long("ledger")
|
|
|
|
.value_name("DIR")
|
|
|
|
.takes_value(true)
|
|
|
|
.required(true)
|
|
|
|
.help("use DIR as persistent ledger location"),
|
|
|
|
).get_matches();
|
|
|
|
|
|
|
|
let ledger_path = matches.value_of("ledger");
|
|
|
|
|
2018-12-06 12:52:47 -08:00
|
|
|
let (keypair, gossip) = if let Some(i) = matches.value_of("identity") {
|
2018-09-21 15:32:15 -07:00
|
|
|
let path = i.to_string();
|
|
|
|
if let Ok(file) = File::open(path.clone()) {
|
|
|
|
let parse: serde_json::Result<Config> = serde_json::from_reader(file);
|
|
|
|
if let Ok(data) = parse {
|
2018-12-06 12:52:47 -08:00
|
|
|
(data.keypair(), data.node_info.gossip)
|
2018-09-21 15:32:15 -07:00
|
|
|
} else {
|
|
|
|
eprintln!("failed to parse {}", path);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
eprintln!("failed to read {}", path);
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
(Keypair::new(), socketaddr!([127, 0, 0, 1], 8700))
|
|
|
|
};
|
|
|
|
|
2018-12-06 12:52:47 -08:00
|
|
|
let node = Node::new_with_external_ip(keypair.pubkey(), &gossip);
|
2018-09-21 15:32:15 -07:00
|
|
|
|
|
|
|
println!(
|
2018-12-06 12:52:47 -08:00
|
|
|
"replicating the data with keypair: {:?} gossip:{:?}",
|
2018-09-21 15:32:15 -07:00
|
|
|
keypair.pubkey(),
|
2018-12-06 12:52:47 -08:00
|
|
|
gossip
|
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
|
|
|
|
2018-11-02 08:40:29 -07:00
|
|
|
let leader_info = NodeInfo::new_entry_point(&network_addr);
|
2018-09-27 10:48:40 -07:00
|
|
|
|
2018-11-02 08:40:29 -07:00
|
|
|
let replicator = Replicator::new(ledger_path, node, &leader_info, &keypair).unwrap();
|
2018-10-02 11:47:51 -07:00
|
|
|
|
2018-09-21 15:32:15 -07:00
|
|
|
replicator.join();
|
|
|
|
}
|