diff --git a/Cargo.toml b/Cargo.toml index 9129af3..5612324 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,4 +5,5 @@ edition = "2021" [dependencies] serde = { version = "1.0.210", features = [ "derive" ] } +tar = "0.4.41" toml = "0.8.19" diff --git a/log.txt b/log.txt deleted file mode 100644 index 85d8832..0000000 --- a/log.txt +++ /dev/null @@ -1,4 +0,0 @@ - -I: Begin backup log - 1725955295 -I: Beginning stage 1 backup. -I: Beginning stage 2 backup. diff --git a/resetenv.sh b/resetenv.sh index 6835b85..9a39299 100644 --- a/resetenv.sh +++ b/resetenv.sh @@ -2,3 +2,4 @@ rm -r testfiles/dir/* echo "" > log.txt rm -r /run/media/xory/Ventoy/backup/* +rm backup.tar diff --git a/src/lib.rs b/src/lib.rs index 74e6f58..8ff6cbf 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,6 +1,7 @@ use serde::Deserialize; use toml; -use std::{fs, io, path::Path}; +use std::{fs, io, net::TcpStream, path::Path}; +use std::io::{prelude::*, BufReader, SeekFrom}; mod logger; use logger::{log, LogLevel}; @@ -12,11 +13,19 @@ pub struct StageConfig { pub recursive: bool } +#[derive(Deserialize, Debug, PartialEq)] +pub struct Stage3Config { + pub src_files: Vec, + pub target_server: String, + pub recursive: bool +} + #[derive(Deserialize, Debug, PartialEq)] pub struct Config { pub stage_1: StageConfig, - pub stage_2: StageConfig + pub stage_2: StageConfig, + pub stage_3: Stage3Config } impl Config { @@ -101,6 +110,21 @@ pub fn stage2(config: &Config) -> io::Result<()> { Ok(()) } +pub fn stage_3(config: &Config) -> io::Result<()> { + { + let mut archivefile = tar::Builder::new(fs::File::create_new("backup.tar")?); + for file in &config.stage_3.src_files { + archivefile.append_path(file)?; + } + } + let archivefile = fs::File::open("backup.tar")?; + let mut backup_server_connection = TcpStream::connect(format!("{}:1024", &config.stage_3.target_server))?; + let buffer = vec![0_u8; archivefile.metadata()?.len().try_into().unwrap()]; + backup_server_connection.write_all(&buffer)?; + backup_server_connection.flush()?; + Ok(()) +} + #[cfg(test)] mod tests { use super::*; @@ -115,6 +139,10 @@ mod tests { src_files = [ './testfiles/src/file1.txt', './testfiles/src/file2.txt', './testfiles/src/a' ] target_dir = '/run/media/xory/Ventoy/backup' recursive = true + [stage_3] + src_files = [ './testfiles/src/file1.txt', './testfiles/src/file2.txt', './testfiles/src/a' ] + target_server = '192.168.1.204' + recursive = true "; let parsed_config = Config::new(toml_config.to_string()); @@ -129,6 +157,11 @@ mod tests { src_files: vec![ "./testfiles/src/file1.txt".to_string(), "./testfiles/src/file2.txt".to_string(), "./testfiles/src/a".to_string() ], target_dir: "/run/media/xory/Ventoy/backup".to_string(), recursive: true + }, + stage_3: Stage3Config { + src_files: vec![ "./testfiles/src/file1.txt".to_string(), "./testfiles/src/file2.txt".to_string(), "./testfiles/src/a".to_string() ], + target_server: "192.168.1.204".to_string(), + recursive: true } }, parsed_config diff --git a/src/main.rs b/src/main.rs index 851f168..d0d132d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,4 @@ -use cynewave::{Config, stage1, stage2}; +use cynewave::{Config, stage1, stage2, stage_3}; mod logger; use logger::{log, LogLevel}; use std::fs; @@ -12,7 +12,9 @@ fn main() -> Result<(), Box> { dbg!(&config); log("./log.txt".to_string(), "Beginning stage 1 backup.".to_string(), LogLevel::Info)?; stage1(&config)?; - log("./log.txt".to_string(), "Beginning stage 2 backup.".to_string(), LogLevel::Info)?; - stage2(&config)?; + // log("./log.txt".to_string(), "Beginning stage 2 backup.".to_string(), LogLevel::Info)?; + // stage2(&config)?; + log("./log.txt".to_string(), "Beginning stage 3 backup.".to_string(), LogLevel::Info)?; + stage_3(&config)?; Ok(()) } diff --git a/testconfig.toml b/testconfig.toml index cece4bf..bbe675a 100644 --- a/testconfig.toml +++ b/testconfig.toml @@ -8,4 +8,7 @@ src_files = [ "./testfiles/src/file1.txt", "./testfiles/src/file2.txt", "./testf target_dir = "/run/media/xory/Ventoy/backup" recursive = true - +[stage_3] +src_files = [ "./testfiles/src/file1.txt", "./testfiles/src/file2.txt", "./testfiles/src/a" ] +target_server = "127.0.0.1" +recursive = true