use std::net::{SocketAddr, TcpStream, ToSocketAddrs};
use std::time::Duration;
pub struct ZkHelper {
ip: String,
port: u16,
}
impl ZkHelper {
pub fn new(ip: impl Into<String>, port: u16) -> Self {
ZkHelper {
ip: ip.into(),
port,
}
}
pub fn test_ping(&self) -> bool {
use std::process::{Command, Stdio};
let is_windows = cfg!(target_os = "windows");
let mut cmd = Command::new("ping");
if is_windows {
cmd.args(["-n", "1", "-w", "5000", &self.ip]);
} else {
cmd.args(["-c", "1", "-W", "5", &self.ip]);
}
cmd.stdout(Stdio::null())
.stderr(Stdio::null())
.status()
.map(|s| s.success())
.unwrap_or(false)
}
pub fn test_tcp(&self) -> bool {
match self.address() {
Some(addr) => TcpStream::connect_timeout(&addr, Duration::from_secs(10)).is_ok(),
None => false,
}
}
fn address(&self) -> Option<SocketAddr> {
(self.ip.as_str(), self.port)
.to_socket_addrs()
.ok()
.and_then(|mut it| it.next())
}
}