use std::io::prelude::*; use std::net::TcpStream; use ssh2::Session; use clap::Parser; use emojis_rs::*; //const USER: &str = "aaronh"; //const EDI: &str = "100.94.173.5:22"; #[derive(Parser, Debug)] #[command(version, about, long_about = None)] struct Args { /// user needs access to systemd #[arg(short, long)] user: String, /// include port number :22 #[arg(short, long)] ip: String, } fn main() { let args = Args::parse(); let tcp = TcpStream::connect(args.ip).expect("Failed to connect to SSH server"); let mut sess = Session::new().expect("Failed to create SSH session"); sess.set_tcp_stream(tcp); sess.handshake().expect("SSH handshake failed"); sess.userauth_agent(&args.user).expect("SSH authentication failed"); if sess.authenticated() { println!("{EMOJI_CHECK} Authentication successful!"); } else { println!("{EMOJI_CROSS} Authentication failed!"); return; } println!("-------------------------"); for service in ["forgejo", "gollum", "hydra-server", "syncthing", "wastebin"] { check_service_status(&sess, service); } } fn check_service_status(sess: &Session, service: &str) { let mut channel = sess.channel_session().expect("Failed to open SSH channel"); channel.exec(&format!("systemctl is-active {service}")).expect("Failed to run systemctl"); let mut output = String::new(); channel.read_to_string(&mut output).expect("Failed to read channel output"); channel.wait_close().expect("Failed to close SSH channel"); let exit_code = channel.exit_status().expect("Failed to get exit status"); if exit_code == 0 { println!("{EMOJI_CHECK} {service} service is active"); } else { println!("{EMOJI_CROSS} {service} service is inactive (exit code: {exit_code})"); } }