94 lines
2.6 KiB
Bash
Executable File
94 lines
2.6 KiB
Bash
Executable File
#!/bin/bash
|
|
# Database Cleanup Script
|
|
# Scans database for missing files and removes their references
|
|
# Runs via systemd timer nightly at 3:00 AM
|
|
|
|
set -e
|
|
|
|
# Configuration
|
|
API_URL="http://localhost:8000/api/maintenance/cleanup/missing-files"
|
|
STATUS_URL="http://localhost:8000/api/maintenance/cleanup/status"
|
|
LOG_FILE="/opt/media-downloader/logs/db-cleanup.log"
|
|
TOKEN_SCRIPT="/opt/media-downloader/scripts/get-api-token.sh"
|
|
|
|
# Logging function
|
|
log() {
|
|
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
|
|
}
|
|
|
|
# Get API token
|
|
if [ ! -f "$TOKEN_SCRIPT" ]; then
|
|
log "ERROR: API token script not found at $TOKEN_SCRIPT"
|
|
exit 1
|
|
fi
|
|
|
|
$TOKEN_SCRIPT > /dev/null 2>&1
|
|
TOKEN=$(cat /tmp/api_token.txt 2>/dev/null)
|
|
if [ -z "$TOKEN" ]; then
|
|
log "ERROR: Failed to get API token"
|
|
exit 1
|
|
fi
|
|
|
|
log "Starting database cleanup (dry_run=false)"
|
|
|
|
# Start cleanup
|
|
RESPONSE=$(curl -s -X POST "$API_URL" \
|
|
-H "Content-Type: application/json" \
|
|
-H "Authorization: Bearer $TOKEN" \
|
|
-d '{"dry_run": false}')
|
|
|
|
if [ $? -ne 0 ]; then
|
|
log "ERROR: Failed to start cleanup"
|
|
exit 1
|
|
fi
|
|
|
|
log "Cleanup started, waiting for completion..."
|
|
|
|
# Poll for status
|
|
MAX_WAIT=300 # 5 minutes max
|
|
WAITED=0
|
|
INTERVAL=5
|
|
|
|
while [ $WAITED -lt $MAX_WAIT ]; do
|
|
sleep $INTERVAL
|
|
WAITED=$((WAITED + INTERVAL))
|
|
|
|
STATUS=$(curl -s "$STATUS_URL" -H "Authorization: Bearer $TOKEN")
|
|
|
|
STATUS_CODE=$(echo "$STATUS" | grep -o '"status":"[^"]*"' | cut -d'"' -f4)
|
|
|
|
case "$STATUS_CODE" in
|
|
"completed")
|
|
TOTAL_CHECKED=$(echo "$STATUS" | grep -o '"total_checked":[0-9]*' | cut -d':' -f2)
|
|
TOTAL_MISSING=$(echo "$STATUS" | grep -o '"total_missing":[0-9]*' | cut -d':' -f2)
|
|
TOTAL_REMOVED=$(echo "$STATUS" | grep -o '"total_removed":[0-9]*' | cut -d':' -f2)
|
|
DURATION=$(echo "$STATUS" | grep -o '"duration_seconds":[0-9.]*' | cut -d':' -f2)
|
|
|
|
log "SUCCESS: Cleanup completed"
|
|
log " Checked: $TOTAL_CHECKED files"
|
|
log " Missing: $TOTAL_MISSING files"
|
|
log " Removed: $TOTAL_REMOVED references"
|
|
log " Duration: ${DURATION}s"
|
|
exit 0
|
|
;;
|
|
"failed")
|
|
ERROR=$(echo "$STATUS" | grep -o '"error":"[^"]*"' | cut -d'"' -f4)
|
|
log "ERROR: Cleanup failed - $ERROR"
|
|
exit 1
|
|
;;
|
|
"running")
|
|
log "Still running... (${WAITED}s elapsed)"
|
|
;;
|
|
"no_scan")
|
|
log "ERROR: Cleanup job not found"
|
|
exit 1
|
|
;;
|
|
*)
|
|
log "WARNING: Unknown status - $STATUS_CODE"
|
|
;;
|
|
esac
|
|
done
|
|
|
|
log "ERROR: Cleanup timed out after ${MAX_WAIT}s"
|
|
exit 1
|