From ab7f99e061e54924899b778e929dd2e17c8792d9 Mon Sep 17 00:00:00 2001 From: fxqnlr Date: Fri, 6 Sep 2024 13:47:47 +0200 Subject: add root index and directory creation --- src/backup.rs | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 80 insertions(+), 9 deletions(-) (limited to 'src/backup.rs') diff --git a/src/backup.rs b/src/backup.rs index 4e74c97..69bc2ea 100644 --- a/src/backup.rs +++ b/src/backup.rs @@ -1,9 +1,20 @@ -use std::time::{SystemTime, UNIX_EPOCH}; +use std::{ + fs::{create_dir_all, File, OpenOptions}, + io::{ErrorKind, Read, Write}, + path::PathBuf, + time::{SystemTime, UNIX_EPOCH}, +}; +use gethostname::gethostname; use serde::{Deserialize, Serialize}; use uuid::Uuid; -use crate::{config::Config, pathinfo::PathInfo, packages::Package, error::Result}; +use crate::{ + config::Config, + error::{Error, Result}, + packages::Package, + pathinfo::PathInfo, +}; pub type BackupId = String; @@ -24,21 +35,81 @@ impl Backup { Ok(Self { // UUID not really needed, maybe a shorter hash id: Uuid::new_v4().to_string(), - timestamp: SystemTime::now() - .duration_since(UNIX_EPOCH) - .unwrap() - .as_secs(), + timestamp: Self::get_timestamp(), packages, files, }) } - + pub fn save(&self, config: &Config) -> Result<()> { + let rel_location = format!( + "bu_{}_{}", + gethostname() + .into_string() + .map_err(|_| Error::InvalidOsString)?, + Self::get_timestamp() + ); + + let bl = BackupLocation { + id: self.id.to_string(), + rel_location, + }; + + Self::append_to_root_index(config, bl.clone())?; + + let backup_root = format!("{}/{}", config.root, bl.rel_location); + create_dir_all(&backup_root).unwrap(); + let path = format!("{}/index.json", backup_root); + let mut f = File::create(path).unwrap(); + f.write_all(&serde_json::to_vec(self).unwrap()).unwrap(); + + Ok(()) + } + + pub fn get(config: &Config, _id: Option) -> Result<()> { + let backup_index_root = format!("{}/index.json", config.root); + let mut file = File::open(backup_index_root)?; + let mut content = String::new(); + file.read_to_string(&mut content)?; + let list: Vec = serde_json::from_str(&content)?; + println!("{list:#?}"); + + todo!(); + + Ok(()) + } + + fn append_to_root_index(config: &Config, new_backup: BackupLocation) -> Result<()> { + let backup_index_root = format!("{}/index.json", config.root); + let path = PathBuf::from(&backup_index_root); + if path.exists() { + let mut f = File::open(&path)?; + let mut content = String::new(); + f.read_to_string(&mut content)?; + let mut loc: Vec = serde_json::from_str(&content)?; + + let mut f = File::create(path)?; + loc.push(new_backup); + + f.write_all(&serde_json::to_vec(&loc)?)?; + } else { + let mut f = File::create(backup_index_root)?; + f.write_all(&serde_json::to_vec(&vec![new_backup])?)?; + }; + + Ok(()) + } + + fn get_timestamp() -> u64 { + SystemTime::now() + .duration_since(UNIX_EPOCH) + .unwrap() + .as_secs() + } } +#[derive(Debug, Clone, Serialize, Deserialize)] struct BackupLocation { id: BackupId, rel_location: String, } - -type BackupList = Vec; -- cgit v1.2.3