From 65961d8d2e06e436aeecd4f88f4f3deadf028644 Mon Sep 17 00:00:00 2001 From: pokamest Date: Thu, 25 Feb 2021 18:05:42 +0300 Subject: [PATCH] vpnconnection.cpp crash fix ss server sript fix --- client/core/servercontroller.cpp | 44 +++++++++++++------ client/core/servercontroller.h | 4 +- client/server_scripts/setup_openvpn_server.sh | 3 +- .../setup_shadowsocks_server.sh | 3 +- client/vpnconnection.cpp | 10 ++++- 5 files changed, 44 insertions(+), 20 deletions(-) diff --git a/client/core/servercontroller.cpp b/client/core/servercontroller.cpp index ebf3b1ab..50eb950f 100644 --- a/client/core/servercontroller.cpp +++ b/client/core/servercontroller.cpp @@ -25,8 +25,8 @@ QString ServerController::getContainerName(DockerContainer container) ErrorCode ServerController::runScript(DockerContainer container, const SshConnectionParameters &sshParams, QString script, - const std::function &cbReadStdOut, - const std::function &cbReadStdErr) + const std::function)> &cbReadStdOut, + const std::function)> &cbReadStdErr) { QLoggingCategory::setFilterRules(QStringLiteral("qtc.ssh=false")); @@ -74,7 +74,7 @@ ErrorCode ServerController::runScript(DockerContainer container, if (s != "." && !s.isEmpty()) { qDebug().noquote() << "stdout" << s; } - if (cbReadStdOut) cbReadStdOut(s); + if (cbReadStdOut) cbReadStdOut(s, proc); }); QObject::connect(proc.data(), &SshRemoteProcess::readyReadStandardError, &wait, [proc, cbReadStdErr](){ @@ -82,7 +82,7 @@ ErrorCode ServerController::runScript(DockerContainer container, if (s != "." && !s.isEmpty()) { qDebug().noquote() << "stderr" << s; } - if (cbReadStdErr) cbReadStdErr(s); + if (cbReadStdErr) cbReadStdErr(s, proc); }); proc->start(); @@ -124,9 +124,9 @@ ErrorCode ServerController::uploadTextFileToContainer(DockerContainer container, QEventLoop wait; int exitStatus = -1; - // QObject::connect(proc.data(), &SshRemoteProcess::started, &wait, [](){ - // qDebug() << "Command started"; - // }); +// QObject::connect(proc.data(), &SshRemoteProcess::started, &wait, [](){ +// qDebug() << "uploadTextFileToContainer started"; +// }); QObject::connect(proc.data(), &SshRemoteProcess::closed, &wait, [&](int status){ //qDebug() << "Remote process exited with status" << status; @@ -143,7 +143,6 @@ ErrorCode ServerController::uploadTextFileToContainer(DockerContainer container, }); proc->start(); - //wait.exec(); if (exitStatus < 0) { wait.exec(); @@ -309,7 +308,8 @@ ErrorCode ServerController::removeServer(const ServerCredentials &credentials, P ErrorCode ServerController::setupServer(const ServerCredentials &credentials, Protocol proto) { if (proto == Protocol::OpenVpn) { - return setupOpenVpnServer(credentials); + return ErrorCode::NoError; + //return setupOpenVpnServer(credentials); } else if (proto == Protocol::ShadowSocks) { return setupShadowSocksServer(credentials); @@ -318,7 +318,7 @@ ErrorCode ServerController::setupServer(const ServerCredentials &credentials, Pr //return ErrorCode::NotImplementedError; // TODO: run concurently - setupOpenVpnServer(credentials); + //setupOpenVpnServer(credentials); setupShadowSocksServer(credentials); } @@ -336,10 +336,14 @@ ErrorCode ServerController::setupOpenVpnServer(const ServerCredentials &credenti if (scriptData.isEmpty()) return ErrorCode::InternalError; QString stdOut; - auto cbReadStdOut = [&](const QString &data) { + auto cbReadStdOut = [&](const QString &data, QSharedPointer proc) { stdOut += data + "\n"; + + if (data.contains("Automatically restart Docker daemon?")) { + proc->write("yes\n"); + } }; - auto cbReadStdErr = [&](const QString &data) { + auto cbReadStdErr = [&](const QString &data, QSharedPointer proc) { stdOut += data + "\n"; }; @@ -364,7 +368,19 @@ ErrorCode ServerController::setupShadowSocksServer(const ServerCredentials &cred scriptData = file.readAll(); if (scriptData.isEmpty()) return ErrorCode::InternalError; - ErrorCode e = runScript(DockerContainer::ShadowSocks, sshParams(credentials), scriptData); + QString stdOut; + auto cbReadStdOut = [&](const QString &data, QSharedPointer proc) { + stdOut += data + "\n"; + + if (data.contains("Automatically restart Docker daemon?")) { + proc->write("yes\n"); + } + }; + auto cbReadStdErr = [&](const QString &data, QSharedPointer proc) { + stdOut += data + "\n"; + }; + + ErrorCode e = runScript(DockerContainer::ShadowSocks, sshParams(credentials), scriptData, cbReadStdOut, cbReadStdErr); if (e) return e; // Create ss config @@ -385,7 +401,7 @@ ErrorCode ServerController::setupShadowSocksServer(const ServerCredentials &cred uploadTextFileToContainer(DockerContainer::ShadowSocks, credentials, configData, sSConfigPath); // Start ss - QString script = QString("docker exec -i %1 sh -c \"ss-server -c %2 &\""). + QString script = QString("docker exec -d %1 sh -c \"ss-server -c %2\""). arg(getContainerName(DockerContainer::ShadowSocks)).arg(sSConfigPath); e = runScript(DockerContainer::ShadowSocks, sshParams(credentials), script); diff --git a/client/core/servercontroller.h b/client/core/servercontroller.h index b02e2ed6..ad1b947f 100644 --- a/client/core/servercontroller.h +++ b/client/core/servercontroller.h @@ -49,8 +49,8 @@ private: static QSsh::SshConnection *connectToHost(const QSsh::SshConnectionParameters &sshParams); static ErrorCode runScript(DockerContainer container, const QSsh::SshConnectionParameters &sshParams, QString script, - const std::function &cbReadStdOut = nullptr, - const std::function &cbReadStdErr = nullptr); + const std::function)> &cbReadStdOut = nullptr, + const std::function)> &cbReadStdErr = nullptr); static ErrorCode setupOpenVpnServer(const ServerCredentials &credentials); static ErrorCode setupShadowSocksServer(const ServerCredentials &credentials); diff --git a/client/server_scripts/setup_openvpn_server.sh b/client/server_scripts/setup_openvpn_server.sh index c9714ac3..e7dcf0dd 100644 --- a/client/server_scripts/setup_openvpn_server.sh +++ b/client/server_scripts/setup_openvpn_server.sh @@ -1,4 +1,5 @@ -#CONTAINER_NAME=... this var will be set in ServerController +# CONTAINER_NAME=... this var will be set in ServerController +# Don't run commands in background like sh -c "openvpn &" apt-get update diff --git a/client/server_scripts/setup_shadowsocks_server.sh b/client/server_scripts/setup_shadowsocks_server.sh index 6f147298..06b2b1f1 100644 --- a/client/server_scripts/setup_shadowsocks_server.sh +++ b/client/server_scripts/setup_shadowsocks_server.sh @@ -1,4 +1,5 @@ -#CONTAINER_NAME=... this var will be set in ServerController +# CONTAINER_NAME=... this var will be set in ServerController +# Don't run commands in background like sh -c "openvpn &" apt-get update diff --git a/client/vpnconnection.cpp b/client/vpnconnection.cpp index 68796937..01217cd5 100644 --- a/client/vpnconnection.cpp +++ b/client/vpnconnection.cpp @@ -116,10 +116,11 @@ ErrorCode VpnConnection::connectToVpn(const ServerCredentials &credentials, Prot if (m_vpnProtocol) { disconnect(m_vpnProtocol.data(), &VpnProtocol::protocolError, this, &VpnConnection::vpnProtocolError); m_vpnProtocol->stop(); - m_vpnProtocol->deleteLater(); + m_vpnProtocol.reset(); + //m_vpnProtocol->deleteLater(); } - qApp->processEvents(); + //qApp->processEvents(); if (protocol == Protocol::Any || protocol == Protocol::OpenVpn) { ErrorCode e = createVpnConfiguration(credentials, Protocol::OpenVpn); @@ -143,6 +144,11 @@ ErrorCode VpnConnection::connectToVpn(const ServerCredentials &credentials, Prot } m_vpnProtocol.reset(new ShadowSocksVpnProtocol(m_vpnConfiguration)); + e = static_cast(m_vpnProtocol.data())->checkAndSetupTapDriver(); + if (e) { + emit connectionStateChanged(VpnProtocol::ConnectionState::Error); + return e; + } } connect(m_vpnProtocol.data(), &VpnProtocol::protocolError, this, &VpnConnection::vpnProtocolError);