added a script to check the user in the sudo group
- move isServerDpkgBusy to separate script
This commit is contained in:
parent
cba78190a8
commit
ea9917dacc
8 changed files with 77 additions and 32 deletions
|
|
@ -32,6 +32,7 @@ enum ErrorCode
|
||||||
ServerContainerMissingError,
|
ServerContainerMissingError,
|
||||||
ServerDockerFailedError,
|
ServerDockerFailedError,
|
||||||
ServerCancelInstallation,
|
ServerCancelInstallation,
|
||||||
|
ServerUserNotInSudo,
|
||||||
|
|
||||||
// Ssh connection errors
|
// Ssh connection errors
|
||||||
SshSocketError, SshTimeoutError, SshProtocolError,
|
SshSocketError, SshTimeoutError, SshProtocolError,
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ QString errorString(ErrorCode code){
|
||||||
case(ServerContainerMissingError): return QObject::tr("Server error: Docker container missing");
|
case(ServerContainerMissingError): return QObject::tr("Server error: Docker container missing");
|
||||||
case(ServerDockerFailedError): return QObject::tr("Server error: Docker failed");
|
case(ServerDockerFailedError): return QObject::tr("Server error: Docker failed");
|
||||||
case(ServerCancelInstallation): return QObject::tr("Installation canceled by user");
|
case(ServerCancelInstallation): return QObject::tr("Installation canceled by user");
|
||||||
|
case(ServerUserNotInSudo): return QObject::tr("The user does not have permission to use sudo");
|
||||||
|
|
||||||
// Ssh connection errors
|
// Ssh connection errors
|
||||||
case(SshSocketError): return QObject::tr("Ssh connection error");
|
case(SshSocketError): return QObject::tr("Ssh connection error");
|
||||||
|
|
|
||||||
|
|
@ -32,6 +32,7 @@ QString amnezia::scriptName(SharedScriptType type)
|
||||||
case SharedScriptType::setup_host_firewall: return QLatin1String("setup_host_firewall.sh");
|
case SharedScriptType::setup_host_firewall: return QLatin1String("setup_host_firewall.sh");
|
||||||
case SharedScriptType::check_connection: return QLatin1String("check_connection.sh");
|
case SharedScriptType::check_connection: return QLatin1String("check_connection.sh");
|
||||||
case SharedScriptType::check_server_is_busy: return QLatin1String("check_server_is_busy.sh");
|
case SharedScriptType::check_server_is_busy: return QLatin1String("check_server_is_busy.sh");
|
||||||
|
case SharedScriptType::check_user_in_sudo: return QLatin1String("check_user_in_sudo.sh");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,8 @@ enum SharedScriptType {
|
||||||
remove_all_containers,
|
remove_all_containers,
|
||||||
setup_host_firewall,
|
setup_host_firewall,
|
||||||
check_connection,
|
check_connection,
|
||||||
check_server_is_busy
|
check_server_is_busy,
|
||||||
|
check_user_in_sudo
|
||||||
};
|
};
|
||||||
enum ProtocolScriptType {
|
enum ProtocolScriptType {
|
||||||
// Protocol scripts
|
// Protocol scripts
|
||||||
|
|
|
||||||
|
|
@ -416,11 +416,19 @@ ErrorCode ServerController::setupContainer(const ServerCredentials &credentials,
|
||||||
//qDebug().noquote() << QJsonDocument(config).toJson();
|
//qDebug().noquote() << QJsonDocument(config).toJson();
|
||||||
ErrorCode e = ErrorCode::NoError;
|
ErrorCode e = ErrorCode::NoError;
|
||||||
|
|
||||||
|
disconnectFromHost(credentials);
|
||||||
|
|
||||||
|
e = isUserInSudo(credentials, container);
|
||||||
|
if (e) return e;
|
||||||
|
|
||||||
if (!isUpdate) {
|
if (!isUpdate) {
|
||||||
e = isServerPortBusy(credentials, container, config);
|
e = isServerPortBusy(credentials, container, config);
|
||||||
if (e) return e;
|
if (e) return e;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
e = isServerDpkgBusy(credentials, container);
|
||||||
|
if (e) return e;
|
||||||
|
|
||||||
e = installDockerWorker(credentials, container);
|
e = installDockerWorker(credentials, container);
|
||||||
if (e) return e;
|
if (e) return e;
|
||||||
qDebug().noquote() << "ServerController::setupContainer installDockerWorker finished";
|
qDebug().noquote() << "ServerController::setupContainer installDockerWorker finished";
|
||||||
|
|
@ -536,37 +544,6 @@ ErrorCode ServerController::installDockerWorker(const ServerCredentials &credent
|
||||||
stdOut += data + "\n";
|
stdOut += data + "\n";
|
||||||
};
|
};
|
||||||
|
|
||||||
QFutureWatcher<ErrorCode> watcher;
|
|
||||||
|
|
||||||
QFuture<ErrorCode> future = QtConcurrent::run([this, &stdOut, &cbReadStdOut, &cbReadStdErr, &credentials]() {
|
|
||||||
do {
|
|
||||||
if (m_cancelInstallation) {
|
|
||||||
return ErrorCode::ServerCancelInstallation;
|
|
||||||
}
|
|
||||||
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());
|
|
||||||
return ErrorCode::NoError;
|
|
||||||
});
|
|
||||||
|
|
||||||
QEventLoop wait;
|
|
||||||
QObject::connect(&watcher, &QFutureWatcher<ErrorCode>::finished, &wait, &QEventLoop::quit);
|
|
||||||
watcher.setFuture(future);
|
|
||||||
wait.exec();
|
|
||||||
|
|
||||||
m_cancelInstallation = false;
|
|
||||||
emit serverIsBusy(false);
|
|
||||||
|
|
||||||
if (future.result() != ErrorCode::NoError) {
|
|
||||||
return future.result();
|
|
||||||
}
|
|
||||||
|
|
||||||
ErrorCode error = runScript(credentials,
|
ErrorCode error = runScript(credentials,
|
||||||
replaceVars(amnezia::scriptData(SharedScriptType::install_docker),
|
replaceVars(amnezia::scriptData(SharedScriptType::install_docker),
|
||||||
genVarsForScript(credentials)), cbReadStdOut, cbReadStdErr);
|
genVarsForScript(credentials)), cbReadStdOut, cbReadStdErr);
|
||||||
|
|
@ -895,6 +872,64 @@ ErrorCode ServerController::isServerPortBusy(const ServerCredentials &credential
|
||||||
return ErrorCode::NoError;
|
return ErrorCode::NoError;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ErrorCode ServerController::isUserInSudo(const ServerCredentials &credentials, DockerContainer container)
|
||||||
|
{
|
||||||
|
QString stdOut;
|
||||||
|
auto cbReadStdOut = [&](const QString &data, QSharedPointer<QSsh::SshRemoteProcess> proc) {
|
||||||
|
stdOut += data + "\n";
|
||||||
|
};
|
||||||
|
auto cbReadStdErr = [&](const QString &data, QSharedPointer<QSsh::SshRemoteProcess> ) {
|
||||||
|
stdOut += data + "\n";
|
||||||
|
};
|
||||||
|
|
||||||
|
const QString scriptData = amnezia::scriptData(SharedScriptType::check_user_in_sudo);
|
||||||
|
ErrorCode error = runScript(credentials, replaceVars(scriptData, genVarsForScript(credentials)), cbReadStdOut, cbReadStdErr);
|
||||||
|
|
||||||
|
if (!stdOut.contains("sudo")) return ErrorCode::ServerUserNotInSudo;
|
||||||
|
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
ErrorCode ServerController::isServerDpkgBusy(const ServerCredentials &credentials, DockerContainer container)
|
||||||
|
{
|
||||||
|
QString stdOut;
|
||||||
|
auto cbReadStdOut = [&](const QString &data, QSharedPointer<QSsh::SshRemoteProcess> proc) {
|
||||||
|
stdOut += data + "\n";
|
||||||
|
};
|
||||||
|
auto cbReadStdErr = [&](const QString &data, QSharedPointer<QSsh::SshRemoteProcess> ) {
|
||||||
|
stdOut += data + "\n";
|
||||||
|
};
|
||||||
|
|
||||||
|
QFutureWatcher<ErrorCode> watcher;
|
||||||
|
|
||||||
|
QFuture<ErrorCode> future = QtConcurrent::run([this, &stdOut, &cbReadStdOut, &cbReadStdErr, &credentials]() {
|
||||||
|
do {
|
||||||
|
if (m_cancelInstallation) {
|
||||||
|
return ErrorCode::ServerCancelInstallation;
|
||||||
|
}
|
||||||
|
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());
|
||||||
|
return ErrorCode::NoError;
|
||||||
|
});
|
||||||
|
|
||||||
|
QEventLoop wait;
|
||||||
|
QObject::connect(&watcher, &QFutureWatcher<ErrorCode>::finished, &wait, &QEventLoop::quit);
|
||||||
|
watcher.setFuture(future);
|
||||||
|
wait.exec();
|
||||||
|
|
||||||
|
m_cancelInstallation = false;
|
||||||
|
emit serverIsBusy(false);
|
||||||
|
|
||||||
|
return future.result();
|
||||||
|
}
|
||||||
|
|
||||||
ErrorCode ServerController::getAlreadyInstalledContainers(const ServerCredentials &credentials, QMap<DockerContainer, QJsonObject> &installedContainers)
|
ErrorCode ServerController::getAlreadyInstalledContainers(const ServerCredentials &credentials, QMap<DockerContainer, QJsonObject> &installedContainers)
|
||||||
{
|
{
|
||||||
QString stdOut;
|
QString stdOut;
|
||||||
|
|
|
||||||
|
|
@ -84,7 +84,10 @@ private:
|
||||||
ErrorCode runContainerWorker(const ServerCredentials &credentials, DockerContainer container, QJsonObject &config);
|
ErrorCode runContainerWorker(const ServerCredentials &credentials, DockerContainer container, QJsonObject &config);
|
||||||
ErrorCode configureContainerWorker(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 startupContainerWorker(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &config = QJsonObject());
|
||||||
|
|
||||||
ErrorCode isServerPortBusy(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &config);
|
ErrorCode isServerPortBusy(const ServerCredentials &credentials, DockerContainer container, const QJsonObject &config);
|
||||||
|
ErrorCode isUserInSudo(const ServerCredentials &credentials, DockerContainer container);
|
||||||
|
ErrorCode isServerDpkgBusy(const ServerCredentials &credentials, DockerContainer container);
|
||||||
|
|
||||||
std::shared_ptr<Settings> m_settings;
|
std::shared_ptr<Settings> m_settings;
|
||||||
std::shared_ptr<VpnConfigurator> m_configurator;
|
std::shared_ptr<VpnConfigurator> m_configurator;
|
||||||
|
|
|
||||||
|
|
@ -165,5 +165,6 @@
|
||||||
<file>ui/qml/Controls/PopupWithQuestion.qml</file>
|
<file>ui/qml/Controls/PopupWithQuestion.qml</file>
|
||||||
<file>ui/qml/Pages/PageAdvancedServerSettings.qml</file>
|
<file>ui/qml/Pages/PageAdvancedServerSettings.qml</file>
|
||||||
<file>ui/qml/Controls/PopupWarning.qml</file>
|
<file>ui/qml/Controls/PopupWarning.qml</file>
|
||||||
|
<file>server_scripts/check_user_in_sudo.sh</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
|
|
||||||
2
client/server_scripts/check_user_in_sudo.sh
Normal file
2
client/server_scripts/check_user_in_sudo.sh
Normal file
|
|
@ -0,0 +1,2 @@
|
||||||
|
CUR_USER=$(whoami);\
|
||||||
|
groups $CUR_USER
|
||||||
Loading…
Add table
Add a link
Reference in a new issue