Albatross/src/remote_backup.rs

48 lines
1.4 KiB
Rust

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();
}