From 10933ce4660a4c3c32d0357252e06ea46a8a14e8 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Sat, 24 Feb 2024 14:34:47 +0500 Subject: [PATCH] added backward compatibility for the old awg container --- .../configurators/wireguard_configurator.cpp | 34 +++++++++++----- client/core/controllers/serverController.cpp | 32 ++++++++++++++- client/core/controllers/serverController.h | 2 + client/ui/models/clientManagementModel.cpp | 40 +++++++++++++------ 4 files changed, 85 insertions(+), 23 deletions(-) diff --git a/client/configurators/wireguard_configurator.cpp b/client/configurators/wireguard_configurator.cpp index 809d8550..440a4386 100644 --- a/client/configurators/wireguard_configurator.cpp +++ b/client/configurators/wireguard_configurator.cpp @@ -13,23 +13,22 @@ #include #include "containers/containers_defs.h" +#include "core/controllers/serverController.h" #include "core/scripts_registry.h" #include "core/server_defs.h" -#include "core/controllers/serverController.h" #include "settings.h" #include "utilities.h" WireguardConfigurator::WireguardConfigurator(std::shared_ptr settings, bool isAwg, QObject *parent) : ConfiguratorBase(settings, parent), m_isAwg(isAwg) { - m_serverConfigPath = m_isAwg ? amnezia::protocols::awg::serverConfigPath - : amnezia::protocols::wireguard::serverConfigPath; - m_serverPublicKeyPath = m_isAwg ? amnezia::protocols::awg::serverPublicKeyPath - : amnezia::protocols::wireguard::serverPublicKeyPath; - m_serverPskKeyPath = m_isAwg ? amnezia::protocols::awg::serverPskKeyPath - : amnezia::protocols::wireguard::serverPskKeyPath; - m_configTemplate = m_isAwg ? ProtocolScriptType::awg_template - : ProtocolScriptType::wireguard_template; + m_serverConfigPath = + m_isAwg ? amnezia::protocols::awg::serverConfigPath : amnezia::protocols::wireguard::serverConfigPath; + m_serverPublicKeyPath = + m_isAwg ? amnezia::protocols::awg::serverPublicKeyPath : amnezia::protocols::wireguard::serverPublicKeyPath; + m_serverPskKeyPath = + m_isAwg ? amnezia::protocols::awg::serverPskKeyPath : amnezia::protocols::wireguard::serverPskKeyPath; + m_configTemplate = m_isAwg ? ProtocolScriptType::awg_template : ProtocolScriptType::wireguard_template; m_protocolName = m_isAwg ? config_key::awg : config_key::wireguard; m_defaultPort = m_isAwg ? protocols::wireguard::defaultPort : protocols::awg::defaultPort; @@ -88,6 +87,20 @@ WireguardConfigurator::ConnectionData WireguardConfigurator::prepareWireguardCon ErrorCode e = ErrorCode::NoError; ServerController serverController(m_settings); + if (container == DockerContainer::Awg) { + if (serverController.isNewAwgContainer(credentials)) { + m_serverConfigPath = amnezia::protocols::awg::serverConfigPath; + m_interfaceName = protocols::awg::interfaceName; + m_wgBinaryName = protocols::awg::wgBinaryName; + m_wgQuickBinaryName = protocols::awg::wgQuickBinaryName; + } else { + m_serverConfigPath = "/opt/amnezia/awg/wg0.conf"; + m_interfaceName = protocols::wireguard::interfaceName; + m_wgBinaryName = protocols::wireguard::wgBinaryName; + m_wgQuickBinaryName = protocols::wireguard::wgQuickBinaryName; + } + } + // Get list of already created clients (only IP addresses) QString nextIpNumber; { @@ -181,7 +194,8 @@ WireguardConfigurator::ConnectionData WireguardConfigurator::prepareWireguardCon } QString WireguardConfigurator::genWireguardConfig(const ServerCredentials &credentials, DockerContainer container, - const QJsonObject &containerConfig, QString &clientId, ErrorCode *errorCode) + const QJsonObject &containerConfig, QString &clientId, + ErrorCode *errorCode) { ServerController serverController(m_settings); QString scriptData = amnezia::scriptData(m_configTemplate, container); diff --git a/client/core/controllers/serverController.cpp b/client/core/controllers/serverController.cpp index 9a170a85..736f43ac 100644 --- a/client/core/controllers/serverController.cpp +++ b/client/core/controllers/serverController.cpp @@ -855,7 +855,16 @@ ErrorCode ServerController::getAlreadyInstalledContainers(const ServerCredential containerConfig.insert(config_key::transport_proto, transportProto); if (protocol == Proto::Awg) { - QString serverConfig = getTextFileFromContainer(container, credentials, protocols::awg::serverConfigPath, &errorCode); + QString serverConfigPath; + if (container == DockerContainer::Awg) { + if (isNewAwgContainer(credentials)) { + serverConfigPath = amnezia::protocols::awg::serverConfigPath; + } else { + serverConfigPath = "/opt/amnezia/awg/wg0.conf"; + } + } + + QString serverConfig = getTextFileFromContainer(container, credentials, serverConfigPath, &errorCode); QMap serverConfigMap; auto serverConfigLines = serverConfig.split("\n"); @@ -960,3 +969,24 @@ ErrorCode ServerController::getDecryptedPrivateKey(const ServerCredentials &cred auto error = m_sshClient.getDecryptedPrivateKey(credentials, decryptedPrivateKey, callback); return error; } + +bool ServerController::isNewAwgContainer(const ServerCredentials &credentials) +{ + QString stdOut; + auto cbReadStdOut = [&](const QString &data, libssh::Client &) { + stdOut += data + "\n"; + return ErrorCode::NoError; + }; + + auto cbReadStdErr = [&](const QString &data, libssh::Client &) { + stdOut += data + "\n"; + return ErrorCode::NoError; + }; + + QString script = QString("sudo docker exec -i $CONTAINER_NAME bash -c 'type awg'"); + + runScript(credentials, replaceVars(script, genVarsForScript(credentials, DockerContainer::Awg)), cbReadStdOut, cbReadStdErr); + + return stdOut.contains("/usr/bin/awg"); + +} diff --git a/client/core/controllers/serverController.h b/client/core/controllers/serverController.h index 16569dbb..f3db7602 100644 --- a/client/core/controllers/serverController.h +++ b/client/core/controllers/serverController.h @@ -62,6 +62,8 @@ public: ErrorCode getDecryptedPrivateKey(const ServerCredentials &credentials, QString &decryptedPrivateKey, const std::function &callback); + bool isNewAwgContainer(const ServerCredentials &credentials); + private: ErrorCode installDockerWorker(const ServerCredentials &credentials, DockerContainer container); ErrorCode prepareHostWorker(const ServerCredentials &credentials, DockerContainer container, diff --git a/client/ui/models/clientManagementModel.cpp b/client/ui/models/clientManagementModel.cpp index 0ea55fd3..5f543cde 100644 --- a/client/ui/models/clientManagementModel.cpp +++ b/client/ui/models/clientManagementModel.cpp @@ -10,7 +10,8 @@ namespace { Logger logger("ClientManagementModel"); - namespace configKey { + namespace configKey + { constexpr char clientId[] = "clientId"; constexpr char clientName[] = "clientName"; constexpr char container[] = "container"; @@ -61,7 +62,6 @@ void ClientManagementModel::migration(const QByteArray &clientsTableString) m_clientsTable.push_back(client); } - } ErrorCode ClientManagementModel::updateModel(DockerContainer container, ServerCredentials credentials) @@ -121,7 +121,8 @@ ErrorCode ClientManagementModel::updateModel(DockerContainer container, ServerCr return error; } -ErrorCode ClientManagementModel::getOpenVpnClients(ServerController &serverController, DockerContainer container, ServerCredentials credentials, int &count) +ErrorCode ClientManagementModel::getOpenVpnClients(ServerController &serverController, DockerContainer container, + ServerCredentials credentials, int &count) { ErrorCode error = ErrorCode::NoError; QString stdOut; @@ -163,7 +164,8 @@ ErrorCode ClientManagementModel::getOpenVpnClients(ServerController &serverContr return error; } -ErrorCode ClientManagementModel::getWireGuardClients(ServerController &serverController, DockerContainer container, ServerCredentials credentials, int &count) +ErrorCode ClientManagementModel::getWireGuardClients(ServerController &serverController, DockerContainer container, + ServerCredentials credentials, int &count) { ErrorCode error = ErrorCode::NoError; @@ -314,13 +316,16 @@ ErrorCode ClientManagementModel::revokeClient(const int row, const DockerContain QJsonArray containers = server.value(config_key::containers).toArray(); for (auto i = 0; i < containers.size(); i++) { auto containerConfig = containers.at(i).toObject(); - auto containerType = ContainerProps::containerFromString(containerConfig.value(config_key::container).toString()); + auto containerType = + ContainerProps::containerFromString(containerConfig.value(config_key::container).toString()); if (containerType == container) { QJsonObject protocolConfig; if (container == DockerContainer::ShadowSocks || container == DockerContainer::Cloak) { - protocolConfig = containerConfig.value(ContainerProps::containerTypeToString(DockerContainer::OpenVpn)).toObject(); + protocolConfig = + containerConfig.value(ContainerProps::containerTypeToString(DockerContainer::OpenVpn)).toObject(); } else { - protocolConfig = containerConfig.value(ContainerProps::containerTypeToString(containerType)).toObject(); + protocolConfig = + containerConfig.value(ContainerProps::containerTypeToString(containerType)).toObject(); } if (protocolConfig.value(config_key::last_config).toString().contains(clientId)) { @@ -379,8 +384,17 @@ ErrorCode ClientManagementModel::revokeWireGuard(const int row, const DockerCont ErrorCode error; ServerController serverController(m_settings); - const QString wireGuardConfigFile = DockerContainer::WireGuard ? amnezia::protocols::wireguard::serverConfigPath - : amnezia::protocols::awg::serverConfigPath; + QString wireGuardConfigFile; + if (container == DockerContainer::Awg) { + if (serverController.isNewAwgContainer(credentials)) { + wireGuardConfigFile = amnezia::protocols::awg::serverConfigPath; + } else { + wireGuardConfigFile = "/opt/amnezia/awg/wg0.conf"; + } + } else { + wireGuardConfigFile = amnezia::protocols::wireguard::serverConfigPath; + } + const QString wireguardConfigString = serverController.getTextFileFromContainer(container, credentials, wireGuardConfigFile, &error); if (error != ErrorCode::NoError) { @@ -425,9 +439,11 @@ ErrorCode ClientManagementModel::revokeWireGuard(const int row, const DockerCont return error; } - QString interfaceName = DockerContainer::WireGuard ? protocols::wireguard::interfaceName : protocols::awg::interfaceName; - QString wgBinaryName = DockerContainer::WireGuard ? protocols::wireguard::wgBinaryName : protocols::awg::wgBinaryName; - QString wgQuickBinaryName = DockerContainer::WireGuard ? protocols::wireguard::wgQuickBinaryName : protocols::awg::wgQuickBinaryName; + QString interfaceName = + DockerContainer::WireGuard ? protocols::wireguard::interfaceName : protocols::awg::interfaceName; + QString wgBinaryName = DockerContainer::WireGuard ? protocols::wireguard::wgBinaryName : protocols::awg::wgBinaryName; + QString wgQuickBinaryName = + DockerContainer::WireGuard ? protocols::wireguard::wgQuickBinaryName : protocols::awg::wgQuickBinaryName; QString script = QString("sudo docker exec -i $CONTAINER_NAME bash -c '%4 syncconf %2 <(%3 strip %1)'") .arg(wireGuardConfigFile, interfaceName, wgQuickBinaryName, wgBinaryName); error = serverController.runScript(