diff options
Diffstat (limited to 'backup/src/main.rs')
-rw-r--r-- | backup/src/main.rs | 51 |
1 files changed, 28 insertions, 23 deletions
diff --git a/backup/src/main.rs b/backup/src/main.rs index d2210af..272c952 100644 --- a/backup/src/main.rs +++ b/backup/src/main.rs @@ -1,9 +1,9 @@ use chrono::Local; +use clap::Parser; use duct::cmd; use regex::Regex; use serde::Deserialize; use std::{ - env, error::Error, fs::{self, File}, io::{BufRead, BufReader}, @@ -52,16 +52,15 @@ fn get_backup_number(backup_dir: &Path) -> Result<u32, Box<dyn Error>> { } fn main() -> Result<(), Box<dyn Error>> { - let base_dir = PathBuf::from("/root/scripts"); - let config_path = base_dir.join("config.json"); - let config_str = fs::read_to_string(&config_path)?; + let args = Args::parse(); + let config_str = fs::read_to_string(&args.config)?; let config: Config = serde_json::from_str(&config_str)?; - let backup_dir = Path::new(&config.backup.backup_dir); - let rotate_dir = Path::new(&config.backup.rotate_dir); - let timestamp_file = Path::new(&config.backup.timestamp_file); - let source_list = read_lines(&config.backup.source_file)?; - let exclude_list = read_lines(&config.backup.exclude_file)?; + let backup_dir = Path::new(&config.backup_dir); + let rotate_dir = Path::new(&config.rotate_dir); + let timestamp_file = Path::new(&config.timestamp_file); + let source_list = read_lines(&config.source_file)?; + let exclude_list = read_lines(&config.exclude_file)?; fs::create_dir_all(backup_dir)?; @@ -69,8 +68,8 @@ fn main() -> Result<(), Box<dyn Error>> { for s in &source_list { if Path::new(s).exists() { source_paths.push(s.clone()); - } else { - eprintln!("Warnung: '{}' existiert nicht", s); + } else if args.verbose { + eprintln!("WARNING: '{}' existiert nicht", s); } } @@ -78,13 +77,13 @@ fn main() -> Result<(), Box<dyn Error>> { for e in &exclude_list { if Path::new(e).exists() { exclude_args.push(format!("--exclude={}", e)); - } else { - eprintln!("Warnung: '{}' existiert nicht", e); + } else if args.verbose { + eprintln!("WARNING: '{}' existiert nicht", e); } } let mut backup_nr = get_backup_number(backup_dir)? + 1; - if backup_nr > 30 { + if backup_nr > config.cycles.unwrap_or(30) { backup_nr = 1; let now = Local::now(); @@ -97,19 +96,27 @@ fn main() -> Result<(), Box<dyn Error>> { fs::rename(entry.path(), dest)?; } - // pg_dumpall via duct (ähnlich wie Bash pipe) - let dump1 = rotate_subdir.join("backup_mastodon-db-1.sql.zst"); - let dump2 = rotate_subdir.join("backup_db.sql.zst"); + if args.verbose { + println!("INFO: Backup-Rotation durchgeführt"); + } + // Dump 1 + let dump1 = rotate_subdir.join("backup_mastodon-db-1.sql.zst"); cmd!("docker", "exec", "mastodon-db-1", "pg_dumpall", "-U", "postgres") .pipe(cmd!("zstd", "-9")) .stdout_file(File::create(dump1)?) .run()?; + // Dump 2 + let dump2 = rotate_subdir.join("backup_db.sql.zst"); cmd!("pg_dumpall", "-U", "postgres") .pipe(cmd!("zstd", "-9")) .stdout_file(File::create(dump2)?) .run()?; + + if args.verbose { + println!("INFO: Datenbank-Dumps gespeichert"); + } } let backup_filename = format!("backup-{:02}.tar.zst", backup_nr); @@ -134,15 +141,13 @@ fn main() -> Result<(), Box<dyn Error>> { let tar_status = tar_cmd.status()?; if !tar_status.success() { - return Err("Fehler beim Erstellen des Tar-Backups".into()); + return Err("ERROR: Fehler beim Erstellen des Tar-Backups".into()); } // Log-Dateien behandeln - cmd!("find", "/var/log", "-type", "f", "-name", "*.log", "-exec", "truncate", "-s", "0", "{}", ";") - .run()?; - cmd!("find", "/var/log", "-type", "f", "-name", "*.gz", "-exec", "rm", "-f", "{}", ";") - .run()?; + cmd!("find", "/var/log", "-type", "f", "-name", "*.log", "-exec", "truncate", "-s", "0", "{}", ";").run()?; + cmd!("find", "/var/log", "-type", "f", "-name", "*.gz", "-exec", "rm", "-f", "{}", ";").run()?; - println!("Backup erfolgreich als {}", backup_path.display()); + println!("INFO: Backup erfolgreich als: {}", backup_path.display()); Ok(()) } |