This commit is contained in:
maziggy
2026-02-03 12:40:01 +01:00
parent e9e49768fe
commit 89b19cbe4f
6 changed files with 50 additions and 42 deletions
+45 -37
View File
@@ -340,47 +340,55 @@ async def restore_backup(
if not backup_db.exists():
raise HTTPException(400, "Invalid backup: missing bambuddy.db")
# 3. Stop virtual printer if running (releases file locks)
vp_was_enabled = virtual_printer_manager.is_enabled
if vp_was_enabled:
await virtual_printer_manager.configure(enabled=False)
# 4. Close current database connections
await close_all_connections()
# 5. Replace database
shutil.copy2(backup_db, db_path)
# 6. Replace data directories
dirs_to_restore = [
("archive", base_dir / "archive"),
("virtual_printer", base_dir / "virtual_printer"),
("plate_calibration", app_settings.plate_calibration_dir),
("icons", base_dir / "icons"),
("projects", base_dir / "projects"),
]
for name, dest_dir in dirs_to_restore:
src_dir = temp_path / name
if src_dir.exists():
if dest_dir.exists():
shutil.rmtree(dest_dir)
shutil.copytree(src_dir, dest_dir)
# 7. Restart virtual printer if it was running before
if vp_was_enabled:
try:
# 3. Stop virtual printer if running (releases file locks)
try:
await virtual_printer_manager.configure(enabled=True)
if virtual_printer_manager.is_enabled:
logger.info("Stopping virtual printer for restore...")
await virtual_printer_manager.configure(enabled=False)
except Exception as e:
logger.warning(f"Failed to restart virtual printer after restore: {e}")
logger.warning(f"Failed to stop virtual printer: {e}")
# 8. Note: Database connection will be reinitialized on restart
# The application should be restarted after restore
# 4. Close current database connections
logger.info("Closing database connections...")
await close_all_connections()
return {
"success": True,
"message": "Backup restored successfully. Please restart Bambuddy for changes to take effect.",
}
# 5. Replace database
logger.info("Restoring database from backup...")
shutil.copy2(backup_db, db_path)
# 6. Replace data directories
dirs_to_restore = [
("archive", base_dir / "archive"),
("virtual_printer", base_dir / "virtual_printer"),
("plate_calibration", app_settings.plate_calibration_dir),
("icons", base_dir / "icons"),
("projects", base_dir / "projects"),
]
for name, dest_dir in dirs_to_restore:
src_dir = temp_path / name
if src_dir.exists():
logger.info(f"Restoring {name} directory...")
if dest_dir.exists():
shutil.rmtree(dest_dir)
shutil.copytree(src_dir, dest_dir)
# 7. Note: Virtual printer and database will be reinitialized on restart
# Do NOT try to restart services here - the database session is closed
logger.info("Restore complete - restart required")
return {
"success": True,
"message": "Backup restored successfully. Please restart Bambuddy for changes to take effect.",
}
except Exception as e:
logger.error(f"Restore failed: {e}")
return JSONResponse(
status_code=500,
content={"success": False, "message": f"Restore failed: {str(e)}"},
)
@router.get("/virtual-printer/models")
+1 -1
View File
@@ -2253,7 +2253,7 @@ export default {
restoreSuccess: 'Sicherung erfolgreich wiederhergestellt',
backupFailed: 'Sicherung fehlgeschlagen',
restoreFailed: 'Wiederherstellung fehlgeschlagen',
restoreNote: 'Virtueller Drucker wird nach der Wiederherstellung neu gestartet',
restoreNote: 'Virtueller Drucker wird während der Wiederherstellung gestoppt',
},
// Tags
+1 -1
View File
@@ -2253,7 +2253,7 @@ export default {
restoreSuccess: 'Backup restored successfully',
backupFailed: 'Backup failed',
restoreFailed: 'Restore failed',
restoreNote: 'Virtual Printer will be restarted after restore',
restoreNote: 'Virtual Printer will be stopped during restore',
},
// Tags
+1 -1
View File
@@ -1786,7 +1786,7 @@ export default {
apiKeysDescription: 'Webhook APIキー(インポート時に新しいキーが生成されます)',
restoreBackup: 'バックアップの復元',
restoreDescription: 'バックアップファイルからすべてのデータを置き換える',
restoreNote: '復元後、仮想プリンターが再起動されます',
restoreNote: '復元中、仮想プリンターは停止されます',
},
// Restore modal
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -23,7 +23,7 @@
<!-- Splash screens for iOS -->
<link rel="apple-touch-startup-image" href="/img/android-chrome-512x512.png" />
<script type="module" crossorigin src="/assets/index-D8xEJ4tS.js"></script>
<script type="module" crossorigin src="/assets/index-CKG31ANB.js"></script>
<link rel="stylesheet" crossorigin href="/assets/index-DME4t7XG.css">
</head>
<body>