infra/scripts/cleanup-L0.sh
#!/bin/bash
################################################################################
# CLEANUP L0 — Безопасная автоматическая очистка
#
# Запускается автоматически монитором при disk >= 90%
# Не требует подтверждения, не удаляет важные данные
#
# Освобождает: 100-500 MB обычно
################################################################################

# Загрузка переменных платформы
source /opt/claude-workspace/system/config/platform-vars.sh 2>/dev/null || {
    WORKSPACE=${WORKSPACE:-/opt/claude-workspace}
}

set -u

# Функции логирования
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"
}

get_disk_usage() {
    df -h / | awk 'NR==2 {print $5}' | sed 's/%//'
}

# Начало
log "=== L0: Безопасная очистка запущена ==="
DISK_BEFORE=$(get_disk_usage)
log "Диск ДО очистки: ${DISK_BEFORE}%"

# 1. /tmp старше 7 дней
log "Очистка /tmp..."
find /tmp -type f -mtime +7 -delete 2>/dev/null
find /tmp -type d -empty -delete 2>/dev/null
log "✓ /tmp очищен"

# 2. APT кэш
log "Очистка APT cache..."
apt-get clean -y >/dev/null 2>&1
apt-get autoclean -y >/dev/null 2>&1
log "✓ APT cache очищен"

# 3. PIP кэш
log "Очистка PIP cache..."
rm -rf ~/.cache/pip/* 2>/dev/null
rm -rf /root/.cache/pip/* 2>/dev/null
log "✓ PIP cache очищен"

# 4. NPM кэш (если есть)
if command -v npm >/dev/null 2>&1; then
    log "Очистка NPM cache..."
    npm cache clean --force >/dev/null 2>&1
    log "✓ NPM cache очищен"
fi

# 5. Docker (только dangling)
if command -v docker >/dev/null 2>&1; then
    log "Очистка Docker (dangling)..."
    docker image prune -f >/dev/null 2>&1
    docker volume prune -f >/dev/null 2>&1
    docker container prune -f >/dev/null 2>&1
    log "✓ Docker dangling очищен"
fi

# 6. Journald
log "Очистка journald..."
journalctl --vacuum-size=500M >/dev/null 2>&1
log "✓ Journald очищен (до 500M)"

# 7. Логи ротированные
log "Очистка старых логов..."
find /var/log -name "*.gz" -mtime +7 -delete 2>/dev/null
find /var/log -name "*.1" -mtime +7 -exec truncate -s 0 {} \; 2>/dev/null
find /var/log -name "*.2" -mtime +7 -exec truncate -s 0 {} \; 2>/dev/null
log "✓ Старые логи очищены"

# 8. Claude логи
if [ -d "$WORKSPACE/.logs" ]; then
    log "Очистка Claude логов..."
    find $WORKSPACE/.logs -name "*.log" -mtime +7 -delete 2>/dev/null
    log "✓ Claude логи очищены"
fi

# 9. Claude temp
log "Очистка Claude temp..."
find /tmp -name "claude-*" -mtime +3 -type f -delete 2>/dev/null
find /tmp -name "claude-*" -type d -empty -delete 2>/dev/null
log "✓ Claude temp очищен"

# 10. Старые core dumps
log "Очистка core dumps..."
find /var/crash -type f -delete 2>/dev/null
log "✓ Core dumps очищены"

# Результат
sleep 2
DISK_AFTER=$(get_disk_usage)
FREED=$((DISK_BEFORE - DISK_AFTER))

log "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
log "Диск ДО:    ${DISK_BEFORE}%"
log "Диск ПОСЛЕ: ${DISK_AFTER}%"
log "Освобождено: ${FREED}%"
log "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"

if [ "$DISK_AFTER" -lt 85 ]; then
    log "✅ Успех: диск в норме (${DISK_AFTER}%)"
    exit 0
elif [ "$FREED" -gt 0 ]; then
    log "⚠️  Частичный успех: освобождено ${FREED}%, но всё ещё ${DISK_AFTER}%"
    log "💡 Рекомендация: запустить cleanup-L1.sh вручную"
    exit 0
else
    log "❌ Очистка не помогла: ${DISK_AFTER}%"
    log "🔴 Требуется ручная очистка (L1 или L2)"
    exit 1
fi