Backups können gelöscht werden

Dieser Commit ist enthalten in:
2025-06-10 00:10:17 +02:00
Ursprung dfd6b72173
Commit 7f9849d879
6 geänderte Dateien mit 86 neuen und 4 gelöschten Zeilen

Datei anzeigen

@@ -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():

Datei anzeigen

@@ -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 %}