ShadowSocks protocol fixes:
- remote for OpenVPN is set to real ip address - remote ip will be added as alias in docker container - ss-local graceful shutdown - crash fixes
This commit is contained in:
parent
84e4b776ac
commit
d831d68e73
14 changed files with 173 additions and 65 deletions
|
@ -63,7 +63,11 @@ enum ErrorCode
|
|||
|
||||
// VPN errors
|
||||
OpenVpnAdaptersInUseError,
|
||||
OpenVpnUnknownError
|
||||
OpenVpnUnknownError,
|
||||
|
||||
// 3rd party utils errors
|
||||
OpenVpnExecutableCrashed,
|
||||
ShadowSocksExecutableCrashed
|
||||
};
|
||||
|
||||
namespace config {
|
||||
|
|
|
@ -240,12 +240,7 @@ QString OpenVpnConfigurator::genOpenVpnConfig(const ServerCredentials &credentia
|
|||
config.replace("redirect-gateway def1 bypass-dhcp", "");
|
||||
}
|
||||
|
||||
if (proto == Protocol::ShadowSocks) {
|
||||
config.replace("$REMOTE_HOST", "10.8.0.1");
|
||||
}
|
||||
else {
|
||||
config.replace("$REMOTE_HOST", connData.host);
|
||||
}
|
||||
config.replace("$REMOTE_HOST", connData.host);
|
||||
config.replace("$REMOTE_PORT", "1194");
|
||||
config.replace("$CA_CERT", connData.caCert);
|
||||
config.replace("$CLIENT_CERT", connData.clientCert);
|
||||
|
@ -265,7 +260,9 @@ QString OpenVpnConfigurator::convertOpenSShKey(const QString &key)
|
|||
p.setProcessChannelMode(QProcess::MergedChannels);
|
||||
|
||||
QTemporaryFile tmp;
|
||||
#ifdef QT_DEBUG
|
||||
tmp.setAutoRemove(false);
|
||||
#endif
|
||||
tmp.open();
|
||||
tmp.write(key.toUtf8());
|
||||
tmp.close();
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
#include <QApplication>
|
||||
|
||||
#include "sshconnectionmanager.h"
|
||||
#include "utils.h"
|
||||
|
||||
|
||||
using namespace QSsh;
|
||||
|
@ -24,7 +25,7 @@ QString ServerController::getContainerName(DockerContainer container)
|
|||
}
|
||||
}
|
||||
|
||||
ErrorCode ServerController::runScript(DockerContainer container,
|
||||
ErrorCode ServerController::runScript(const QHash<QString, QString> &vars,
|
||||
const SshConnectionParameters &sshParams, QString script,
|
||||
const std::function<void(const QString &, QSharedPointer<SshRemoteProcess>)> &cbReadStdOut,
|
||||
const std::function<void(const QString &, QSharedPointer<SshRemoteProcess>)> &cbReadStdErr)
|
||||
|
@ -41,7 +42,11 @@ ErrorCode ServerController::runScript(DockerContainer container,
|
|||
const QStringList &lines = script.split("\n", QString::SkipEmptyParts);
|
||||
for (int i = 0; i < lines.count(); i++) {
|
||||
QString line = lines.at(i);
|
||||
line.replace("$CONTAINER_NAME", getContainerName(container));
|
||||
|
||||
for (const QString &var : vars.keys()) {
|
||||
//qDebug() << "Replacing" << var << vars.value(var);
|
||||
line.replace(var, vars.value(var));
|
||||
}
|
||||
|
||||
if (line.startsWith("#")) {
|
||||
continue;
|
||||
|
@ -209,7 +214,7 @@ ErrorCode ServerController::signCert(DockerContainer container,
|
|||
|
||||
QStringList script {script_import, script_sign};
|
||||
|
||||
return runScript(container, sshParams(credentials), script.join("\n"));
|
||||
return runScript(genVarsForScript(credentials, container), sshParams(credentials), script.join("\n"));
|
||||
}
|
||||
|
||||
ErrorCode ServerController::checkOpenVpnServer(DockerContainer container, const ServerCredentials &credentials)
|
||||
|
@ -306,7 +311,7 @@ ErrorCode ServerController::removeServer(const ServerCredentials &credentials, P
|
|||
scriptData = file.readAll();
|
||||
if (scriptData.isEmpty()) return ErrorCode::InternalError;
|
||||
|
||||
return runScript(container, sshParams(credentials), scriptData);
|
||||
return runScript(genVarsForScript(credentials, container), sshParams(credentials), scriptData);
|
||||
}
|
||||
|
||||
ErrorCode ServerController::setupServer(const ServerCredentials &credentials, Protocol proto)
|
||||
|
@ -351,7 +356,7 @@ ErrorCode ServerController::setupOpenVpnServer(const ServerCredentials &credenti
|
|||
stdOut += data + "\n";
|
||||
};
|
||||
|
||||
ErrorCode e = runScript(DockerContainer::OpenVpn, sshParams(credentials), scriptData, cbReadStdOut, cbReadStdErr);
|
||||
ErrorCode e = runScript(genVarsForScript(credentials, DockerContainer::OpenVpn), sshParams(credentials), scriptData, cbReadStdOut, cbReadStdErr);
|
||||
if (e) return e;
|
||||
QApplication::processEvents();
|
||||
|
||||
|
@ -384,7 +389,7 @@ ErrorCode ServerController::setupShadowSocksServer(const ServerCredentials &cred
|
|||
stdOut += data + "\n";
|
||||
};
|
||||
|
||||
ErrorCode e = runScript(DockerContainer::ShadowSocks, sshParams(credentials), scriptData, cbReadStdOut, cbReadStdErr);
|
||||
ErrorCode e = runScript(genVarsForScript(credentials, DockerContainer::ShadowSocks), sshParams(credentials), scriptData, cbReadStdOut, cbReadStdErr);
|
||||
if (e) return e;
|
||||
|
||||
// Create ss config
|
||||
|
@ -407,10 +412,27 @@ ErrorCode ServerController::setupShadowSocksServer(const ServerCredentials &cred
|
|||
QString script = QString("sudo docker exec -d %1 sh -c \"ss-server -c %2\"").
|
||||
arg(getContainerName(DockerContainer::ShadowSocks)).arg(sSConfigPath);
|
||||
|
||||
e = runScript(DockerContainer::ShadowSocks, sshParams(credentials), script);
|
||||
e = runScript(genVarsForScript(credentials, DockerContainer::ShadowSocks), sshParams(credentials), script);
|
||||
return e;
|
||||
}
|
||||
|
||||
QHash<QString, QString> ServerController::genVarsForScript(const ServerCredentials &credentials, DockerContainer container)
|
||||
{
|
||||
QHash<QString, QString> vars;
|
||||
|
||||
vars.insert("$CONTAINER_NAME", getContainerName(container));
|
||||
|
||||
QString serverIp = Utils::getIPAddress(credentials.hostName);
|
||||
if (!serverIp.isEmpty()) {
|
||||
vars.insert("$SERVER_IP_ADDRESS", serverIp);
|
||||
}
|
||||
else {
|
||||
qWarning() << "ServerController::genVarsForScript unable to resolve address for credentials.hostName";
|
||||
}
|
||||
|
||||
return vars;
|
||||
}
|
||||
|
||||
SshConnection *ServerController::connectToHost(const SshConnectionParameters &sshParams)
|
||||
{
|
||||
SshConnection *client = acquireConnection(sshParams);
|
||||
|
@ -470,5 +492,5 @@ ErrorCode ServerController::setupServerFirewall(const ServerCredentials &credent
|
|||
file.open(QIODevice::ReadOnly);
|
||||
|
||||
QString script = file.readAll();
|
||||
return runScript(DockerContainer::OpenVpn, sshParams(credentials), script);
|
||||
return runScript(genVarsForScript(credentials, DockerContainer::OpenVpn), sshParams(credentials), script);
|
||||
}
|
||||
|
|
|
@ -47,7 +47,8 @@ public:
|
|||
static ErrorCode setupServerFirewall(const ServerCredentials &credentials);
|
||||
private:
|
||||
static QSsh::SshConnection *connectToHost(const QSsh::SshConnectionParameters &sshParams);
|
||||
static ErrorCode runScript(DockerContainer container,
|
||||
|
||||
static ErrorCode runScript(const QHash<QString, QString> &vars,
|
||||
const QSsh::SshConnectionParameters &sshParams, QString script,
|
||||
const std::function<void(const QString &, QSharedPointer<QSsh::SshRemoteProcess>)> &cbReadStdOut = nullptr,
|
||||
const std::function<void(const QString &, QSharedPointer<QSsh::SshRemoteProcess>)> &cbReadStdErr = nullptr);
|
||||
|
@ -55,6 +56,8 @@ private:
|
|||
static ErrorCode setupOpenVpnServer(const ServerCredentials &credentials);
|
||||
static ErrorCode setupShadowSocksServer(const ServerCredentials &credentials);
|
||||
|
||||
|
||||
static QHash<QString, QString> genVarsForScript(const ServerCredentials &credentials, DockerContainer container);
|
||||
};
|
||||
|
||||
#endif // SERVERCONTROLLER_H
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue