refactoring

Protocol to DockerContainer
This commit is contained in:
pokamest 2021-04-26 23:19:19 +03:00
parent 615bba69e5
commit d424bb24cf
13 changed files with 60 additions and 64 deletions

View file

@ -7,12 +7,10 @@
#include "protocols/protocols_defs.h" #include "protocols/protocols_defs.h"
QJsonObject CloakConfigurator::genCloakConfig(const ServerCredentials &credentials, QJsonObject CloakConfigurator::genCloakConfig(const ServerCredentials &credentials,
Protocol proto, ErrorCode *errorCode) DockerContainer container, ErrorCode *errorCode)
{ {
ErrorCode e = ErrorCode::NoError; ErrorCode e = ErrorCode::NoError;
DockerContainer container = amnezia::containerForProto(proto);
QString cloakPublicKey = ServerController::getTextFileFromContainer(container, credentials, QString cloakPublicKey = ServerController::getTextFileFromContainer(container, credentials,
amnezia::protocols::cloak::ckPublicKeyPath, &e); amnezia::protocols::cloak::ckPublicKeyPath, &e);
cloakPublicKey.replace("\n", ""); cloakPublicKey.replace("\n", "");

View file

@ -11,7 +11,7 @@ class CloakConfigurator
{ {
public: public:
static QJsonObject genCloakConfig(const ServerCredentials &credentials, Protocol proto, static QJsonObject genCloakConfig(const ServerCredentials &credentials, DockerContainer container,
ErrorCode *errorCode = nullptr); ErrorCode *errorCode = nullptr);
}; };

View file

@ -139,7 +139,7 @@ OpenVpnConfigurator::ConnectionData OpenVpnConfigurator::createCertRequest()
} }
OpenVpnConfigurator::ConnectionData OpenVpnConfigurator::prepareOpenVpnConfig(const ServerCredentials &credentials, OpenVpnConfigurator::ConnectionData OpenVpnConfigurator::prepareOpenVpnConfig(const ServerCredentials &credentials,
Protocol proto, ErrorCode *errorCode) DockerContainer container, ErrorCode *errorCode)
{ {
OpenVpnConfigurator::ConnectionData connData = OpenVpnConfigurator::createCertRequest(); OpenVpnConfigurator::ConnectionData connData = OpenVpnConfigurator::createCertRequest();
connData.host = credentials.hostName; connData.host = credentials.hostName;
@ -153,8 +153,6 @@ OpenVpnConfigurator::ConnectionData OpenVpnConfigurator::prepareOpenVpnConfig(co
arg(amnezia::protocols::openvpn::clientsDirPath). arg(amnezia::protocols::openvpn::clientsDirPath).
arg(connData.clientId); arg(connData.clientId);
DockerContainer container = amnezia::containerForProto(proto);
ErrorCode e = ServerController::uploadTextFileToContainer(container, credentials, connData.request, reqFileName); ErrorCode e = ServerController::uploadTextFileToContainer(container, credentials, connData.request, reqFileName);
if (e) { if (e) {
if (errorCode) *errorCode = e; if (errorCode) *errorCode = e;
@ -194,7 +192,7 @@ Settings &OpenVpnConfigurator::m_settings()
} }
QString OpenVpnConfigurator::genOpenVpnConfig(const ServerCredentials &credentials, QString OpenVpnConfigurator::genOpenVpnConfig(const ServerCredentials &credentials,
Protocol proto, ErrorCode *errorCode) DockerContainer container, ErrorCode *errorCode)
{ {
// QFile configTemplFile; // QFile configTemplFile;
// if (proto == Protocol::OpenVpn) // if (proto == Protocol::OpenVpn)
@ -206,20 +204,20 @@ QString OpenVpnConfigurator::genOpenVpnConfig(const ServerCredentials &credentia
// configTemplFile.open(QIODevice::ReadOnly); // configTemplFile.open(QIODevice::ReadOnly);
// QString config = configTemplFile.readAll(); // QString config = configTemplFile.readAll();
QString config = amnezia::scriptData(ProtocolScriptType::openvpn_template, proto); QString config = amnezia::scriptData(ProtocolScriptType::openvpn_template, container);
ConnectionData connData = prepareOpenVpnConfig(credentials, proto, errorCode); ConnectionData connData = prepareOpenVpnConfig(credentials, container, errorCode);
if (errorCode && *errorCode) { if (errorCode && *errorCode) {
return ""; return "";
} }
if (proto == Protocol::OpenVpn) if (container == DockerContainer::OpenVpn)
config.replace("$PROTO", "udp"); config.replace("$PROTO", "udp");
else if (proto == Protocol::ShadowSocksOverOpenVpn) { else if (container == DockerContainer::ShadowSocksOverOpenVpn) {
config.replace("$PROTO", "tcp"); config.replace("$PROTO", "tcp");
config.replace("$LOCAL_PROXY_PORT", amnezia::protocols::shadowsocks::ssLocalProxyPort); config.replace("$LOCAL_PROXY_PORT", amnezia::protocols::shadowsocks::ssLocalProxyPort);
} }
else if (proto == Protocol::OpenVpnOverCloak) { else if (container == DockerContainer::OpenVpnOverCloak) {
config.replace("$PROTO", "tcp"); config.replace("$PROTO", "tcp");
} }

View file

@ -22,7 +22,7 @@ public:
QString host; // host ip QString host; // host ip
}; };
static QString genOpenVpnConfig(const ServerCredentials &credentials, Protocol proto, static QString genOpenVpnConfig(const ServerCredentials &credentials, DockerContainer container,
ErrorCode *errorCode = nullptr); ErrorCode *errorCode = nullptr);
static QString convertOpenSShKey(const QString &key); static QString convertOpenSShKey(const QString &key);
@ -40,7 +40,7 @@ private:
static ConnectionData createCertRequest(); static ConnectionData createCertRequest();
static ConnectionData prepareOpenVpnConfig(const ServerCredentials &credentials, static ConnectionData prepareOpenVpnConfig(const ServerCredentials &credentials,
Protocol proto, ErrorCode *errorCode = nullptr); DockerContainer container, ErrorCode *errorCode = nullptr);
static Settings &m_settings(); static Settings &m_settings();
}; };

View file

@ -10,8 +10,8 @@ Q_NAMESPACE
enum class Protocol { enum class Protocol {
Any, Any,
OpenVpn, OpenVpn,
ShadowSocksOverOpenVpn, ShadowSocks,
OpenVpnOverCloak, Cloak,
WireGuard WireGuard
}; };
Q_ENUM_NS(Protocol) Q_ENUM_NS(Protocol)
@ -44,18 +44,18 @@ inline QString containerToString(DockerContainer container){
return QVariant::fromValue(container).toString(); return QVariant::fromValue(container).toString();
} }
static DockerContainer containerForProto(Protocol proto) //static DockerContainer containerForProto(Protocol proto)
{ //{
Q_ASSERT(proto != Protocol::Any); // Q_ASSERT(proto != Protocol::Any);
switch (proto) { // switch (proto) {
case Protocol::OpenVpn: return DockerContainer::OpenVpn; // case Protocol::OpenVpn: return DockerContainer::OpenVpn;
case Protocol::OpenVpnOverCloak: return DockerContainer::OpenVpnOverCloak; // case Protocol::OpenVpnOverCloak: return DockerContainer::OpenVpnOverCloak;
case Protocol::ShadowSocksOverOpenVpn: return DockerContainer::ShadowSocksOverOpenVpn; // case Protocol::ShadowSocksOverOpenVpn: return DockerContainer::ShadowSocksOverOpenVpn;
case Protocol::WireGuard: return DockerContainer::WireGuard; // case Protocol::WireGuard: return DockerContainer::WireGuard;
case Protocol::Any: return DockerContainer::None; // case Protocol::Any: return DockerContainer::None;
} // }
} //}
struct ServerCredentials struct ServerCredentials
{ {

View file

@ -4,13 +4,13 @@
#include <QDebug> #include <QDebug>
#include <QFile> #include <QFile>
QString amnezia::scriptFolder(amnezia::Protocol proto) QString amnezia::scriptFolder(amnezia::DockerContainer container)
{ {
switch (proto) { switch (container) {
case Protocol::OpenVpn: return QLatin1String("openvpn"); case DockerContainer::OpenVpn: return QLatin1String("openvpn");
case Protocol::OpenVpnOverCloak: return QLatin1String("openvpn_cloak"); case DockerContainer::OpenVpnOverCloak: return QLatin1String("openvpn_cloak");
case Protocol::ShadowSocksOverOpenVpn: return QLatin1String("openvpn_shadowsocks"); case DockerContainer::ShadowSocksOverOpenVpn: return QLatin1String("openvpn_shadowsocks");
case Protocol::WireGuard: return QLatin1String("wireguard"); case DockerContainer::WireGuard: return QLatin1String("wireguard");
default: return ""; default: return "";
} }
} }
@ -49,9 +49,9 @@ QString amnezia::scriptData(amnezia::SharedScriptType type)
return file.readAll(); return file.readAll();
} }
QString amnezia::scriptData(amnezia::ProtocolScriptType type, amnezia::Protocol proto) QString amnezia::scriptData(amnezia::ProtocolScriptType type, DockerContainer container)
{ {
QString fileName = QString(":/server_scripts/%1/%2").arg(amnezia::scriptFolder(proto), amnezia::scriptName(type)); QString fileName = QString(":/server_scripts/%1/%2").arg(amnezia::scriptFolder(container), amnezia::scriptName(type));
QFile file(fileName); QFile file(fileName);
if (! file.open(QIODevice::ReadOnly)) { if (! file.open(QIODevice::ReadOnly)) {
qDebug() << "Error opening script" << fileName; qDebug() << "Error opening script" << fileName;

View file

@ -25,13 +25,13 @@ enum ProtocolScriptType {
}; };
QString scriptFolder(Protocol proto); QString scriptFolder(DockerContainer container);
QString scriptName(SharedScriptType type); QString scriptName(SharedScriptType type);
QString scriptName(ProtocolScriptType type); QString scriptName(ProtocolScriptType type);
QString scriptData(SharedScriptType type); QString scriptData(SharedScriptType type);
QString scriptData(ProtocolScriptType type, Protocol proto); QString scriptData(ProtocolScriptType type, DockerContainer container);
} }
#endif // SCRIPTS_REGISTRY_H #endif // SCRIPTS_REGISTRY_H

View file

@ -467,7 +467,7 @@ ErrorCode ServerController::setupOpenVpnOverCloakServer(const ServerCredentials
genVarsForScript(credentials, container))); genVarsForScript(credentials, container)));
if (e) return e; if (e) return e;
uploadFileToHost(credentials, amnezia::scriptData(ProtocolScriptType::dockerfile, Protocol::OpenVpnOverCloak).toUtf8(), uploadFileToHost(credentials, amnezia::scriptData(ProtocolScriptType::dockerfile, DockerContainer::OpenVpnOverCloak).toUtf8(),
amnezia::server::getDockerfileFolder(container) + "/Dockerfile"); amnezia::server::getDockerfileFolder(container) + "/Dockerfile");
@ -489,12 +489,12 @@ ErrorCode ServerController::setupOpenVpnOverCloakServer(const ServerCredentials
runScript(sshParams(credentials), runScript(sshParams(credentials),
replaceVars(amnezia::scriptData(ProtocolScriptType::configure_container, Protocol::OpenVpnOverCloak), replaceVars(amnezia::scriptData(ProtocolScriptType::configure_container, DockerContainer::OpenVpnOverCloak),
genVarsForScript(credentials, container))); genVarsForScript(credentials, container)));
if (e) return e; if (e) return e;
uploadTextFileToContainer(DockerContainer::OpenVpnOverCloak, credentials, uploadTextFileToContainer(DockerContainer::OpenVpnOverCloak, credentials,
replaceVars(amnezia::scriptData(ProtocolScriptType::container_startup, Protocol::OpenVpnOverCloak), replaceVars(amnezia::scriptData(ProtocolScriptType::container_startup, DockerContainer::OpenVpnOverCloak),
genVarsForScript(credentials, container)), genVarsForScript(credentials, container)),
"/opt/amnezia/start.sh"); "/opt/amnezia/start.sh");

View file

@ -96,7 +96,7 @@ QString ShadowSocksVpnProtocol::shadowSocksExecPath()
#endif #endif
} }
QJsonObject ShadowSocksVpnProtocol::genShadowSocksConfig(const ServerCredentials &credentials, Protocol proto) QJsonObject ShadowSocksVpnProtocol::genShadowSocksConfig(const ServerCredentials &credentials, DockerContainer container)
{ {
QJsonObject ssConfig; QJsonObject ssConfig;
ssConfig.insert("server", credentials.hostName); ssConfig.insert("server", credentials.hostName);

View file

@ -13,7 +13,7 @@ public:
ErrorCode start() override; ErrorCode start() override;
void stop() override; void stop() override;
static QJsonObject genShadowSocksConfig(const ServerCredentials &credentials, Protocol proto = Protocol::ShadowSocksOverOpenVpn); static QJsonObject genShadowSocksConfig(const ServerCredentials &credentials, DockerContainer container = DockerContainer::ShadowSocksOverOpenVpn);
protected: protected:
void readShadowSocksConfiguration(const QJsonObject &configuration); void readShadowSocksConfiguration(const QJsonObject &configuration);

View file

@ -108,12 +108,12 @@ QJsonObject Settings::protocolConfig(int serverIndex, DockerContainer container,
switch (proto) { switch (proto) {
case Protocol::OpenVpn: case Protocol::OpenVpn:
return c.value(config_key::openvpn).toObject(); return c.value(config_key::openvpn).toObject();
case Protocol::OpenVpnOverCloak: case Protocol::ShadowSocks:
return c.value(config_key::openvpn).toObject(); return c.value(config_key::shadowsocks).toObject();
case Protocol::ShadowSocksOverOpenVpn: case Protocol::Cloak:
return c.value(config_key::openvpn).toObject(); return c.value(config_key::cloak).toObject();
default: default:
break; return QJsonObject();
} }
} }

View file

@ -80,11 +80,11 @@ ErrorCode VpnConnection::lastError() const
return m_vpnProtocol.data()->lastError(); return m_vpnProtocol.data()->lastError();
} }
ErrorCode VpnConnection::createVpnConfiguration(const ServerCredentials &credentials, Protocol protocol) ErrorCode VpnConnection::createVpnConfiguration(const ServerCredentials &credentials, DockerContainer container)
{ {
ErrorCode errorCode = ErrorCode::NoError; ErrorCode errorCode = ErrorCode::NoError;
if (protocol == Protocol::OpenVpn || protocol == Protocol::ShadowSocksOverOpenVpn || protocol == Protocol::OpenVpnOverCloak) { if (container == DockerContainer::OpenVpn || container == DockerContainer::ShadowSocksOverOpenVpn || container == DockerContainer::OpenVpnOverCloak) {
QString openVpnConfigData = OpenVpnConfigurator::genOpenVpnConfig(credentials, protocol, &errorCode); QString openVpnConfigData = OpenVpnConfigurator::genOpenVpnConfig(credentials, container, &errorCode);
m_vpnConfiguration.insert(config::key_openvpn_config_data, openVpnConfigData); m_vpnConfiguration.insert(config::key_openvpn_config_data, openVpnConfigData);
if (errorCode) { if (errorCode) {
return errorCode; return errorCode;
@ -101,13 +101,13 @@ ErrorCode VpnConnection::createVpnConfiguration(const ServerCredentials &credent
} }
} }
if (protocol == Protocol::ShadowSocksOverOpenVpn) { if (container == DockerContainer::ShadowSocksOverOpenVpn) {
QJsonObject ssConfigData = ShadowSocksVpnProtocol::genShadowSocksConfig(credentials); QJsonObject ssConfigData = ShadowSocksVpnProtocol::genShadowSocksConfig(credentials);
m_vpnConfiguration.insert(config::key_shadowsocks_config_data, ssConfigData); m_vpnConfiguration.insert(config::key_shadowsocks_config_data, ssConfigData);
} }
if (protocol == Protocol::OpenVpnOverCloak) { if (container == DockerContainer::OpenVpnOverCloak) {
QJsonObject cloakConfigData = CloakConfigurator::genCloakConfig(credentials, Protocol::OpenVpnOverCloak, &errorCode); QJsonObject cloakConfigData = CloakConfigurator::genCloakConfig(credentials, DockerContainer::OpenVpnOverCloak, &errorCode);
m_vpnConfiguration.insert(config::key_cloak_config_data, cloakConfigData); m_vpnConfiguration.insert(config::key_cloak_config_data, cloakConfigData);
} }
@ -115,13 +115,13 @@ ErrorCode VpnConnection::createVpnConfiguration(const ServerCredentials &credent
return ErrorCode::NoError; return ErrorCode::NoError;
} }
ErrorCode VpnConnection::connectToVpn(const ServerCredentials &credentials, Protocol protocol) ErrorCode VpnConnection::connectToVpn(const ServerCredentials &credentials, DockerContainer container)
{ {
qDebug() << "connectToVpn, CustomRouting is" << m_settings.customRouting(); qDebug() << "connectToVpn, CustomRouting is" << m_settings.customRouting();
// qDebug() << "Cred" << m_settings.serverCredentials().hostName << // qDebug() << "Cred" << m_settings.serverCredentials().hostName <<
// m_settings.serverCredentials().password; // m_settings.serverCredentials().password;
//protocol = Protocol::ShadowSocks; //protocol = Protocol::ShadowSocks;
protocol = Protocol::OpenVpnOverCloak; container = DockerContainer::OpenVpnOverCloak;
// TODO: Try protocols one by one in case of Protocol::Any // TODO: Try protocols one by one in case of Protocol::Any
// TODO: Implement some behavior in case if connection not stable // TODO: Implement some behavior in case if connection not stable
@ -138,8 +138,8 @@ ErrorCode VpnConnection::connectToVpn(const ServerCredentials &credentials, Prot
//qApp->processEvents(); //qApp->processEvents();
if (protocol == Protocol::Any || protocol == Protocol::OpenVpn) { if (container == DockerContainer::None || container == DockerContainer::OpenVpn) {
ErrorCode e = createVpnConfiguration(credentials, Protocol::OpenVpn); ErrorCode e = createVpnConfiguration(credentials, DockerContainer::OpenVpn);
if (e) { if (e) {
emit connectionStateChanged(VpnProtocol::ConnectionState::Error); emit connectionStateChanged(VpnProtocol::ConnectionState::Error);
return e; return e;
@ -152,8 +152,8 @@ ErrorCode VpnConnection::connectToVpn(const ServerCredentials &credentials, Prot
return e; return e;
} }
} }
else if (protocol == Protocol::ShadowSocksOverOpenVpn) { else if (container == DockerContainer::ShadowSocksOverOpenVpn) {
ErrorCode e = createVpnConfiguration(credentials, Protocol::ShadowSocksOverOpenVpn); ErrorCode e = createVpnConfiguration(credentials, DockerContainer::ShadowSocksOverOpenVpn);
if (e) { if (e) {
emit connectionStateChanged(VpnProtocol::ConnectionState::Error); emit connectionStateChanged(VpnProtocol::ConnectionState::Error);
return e; return e;
@ -166,8 +166,8 @@ ErrorCode VpnConnection::connectToVpn(const ServerCredentials &credentials, Prot
return e; return e;
} }
} }
else if (protocol == Protocol::OpenVpnOverCloak) { else if (container == DockerContainer::OpenVpnOverCloak) {
ErrorCode e = createVpnConfiguration(credentials, Protocol::OpenVpnOverCloak); ErrorCode e = createVpnConfiguration(credentials, DockerContainer::OpenVpnOverCloak);
if (e) { if (e) {
emit connectionStateChanged(VpnProtocol::ConnectionState::Error); emit connectionStateChanged(VpnProtocol::ConnectionState::Error);
return e; return e;

View file

@ -24,9 +24,9 @@ public:
static QString bytesPerSecToText(quint64 bytes); static QString bytesPerSecToText(quint64 bytes);
ErrorCode lastError() const; ErrorCode lastError() const;
ErrorCode createVpnConfiguration(const ServerCredentials &credentials, Protocol protocol); ErrorCode createVpnConfiguration(const ServerCredentials &credentials, DockerContainer container);
ErrorCode connectToVpn(const ServerCredentials &credentials, Protocol protocol = Protocol::Any); ErrorCode connectToVpn(const ServerCredentials &credentials, DockerContainer container = DockerContainer::None);
void disconnectFromVpn(); void disconnectFromVpn();
bool isConnected() const; bool isConnected() const;