From 0ca5279e02534f1ea71818a43e3e76c5d699b7eb Mon Sep 17 00:00:00 2001 From: NickVs2015 Date: Fri, 22 May 2026 15:24:01 +0300 Subject: [PATCH] fix: adapt ServersBackupController to new codebase after rebase - Remove deleted ServerController dependency; implement runHostScript, downloadFileFromHost, uploadFileToHostPublic directly using SshSession and libssh::Client which are the current SSH abstractions - Change constructor from std::shared_ptr to QPointer to match CoreController's settings type - Register PageSettingsServerBackup, PageSettingsServerBackupRestored, PageSettingsServerRestoreMode in qml.qrc (were in resources.qrc which was removed from the codebase) --- .../controllers/serversBackupController.cpp | 56 +++++++++++++++---- .../ui/controllers/serversBackupController.h | 18 ++++-- client/ui/qml/qml.qrc | 3 + 3 files changed, 62 insertions(+), 15 deletions(-) diff --git a/client/ui/controllers/serversBackupController.cpp b/client/ui/controllers/serversBackupController.cpp index 2bb7c405f..1be4b4d6a 100644 --- a/client/ui/controllers/serversBackupController.cpp +++ b/client/ui/controllers/serversBackupController.cpp @@ -1,4 +1,6 @@ #include "serversBackupController.h" +#include "secureQSettings.h" +#include "core/utils/utilities.h" #include #include #include @@ -24,11 +26,10 @@ #include "ui/models/servers_model.h" #include "ui/models/containers_model.h" -ServersBackupController::ServersBackupController(std::shared_ptr settings, ServersModel *serversModel, QObject *parent) +ServersBackupController::ServersBackupController(SecureQSettings *settings, ServersModel *serversModel, QObject *parent) : QObject(parent) , m_settings(settings) , m_serversModel(serversModel) - , m_serverController(new ServerController(settings, this)) , m_status(Idle) , m_backupDir("/var/backups/amnezia") , m_restoreReplaceMode(false) @@ -87,7 +88,7 @@ void ServersBackupController::createBackup(const ServerCredentials &credentials) }; // Run script on server - ErrorCode error = m_serverController->runHostScript(credentials, script, cbStdOut, cbStdErr); + ErrorCode error = runHostScript(credentials, script, cbStdOut, cbStdErr); if (error == ErrorCode::NoError) { // Parse created backup name from output: format "IP_ADDRESS - DD-MM-YYYY_HH-MM-SS.tgz" @@ -165,7 +166,7 @@ void ServersBackupController::createContainerBackup(const ServerCredentials &cre return handleStdErr(data, m_currentError); }; - ErrorCode error = m_serverController->runHostScript(credentials, script, cbStdOut, cbStdErr); + ErrorCode error = runHostScript(credentials, script, cbStdOut, cbStdErr); if (error == ErrorCode::NoError) { // Parse created backup name from output: format "IP_ADDRESS - DD-MM-YYYY_HH-MM-SS.tgz" @@ -221,7 +222,7 @@ void ServersBackupController::createContainersBackup(const ServerCredentials &cr return handleStdErr(data, m_currentError); }; - ErrorCode error = m_serverController->runHostScript(credentials, script, cbStdOut, cbStdErr); + ErrorCode error = runHostScript(credentials, script, cbStdOut, cbStdErr); if (error == ErrorCode::NoError) { // Parse created backup name from output: format "IP_ADDRESS - DD-MM-YYYY_HH-MM-SS.tgz" @@ -268,7 +269,7 @@ void ServersBackupController::fetchBackupList(const ServerCredentials &credentia return handleStdErr(data, m_currentError); }; - ErrorCode error = m_serverController->runHostScript(credentials, script, cbStdOut, cbStdErr); + ErrorCode error = runHostScript(credentials, script, cbStdOut, cbStdErr); if (error == ErrorCode::NoError) { QList backups = parseBackupList(m_currentOutput); @@ -310,7 +311,7 @@ void ServersBackupController::restoreBackup(const ServerCredentials &credentials return handleStdErr(data, m_currentError); }; - ErrorCode error = m_serverController->runHostScript(credentials, script, cbStdOut, cbStdErr); + ErrorCode error = runHostScript(credentials, script, cbStdOut, cbStdErr); // Check output for errors, even if script exited with code 0 bool hasError = m_currentOutput.contains("[ERROR]") || @@ -362,7 +363,7 @@ void ServersBackupController::checkBackupStatus(const ServerCredentials &credent return handleStdErr(data, m_currentError); }; - ErrorCode error = m_serverController->runHostScript(credentials, script, cbStdOut, cbStdErr); + ErrorCode error = runHostScript(credentials, script, cbStdOut, cbStdErr); if (error == ErrorCode::NoError) { QJsonObject status = parseBackupStatus(m_currentOutput); @@ -438,7 +439,7 @@ void ServersBackupController::downloadBackup(const ServerCredentials &credential setProgress(25, tr("Starting file transfer...")); - ErrorCode error = m_serverController->downloadFileFromHost(credentials, remotePath, actualLocalPath); + ErrorCode error = downloadFileFromHost(credentials, remotePath, actualLocalPath); if (error == ErrorCode::NoError) { // qDebug() << "Backup downloaded to:" << actualLocalPath; @@ -582,7 +583,7 @@ void ServersBackupController::uploadBackup(const ServerCredentials &credentials, setProgress(25, tr("Starting file transfer...")); - ErrorCode error = m_serverController->uploadFileToHostPublic(credentials, actualLocalPath, remotePath, + ErrorCode error = uploadFileToHostPublic(credentials, actualLocalPath, remotePath, libssh::ScpOverwriteMode::ScpOverwriteExisting); qDebug() << "Upload result, error code:" << static_cast(error); @@ -763,7 +764,7 @@ void ServersBackupController::deleteBackup(const ServerCredentials &credentials, return handleStdErr(data, m_currentError); }; - ErrorCode error = m_serverController->runHostScript(credentials, script, cbStdOut, cbStdErr); + ErrorCode error = runHostScript(credentials, script, cbStdOut, cbStdErr); if (error == ErrorCode::NoError) { setStatus(Success); @@ -1482,3 +1483,36 @@ void ServersBackupController::trySetDefaultContainer() emit defaultServerAndContainerSet(); } } + +ErrorCode ServersBackupController::runHostScript(const ServerCredentials &credentials, const QString &script, + const std::function &cbStdOut, + const std::function &cbStdErr) +{ + const QString fileName = "/tmp/amnezia_" + Utils::getRandomString(16) + ".sh"; + ErrorCode e = m_sshSession.uploadFileToHost(credentials, script.toUtf8(), fileName); + if (e != ErrorCode::NoError) + return e; + + e = m_sshSession.runScript(credentials, QString("sudo bash %1").arg(fileName), cbStdOut, cbStdErr); + m_sshSession.runScript(credentials, QString("sudo rm -f %1").arg(fileName)); + return e; +} + +ErrorCode ServersBackupController::downloadFileFromHost(const ServerCredentials &credentials, const QString &remotePath, const QString &localPath) +{ + libssh::Client sshClient; + ErrorCode e = sshClient.connectToHost(credentials); + if (e != ErrorCode::NoError) + return e; + return sshClient.scpFileDownload(remotePath, localPath); +} + +ErrorCode ServersBackupController::uploadFileToHostPublic(const ServerCredentials &credentials, const QString &localPath, const QString &remotePath, + libssh::ScpOverwriteMode overwriteMode) +{ + libssh::Client sshClient; + ErrorCode e = sshClient.connectToHost(credentials); + if (e != ErrorCode::NoError) + return e; + return sshClient.scpFileCopy(overwriteMode, localPath, remotePath, "backup_file"); +} diff --git a/client/ui/controllers/serversBackupController.h b/client/ui/controllers/serversBackupController.h index f253d452b..defd29f87 100644 --- a/client/ui/controllers/serversBackupController.h +++ b/client/ui/controllers/serversBackupController.h @@ -10,10 +10,13 @@ class QTemporaryFile; class ServersModel; +class SecureQSettings; + +#include -#include "core/controllers/serverController.h" #include "core/defs.h" #include "containers/containers_defs.h" +#include "core/utils/selfhosted/sshSession.h" using namespace amnezia; @@ -31,7 +34,7 @@ class ServersBackupController : public QObject Q_OBJECT public: - explicit ServersBackupController(std::shared_ptr settings, ServersModel *serversModel, QObject *parent = nullptr); + explicit ServersBackupController(SecureQSettings *settings, ServersModel *serversModel, QObject *parent = nullptr); ~ServersBackupController(); /** @@ -360,10 +363,17 @@ private: */ void trySetDefaultContainer(); + ErrorCode runHostScript(const ServerCredentials &credentials, const QString &script, + const std::function &cbStdOut = nullptr, + const std::function &cbStdErr = nullptr); + ErrorCode downloadFileFromHost(const ServerCredentials &credentials, const QString &remotePath, const QString &localPath); + ErrorCode uploadFileToHostPublic(const ServerCredentials &credentials, const QString &localPath, const QString &remotePath, + libssh::ScpOverwriteMode overwriteMode = libssh::ScpOverwriteMode::ScpOverwriteExisting); + private: - std::shared_ptr m_settings; + QPointer m_settings; ServersModel *m_serversModel; - ServerController *m_serverController; + SshSession m_sshSession; BackupStatus m_status; QString m_backupDir; QString m_currentOutput; diff --git a/client/ui/qml/qml.qrc b/client/ui/qml/qml.qrc index b7e65a681..640155280 100644 --- a/client/ui/qml/qml.qrc +++ b/client/ui/qml/qml.qrc @@ -106,8 +106,11 @@ Pages2/PageSettingsKillSwitch.qml Pages2/PageSettingsKillSwitchExceptions.qml Pages2/PageSettingsLogging.qml + Pages2/PageSettingsServerBackup.qml + Pages2/PageSettingsServerBackupRestored.qml Pages2/PageSettingsServerData.qml Pages2/PageSettingsServerInfo.qml + Pages2/PageSettingsServerRestoreMode.qml Pages2/PageSettingsServerProtocol.qml Pages2/PageSettingsServerProtocols.qml Pages2/PageSettingsServerServices.qml