use crate::config::RemoteBackupConfig; use ssh2::Session; use std::net::TcpStream; use std::path::PathBuf; fn open_ssh_session(remote_config: &RemoteBackupConfig) -> Session { 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_ref() .map(|pub_key| pub_key.as_path().clone()); sess.userauth_pubkey_file( &remote_config.username, public_key, key, None, ) .unwrap(); } else { panic!("No key provided") } sess } pub fn remote_backup(file: PathBuf, remote_config: &RemoteBackupConfig) { 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).unwrap(); let sftp = sess.sftp().unwrap(); let mut remote_file = sftp.create(&remote_path).unwrap(); std::io::copy(&mut local_file, &mut remote_file).unwrap(); }