Skip to content

Commit f6e4798

Browse files
authored
Merge pull request #31 from buildplan/improve_recycle
timestamped recycle‑bin paths and RECYCLE_BIN_DIR validation (no ../)
2 parents 838baca + 0c3b1a9 commit f6e4798

File tree

3 files changed

+20
-10
lines changed

3 files changed

+20
-10
lines changed

README.md

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,7 @@ To run the backup automatically, edit the root crontab.
184184
185185
```ini
186186
# =================================================================
187-
# Configuration for rsync Backup Script v0.27
187+
# Configuration for rsync Backup Script v0.28
188188
# =================================================================
189189
# !! IMPORTANT !! Set file permissions to 600 (chmod 600 backup.conf)
190190
@@ -301,7 +301,7 @@ END_EXCLUDES
301301
302302
```bash
303303
#!/bin/bash
304-
# ===================== v0.27 - 2025.08.12 ========================
304+
# ===================== v0.28 - 2025.08.12 ========================
305305
#
306306
# =================================================================
307307
# SCRIPT INITIALIZATION & SETUP
@@ -394,6 +394,10 @@ if [[ "${RECYCLE_BIN_ENABLED:-false}" == "true" ]]; then
394394
echo "❌ FATAL: RECYCLE_BIN_DIR must be a relative path, not absolute: '${RECYCLE_BIN_DIR}'" >&2
395395
exit 1
396396
fi
397+
if [[ "$RECYCLE_BIN_DIR" == *"../"* ]]; then
398+
echo "❌ FATAL: RECYCLE_BIN_DIR cannot contain '../'" >&2
399+
exit 1
400+
fi
397401
fi
398402

399403
# =================================================================
@@ -744,7 +748,8 @@ run_recycle_bin_cleanup() {
744748
local threshold_timestamp
745749
threshold_timestamp=$(date -d "$retention_days days ago" +%s)
746750
while IFS= read -r folder; do
747-
if [[ "$folder" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] && folder_timestamp=$(date -d "$folder" +%s 2>/dev/null) && [[ -n "$folder_timestamp" ]]; then
751+
local folder_date=${folder%%_*}
752+
if folder_timestamp=$(date -d "$folder_date" +%s 2>/dev/null) && [[ -n "$folder_timestamp" ]]; then
748753
if (( folder_timestamp < threshold_timestamp )); then
749754
folders_to_delete+="${folder}"$'\n'
750755
fi
@@ -792,7 +797,7 @@ if [[ "${1:-}" ]]; then
792797
echo -e "\n--- Checking dry run for: $dir ---"
793798
rsync_dry_opts=( "${RSYNC_BASE_OPTS[@]}" --dry-run --itemize-changes --out-format="%i %n%L" --info=stats2,name,flist2 )
794799
if [[ "${RECYCLE_BIN_ENABLED:-false}" == "true" ]]; then
795-
backup_dir="${BOX_DIR%/}/${RECYCLE_BIN_DIR%/}/$(date +%F)/"
800+
backup_dir="${BOX_DIR%/}/${RECYCLE_BIN_DIR%/}/$(date +%F_%H%M%S)/"
796801
rsync_dry_opts+=(--backup --backup-dir="$backup_dir")
797802
fi
798803
DRY_RUN_LOG_TMP=$(mktemp)
@@ -871,7 +876,7 @@ for dir in "${DIRS_ARRAY[@]}"; do
871876
RSYNC_LOG_TMP=$(mktemp)
872877
RSYNC_EXIT_CODE=0; RSYNC_OPTS=("${RSYNC_BASE_OPTS[@]}")
873878
if [[ "${RECYCLE_BIN_ENABLED:-false}" == "true" ]]; then
874-
backup_dir="${BOX_DIR%/}/${RECYCLE_BIN_DIR%/}/$(date +%F)/"
879+
backup_dir="${BOX_DIR%/}/${RECYCLE_BIN_DIR%/}/$(date +%F_%H%M%S)/"
875880
RSYNC_OPTS+=(--backup --backup-dir="$backup_dir")
876881
fi
877882
if [[ "$VERBOSE_MODE" == "true" ]]; then

backup.conf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# =================================================================
2-
# Configuration for rsync Backup Script v0.27
2+
# Configuration for rsync Backup Script v0.28
33
# =================================================================
44
# !! IMPORTANT !! Set file permissions to 600 (chmod 600 backup.conf)
55

backup_script.sh

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#!/bin/bash
2-
# ===================== v0.27 - 2025.08.12 ========================
2+
# ===================== v0.28 - 2025.08.12 ========================
33
#
44
# Example backup.conf:
55
# BACKUP_DIRS="/home/user/test/./ /var/www/./"
@@ -120,6 +120,10 @@ if [[ "${RECYCLE_BIN_ENABLED:-false}" == "true" ]]; then
120120
echo "❌ FATAL: RECYCLE_BIN_DIR must be a relative path, not absolute: '${RECYCLE_BIN_DIR}'" >&2
121121
exit 1
122122
fi
123+
if [[ "$RECYCLE_BIN_DIR" == *"../"* ]]; then
124+
echo "❌ FATAL: RECYCLE_BIN_DIR cannot contain '../'" >&2
125+
exit 1
126+
fi
123127
fi
124128

125129
# =================================================================
@@ -470,7 +474,8 @@ run_recycle_bin_cleanup() {
470474
local threshold_timestamp
471475
threshold_timestamp=$(date -d "$retention_days days ago" +%s)
472476
while IFS= read -r folder; do
473-
if [[ "$folder" =~ ^[0-9]{4}-[0-9]{2}-[0-9]{2}$ ]] && folder_timestamp=$(date -d "$folder" +%s 2>/dev/null) && [[ -n "$folder_timestamp" ]]; then
477+
local folder_date=${folder%%_*}
478+
if folder_timestamp=$(date -d "$folder_date" +%s 2>/dev/null) && [[ -n "$folder_timestamp" ]]; then
474479
if (( folder_timestamp < threshold_timestamp )); then
475480
folders_to_delete+="${folder}"$'\n'
476481
fi
@@ -518,7 +523,7 @@ if [[ "${1:-}" ]]; then
518523
echo -e "\n--- Checking dry run for: $dir ---"
519524
rsync_dry_opts=( "${RSYNC_BASE_OPTS[@]}" --dry-run --itemize-changes --out-format="%i %n%L" --info=stats2,name,flist2 )
520525
if [[ "${RECYCLE_BIN_ENABLED:-false}" == "true" ]]; then
521-
backup_dir="${BOX_DIR%/}/${RECYCLE_BIN_DIR%/}/$(date +%F)/"
526+
backup_dir="${BOX_DIR%/}/${RECYCLE_BIN_DIR%/}/$(date +%F_%H%M%S)/"
522527
rsync_dry_opts+=(--backup --backup-dir="$backup_dir")
523528
fi
524529
DRY_RUN_LOG_TMP=$(mktemp)
@@ -597,7 +602,7 @@ for dir in "${DIRS_ARRAY[@]}"; do
597602
RSYNC_LOG_TMP=$(mktemp)
598603
RSYNC_EXIT_CODE=0; RSYNC_OPTS=("${RSYNC_BASE_OPTS[@]}")
599604
if [[ "${RECYCLE_BIN_ENABLED:-false}" == "true" ]]; then
600-
backup_dir="${BOX_DIR%/}/${RECYCLE_BIN_DIR%/}/$(date +%F)/"
605+
backup_dir="${BOX_DIR%/}/${RECYCLE_BIN_DIR%/}/$(date +%F_%H%M%S)/"
601606
RSYNC_OPTS+=(--backup --backup-dir="$backup_dir")
602607
fi
603608
if [[ "$VERBOSE_MODE" == "true" ]]; then

0 commit comments

Comments
 (0)