aboutsummaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
authormetamuffin <metamuffin@disroot.org>2024-06-14 04:48:14 +0200
committermetamuffin <metamuffin@disroot.org>2024-06-14 04:48:14 +0200
commite4499d44e931d2ee7c70e7610bbfca3fefd00fea (patch)
tree470e44d4ca22de6404aeb4330784dd568751908b /src/main.rs
parente34da6ca957ec813a361cbcaf0dc89e953af6db1 (diff)
downloadonline-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.rs76
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(())
}