summaryrefslogtreecommitdiffstats
path: root/backup
diff options
context:
space:
mode:
Diffstat (limited to 'backup')
-rw-r--r--backup/Cargo.toml3
-rw-r--r--backup/src/main.rs51
2 files changed, 30 insertions, 24 deletions
diff --git a/backup/Cargo.toml b/backup/Cargo.toml
index 699fe53..c4ba3cc 100644
--- a/backup/Cargo.toml
+++ b/backup/Cargo.toml
@@ -11,4 +11,5 @@ tar = "0.4"
zstd = "0.13"
chrono = "0.4"
regex = "1"
-duct = "0.13" # für shell-like commands \ No newline at end of file
+duct = "0.13"
+clap = { version = "4", features = ["derive"] }
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(())
}