allow for hostname in '--proxy-listen-addr' and '--quic-proxy-addr' (ipv4 only)

This commit is contained in:
GroovieGermanikus 2023-09-06 18:28:21 +02:00
parent 26a5ca2021
commit ab1b074e97
2 changed files with 40 additions and 5 deletions

View File

@ -36,6 +36,7 @@ use solana_sdk::commitment_config::CommitmentConfig;
use solana_sdk::signature::Keypair;
use solana_sdk::signer::Signer;
use std::env;
use std::net::{SocketAddr, ToSocketAddrs};
use std::sync::Arc;
use tokio::sync::mpsc;
@ -263,9 +264,27 @@ pub async fn main() -> anyhow::Result<()> {
fn configure_tpu_connection_path(quic_proxy_addr: Option<String>) -> TpuConnectionPath {
match quic_proxy_addr {
None => TpuConnectionPath::QuicDirectPath,
Some(prox_address) => TpuConnectionPath::QuicForwardProxyPath {
// e.g. "127.0.0.1:11111"
forward_proxy_address: prox_address.parse().expect("Invalid proxy address"),
},
Some(prox_address) => {
let proxy_socket_addr = parse_host_port_to_ipv4(prox_address.as_str()).unwrap();
TpuConnectionPath::QuicForwardProxyPath {
// e.g. "127.0.0.1:11111"
forward_proxy_address: proxy_socket_addr,
}
}
}
}
fn parse_host_port_to_ipv4(host_port: &str) -> Result<SocketAddr, String> {
let addrs: Vec<_> = host_port
.to_socket_addrs()
.map_err(|err| format!("Unable to resolve host {host_port}: {err}"))?
.filter(|addr| addr.is_ipv4())
.collect();
if addrs.is_empty() {
Err(format!("Unable to resolve host: {host_port}"))
} else if addrs.len() > 1 {
Err(format!("Multiple addresses resolved for host: {host_port}"))
} else {
Ok(addrs[0])
}
}

View File

@ -6,6 +6,7 @@ use clap::Parser;
use dotenv::dotenv;
use log::info;
use solana_lite_rpc_core::keypair_loader::load_identity_keypair;
use std::net::{SocketAddr, ToSocketAddrs};
use std::sync::Arc;
use crate::validator_identity::ValidatorIdentity;
@ -34,7 +35,7 @@ pub async fn main() -> anyhow::Result<()> {
} = Args::parse();
dotenv().ok();
let proxy_listener_addr = proxy_listen_addr.parse().unwrap();
let proxy_listener_addr = parse_host_port_to_ipv4(proxy_listen_addr.as_str()).unwrap();
let validator_identity = ValidatorIdentity::new(load_identity_keypair(&identity_keypair).await);
let tls_config = Arc::new(SelfSignedTlsConfigProvider::new_singleton_self_signed_localhost());
@ -58,3 +59,18 @@ pub async fn main() -> anyhow::Result<()> {
}
}
}
fn parse_host_port_to_ipv4(host_port: &str) -> Result<SocketAddr, String> {
let addrs: Vec<_> = host_port
.to_socket_addrs()
.map_err(|err| format!("Unable to resolve host {host_port}: {err}"))?
.filter(|addr| addr.is_ipv4())
.collect();
if addrs.is_empty() {
Err(format!("Unable to resolve host: {host_port}"))
} else if addrs.len() > 1 {
Err(format!("Multiple addresses resolved for host: {host_port}"))
} else {
Ok(addrs[0])
}
}