Backups können gelöscht werden
Dieser Commit ist enthalten in:
@@ -3024,6 +3024,62 @@ def download_backup(backup_id):
|
||||
|
||||
return send_file(filepath, as_attachment=True, download_name=filename)
|
||||
|
||||
@app.route("/backup/delete/<int:backup_id>", methods=["DELETE"])
|
||||
@login_required
|
||||
def delete_backup(backup_id):
|
||||
"""Löscht ein Backup"""
|
||||
conn = get_connection()
|
||||
cur = conn.cursor()
|
||||
|
||||
try:
|
||||
# Backup-Informationen abrufen
|
||||
cur.execute("""
|
||||
SELECT filename, filepath
|
||||
FROM backup_history
|
||||
WHERE id = %s
|
||||
""", (backup_id,))
|
||||
backup_info = cur.fetchone()
|
||||
|
||||
if not backup_info:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': 'Backup nicht gefunden'
|
||||
}), 404
|
||||
|
||||
filename, filepath = backup_info
|
||||
filepath = Path(filepath)
|
||||
|
||||
# Datei löschen, wenn sie existiert
|
||||
if filepath.exists():
|
||||
filepath.unlink()
|
||||
|
||||
# Aus Datenbank löschen
|
||||
cur.execute("""
|
||||
DELETE FROM backup_history
|
||||
WHERE id = %s
|
||||
""", (backup_id,))
|
||||
|
||||
conn.commit()
|
||||
|
||||
# Audit-Log
|
||||
log_audit('DELETE', 'backup', backup_id,
|
||||
additional_info=f"Backup gelöscht: {filename}")
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'message': f'Backup "{filename}" wurde erfolgreich gelöscht'
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
conn.rollback()
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'message': f'Fehler beim Löschen des Backups: {str(e)}'
|
||||
}), 500
|
||||
finally:
|
||||
cur.close()
|
||||
conn.close()
|
||||
|
||||
@app.route("/security/blocked-ips")
|
||||
@login_required
|
||||
def blocked_ips():
|
||||
|
||||
@@ -131,6 +131,11 @@
|
||||
title="Backup wiederherstellen">
|
||||
🔄 Wiederherstellen
|
||||
</button>
|
||||
<button class="btn btn-outline-danger"
|
||||
onclick="deleteBackup({{ backup[0] }}, '{{ backup[1] }}')"
|
||||
title="Backup löschen">
|
||||
🗑️ Löschen
|
||||
</button>
|
||||
</div>
|
||||
{% endif %}
|
||||
</td>
|
||||
@@ -268,5 +273,30 @@ function confirmRestore() {
|
||||
document.body.removeChild(loadingDiv);
|
||||
});
|
||||
}
|
||||
|
||||
function deleteBackup(backupId, filename) {
|
||||
if (!confirm(`Soll das Backup "${filename}" wirklich gelöscht werden?\n\nDieser Vorgang kann nicht rückgängig gemacht werden!`)) {
|
||||
return;
|
||||
}
|
||||
|
||||
fetch(`/backup/delete/${backupId}`, {
|
||||
method: 'DELETE',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
}
|
||||
})
|
||||
.then(response => response.json())
|
||||
.then(data => {
|
||||
if (data.success) {
|
||||
alert('✅ ' + data.message);
|
||||
location.reload();
|
||||
} else {
|
||||
alert('❌ ' + data.message);
|
||||
}
|
||||
})
|
||||
.catch(error => {
|
||||
alert('❌ Fehler beim Löschen des Backups: ' + error);
|
||||
});
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren