diff --git a/client/core/controllers/selfhosted/installController.cpp b/client/core/controllers/selfhosted/installController.cpp index 0a7b8e14a..a2acbb1b0 100644 --- a/client/core/controllers/selfhosted/installController.cpp +++ b/client/core/controllers/selfhosted/installController.cpp @@ -103,7 +103,7 @@ ErrorCode InstallController::setupContainer(const ServerCredentials &credentials bool isUpdate) { qDebug().noquote() << "InstallController::setupContainer" << ContainerUtils::containerToString(container); - SshSession sshSession(this); + SshSession sshSession; ErrorCode e = ErrorCode::NoError; e = isUserInSudo(credentials, sshSession); @@ -168,11 +168,11 @@ ErrorCode InstallController::updateServerConfig(const QString &serverId, DockerC } if (container == DockerContainer::MtProxy) { ServerCredentials credentials = adminConfig->credentials(); - SshSession sshSession(this); + SshSession sshSession; MtProxyInstaller::uploadClientSettingsSnapshot(sshSession, credentials, container, newConfig); } else if (container == DockerContainer::Telemt) { ServerCredentials credentials = adminConfig->credentials(); - SshSession sshSession(this); + SshSession sshSession; TelemtInstaller::uploadClientSettingsSnapshot(sshSession, credentials, container, newConfig); } adminConfig->updateContainerConfig(container, newConfig); @@ -188,7 +188,7 @@ ErrorCode InstallController::updateServerConfig(const QString &serverId, DockerC if (!credentials.isValid()) { return ErrorCode::InternalError; } - SshSession sshSession(this); + SshSession sshSession; bool reinstallRequired = isReinstallContainerRequired(container, oldConfig, newConfig); qDebug() << "InstallController::updateServerConfig for container" << container << "reinstall required is" << reinstallRequired; @@ -984,7 +984,7 @@ ErrorCode InstallController::rebootServer(const QString &serverId) if (!credentials.isValid()) { return ErrorCode::InternalError; } - SshSession sshSession(this); + SshSession sshSession; QString script = QString("sudo reboot"); @@ -1012,7 +1012,7 @@ ErrorCode InstallController::removeAllContainers(const QString &serverId) if (!credentials.isValid()) { return ErrorCode::InternalError; } - SshSession sshSession(this); + SshSession sshSession; ErrorCode errorCode = sshSession.runScript(credentials, amnezia::scriptData(SharedScriptType::remove_all_containers)); if (errorCode == ErrorCode::NoError) { @@ -1034,7 +1034,7 @@ ErrorCode InstallController::removeContainer(const QString &serverId, DockerCont if (!credentials.isValid()) { return ErrorCode::InternalError; } - SshSession sshSession(this); + SshSession sshSession; const amnezia::ScriptVars removeContainerVars = amnezia::genBaseVars(credentials, container, QString(), QString()); const bool removeDataVolume = (container == DockerContainer::MtProxy || container == DockerContainer::Telemt); @@ -1143,7 +1143,7 @@ ErrorCode InstallController::scanServerForInstalledContainers(const QString &ser if (!credentials.isValid()) { return ErrorCode::InternalError; } - SshSession sshSession(this); + SshSession sshSession; QMap installedContainers; ErrorCode errorCode = getAlreadyInstalledContainers(credentials, installedContainers, sshSession); @@ -1186,7 +1186,7 @@ ErrorCode InstallController::scanServerForInstalledContainers(const QString &ser ErrorCode InstallController::installServer(const ServerCredentials &credentials, DockerContainer container, int port, TransportProto transportProto, bool &wasContainerInstalled) { - SshSession sshSession(this); + SshSession sshSession; QMap installedContainers; ErrorCode errorCode = getAlreadyInstalledContainers(credentials, installedContainers, sshSession); if (errorCode) { @@ -1255,7 +1255,7 @@ ErrorCode InstallController::installContainer(const QString &serverId, DockerCon if (!credentials.isValid()) { return ErrorCode::InternalError; } - SshSession sshSession(this); + SshSession sshSession; QMap installedContainers; ErrorCode errorCode = getAlreadyInstalledContainers(credentials, installedContainers, sshSession); @@ -1297,7 +1297,7 @@ ErrorCode InstallController::installContainer(const QString &serverId, DockerCon ErrorCode InstallController::checkSshConnection(ServerCredentials &credentials, QString &output, std::function passphraseCallback) { - SshSession sshSession(this); + SshSession sshSession; ErrorCode errorCode = ErrorCode::NoError; if (credentials.secretData.contains("BEGIN") && credentials.secretData.contains("PRIVATE KEY")) { @@ -1578,7 +1578,7 @@ ErrorCode InstallController::setDockerContainerEnabledState(const QString &serve return ErrorCode::InternalError; } const QString containerName = ContainerUtils::containerToString(container); - SshSession sshSession(this); + SshSession sshSession; const QString script = enabled ? QStringLiteral("sudo docker start %1").arg(containerName) : QStringLiteral("sudo docker stop %1").arg(containerName); const ErrorCode runError = sshSession.runScript(credentials, script); @@ -1618,7 +1618,7 @@ ErrorCode InstallController::queryDockerContainerStatus(const QString &serverId, stdOut += data; return ErrorCode::NoError; }; - SshSession sshSession(this); + SshSession sshSession; const QString script = QStringLiteral( "sudo docker inspect --format '{{.State.Status}}' %1 2>/dev/null || echo 'not_found'") .arg(containerName); @@ -1652,7 +1652,7 @@ ErrorCode InstallController::queryMtProxyDiagnostics(const QString &serverId, Do if (!credentials.isValid()) { return ErrorCode::InternalError; } - SshSession sshSession(this); + SshSession sshSession; return MtProxyInstaller::queryDiagnostics(sshSession, credentials, container, listenPort, out); } @@ -1675,7 +1675,7 @@ QString InstallController::fetchDockerContainerSecret(const QString &serverId, D stdOut += data; return ErrorCode::NoError; }; - SshSession sshSession(this); + SshSession sshSession; const QString path = QStringLiteral("/data/secret"); const QString cmd = QStringLiteral("sudo docker exec %1 cat %2").arg(containerName, path); const ErrorCode errorCode = sshSession.runScript(credentials, cmd, cbReadStdOut); diff --git a/client/ui/controllers/selfhosted/installUiController.cpp b/client/ui/controllers/selfhosted/installUiController.cpp index 3b8b8513f..c4c48e48b 100644 --- a/client/ui/controllers/selfhosted/installUiController.cpp +++ b/client/ui/controllers/selfhosted/installUiController.cpp @@ -9,6 +9,7 @@ #include #include #include +#include #include "core/utils/api/apiUtils.h" #include "core/controllers/selfhosted/installController.h" @@ -359,17 +360,27 @@ void InstallUiController::setContainerEnabled(const QString &serverId, int conta } emit serverIsBusy(true); - const ErrorCode errorCode = m_installController->setDockerContainerEnabledState(serverId, container, enabled); - emit serverIsBusy(false); - if (errorCode == ErrorCode::NoError) { - const ContainerConfig currentConfig = m_serversController->getContainerConfig(serverId, container); - m_protocolModel->updateModel(currentConfig); - emit setContainerEnabledFinished(enabled); - return; - } + InstallController *installController = m_installController; + auto *watcher = new QFutureWatcher(this); + QObject::connect(watcher, &QFutureWatcher::finished, this, + [this, watcher, serverId, container, enabled]() { + const ErrorCode errorCode = watcher->result(); + watcher->deleteLater(); + emit serverIsBusy(false); - emit installationErrorOccurred(errorCode); + if (errorCode == ErrorCode::NoError) { + const ContainerConfig currentConfig = m_serversController->getContainerConfig(serverId, container); + m_protocolModel->updateModel(currentConfig); + emit setContainerEnabledFinished(enabled); + return; + } + emit installationErrorOccurred(errorCode); + }); + QFuture future = QtConcurrent::run([installController, serverId, container, enabled]() -> ErrorCode { + return installController->setDockerContainerEnabledState(serverId, container, enabled); + }); + watcher->setFuture(future); } void InstallUiController::refreshContainerStatus(const QString &serverId, int containerIndex) @@ -379,13 +390,22 @@ void InstallUiController::refreshContainerStatus(const QString &serverId, int co return; } - int status = 3; - const ErrorCode errorCode = m_installController->queryDockerContainerStatus(serverId, container, status); - if (errorCode != ErrorCode::NoError) { - emit containerStatusRefreshed(3); - return; - } - emit containerStatusRefreshed(status); + InstallController *installController = m_installController; + auto *watcher = new QFutureWatcher(this); + QObject::connect(watcher, &QFutureWatcher::finished, this, [this, watcher]() { + const int status = watcher->result(); + watcher->deleteLater(); + emit containerStatusRefreshed(status); + }); + QFuture future = QtConcurrent::run([installController, serverId, container]() -> int { + int status = 3; + const ErrorCode errorCode = installController->queryDockerContainerStatus(serverId, container, status); + if (errorCode != ErrorCode::NoError) { + return 3; + } + return status; + }); + watcher->setFuture(future); } void InstallUiController::refreshContainerDiagnostics(const QString &serverId, int containerIndex, int port) @@ -395,14 +415,27 @@ void InstallUiController::refreshContainerDiagnostics(const QString &serverId, i return; } - MtProxyContainerDiagnostics diag; - const ErrorCode errorCode = m_installController->queryMtProxyDiagnostics(serverId, container, port, diag); - if (errorCode != ErrorCode::NoError) { - emit containerDiagnosticsRefreshed(false, false, -1, QString(), QString()); - return; - } - emit containerDiagnosticsRefreshed(diag.portReachable, diag.upstreamReachable, diag.clientsConnected, - diag.lastConfigRefresh, diag.statsEndpoint); + using DiagResult = std::pair; + InstallController *installController = m_installController; + auto *watcher = new QFutureWatcher(this); + QObject::connect(watcher, &QFutureWatcher::finished, this, [this, watcher]() { + const DiagResult result = watcher->result(); + watcher->deleteLater(); + if (!result.first) { + emit containerDiagnosticsRefreshed(false, false, -1, QString(), QString()); + return; + } + const MtProxyContainerDiagnostics &diag = result.second; + emit containerDiagnosticsRefreshed(diag.portReachable, diag.upstreamReachable, diag.clientsConnected, + diag.lastConfigRefresh, diag.statsEndpoint); + }); + QFuture future = + QtConcurrent::run([installController, serverId, container, port]() -> DiagResult { + MtProxyContainerDiagnostics diag; + const ErrorCode errorCode = installController->queryMtProxyDiagnostics(serverId, container, port, diag); + return { errorCode == ErrorCode::NoError, diag }; + }); + watcher->setFuture(future); } void InstallUiController::fetchContainerSecret(const QString &serverId, int containerIndex) @@ -412,8 +445,17 @@ void InstallUiController::fetchContainerSecret(const QString &serverId, int cont return; } - const QString secret = m_installController->fetchDockerContainerSecret(serverId, container); - emit containerSecretFetched(secret); + InstallController *installController = m_installController; + auto *watcher = new QFutureWatcher(this); + QObject::connect(watcher, &QFutureWatcher::finished, this, [this, watcher]() { + const QString secret = watcher->result(); + watcher->deleteLater(); + emit containerSecretFetched(secret); + }); + QFuture future = QtConcurrent::run([installController, serverId, container]() -> QString { + return installController->fetchDockerContainerSecret(serverId, container); + }); + watcher->setFuture(future); } void InstallUiController::rebootServer(const QString &serverId)