diff options
author | metamuffin <metamuffin@disroot.org> | 2024-06-14 04:48:14 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-06-14 04:48:14 +0200 |
commit | e4499d44e931d2ee7c70e7610bbfca3fefd00fea (patch) | |
tree | 470e44d4ca22de6404aeb4330784dd568751908b /src/main.rs | |
parent | e34da6ca957ec813a361cbcaf0dc89e953af6db1 (diff) | |
download | online-offsite-backup-e4499d44e931d2ee7c70e7610bbfca3fefd00fea.tar online-offsite-backup-e4499d44e931d2ee7c70e7610bbfca3fefd00fea.tar.bz2 online-offsite-backup-e4499d44e931d2ee7c70e7610bbfca3fefd00fea.tar.zst |
implement upload and download
Diffstat (limited to 'src/main.rs')
-rw-r--r-- | src/main.rs | 76 |
1 files changed, 63 insertions, 13 deletions
diff --git a/src/main.rs b/src/main.rs index c72aad7..22977ae 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,12 +2,18 @@ pub mod client; pub mod server; -use anyhow::Result; +use anyhow::{anyhow, Result}; use clap::{Parser, Subcommand}; use client::Client; +use log::info; use serde::Deserialize; use server::server; -use std::{fs::read_to_string, net::SocketAddr, path::PathBuf}; +use std::{ + fs::{read_to_string, File}, + net::SocketAddr, + os::unix::fs::MetadataExt, + path::PathBuf, +}; pub type Serial = u64; @@ -24,13 +30,18 @@ enum Action { List { peer: Option<String>, }, - Restore { - peer: String, - id: String, - destination: PathBuf, + Download { + path: PathBuf, + /// Which peer to download from, any if not specified + peer: Option<String>, + /// Serial of the backup to download, latest if not specified + serial: Option<Serial>, }, - Backup { + Upload { + /// Path to backup file path: PathBuf, + /// Which peer to upload to, all if not specified + peer: Option<String>, }, } @@ -91,12 +102,51 @@ fn main() -> Result<()> { client.quit()?; } } - Action::Restore { - id, - destination, - peer, - } => todo!(), - Action::Backup { path } => todo!(), + Action::Download { path, serial, peer } => { + let mut peers = config.peer.iter().filter(|p| { + if let Some(pn) = &peer { + pn == &p.name + } else { + true + } + }); + let peer = peers.next().ok_or(anyhow!("no matching peer"))?; + info!("connecting to {:?}", peer.name); + let mut client = Client::new(peer.address, &peer.shared_secret)?; + + let file = File::create_new(&path)?; + let serial = if let Some(serial) = serial { + serial + } else { + client.list()?.last().ok_or(anyhow!("no backups stored"))?.2 + }; + println!("downloading serial={serial} from {}", peer.name); + client.download(serial, file)?; + info!("upload successful"); + client.quit()?; + println!("success") + } + Action::Upload { peer, path } => { + let peers = config.peer.iter().filter(|p| { + if let Some(pn) = &peer { + pn == &p.name + } else { + true + } + }); + for peer in peers { + info!("connecting to {:?}", peer.name); + println!("uploading to {}", peer.name); + let mut client = Client::new(peer.address, &peer.shared_secret)?; + + let file = File::open(&path)?; + let size = file.metadata()?.size(); + client.upload(size, file)?; + info!("upload successful"); + client.quit()?; + } + println!("success") + } } Ok(()) } |