diff --git a/Cargo.toml b/Cargo.toml index c4678d086..3dc88b791 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -79,3 +79,4 @@ bs58 = "0.2.0" p2p = "0.5.2" futures = "0.1.21" clap = "2.31" +reqwest = "0.8.6" diff --git a/README.md b/README.md index e0ea480b7..e9ce641a6 100644 --- a/README.md +++ b/README.md @@ -169,7 +169,7 @@ Runtime configuration files for the daemon can be found in #### Leader daemon ```bash -$ sudo snap set solana mode=leader public-ip=$(curl -s http://ifconfig.co) +$ sudo snap set solana mode=leader ``` If CUDA is available: @@ -196,18 +196,18 @@ to port tcp:873, tcp:9900 and the port range udp:8000-udp:10000** To run both the Leader and Drone: ```bash -$ sudo snap set solana mode=leader+drone public-ip=$(curl -s http://ifconfig.co) +$ sudo snap set solana mode=leader+drone ``` #### Validator daemon ```bash -$ sudo snap set solana mode=validator public-ip=$(curl -s http://ifconfig.co) +$ sudo snap set solana mode=validator ``` If CUDA is available: ```bash -$ sudo snap set solana mode=validator public-ip=$(curl -s http://ifconfig.co) enable-cuda=1 +$ sudo snap set solana mode=validator enable-cuda=1 ``` By default the validator will connect to **testnet.solana.com**, override diff --git a/multinode-demo/setup.sh b/multinode-demo/setup.sh index 33b52fbd1..89d11821a 100755 --- a/multinode-demo/setup.sh +++ b/multinode-demo/setup.sh @@ -1,53 +1,45 @@ #!/bin/bash -num_tokens=1000000000 -public_ip= - here=$(dirname "$0") # shellcheck source=multinode-demo/common.sh source "$here"/common.sh usage () { cat < = env::args().collect(); let matches = match opts.parse(&args[1..]) { @@ -37,10 +47,14 @@ fn main() { let bind_addr: SocketAddr = { let mut bind_addr = parse_port_or_addr(matches.opt_str("b")); - if matches.opt_present("d") { + if matches.opt_present("l") { let ip = get_ip_addr().unwrap(); bind_addr.set_ip(ip); } + if matches.opt_present("p") { + let ip = get_public_ip_addr().unwrap(); + bind_addr.set_ip(ip); + } bind_addr }; diff --git a/src/nat.rs b/src/nat.rs index b697512b6..19da9716a 100644 --- a/src/nat.rs +++ b/src/nat.rs @@ -2,6 +2,7 @@ extern crate futures; extern crate p2p; +extern crate reqwest; extern crate tokio_core; use std::net::{IpAddr, Ipv4Addr, SocketAddr, UdpSocket}; @@ -9,6 +10,7 @@ use std::net::{IpAddr, Ipv4Addr, SocketAddr, UdpSocket}; use self::futures::Future; use self::p2p::UdpSocketExt; use std::env; +use std::str; /// A data type representing a public Udp socket pub struct UdpSocketPair { @@ -17,6 +19,19 @@ pub struct UdpSocketPair { pub sender: UdpSocket, // Locally bound socket to send via public address } +/// Tries to determine the public IP address of this machine +pub fn get_public_ip_addr() -> Result { + let body = reqwest::get("http://ifconfig.co/ip") + .map_err(|err| err.to_string())? + .text() + .map_err(|err| err.to_string())?; + + match body.lines().next() { + Some(ip) => Result::Ok(ip.parse().unwrap()), + None => Result::Err("Empty response body".to_string()), + } +} + /// Binds a private Udp address to a public address using UPnP if possible pub fn udp_public_bind(label: &str) -> UdpSocketPair { let private_addr = SocketAddr::new(IpAddr::V4(Ipv4Addr::new(0, 0, 0, 0)), 0);