use crate::config::RemoteBackupConfig; use crate::error::Result; use ssh2::Session; use std::net::TcpStream; use std::path::PathBuf; fn open_ssh_session(remote_config: &RemoteBackupConfig) -> Result { let tcp = TcpStream::connect(&remote_config.sftp_server_addr).unwrap(); let mut sess = Session::new().unwrap(); sess.set_tcp_stream(tcp); sess.handshake().unwrap(); if let Some(password) = &remote_config.password { sess.userauth_password(&remote_config.username, password) .unwrap(); } else if let Some(key) = &remote_config.private_key { let public_key = remote_config.public_key.as_deref(); sess.userauth_pubkey_file(&remote_config.username, public_key, key, None)?; } else { panic!("No key provided") } Ok(sess) } pub fn remote_backup(file: PathBuf, remote_config: &RemoteBackupConfig) -> Result<()> { let sess = open_ssh_session(remote_config)?; let remote_path = remote_config.remote_dir.join(file.file_name().unwrap()); let mut local_file = std::fs::File::open(&file)?; let sftp = sess.sftp()?; let mut remote_file = sftp.create(&remote_path)?; std::io::copy(&mut local_file, &mut remote_file)?; Ok(()) }