From 3defb09da96dc15d3632c6a8269c85e47cab854a Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Thu, 30 Nov 2023 19:21:57 +0700 Subject: [PATCH] added a button to cancel installation if the package manager on the server is busy --- client/core/servercontroller.cpp | 6 +++--- client/core/servercontroller.h | 2 +- client/ui/controllers/installController.cpp | 3 +++ client/ui/controllers/installController.h | 1 + .../qml/Pages2/PageSetupWizardInstalling.qml | 19 +++++++++++++++++++ client/ui/qml/Pages2/PageSetupWizardStart.qml | 1 + client/ui/qml/Pages2/PageStart.qml | 1 + 7 files changed, 29 insertions(+), 4 deletions(-) diff --git a/client/core/servercontroller.cpp b/client/core/servercontroller.cpp index 398b46b3..5bc5e519 100644 --- a/client/core/servercontroller.cpp +++ b/client/core/servercontroller.cpp @@ -634,9 +634,9 @@ QString ServerController::checkSshConnection(const ServerCredentials &credential return stdOut; } -void ServerController::setCancelInstallation(const bool cancel) +void ServerController::cancelInstallation() { - m_cancelInstallation = cancel; + m_cancelInstallation = true; } ErrorCode ServerController::setupServerFirewall(const ServerCredentials &credentials) @@ -737,6 +737,7 @@ ErrorCode ServerController::isUserInSudo(const ServerCredentials &credentials, D ErrorCode ServerController::isServerDpkgBusy(const ServerCredentials &credentials, DockerContainer container) { + m_cancelInstallation = false; QString stdOut; auto cbReadStdOut = [&](const QString &data, libssh::Client &) { stdOut += data + "\n"; @@ -784,7 +785,6 @@ ErrorCode ServerController::isServerDpkgBusy(const ServerCredentials &credential watcher.setFuture(future); wait.exec(); - m_cancelInstallation = false; emit serverIsBusy(false); return future.result(); diff --git a/client/core/servercontroller.h b/client/core/servercontroller.h index 3191386c..6883274e 100644 --- a/client/core/servercontroller.h +++ b/client/core/servercontroller.h @@ -56,7 +56,7 @@ public: QString checkSshConnection(const ServerCredentials &credentials, ErrorCode *errorCode = nullptr); - void setCancelInstallation(const bool cancel); + void cancelInstallation(); ErrorCode getDecryptedPrivateKey(const ServerCredentials &credentials, QString &decryptedPrivateKey, const std::function &callback); diff --git a/client/ui/controllers/installController.cpp b/client/ui/controllers/installController.cpp index 80e74764..6e898a35 100644 --- a/client/ui/controllers/installController.cpp +++ b/client/ui/controllers/installController.cpp @@ -130,6 +130,7 @@ void InstallController::installServer(DockerContainer container, QJsonObject &co { ServerController serverController(m_settings); connect(&serverController, &ServerController::serverIsBusy, this, &InstallController::serverIsBusy); + connect(this, &InstallController::cancelInstallation, &serverController, &ServerController::cancelInstallation); QMap installedContainers; ErrorCode errorCode = @@ -181,6 +182,7 @@ void InstallController::installContainer(DockerContainer container, QJsonObject ServerController serverController(m_settings); connect(&serverController, &ServerController::serverIsBusy, this, &InstallController::serverIsBusy); + connect(this, &InstallController::cancelInstallation, &serverController, &ServerController::cancelInstallation); QMap installedContainers; ErrorCode errorCode = serverController.getAlreadyInstalledContainers(serverCredentials, installedContainers); @@ -282,6 +284,7 @@ void InstallController::updateContainer(QJsonObject config) ServerController serverController(m_settings); connect(&serverController, &ServerController::serverIsBusy, this, &InstallController::serverIsBusy); + connect(this, &InstallController::cancelInstallation, &serverController, &ServerController::cancelInstallation); auto errorCode = serverController.updateContainer(serverCredentials, container, oldContainerConfig, config); if (errorCode == ErrorCode::NoError) { diff --git a/client/ui/controllers/installController.h b/client/ui/controllers/installController.h index a5fd2875..cd0e6b22 100644 --- a/client/ui/controllers/installController.h +++ b/client/ui/controllers/installController.h @@ -65,6 +65,7 @@ signals: void passphraseRequestFinished(); void serverIsBusy(const bool isBusy); + void cancelInstallation(); void currentContainerUpdated(); diff --git a/client/ui/qml/Pages2/PageSetupWizardInstalling.qml b/client/ui/qml/Pages2/PageSetupWizardInstalling.qml index c82ce855..391d408f 100644 --- a/client/ui/qml/Pages2/PageSetupWizardInstalling.qml +++ b/client/ui/qml/Pages2/PageSetupWizardInstalling.qml @@ -19,6 +19,7 @@ PageType { property bool isTimerRunning: true property string progressBarText: qsTr("Usually it takes no more than 5 minutes") + property bool isCancelButtonVisible: false Connections { target: InstallController @@ -61,11 +62,13 @@ PageType { function onServerIsBusy(isBusy) { if (isBusy) { + root.isCancelButtonVisible = true root.progressBarText = qsTr("Amnezia has detected that your server is currently ") + qsTr("busy installing other software. Amnezia installation ") + qsTr("will pause until the server finishes installing other software") root.isTimerRunning = false } else { + root.isCancelButtonVisible = false root.progressBarText = qsTr("Usually it takes no more than 5 minutes") root.isTimerRunning = true } @@ -150,6 +153,22 @@ PageType { text: root.progressBarText } + + BasicButtonType { + id: cancelIntallationButton + + Layout.fillWidth: true + Layout.topMargin: 24 + + visible: root.isCancelButtonVisible + + text: qsTr("Cancel installation") + + onClicked: { + InstallController.cancelInstallation() + PageController.showBusyIndicator(true) + } + } } } } diff --git a/client/ui/qml/Pages2/PageSetupWizardStart.qml b/client/ui/qml/Pages2/PageSetupWizardStart.qml index 994ec200..2f89bc57 100644 --- a/client/ui/qml/Pages2/PageSetupWizardStart.qml +++ b/client/ui/qml/Pages2/PageSetupWizardStart.qml @@ -60,6 +60,7 @@ PageType { target: InstallController function onInstallationErrorOccurred(errorMessage) { + PageController.showBusyIndicator(false) PageController.showErrorMessage(errorMessage) var currentPageName = stackView.currentItem.objectName diff --git a/client/ui/qml/Pages2/PageStart.qml b/client/ui/qml/Pages2/PageStart.qml index ab02ace4..c92bdb8f 100644 --- a/client/ui/qml/Pages2/PageStart.qml +++ b/client/ui/qml/Pages2/PageStart.qml @@ -82,6 +82,7 @@ PageType { target: InstallController function onInstallationErrorOccurred(errorMessage) { + PageController.showBusyIndicator(false) PageController.showErrorMessage(errorMessage) var needCloseCurrentPage = false