use rhai::{Engine, EvalAltResult, Module};
pub fn create_module() -> Module {
Module::new()
}
pub fn register_net_module(engine: &mut Engine) -> Result<(), Box<EvalAltResult>> {
engine.register_fn("tcp_check", tcp_check);
engine.register_fn("tcp_ping", tcp_ping);
engine.register_fn("http_check", http_check);
engine.register_fn("http_status", http_status);
engine.register_fn("ssh_execute", ssh_execute);
engine.register_fn("ssh_execute_output", ssh_execute_output);
engine.register_fn("ssh_ping", ssh_ping_host);
Ok(())
}
pub fn tcp_check(host: &str, port: i64) -> bool {
use std::net::{SocketAddr, TcpStream};
use std::time::Duration;
let addr_str = format!("{}:{}", host, port);
if let Ok(socket_addr) = addr_str.parse::<SocketAddr>() {
TcpStream::connect_timeout(&socket_addr, Duration::from_secs(5)).is_ok()
} else {
match std::net::ToSocketAddrs::to_socket_addrs(&addr_str) {
Ok(mut addrs) => {
if let Some(addr) = addrs.next() {
TcpStream::connect_timeout(&addr, Duration::from_secs(5)).is_ok()
} else {
false
}
}
Err(_) => false,
}
}
}
pub fn tcp_ping(host: &str) -> bool {
use std::process::Command;
let mut cmd = Command::new("ping");
#[cfg(target_os = "windows")]
{
cmd.arg("-n").arg("1").arg("-w").arg("5000"); }
#[cfg(not(target_os = "windows"))]
{
cmd.arg("-c").arg("1").arg("-W").arg("5"); }
cmd.arg(host);
match cmd.output() {
Ok(output) => output.status.success(),
Err(_) => false,
}
}
pub fn http_check(url: &str) -> bool {
use std::time::Duration;
let client = match reqwest::blocking::Client::builder()
.timeout(Duration::from_secs(10))
.build()
{
Ok(client) => client,
Err(_) => return false,
};
match client.head(url).send() {
Ok(response) => response.status().is_success(),
Err(_) => false,
}
}
pub fn http_status(url: &str) -> i64 {
use std::time::Duration;
let client = match reqwest::blocking::Client::builder()
.timeout(Duration::from_secs(10))
.build()
{
Ok(client) => client,
Err(_) => return -1,
};
match client.head(url).send() {
Ok(response) => response.status().as_u16() as i64,
Err(_) => -1,
}
}
pub fn ssh_execute(host: &str, user: &str, command: &str) -> i64 {
use std::process::Command;
let mut cmd = Command::new("ssh");
cmd.arg("-o")
.arg("ConnectTimeout=5")
.arg("-o")
.arg("StrictHostKeyChecking=no")
.arg(format!("{}@{}", user, host))
.arg(command);
match cmd.output() {
Ok(output) => output.status.code().unwrap_or(-1) as i64,
Err(_) => -1,
}
}
pub fn ssh_execute_output(host: &str, user: &str, command: &str) -> String {
use std::process::Command;
let mut cmd = Command::new("ssh");
cmd.arg("-o")
.arg("ConnectTimeout=5")
.arg("-o")
.arg("StrictHostKeyChecking=no")
.arg(format!("{}@{}", user, host))
.arg(command);
match cmd.output() {
Ok(output) => String::from_utf8_lossy(&output.stdout).to_string(),
Err(_) => "SSH command failed".to_string(),
}
}
pub fn ssh_ping_host(host: &str, user: &str) -> bool {
use std::process::Command;
let mut cmd = Command::new("ssh");
cmd.arg("-o")
.arg("ConnectTimeout=5")
.arg("-o")
.arg("StrictHostKeyChecking=no")
.arg("-o")
.arg("BatchMode=yes") .arg(format!("{}@{}", user, host))
.arg("echo 'Connection successful'");
match cmd.output() {
Ok(output) => output.status.success(),
Err(_) => false,
}
}