vpnconnection.cpp crash fix

ss server sript fix
This commit is contained in:
pokamest 2021-02-25 18:05:42 +03:00
parent 7dc1f1e225
commit 65961d8d2e
5 changed files with 44 additions and 20 deletions

View file

@ -25,8 +25,8 @@ QString ServerController::getContainerName(DockerContainer container)
ErrorCode ServerController::runScript(DockerContainer container, ErrorCode ServerController::runScript(DockerContainer container,
const SshConnectionParameters &sshParams, QString script, const SshConnectionParameters &sshParams, QString script,
const std::function<void(const QString &)> &cbReadStdOut, const std::function<void(const QString &, QSharedPointer<SshRemoteProcess>)> &cbReadStdOut,
const std::function<void(const QString &)> &cbReadStdErr) const std::function<void(const QString &, QSharedPointer<SshRemoteProcess>)> &cbReadStdErr)
{ {
QLoggingCategory::setFilterRules(QStringLiteral("qtc.ssh=false")); QLoggingCategory::setFilterRules(QStringLiteral("qtc.ssh=false"));
@ -74,7 +74,7 @@ ErrorCode ServerController::runScript(DockerContainer container,
if (s != "." && !s.isEmpty()) { if (s != "." && !s.isEmpty()) {
qDebug().noquote() << "stdout" << s; qDebug().noquote() << "stdout" << s;
} }
if (cbReadStdOut) cbReadStdOut(s); if (cbReadStdOut) cbReadStdOut(s, proc);
}); });
QObject::connect(proc.data(), &SshRemoteProcess::readyReadStandardError, &wait, [proc, cbReadStdErr](){ QObject::connect(proc.data(), &SshRemoteProcess::readyReadStandardError, &wait, [proc, cbReadStdErr](){
@ -82,7 +82,7 @@ ErrorCode ServerController::runScript(DockerContainer container,
if (s != "." && !s.isEmpty()) { if (s != "." && !s.isEmpty()) {
qDebug().noquote() << "stderr" << s; qDebug().noquote() << "stderr" << s;
} }
if (cbReadStdErr) cbReadStdErr(s); if (cbReadStdErr) cbReadStdErr(s, proc);
}); });
proc->start(); proc->start();
@ -124,9 +124,9 @@ ErrorCode ServerController::uploadTextFileToContainer(DockerContainer container,
QEventLoop wait; QEventLoop wait;
int exitStatus = -1; int exitStatus = -1;
// QObject::connect(proc.data(), &SshRemoteProcess::started, &wait, [](){ // QObject::connect(proc.data(), &SshRemoteProcess::started, &wait, [](){
// qDebug() << "Command started"; // qDebug() << "uploadTextFileToContainer started";
// }); // });
QObject::connect(proc.data(), &SshRemoteProcess::closed, &wait, [&](int status){ QObject::connect(proc.data(), &SshRemoteProcess::closed, &wait, [&](int status){
//qDebug() << "Remote process exited with status" << status; //qDebug() << "Remote process exited with status" << status;
@ -143,7 +143,6 @@ ErrorCode ServerController::uploadTextFileToContainer(DockerContainer container,
}); });
proc->start(); proc->start();
//wait.exec();
if (exitStatus < 0) { if (exitStatus < 0) {
wait.exec(); wait.exec();
@ -309,7 +308,8 @@ ErrorCode ServerController::removeServer(const ServerCredentials &credentials, P
ErrorCode ServerController::setupServer(const ServerCredentials &credentials, Protocol proto) ErrorCode ServerController::setupServer(const ServerCredentials &credentials, Protocol proto)
{ {
if (proto == Protocol::OpenVpn) { if (proto == Protocol::OpenVpn) {
return setupOpenVpnServer(credentials); return ErrorCode::NoError;
//return setupOpenVpnServer(credentials);
} }
else if (proto == Protocol::ShadowSocks) { else if (proto == Protocol::ShadowSocks) {
return setupShadowSocksServer(credentials); return setupShadowSocksServer(credentials);
@ -318,7 +318,7 @@ ErrorCode ServerController::setupServer(const ServerCredentials &credentials, Pr
//return ErrorCode::NotImplementedError; //return ErrorCode::NotImplementedError;
// TODO: run concurently // TODO: run concurently
setupOpenVpnServer(credentials); //setupOpenVpnServer(credentials);
setupShadowSocksServer(credentials); setupShadowSocksServer(credentials);
} }
@ -336,10 +336,14 @@ ErrorCode ServerController::setupOpenVpnServer(const ServerCredentials &credenti
if (scriptData.isEmpty()) return ErrorCode::InternalError; if (scriptData.isEmpty()) return ErrorCode::InternalError;
QString stdOut; QString stdOut;
auto cbReadStdOut = [&](const QString &data) { auto cbReadStdOut = [&](const QString &data, QSharedPointer<QSsh::SshRemoteProcess> proc) {
stdOut += data + "\n"; 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<QSsh::SshRemoteProcess> proc) {
stdOut += data + "\n"; stdOut += data + "\n";
}; };
@ -364,7 +368,19 @@ ErrorCode ServerController::setupShadowSocksServer(const ServerCredentials &cred
scriptData = file.readAll(); scriptData = file.readAll();
if (scriptData.isEmpty()) return ErrorCode::InternalError; if (scriptData.isEmpty()) return ErrorCode::InternalError;
ErrorCode e = runScript(DockerContainer::ShadowSocks, sshParams(credentials), scriptData); QString stdOut;
auto cbReadStdOut = [&](const QString &data, QSharedPointer<QSsh::SshRemoteProcess> proc) {
stdOut += data + "\n";
if (data.contains("Automatically restart Docker daemon?")) {
proc->write("yes\n");
}
};
auto cbReadStdErr = [&](const QString &data, QSharedPointer<QSsh::SshRemoteProcess> proc) {
stdOut += data + "\n";
};
ErrorCode e = runScript(DockerContainer::ShadowSocks, sshParams(credentials), scriptData, cbReadStdOut, cbReadStdErr);
if (e) return e; if (e) return e;
// Create ss config // Create ss config
@ -385,7 +401,7 @@ ErrorCode ServerController::setupShadowSocksServer(const ServerCredentials &cred
uploadTextFileToContainer(DockerContainer::ShadowSocks, credentials, configData, sSConfigPath); uploadTextFileToContainer(DockerContainer::ShadowSocks, credentials, configData, sSConfigPath);
// Start ss // 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); arg(getContainerName(DockerContainer::ShadowSocks)).arg(sSConfigPath);
e = runScript(DockerContainer::ShadowSocks, sshParams(credentials), script); e = runScript(DockerContainer::ShadowSocks, sshParams(credentials), script);

View file

@ -49,8 +49,8 @@ private:
static QSsh::SshConnection *connectToHost(const QSsh::SshConnectionParameters &sshParams); static QSsh::SshConnection *connectToHost(const QSsh::SshConnectionParameters &sshParams);
static ErrorCode runScript(DockerContainer container, static ErrorCode runScript(DockerContainer container,
const QSsh::SshConnectionParameters &sshParams, QString script, const QSsh::SshConnectionParameters &sshParams, QString script,
const std::function<void(const QString &)> &cbReadStdOut = nullptr, const std::function<void(const QString &, QSharedPointer<QSsh::SshRemoteProcess>)> &cbReadStdOut = nullptr,
const std::function<void(const QString &)> &cbReadStdErr = nullptr); const std::function<void(const QString &, QSharedPointer<QSsh::SshRemoteProcess>)> &cbReadStdErr = nullptr);
static ErrorCode setupOpenVpnServer(const ServerCredentials &credentials); static ErrorCode setupOpenVpnServer(const ServerCredentials &credentials);
static ErrorCode setupShadowSocksServer(const ServerCredentials &credentials); static ErrorCode setupShadowSocksServer(const ServerCredentials &credentials);

View file

@ -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 apt-get update

View file

@ -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 apt-get update

View file

@ -116,10 +116,11 @@ ErrorCode VpnConnection::connectToVpn(const ServerCredentials &credentials, Prot
if (m_vpnProtocol) { if (m_vpnProtocol) {
disconnect(m_vpnProtocol.data(), &VpnProtocol::protocolError, this, &VpnConnection::vpnProtocolError); disconnect(m_vpnProtocol.data(), &VpnProtocol::protocolError, this, &VpnConnection::vpnProtocolError);
m_vpnProtocol->stop(); m_vpnProtocol->stop();
m_vpnProtocol->deleteLater(); m_vpnProtocol.reset();
//m_vpnProtocol->deleteLater();
} }
qApp->processEvents(); //qApp->processEvents();
if (protocol == Protocol::Any || protocol == Protocol::OpenVpn) { if (protocol == Protocol::Any || protocol == Protocol::OpenVpn) {
ErrorCode e = createVpnConfiguration(credentials, 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)); m_vpnProtocol.reset(new ShadowSocksVpnProtocol(m_vpnConfiguration));
e = static_cast<OpenVpnProtocol *>(m_vpnProtocol.data())->checkAndSetupTapDriver();
if (e) {
emit connectionStateChanged(VpnProtocol::ConnectionState::Error);
return e;
}
} }
connect(m_vpnProtocol.data(), &VpnProtocol::protocolError, this, &VpnConnection::vpnProtocolError); connect(m_vpnProtocol.data(), &VpnProtocol::protocolError, this, &VpnConnection::vpnProtocolError);