🎉 Refactor database logs and cleanup temporary files 🎇
This commit is contained in:
238
backend/app.py
238
backend/app.py
@@ -5048,6 +5048,244 @@ def admin_advanced_settings():
|
||||
flash('Fehler beim Laden der erweiterten Einstellungen', 'error')
|
||||
return redirect(url_for('admin_page'))
|
||||
|
||||
@app.route('/api/admin/maintenance/cleanup-logs', methods=['POST'])
|
||||
@login_required
|
||||
@admin_required
|
||||
def api_cleanup_logs():
|
||||
"""Bereinigt alte Log-Dateien"""
|
||||
try:
|
||||
app_logger.info(f"📋 Log-Bereinigung gestartet von Benutzer {current_user.username}")
|
||||
|
||||
cleanup_results = {
|
||||
'files_removed': 0,
|
||||
'space_freed_mb': 0,
|
||||
'directories_cleaned': [],
|
||||
'errors': []
|
||||
}
|
||||
|
||||
# Log-Verzeichnis bereinigen
|
||||
logs_dir = os.path.join(app.root_path, 'logs')
|
||||
if os.path.exists(logs_dir):
|
||||
cutoff_date = datetime.now() - timedelta(days=30)
|
||||
|
||||
for root, dirs, files in os.walk(logs_dir):
|
||||
for file in files:
|
||||
if file.endswith('.log'):
|
||||
file_path = os.path.join(root, file)
|
||||
try:
|
||||
file_time = datetime.fromtimestamp(os.path.getctime(file_path))
|
||||
if file_time < cutoff_date:
|
||||
file_size = os.path.getsize(file_path)
|
||||
os.remove(file_path)
|
||||
cleanup_results['files_removed'] += 1
|
||||
cleanup_results['space_freed_mb'] += file_size / (1024 * 1024)
|
||||
except Exception as e:
|
||||
cleanup_results['errors'].append(f"Fehler bei {file}: {str(e)}")
|
||||
|
||||
# Verzeichnis zu bereinigten hinzufügen
|
||||
rel_dir = os.path.relpath(root, logs_dir)
|
||||
if rel_dir != '.' and rel_dir not in cleanup_results['directories_cleaned']:
|
||||
cleanup_results['directories_cleaned'].append(rel_dir)
|
||||
|
||||
# Temporäre Upload-Dateien bereinigen (älter als 7 Tage)
|
||||
uploads_temp_dir = os.path.join(app.root_path, 'uploads', 'temp')
|
||||
if os.path.exists(uploads_temp_dir):
|
||||
temp_cutoff_date = datetime.now() - timedelta(days=7)
|
||||
|
||||
for root, dirs, files in os.walk(uploads_temp_dir):
|
||||
for file in files:
|
||||
file_path = os.path.join(root, file)
|
||||
try:
|
||||
file_time = datetime.fromtimestamp(os.path.getctime(file_path))
|
||||
if file_time < temp_cutoff_date:
|
||||
file_size = os.path.getsize(file_path)
|
||||
os.remove(file_path)
|
||||
cleanup_results['files_removed'] += 1
|
||||
cleanup_results['space_freed_mb'] += file_size / (1024 * 1024)
|
||||
except Exception as e:
|
||||
cleanup_results['errors'].append(f"Temp-Datei {file}: {str(e)}")
|
||||
|
||||
cleanup_results['space_freed_mb'] = round(cleanup_results['space_freed_mb'], 2)
|
||||
|
||||
app_logger.info(f"✅ Log-Bereinigung abgeschlossen: {cleanup_results['files_removed']} Dateien entfernt, {cleanup_results['space_freed_mb']} MB freigegeben")
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'message': f'Log-Bereinigung erfolgreich: {cleanup_results["files_removed"]} Dateien entfernt',
|
||||
'details': cleanup_results
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
app_logger.error(f"❌ Fehler bei Log-Bereinigung: {str(e)}")
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'Fehler bei der Log-Bereinigung: {str(e)}'
|
||||
}), 500
|
||||
|
||||
@app.route('/api/admin/maintenance/system-check', methods=['POST'])
|
||||
@login_required
|
||||
@admin_required
|
||||
def api_system_check():
|
||||
"""Führt eine System-Integritätsprüfung durch"""
|
||||
try:
|
||||
app_logger.info(f"🔍 System-Integritätsprüfung gestartet von Benutzer {current_user.username}")
|
||||
|
||||
check_results = {
|
||||
'database_integrity': False,
|
||||
'file_permissions': False,
|
||||
'disk_space': False,
|
||||
'memory_usage': False,
|
||||
'critical_files': False,
|
||||
'errors': [],
|
||||
'warnings': [],
|
||||
'details': {}
|
||||
}
|
||||
|
||||
# 1. Datenbank-Integritätsprüfung
|
||||
try:
|
||||
db_session = get_db_session()
|
||||
|
||||
# Einfache Abfrage zur Überprüfung der DB-Verbindung
|
||||
user_count = db_session.query(User).count()
|
||||
printer_count = db_session.query(Printer).count()
|
||||
|
||||
check_results['database_integrity'] = True
|
||||
check_results['details']['database'] = {
|
||||
'users': user_count,
|
||||
'printers': printer_count,
|
||||
'connection': 'OK'
|
||||
}
|
||||
|
||||
db_session.close()
|
||||
|
||||
except Exception as e:
|
||||
check_results['errors'].append(f"Datenbank-Integritätsprüfung: {str(e)}")
|
||||
check_results['details']['database'] = {'error': str(e)}
|
||||
|
||||
# 2. Festplattenspeicher prüfen
|
||||
try:
|
||||
import shutil
|
||||
total, used, free = shutil.disk_usage(app.root_path)
|
||||
|
||||
free_gb = free / (1024**3)
|
||||
used_percent = (used / total) * 100
|
||||
|
||||
check_results['disk_space'] = free_gb > 1.0 # Mindestens 1GB frei
|
||||
check_results['details']['disk_space'] = {
|
||||
'free_gb': round(free_gb, 2),
|
||||
'used_percent': round(used_percent, 2),
|
||||
'total_gb': round(total / (1024**3), 2)
|
||||
}
|
||||
|
||||
if used_percent > 90:
|
||||
check_results['warnings'].append(f"Festplatte zu {used_percent:.1f}% belegt")
|
||||
|
||||
except Exception as e:
|
||||
check_results['errors'].append(f"Festplattenspeicher-Prüfung: {str(e)}")
|
||||
|
||||
# 3. Speicherverbrauch prüfen
|
||||
try:
|
||||
import psutil
|
||||
memory = psutil.virtual_memory()
|
||||
|
||||
check_results['memory_usage'] = memory.percent < 90
|
||||
check_results['details']['memory'] = {
|
||||
'used_percent': round(memory.percent, 2),
|
||||
'available_gb': round(memory.available / (1024**3), 2),
|
||||
'total_gb': round(memory.total / (1024**3), 2)
|
||||
}
|
||||
|
||||
if memory.percent > 85:
|
||||
check_results['warnings'].append(f"Speicherverbrauch bei {memory.percent:.1f}%")
|
||||
|
||||
except ImportError:
|
||||
check_results['warnings'].append("psutil nicht verfügbar - Speicherprüfung übersprungen")
|
||||
except Exception as e:
|
||||
check_results['errors'].append(f"Speicher-Prüfung: {str(e)}")
|
||||
|
||||
# 4. Kritische Dateien prüfen
|
||||
try:
|
||||
critical_files = [
|
||||
'app.py',
|
||||
'models.py',
|
||||
'requirements.txt',
|
||||
os.path.join('instance', 'database.db')
|
||||
]
|
||||
|
||||
missing_files = []
|
||||
for file_path in critical_files:
|
||||
full_path = os.path.join(app.root_path, file_path)
|
||||
if not os.path.exists(full_path):
|
||||
missing_files.append(file_path)
|
||||
|
||||
check_results['critical_files'] = len(missing_files) == 0
|
||||
check_results['details']['critical_files'] = {
|
||||
'checked': len(critical_files),
|
||||
'missing': missing_files
|
||||
}
|
||||
|
||||
if missing_files:
|
||||
check_results['errors'].append(f"Fehlende kritische Dateien: {', '.join(missing_files)}")
|
||||
|
||||
except Exception as e:
|
||||
check_results['errors'].append(f"Datei-Prüfung: {str(e)}")
|
||||
|
||||
# 5. Dateiberechtigungen prüfen
|
||||
try:
|
||||
test_dirs = ['logs', 'uploads', 'instance']
|
||||
permission_issues = []
|
||||
|
||||
for dir_name in test_dirs:
|
||||
dir_path = os.path.join(app.root_path, dir_name)
|
||||
if os.path.exists(dir_path):
|
||||
if not os.access(dir_path, os.W_OK):
|
||||
permission_issues.append(dir_name)
|
||||
|
||||
check_results['file_permissions'] = len(permission_issues) == 0
|
||||
check_results['details']['file_permissions'] = {
|
||||
'checked_directories': test_dirs,
|
||||
'permission_issues': permission_issues
|
||||
}
|
||||
|
||||
if permission_issues:
|
||||
check_results['errors'].append(f"Schreibrechte fehlen: {', '.join(permission_issues)}")
|
||||
|
||||
except Exception as e:
|
||||
check_results['errors'].append(f"Berechtigungs-Prüfung: {str(e)}")
|
||||
|
||||
# Gesamtergebnis bewerten
|
||||
passed_checks = sum([
|
||||
check_results['database_integrity'],
|
||||
check_results['file_permissions'],
|
||||
check_results['disk_space'],
|
||||
check_results['memory_usage'],
|
||||
check_results['critical_files']
|
||||
])
|
||||
|
||||
total_checks = 5
|
||||
success_rate = (passed_checks / total_checks) * 100
|
||||
|
||||
check_results['overall_health'] = 'excellent' if success_rate >= 100 else \
|
||||
'good' if success_rate >= 80 else \
|
||||
'warning' if success_rate >= 60 else 'critical'
|
||||
|
||||
check_results['success_rate'] = round(success_rate, 1)
|
||||
|
||||
app_logger.info(f"✅ System-Integritätsprüfung abgeschlossen: {success_rate:.1f}% ({passed_checks}/{total_checks} Tests bestanden)")
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'message': f'System-Integritätsprüfung abgeschlossen: {success_rate:.1f}% Erfolgsrate',
|
||||
'details': check_results
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
app_logger.error(f"❌ Fehler bei System-Integritätsprüfung: {str(e)}")
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'Fehler bei der System-Integritätsprüfung: {str(e)}'
|
||||
}), 500
|
||||
|
||||
# ===== OPTIMIERUNGS-ALGORITHMUS-FUNKTIONEN =====
|
||||
|
||||
def apply_round_robin_optimization(jobs, printers, db_session):
|
||||
|
Reference in New Issue
Block a user