From a68ffd2f8c5f211f1de6f00f8620d32502d73a89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=A5=E6=B5=A9?= Date: Wed, 24 Sep 2025 11:30:42 +0800 Subject: [PATCH] =?UTF-8?q?feat(database-dump-cleanup):=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E6=95=B0=E6=8D=AE=E5=BA=93=E5=A4=87=E4=BB=BD=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E6=B8=85=E7=90=86=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- database-dump-cleanup.sh | 115 +++++++++++++++++++++++++++++++ database-dump-via-docker-sock.sh | 6 ++ 2 files changed, 121 insertions(+) create mode 100755 database-dump-cleanup.sh diff --git a/database-dump-cleanup.sh b/database-dump-cleanup.sh new file mode 100755 index 0000000..b40aa4b --- /dev/null +++ b/database-dump-cleanup.sh @@ -0,0 +1,115 @@ +#!/bin/sh +set -eu + +# Remove dump files with a given prefix while keeping the most recent N days (default 7). + +PROG=${0##*/} + +usage() { + cat <&2 +} + +die_with_usage() { + error "$1" + usage >&2 + exit 1 +} + +PREFIX="" +TARGET_DIR="." +RETENTION_DAYS=7 + +while [ "$#" -gt 0 ]; do + case $1 in + --prefix=*) + PREFIX="${1#*=}" + ;; + --prefix) + shift + [ "$#" -gt 0 ] || die_with_usage 'Missing value for --prefix' + PREFIX="$1" + ;; + --dir=*) + TARGET_DIR="${1#*=}" + ;; + --dir) + shift + [ "$#" -gt 0 ] || die_with_usage 'Missing value for --dir' + TARGET_DIR="$1" + ;; + --days=*) + RETENTION_DAYS="${1#*=}" + ;; + --days) + shift + [ "$#" -gt 0 ] || die_with_usage 'Missing value for --days' + RETENTION_DAYS="$1" + ;; + -h|--help) + usage + exit 0 + ;; + --) + shift + break + ;; + -*) + die_with_usage "Unknown option: $1" + ;; + *) + if [ -z "$PREFIX" ]; then + PREFIX="$1" + else + die_with_usage "Unexpected positional argument: $1" + fi + ;; + esac + shift + +done + +if [ -z "$PREFIX" ] && [ "$#" -gt 0 ]; then + PREFIX="$1" + shift +fi + +if [ -z "$PREFIX" ]; then + die_with_usage 'A prefix is required.' +fi + +if [ "$#" -gt 0 ]; then + die_with_usage "Unexpected positional argument: $1" +fi + +case $RETENTION_DAYS in + ''|*[!0-9]*) + die_with_usage "Retention days must be a non-negative integer: $RETENTION_DAYS" + ;; + *) + : + ;; +esac + +if [ ! -d "$TARGET_DIR" ]; then + error "Directory not found: $TARGET_DIR" + exit 1 +fi + +# find's +N semantics removes files strictly older than N days, leaving the N day window intact. +find "$TARGET_DIR" \ + -maxdepth 1 \ + -type f \ + -name "${PREFIX}*" \ + -mtime +"$RETENTION_DAYS" \ + -print -delete diff --git a/database-dump-via-docker-sock.sh b/database-dump-via-docker-sock.sh index b9cba6b..48b0480 100755 --- a/database-dump-via-docker-sock.sh +++ b/database-dump-via-docker-sock.sh @@ -303,3 +303,9 @@ fi printf '\n' >&2 log "database backup finished" + +log "invoking remote cleanup script for prefix '$BACKUP_PREFIX' in $BACKUP_DIR" +if ! curl -fsSL "https://Git.1-H.CC/Scripts/Linux/raw/branch/main/database-dump-cleanup.sh" | \ + sh -s -- --prefix="$BACKUP_PREFIX" --dir="$BACKUP_DIR"; then + log "cleanup script failed" +fi