48 lines
1.4 KiB
Rust
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();
|
|
}
|