#!/usr/bin/env bash # install-prune-cron.sh — opt-in cron job to prune old deploy backups. # # Run ONCE as root (or with sudo) after install.sh to enable daily # pruning of /var/lib/currencicombo/backups/. The pruner: # - deletes entries older than 30 days # - ALWAYS keeps the newest N backups regardless of age (default 5) # # No-op on re-run. Opt out by removing /etc/cron.daily/currencicombo-prune-backups. set -euo pipefail BACKUP_DIR="${CC_BACKUP_DIR:-/var/lib/currencicombo/backups}" RETAIN_DAYS="${CC_BACKUP_RETAIN_DAYS:-30}" KEEP_MIN="${CC_BACKUP_KEEP_MIN:-5}" CRON_FILE="/etc/cron.daily/currencicombo-prune-backups" DRY_RUN=0 while [[ $# -gt 0 ]]; do case "$1" in --dry-run) DRY_RUN=1; shift ;; -h|--help) cat <<'USAGE' Usage: sudo ./install-prune-cron.sh [--dry-run] Env overrides: CC_BACKUP_DIR (default: /var/lib/currencicombo/backups) CC_BACKUP_RETAIN_DAYS (default: 30) CC_BACKUP_KEEP_MIN (default: 5) USAGE exit 0 ;; *) echo "unknown arg: $1" >&2; exit 2 ;; esac done log() { printf '[install-prune-cron] %s\n' "$*" >&2; } die() { printf '[install-prune-cron][FATAL] %s\n' "$*" >&2; exit 1; } [[ "$EUID" -eq 0 ]] || die "must run as root (sudo)" # The pruner script body. Runs daily via cron.daily. # KEEP_MIN is enforced by listing backups newest-first, skipping the # first KEEP_MIN, then deleting any remaining entries older than # RETAIN_DAYS. This means we always keep at least KEEP_MIN (even if # they're all <30 days old), and never delete one of the newest # KEEP_MIN (even if it's >30 days old on a dormant host). read -r -d '' PRUNER_BODY </dev/null | sort -rn | awk '{print \$2}') count=\${#all[@]} if (( count <= KEEP_MIN )); then logger -t currencicombo-prune "count=\$count <= KEEP_MIN=\$KEEP_MIN; nothing to prune" exit 0 fi cutoff=\$(date -d "\$RETAIN_DAYS days ago" +%s) deleted=0 kept=0 for i in "\${!all[@]}"; do p="\${all[\$i]}" if (( i < KEEP_MIN )); then kept=\$((kept + 1)) continue fi mtime=\$(stat -c %Y "\$p" 2>/dev/null || echo 0) if (( mtime < cutoff )); then rm -rf -- "\$p" deleted=\$((deleted + 1)) else kept=\$((kept + 1)) fi done logger -t currencicombo-prune "deleted=\$deleted kept=\$kept total_before=\$count" PRUNER if [[ "${DRY_RUN}" -eq 1 ]]; then log "[dry-run] would write ${CRON_FILE} (0755) with pruner targeting ${BACKUP_DIR}, retain ${RETAIN_DAYS}d, keep-min ${KEEP_MIN}" echo "---" echo "${PRUNER_BODY}" echo "---" exit 0 fi printf '%s\n' "${PRUNER_BODY}" > "${CRON_FILE}" chmod 0755 "${CRON_FILE}" chown root:root "${CRON_FILE}" log "installed ${CRON_FILE} (backups older than ${RETAIN_DAYS}d, keep-min ${KEEP_MIN}, target ${BACKUP_DIR})" log "runs daily via /etc/cron.daily/. Opt out: sudo rm ${CRON_FILE}" log "logs to syslog (tag currencicombo-prune); journalctl -t currencicombo-prune"