From 670339d2c9c681989513ec41df434df184e1ac00 Mon Sep 17 00:00:00 2001 From: Olivier 'reivilibre Date: Sun, 4 Jul 2021 20:50:10 +0100 Subject: [PATCH] Add remote support for backup one --- Cargo.lock | 20 ++++++++++++++ datman/Cargo.toml | 2 +- datman/src/bin/datman.rs | 58 ++++++++++++++++++++++++++++++++-------- 3 files changed, 68 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 42ac1b7..9ce3fb4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "ahash" version = "0.3.8" @@ -276,6 +278,7 @@ dependencies = [ "clap", "env_logger", "glob", + "hostname", "humansize", "indicatif", "itertools 0.10.1", @@ -433,6 +436,17 @@ dependencies = [ "libc", ] +[[package]] +name = "hostname" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c731c3e10504cc8ed35cfe2f1db4c9274c3d35fa486e3b31df46f068ef3e867" +dependencies = [ + "libc", + "match_cfg", + "winapi", +] + [[package]] name = "humansize" version = "1.1.1" @@ -545,6 +559,12 @@ dependencies = [ "cfg-if 1.0.0", ] +[[package]] +name = "match_cfg" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" + [[package]] name = "maybe-uninit" version = "2.0.0" diff --git a/datman/Cargo.toml b/datman/Cargo.toml index e86db23..5d7ccc8 100644 --- a/datman/Cargo.toml +++ b/datman/Cargo.toml @@ -28,5 +28,5 @@ glob = "0.3.0" humansize = "1.1.1" chrono = "0.4.19" itertools = "0.10.1" - +hostname = "0.3.1" yama = { path = "../yama", version = "0.4.0" } diff --git a/datman/src/bin/datman.rs b/datman/src/bin/datman.rs index 25851ad..21461e6 100644 --- a/datman/src/bin/datman.rs +++ b/datman/src/bin/datman.rs @@ -25,7 +25,8 @@ use chrono::{DateTime, Local, NaiveDate, NaiveDateTime, TimeZone, Utc}; use datman::commands::backup::{backup_all_sources_to_destination, backup_source_to_destination}; use datman::commands::ilabel::interactive_labelling_session; use datman::commands::init_descriptor; -use datman::descriptor::load_descriptor; +use datman::descriptor::{load_descriptor, SourceDescriptor}; +use datman::remote::backup_source_requester::backup_remote_source_to_destination; use std::str::FromStr; #[derive(Clap)] @@ -54,6 +55,10 @@ pub enum DatmanCommand { /// Name of the destination to back up to. destination_name: String, + + /// Specify the remote user@host name. + #[clap(short, long)] + remote: Option, }, BackupAll { @@ -139,24 +144,55 @@ fn main() -> anyhow::Result<()> { DatmanCommand::BackupOne { source_name, destination_name, + remote, } => { + let my_hostname = hostname::get() + .expect("No hostname") + .into_string() + .expect("Hostname string must be sensible."); let descriptor = load_descriptor(Path::new(".")).unwrap(); let source = &descriptor.source[&source_name]; let destination = &descriptor.piles[&destination_name]; - backup_source_to_destination( - source, - destination, - &descriptor, - Path::new("."), - &source_name, - &destination_name, - yama::utils::get_number_of_workers("YAMA_CHUNKERS"), - ) - .unwrap(); + + if let SourceDescriptor::DirectorySource { hostname, .. } = source { + if hostname != &my_hostname && remote.is_none() { + bail!( + "Wrong hostname. Hostname should be {:?} but is {:?}", + hostname, + my_hostname + ); + } + } + + if let Some(remote_user_at_host) = remote { + backup_remote_source_to_destination( + source, + destination, + &descriptor, + Path::new("."), + &source_name, + &destination_name, + &remote_user_at_host, + yama::utils::get_number_of_workers("YAMA_CHUNKERS"), + ) + .unwrap(); + } else { + backup_source_to_destination( + source, + destination, + &descriptor, + Path::new("."), + &source_name, + &destination_name, + yama::utils::get_number_of_workers("YAMA_CHUNKERS"), + ) + .unwrap(); + } } DatmanCommand::BackupAll { destination_name } => { let descriptor = load_descriptor(Path::new(".")).unwrap(); let destination = &descriptor.piles[&destination_name]; + backup_all_sources_to_destination( destination, &descriptor,