added display of a notification that the server is busy installing third-party software

- refactoring doInstallAction functions
This commit is contained in:
vladimir.kuznetsov 2023-01-01 21:48:20 +03:00
parent 3f257af7a9
commit 08a8eadb49
22 changed files with 398 additions and 346 deletions

View file

@ -31,6 +31,7 @@ QString amnezia::scriptName(SharedScriptType type)
case SharedScriptType::remove_all_containers: return QLatin1String("remove_all_containers.sh");
case SharedScriptType::setup_host_firewall: return QLatin1String("setup_host_firewall.sh");
case SharedScriptType::check_connection: return QLatin1String("check_connection.sh");
case SharedScriptType::check_server_is_busy: return QLatin1String("check_server_is_busy.sh");
}
}

View file

@ -15,7 +15,8 @@ enum SharedScriptType {
remove_container,
remove_all_containers,
setup_host_firewall,
check_connection
check_connection,
check_server_is_busy
};
enum ProtocolScriptType {
// Protocol scripts

View file

@ -12,6 +12,8 @@
#include <QApplication>
#include <QTemporaryFile>
#include <QFileInfo>
#include <QThread>
#include <QtConcurrent>
#include "sftpchannel.h"
#include "sshconnectionmanager.h"
@ -528,14 +530,36 @@ ErrorCode ServerController::installDockerWorker(const ServerCredentials &credent
stdOut += data + "\n";
};
ErrorCode e = runScript(credentials,
replaceVars(amnezia::scriptData(SharedScriptType::install_docker),
genVarsForScript(credentials)),
cbReadStdOut, cbReadStdErr);
QFutureWatcher<void> watcher;
QFuture<void> future = QtConcurrent::run([this, &stdOut, &cbReadStdOut, &cbReadStdErr, &credentials]() {
do {
stdOut.clear();
runScript(credentials,
replaceVars(amnezia::scriptData(SharedScriptType::check_server_is_busy),
genVarsForScript(credentials)), cbReadStdOut, cbReadStdErr);
if (!stdOut.isEmpty() || stdOut.contains("Unable to acquire the dpkg frontend lock")) {
emit serverIsBusy(true);
QThread::msleep(1000);
}
} while (!stdOut.isEmpty());
});
watcher.setFuture(future);
QEventLoop wait;
QObject::connect(&watcher, &QFutureWatcher<void>::finished, &wait, &QEventLoop::quit);
wait.exec();
emit serverIsBusy(false);
ErrorCode error = runScript(credentials,
replaceVars(amnezia::scriptData(SharedScriptType::install_docker),
genVarsForScript(credentials)), cbReadStdOut, cbReadStdErr);
if (stdOut.contains("command not found")) return ErrorCode::ServerDockerFailedError;
return e;
return error;
}
ErrorCode ServerController::prepareHostWorker(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &config)

View file

@ -84,6 +84,9 @@ private:
std::shared_ptr<Settings> m_settings;
std::shared_ptr<VpnConfigurator> m_configurator;
signals:
void serverIsBusy(const bool isBusy);
};
#endif // SERVERCONTROLLER_H