296 lines
9.6 KiB
Bash
Executable File
296 lines
9.6 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
# Cleanup Old, Backup, and Unreferenced Files
|
|
# Safely removes old files, backups, and unused files from both local and remote
|
|
#
|
|
# This script identifies and removes:
|
|
# - Backup directories (backup-*, *backup*)
|
|
# - Temporary files (*.tmp, *.temp, *~, *.swp)
|
|
# - Old log files (logs/*.log older than 30 days)
|
|
# - Duplicate/unused files
|
|
# - Old documentation that's been superseded
|
|
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PROJECT_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)"
|
|
|
|
# Colors
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m'
|
|
|
|
log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
|
|
log_success() { echo -e "${GREEN}[✓]${NC} $1"; }
|
|
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
|
|
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
|
|
|
|
# Configuration
|
|
DRY_RUN="${DRY_RUN:-true}"
|
|
REMOTE_HOST="${REMOTE_HOST:-192.168.11.10}"
|
|
REMOTE_USER="${REMOTE_USER:-root}"
|
|
CLEAN_LOCAL="${CLEAN_LOCAL:-true}"
|
|
CLEAN_REMOTE="${CLEAN_REMOTE:-true}"
|
|
MIN_LOG_AGE_DAYS=30
|
|
|
|
# Parse arguments
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
--execute)
|
|
DRY_RUN=false
|
|
shift
|
|
;;
|
|
--skip-remote)
|
|
CLEAN_REMOTE=false
|
|
shift
|
|
;;
|
|
--skip-local)
|
|
CLEAN_LOCAL=false
|
|
shift
|
|
;;
|
|
--help)
|
|
cat << EOF
|
|
Usage: $0 [OPTIONS]
|
|
|
|
Cleanup old, backup, and unreferenced files from project directories.
|
|
|
|
Options:
|
|
--execute Actually delete files (default: dry-run, only shows what would be deleted)
|
|
--skip-remote Skip cleaning remote host (ml110)
|
|
--skip-local Skip cleaning local project
|
|
--help Show this help
|
|
|
|
Safety:
|
|
- By default, runs in DRY-RUN mode (shows files but doesn't delete)
|
|
- Use --execute to actually delete files
|
|
- Creates a manifest of files that will be deleted
|
|
EOF
|
|
exit 0
|
|
;;
|
|
*)
|
|
log_error "Unknown option: $1"
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Create cleanup manifest
|
|
CLEANUP_MANIFEST="$PROJECT_ROOT/logs/cleanup-manifest-$(date +%Y%m%d-%H%M%S).txt"
|
|
mkdir -p "$PROJECT_ROOT/logs"
|
|
> "$CLEANUP_MANIFEST"
|
|
|
|
log_info "========================================="
|
|
log_info "File Cleanup Script"
|
|
log_info "========================================="
|
|
log_info "Mode: $([ "$DRY_RUN" == "true" ] && echo "DRY-RUN (no files will be deleted)" || echo "EXECUTE (files will be deleted)")"
|
|
log_info "Manifest: $CLEANUP_MANIFEST"
|
|
log_info ""
|
|
|
|
# Function to find and catalog files to delete
|
|
find_cleanup_targets() {
|
|
local base_dir="$1"
|
|
local label="$2"
|
|
|
|
log_info "=== Scanning $label ==="
|
|
local count=0
|
|
|
|
# Backup directories
|
|
while IFS= read -r dir; do
|
|
if [[ -d "$dir" ]]; then
|
|
echo "$dir" >> "$CLEANUP_MANIFEST"
|
|
echo "DIR: $dir"
|
|
((count++))
|
|
fi
|
|
done < <(find "$base_dir" -type d -name "*backup*" 2>/dev/null)
|
|
|
|
# Temporary directories
|
|
while IFS= read -r dir; do
|
|
if [[ -d "$dir" ]] && [[ "$dir" != "$base_dir" ]]; then
|
|
echo "$dir" >> "$CLEANUP_MANIFEST"
|
|
echo "DIR: $dir"
|
|
((count++))
|
|
fi
|
|
done < <(find "$base_dir" -type d \( -name "*tmp*" -o -name "*temp*" \) 2>/dev/null)
|
|
|
|
# Temporary/backup files
|
|
while IFS= read -r file; do
|
|
if [[ -f "$file" ]]; then
|
|
echo "$file" >> "$CLEANUP_MANIFEST"
|
|
echo "FILE: $file"
|
|
((count++))
|
|
fi
|
|
done < <(find "$base_dir" -type f \( -name "*.bak" -o -name "*.old" -o -name "*~" -o -name "*.swp" -o -name "*.tmp" -o -name "*.temp" \) 2>/dev/null)
|
|
|
|
# Old log files (older than MIN_LOG_AGE_DAYS)
|
|
if [[ -d "$base_dir/logs" ]]; then
|
|
while IFS= read -r file; do
|
|
if [[ -f "$file" ]]; then
|
|
local file_age=$(( ($(date +%s) - $(stat -c %Y "$file" 2>/dev/null || echo 0)) / 86400 ))
|
|
if [[ $file_age -gt $MIN_LOG_AGE_DAYS ]]; then
|
|
echo "$file" >> "$CLEANUP_MANIFEST"
|
|
echo "OLD LOG ($file_age days): $file"
|
|
((count++))
|
|
fi
|
|
fi
|
|
done < <(find "$base_dir/logs" -type f -name "*.log" 2>/dev/null)
|
|
fi
|
|
|
|
# temp-all-keys-* directories in smom-dbis-138
|
|
if [[ "$base_dir" == *"smom-dbis-138"* ]]; then
|
|
while IFS= read -r dir; do
|
|
if [[ -d "$dir" ]]; then
|
|
echo "$dir" >> "$CLEANUP_MANIFEST"
|
|
echo "TEMP KEY GEN: $dir"
|
|
((count++))
|
|
fi
|
|
done < <(find "$base_dir" -type d -name "temp-all-keys-*" 2>/dev/null)
|
|
fi
|
|
|
|
log_info "Found $count items to clean"
|
|
echo "$count"
|
|
}
|
|
|
|
# Function to delete files from manifest
|
|
delete_from_manifest() {
|
|
local manifest_file="$1"
|
|
local label="$2"
|
|
|
|
if [[ ! -f "$manifest_file" ]]; then
|
|
log_warn "Manifest file not found: $manifest_file"
|
|
return 0
|
|
fi
|
|
|
|
local count=$(wc -l < "$manifest_file" | tr -d ' ')
|
|
if [[ $count -eq 0 ]]; then
|
|
log_info "No files to delete for $label"
|
|
return 0
|
|
fi
|
|
|
|
log_info "Deleting $count items from $label..."
|
|
local deleted=0
|
|
local failed=0
|
|
|
|
while IFS= read -r target; do
|
|
if [[ -z "$target" ]]; then
|
|
continue
|
|
fi
|
|
|
|
if [[ -e "$target" ]]; then
|
|
if rm -rf "$target" 2>/dev/null; then
|
|
((deleted++))
|
|
else
|
|
log_warn "Failed to delete: $target"
|
|
((failed++))
|
|
fi
|
|
fi
|
|
done < "$manifest_file"
|
|
|
|
log_success "Deleted $deleted items, $failed failures"
|
|
}
|
|
|
|
# Clean local project
|
|
if [[ "$CLEAN_LOCAL" == "true" ]]; then
|
|
log_info ""
|
|
log_info "=== Local Project Cleanup ==="
|
|
|
|
# Clean proxmox project
|
|
PROXMOX_CLEANUP="$PROJECT_ROOT/logs/proxmox-cleanup-$(date +%Y%m%d-%H%M%S).txt"
|
|
> "$PROXMOX_CLEANUP"
|
|
|
|
find_cleanup_targets "$PROJECT_ROOT" "proxmox project" | tee -a "$PROXMOX_CLEANUP" | tail -20
|
|
|
|
proxmox_count=$(tail -1 "$PROXMOX_CLEANUP" | grep -oE '[0-9]+' | head -1 || echo "0")
|
|
|
|
# Clean smom-dbis-138 project
|
|
if [[ -d "$PROJECT_ROOT/../smom-dbis-138" ]]; then
|
|
SMOM_CLEANUP="$PROJECT_ROOT/logs/smom-cleanup-$(date +%Y%m%d-%H%M%S).txt"
|
|
> "$SMOM_CLEANUP"
|
|
|
|
find_cleanup_targets "$PROJECT_ROOT/../smom-dbis-138" "smom-dbis-138 project" | tee -a "$SMOM_CLEANUP" | tail -20
|
|
|
|
smom_count=$(tail -1 "$SMOM_CLEANUP" | grep -oE '[0-9]+' | head -1 || echo "0")
|
|
else
|
|
smom_count=0
|
|
fi
|
|
|
|
total_local=$((proxmox_count + smom_count))
|
|
|
|
if [[ "$DRY_RUN" != "true" ]] && [[ $total_local -gt 0 ]]; then
|
|
log_info ""
|
|
log_warn "Executing deletion of $total_local local items..."
|
|
delete_from_manifest "$CLEANUP_MANIFEST" "local project"
|
|
fi
|
|
fi
|
|
|
|
# Clean remote host
|
|
if [[ "$CLEAN_REMOTE" == "true" ]]; then
|
|
log_info ""
|
|
log_info "=== Remote Host Cleanup (ml110) ==="
|
|
|
|
# Test SSH connection
|
|
if ! sshpass -p 'L@kers2010' ssh -o StrictHostKeyChecking=no -o ConnectTimeout=5 \
|
|
"${REMOTE_USER}@${REMOTE_HOST}" "echo 'Connected'" 2>/dev/null; then
|
|
log_warn "Cannot connect to ${REMOTE_HOST}, skipping remote cleanup"
|
|
else
|
|
log_info "Scanning remote host..."
|
|
|
|
# Get list of files to clean on remote
|
|
REMOTE_CLEANUP_LIST=$(sshpass -p 'L@kers2010' ssh -o StrictHostKeyChecking=no \
|
|
"${REMOTE_USER}@${REMOTE_HOST}" "cd /opt && \
|
|
find smom-dbis-138* -type d -name '*backup*' 2>/dev/null && \
|
|
find smom-dbis-138* -type d \( -name '*tmp*' -o -name '*temp*' \) 2>/dev/null && \
|
|
find smom-dbis-138* -type f \( -name '*.bak' -o -name '*.old' -o -name '*~' -o -name '*.swp' \) 2>/dev/null" 2>/dev/null | head -50)
|
|
|
|
remote_count=0
|
|
if [[ -n "$REMOTE_CLEANUP_LIST" ]]; then
|
|
echo "$REMOTE_CLEANUP_LIST" | while IFS= read -r item; do
|
|
if [[ -n "$item" ]]; then
|
|
echo "/opt/$item" >> "$CLEANUP_MANIFEST"
|
|
echo "REMOTE: /opt/$item"
|
|
((remote_count++))
|
|
fi
|
|
done
|
|
|
|
log_info "Found $remote_count items to clean on remote"
|
|
else
|
|
log_info "No cleanup targets found on remote"
|
|
fi
|
|
|
|
if [[ "$DRY_RUN" != "true" ]] && [[ $remote_count -gt 0 ]]; then
|
|
log_info ""
|
|
log_warn "Executing deletion of $remote_count remote items..."
|
|
|
|
# Delete remote files
|
|
sshpass -p 'L@kers2010' ssh -o StrictHostKeyChecking=no \
|
|
"${REMOTE_USER}@${REMOTE_HOST}" "cd /opt && \
|
|
find smom-dbis-138* -type d -name '*backup*' -exec rm -rf {} + 2>/dev/null; \
|
|
find smom-dbis-138* -type d \( -name '*tmp*' -o -name '*temp*' \) -exec rm -rf {} + 2>/dev/null; \
|
|
find smom-dbis-138* -type f \( -name '*.bak' -o -name '*.old' -o -name '*~' -o -name '*.swp' \) -delete 2>/dev/null; \
|
|
echo 'Remote cleanup completed'"
|
|
|
|
log_success "Remote cleanup completed"
|
|
fi
|
|
fi
|
|
fi
|
|
|
|
# Summary
|
|
log_info ""
|
|
log_info "========================================="
|
|
log_info "Cleanup Summary"
|
|
log_info "========================================="
|
|
log_info "Manifest file: $CLEANUP_MANIFEST"
|
|
log_info "Mode: $([ "$DRY_RUN" == "true" ] && echo "DRY-RUN" || echo "EXECUTED")"
|
|
log_info ""
|
|
|
|
if [[ "$DRY_RUN" == "true" ]]; then
|
|
log_warn "This was a DRY-RUN. No files were deleted."
|
|
log_info "Review the manifest file and run with --execute to delete files:"
|
|
log_info " $0 --execute"
|
|
else
|
|
log_success "Cleanup completed. Check manifest for details: $CLEANUP_MANIFEST"
|
|
fi
|
|
|
|
log_info ""
|
|
|