diff --git a/client/core/defs.h b/client/core/defs.h index 3f861401..884cb60f 100644 --- a/client/core/defs.h +++ b/client/core/defs.h @@ -32,6 +32,7 @@ enum ErrorCode ServerContainerMissingError, ServerDockerFailedError, ServerCancelInstallation, + ServerContainerAlreadyInstalledError, // Ssh connection errors SshSocketError, SshTimeoutError, SshProtocolError, diff --git a/client/core/errorstrings.cpp b/client/core/errorstrings.cpp index 1e7eb395..9460365f 100644 --- a/client/core/errorstrings.cpp +++ b/client/core/errorstrings.cpp @@ -16,6 +16,7 @@ QString errorString(ErrorCode code){ case(ServerContainerMissingError): return QObject::tr("Server error: Docker container missing"); case(ServerDockerFailedError): return QObject::tr("Server error: Docker failed"); case(ServerCancelInstallation): return QObject::tr("Installation canceled by user"); + case(ServerContainerAlreadyInstalledError): return QObject::tr("Container already installed"); // Ssh connection errors case(SshSocketError): return QObject::tr("Ssh connection error"); diff --git a/client/core/servercontroller.cpp b/client/core/servercontroller.cpp index 375215b7..e2095492 100644 --- a/client/core/servercontroller.cpp +++ b/client/core/servercontroller.cpp @@ -415,6 +415,9 @@ ErrorCode ServerController::setupContainer(const ServerCredentials &credentials, //qDebug().noquote() << QJsonDocument(config).toJson(); ErrorCode e = ErrorCode::NoError; + e = isContainerAlreadyInstalled(credentials, container); + if (e) return e; + e = installDockerWorker(credentials, container); if (e) return e; qDebug().noquote() << "ServerController::setupContainer installDockerWorker finished"; @@ -856,3 +859,28 @@ QString ServerController::replaceVars(const QString &script, const Vars &vars) //qDebug().noquote() << script; return s; } + +ErrorCode ServerController::isContainerAlreadyInstalled(const ServerCredentials &credentials, DockerContainer container) +{ + QString stdOut; + auto cbReadStdOut = [&](const QString &data, QSharedPointer proc) { + stdOut += data + "\n"; + }; + auto cbReadStdErr = [&](const QString &data, QSharedPointer ) { + stdOut += data + "\n"; + }; + + QString script = QString("sudo docker ps | grep %1").arg(ContainerProps::containerToString(container)); + + ErrorCode errorCode = runScript(credentials, + replaceVars(script, genVarsForScript(credentials, container)), cbReadStdOut, cbReadStdErr); + + if (errorCode != ErrorCode::NoError) { + return errorCode; + } + + if (!stdOut.isEmpty()) { + return ErrorCode::ServerContainerAlreadyInstalledError; + } + return ErrorCode::NoError; +} diff --git a/client/core/servercontroller.h b/client/core/servercontroller.h index 04ae1a15..0473b508 100644 --- a/client/core/servercontroller.h +++ b/client/core/servercontroller.h @@ -82,6 +82,7 @@ private: ErrorCode runContainerWorker(const ServerCredentials &credentials, DockerContainer container, QJsonObject &config); ErrorCode configureContainerWorker(const ServerCredentials &credentials, DockerContainer container, QJsonObject &config); ErrorCode startupContainerWorker(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &config = QJsonObject()); + ErrorCode isContainerAlreadyInstalled(const ServerCredentials &credentials, DockerContainer container); std::shared_ptr m_settings; std::shared_ptr m_configurator;