From 144ed3c98862cf1c789db1a2b501813903d16238 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Wed, 21 Feb 2024 19:06:16 +0500 Subject: [PATCH 1/2] updated the paths to awg files and interfaces to match the new docker container --- client/configurators/wireguard_configurator.cpp | 8 ++++++-- client/configurators/wireguard_configurator.h | 3 +++ client/protocols/protocols_defs.h | 9 ++++++++- client/ui/models/clientManagementModel.cpp | 14 +++++++++----- 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/client/configurators/wireguard_configurator.cpp b/client/configurators/wireguard_configurator.cpp index 8bfd5e75..809d8550 100644 --- a/client/configurators/wireguard_configurator.cpp +++ b/client/configurators/wireguard_configurator.cpp @@ -33,6 +33,10 @@ WireguardConfigurator::WireguardConfigurator(std::shared_ptr settings, m_protocolName = m_isAwg ? config_key::awg : config_key::wireguard; m_defaultPort = m_isAwg ? protocols::wireguard::defaultPort : protocols::awg::defaultPort; + + m_interfaceName = m_isAwg ? protocols::awg::interfaceName : protocols::wireguard::interfaceName; + m_wgBinaryName = m_isAwg ? protocols::awg::wgBinaryName : protocols::wireguard::wgBinaryName; + m_wgQuickBinaryName = m_isAwg ? protocols::awg::wgQuickBinaryName : protocols::wireguard::wgQuickBinaryName; } WireguardConfigurator::ConnectionData WireguardConfigurator::genClientKeys() @@ -167,8 +171,8 @@ WireguardConfigurator::ConnectionData WireguardConfigurator::prepareWireguardCon return connData; } - QString script = QString("sudo docker exec -i $CONTAINER_NAME bash -c 'wg syncconf wg0 <(wg-quick strip %1)'") - .arg(m_serverConfigPath); + QString script = QString("sudo docker exec -i $CONTAINER_NAME bash -c '%4 syncconf %2 <(%3 strip %1)'") + .arg(m_serverConfigPath, m_interfaceName, m_wgQuickBinaryName, m_wgBinaryName); e = serverController.runScript( credentials, serverController.replaceVars(script, serverController.genVarsForScript(credentials, container))); diff --git a/client/configurators/wireguard_configurator.h b/client/configurators/wireguard_configurator.h index d2422981..d1180637 100644 --- a/client/configurators/wireguard_configurator.h +++ b/client/configurators/wireguard_configurator.h @@ -44,6 +44,9 @@ private: amnezia::ProtocolScriptType m_configTemplate; QString m_protocolName; QString m_defaultPort; + QString m_interfaceName; + QString m_wgBinaryName; + QString m_wgQuickBinaryName; }; #endif // WIREGUARD_CONFIGURATOR_H diff --git a/client/protocols/protocols_defs.h b/client/protocols/protocols_defs.h index f83a0067..c88bad15 100644 --- a/client/protocols/protocols_defs.h +++ b/client/protocols/protocols_defs.h @@ -152,6 +152,9 @@ namespace amnezia constexpr char serverPublicKeyPath[] = "/opt/amnezia/wireguard/wireguard_server_public_key.key"; constexpr char serverPskKeyPath[] = "/opt/amnezia/wireguard/wireguard_psk.key"; + constexpr char interfaceName[] = "wg0"; + constexpr char wgBinaryName[] = "wg"; + constexpr char wgQuickBinaryName[] = "wg-quick"; } namespace sftp @@ -164,7 +167,7 @@ namespace amnezia { constexpr char defaultPort[] = "55424"; - constexpr char serverConfigPath[] = "/opt/amnezia/awg/wg0.conf"; + constexpr char serverConfigPath[] = "/opt/amnezia/awg/awg0.conf"; constexpr char serverPublicKeyPath[] = "/opt/amnezia/awg/wireguard_server_public_key.key"; constexpr char serverPskKeyPath[] = "/opt/amnezia/awg/wireguard_psk.key"; @@ -177,6 +180,10 @@ namespace amnezia constexpr char defaultResponsePacketMagicHeader[] = "3288052141"; constexpr char defaultTransportPacketMagicHeader[] = "2528465083"; constexpr char defaultUnderloadPacketMagicHeader[] = "1766607858"; + + constexpr char interfaceName[] = "awg0"; + constexpr char wgBinaryName[] = "awg"; + constexpr char wgQuickBinaryName[] = "awg-quick"; } } // namespace protocols diff --git a/client/ui/models/clientManagementModel.cpp b/client/ui/models/clientManagementModel.cpp index 7c81c80e..0ea55fd3 100644 --- a/client/ui/models/clientManagementModel.cpp +++ b/client/ui/models/clientManagementModel.cpp @@ -167,8 +167,8 @@ ErrorCode ClientManagementModel::getWireGuardClients(ServerController &serverCon { ErrorCode error = ErrorCode::NoError; - const QString wireGuardConfigFile = - QString("opt/amnezia/%1/wg0.conf").arg(container == DockerContainer::WireGuard ? "wireguard" : "awg"); + const QString wireGuardConfigFile = DockerContainer::WireGuard ? amnezia::protocols::wireguard::serverConfigPath + : amnezia::protocols::awg::serverConfigPath; const QString wireguardConfigString = serverController.getTextFileFromContainer(container, credentials, wireGuardConfigFile, &error); if (error != ErrorCode::NoError) { @@ -379,8 +379,8 @@ ErrorCode ClientManagementModel::revokeWireGuard(const int row, const DockerCont ErrorCode error; ServerController serverController(m_settings); - const QString wireGuardConfigFile = - QString("/opt/amnezia/%1/wg0.conf").arg(container == DockerContainer::WireGuard ? "wireguard" : "awg"); + const QString wireGuardConfigFile = DockerContainer::WireGuard ? amnezia::protocols::wireguard::serverConfigPath + : amnezia::protocols::awg::serverConfigPath; const QString wireguardConfigString = serverController.getTextFileFromContainer(container, credentials, wireGuardConfigFile, &error); if (error != ErrorCode::NoError) { @@ -425,7 +425,11 @@ ErrorCode ClientManagementModel::revokeWireGuard(const int row, const DockerCont return error; } - const QString script = "sudo docker exec -i $CONTAINER_NAME bash -c 'wg syncconf wg0 <(wg-quick strip %1)'"; + 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( credentials, serverController.replaceVars(script.arg(wireGuardConfigFile), From 10933ce4660a4c3c32d0357252e06ea46a8a14e8 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Sat, 24 Feb 2024 14:34:47 +0500 Subject: [PATCH 2/2] 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(