From cb96ca3cb36e8aa14619a029a916fba073376909 Mon Sep 17 00:00:00 2001 From: Marco Morath Date: Sat, 17 Aug 2024 22:01:37 +0200 Subject: [PATCH] initial commit --- README.md | 3 + backup-rentention.sh | 155 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 158 insertions(+) create mode 100644 backup-rentention.sh diff --git a/README.md b/README.md index 361c753..d5d699d 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,5 @@ # file-rentention +This script is intendet to be used to delete files, created by a backup-script for example. The rentention will be processes by a timeplan (days, weeks, months to keep). + +More Information is available on the mentioned website. \ No newline at end of file diff --git a/backup-rentention.sh b/backup-rentention.sh new file mode 100644 index 0000000..d134aab --- /dev/null +++ b/backup-rentention.sh @@ -0,0 +1,155 @@ +#!/bin/bash + +# Script: +# Version: 1.0 +# Autor: Marco Morath +# Lizenz: Gnu GPLv3 + +# Anwenderhinweis: +# Wird der Parameter dryrun mit übergeben, wird keine Löschung durchgeführt. Es wird nur ermittelt, welche Dateien +# gelöscht werden, wenn das Skript tatsächlich ausgeführt wird. + +# Verzeichnis mit den Backups +backup_dir="/mnt/backupfolder" + +# Ältere Backups behalten: 14 tägliche, 13 wöchentliche, 12 monatliche +daily_keep=14 +weekly_keep=13 +monthly_keep=12 + +# Log-Verzeichnis und -Datei +log_dir="/home/user/logdirectory" +log_file="$log_dir/$(date +%Y-%m-%d)-backup-retention.log" + +# Logrotation +log_files=($(ls -1tr $log_dir/*backup-retention*.log)) +log_keep=14 + +# Alte Logdateien löschen +if [ ${#log_files[@]} -gt $log_keep ]; then + for log in "${log_files[@]:0:$((${#log_files[@]} - $log_keep))}"; do + echo "Lösche Logdatei: $log" + rm -f "$log" + done +fi + +# Neues Logfile erstellen +touch "$log_file" + +# Liste der Backups in umgekehrter Reihenfolge nach Erstellungsdatum (älteste zuerst) +backups=($(ls -1tr --time=ctime $backup_dir)) + +# Arrays für die zu behaltenden Backups +daily_backups=() +weekly_backups=() +monthly_backups=() + +# Datumswerte +today_in_seconds=$(date +%s) +daily_oldest_in_seconds=$(( $today_in_seconds - ( 86400 * $daily_keep ) )) +weekly_oldest_in_seconds=$(( $today_in_seconds - ( 86400 * 7 * $weekly_keep ) )) +monthly_oldest_in_seconds=$(( $today_in_seconds - ( 86400 * 30 * $monthly_keep ) )) + +# Funktion, um die Woche eines Datums zu berechnen +get_week_of_year() { + date -d "@$1" +%Y-%V +} + +# Funktion, um den Monat eines Datums zu berechnen +get_month_of_year() { + date -d "@$1" +%Y-%m +} + +# Backup-Kategorisierung +declare -A weekly_latest +declare -A monthly_latest + +for backup in "${backups[@]}"; do + backup_date_seconds=$(stat -c %Y "$backup_dir/$backup") + + if [ $backup_date_seconds -ge $daily_oldest_in_seconds ]; then + daily_backups+=($backup) + + elif [ $backup_date_seconds -ge $weekly_oldest_in_seconds ]; then + week_of_year=$(get_week_of_year $backup_date_seconds) + if [[ -z "${weekly_latest[$week_of_year]}" || $backup_date_seconds -gt $(stat -c %Y "$backup_dir/${weekly_latest[$week_of_year]}") ]]; then + weekly_latest[$week_of_year]=$backup + fi + + elif [ $backup_date_seconds -ge $monthly_oldest_in_seconds ]; then + month_of_year=$(get_month_of_year $backup_date_seconds) + if [[ -z "${monthly_latest[$month_of_year]}" || $backup_date_seconds -gt $(stat -c %Y "$backup_dir/${monthly_latest[$month_of_year]}") ]]; then + monthly_latest[$month_of_year]=$backup + fi + + fi + +done + +# Jüngste wöchentliche und monatliche Backups in Arrays speichern +for backup in "${weekly_latest[@]}"; do + weekly_backups+=($backup) +done + +for backup in "${monthly_latest[@]}"; do + monthly_backups+=($backup) +done + +# Alle zu behaltenden Backups zusammenführen +keep_backups=("${daily_backups[@]}" "${weekly_backups[@]}" "${monthly_backups[@]}") + +# Funktion zum Protokollieren +log() { + echo "$1" | tee -a "$log_file" +} + +# Beginn des Vorgangs dokumentieren +log "##### Bereinigung begonnen ( $(date +"%d-%m-%Y %H:%M:%S") ) #####" + +# Überprüfen, ob der Parameter "dryrun" gesetzt ist +dryrun=false +if [ "$1" == "dryrun" ]; then + dryrun=true + log "Dry run aktiviert: Es werden keine Backups gelöscht." +fi + +# Backups zum Behalten ermitteln +echo "==== Zu behaltende Backups ====" +number=0 +for backup in "${backups[@]}"; do + if [[ " ${keep_backups[@]} " =~ " $backup " ]]; then + + number=$(($number+1)) + if $dryrun; then + log "$number Würde behalten: $backup" + + else + log "$number Behalte Backup: $backup" + + fi + + fi + +done + +# Backups zum Löschen ermitteln +echo "==== Zu löschende Backups ====" +number=0 +for backup in "${backups[@]}"; do + if [[ ! " ${keep_backups[@]} " =~ " $backup " ]]; then + + number=$(($number+1)) + if $dryrun; then + log "$number Würde löschen: $backup" + + else + log "$number Lösche Backup: $backup" + rm -f "$backup_dir/$backup" + + fi + + fi + +done + +log "##### Backup-Bereinigung abgeschlossen ( $(date +"%d-%m-%Y %H:%M:%S") ) #####" \ No newline at end of file