vpnconnection.cpp crash fix
ss server sript fix
This commit is contained in:
parent
7dc1f1e225
commit
65961d8d2e
5 changed files with 44 additions and 20 deletions
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue