From 7b1b8dc749137c074948d622b4957619f5af41e4 Mon Sep 17 00:00:00 2001 From: "vladimir.kuznetsov" Date: Thu, 14 Dec 2023 18:50:09 +0700 Subject: [PATCH] fixed server search for sftp, dns and tor containers --- client/containers/containers_defs.cpp | 2 +- client/core/servercontroller.cpp | 66 +++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/client/containers/containers_defs.cpp b/client/containers/containers_defs.cpp index b6f1b111a..a523ef840 100644 --- a/client/containers/containers_defs.cpp +++ b/client/containers/containers_defs.cpp @@ -58,7 +58,7 @@ QVector ContainerProps::protocolsForContainer(amnezia::DockerCon case DockerContainer::Ipsec: return { Proto::Ikev2 /*, Protocol::L2tp */ }; - case DockerContainer::Dns: return {}; + case DockerContainer::Dns: return { Proto::Dns }; case DockerContainer::Sftp: return { Proto::Sftp }; diff --git a/client/core/servercontroller.cpp b/client/core/servercontroller.cpp index 5bc5e5198..e7c047dbc 100644 --- a/client/core/servercontroller.cpp +++ b/client/core/servercontroller.cpp @@ -31,6 +31,11 @@ #include +namespace +{ + Logger logger("ServerController"); +} + ServerController::ServerController(std::shared_ptr settings, QObject *parent) : m_settings(settings) { } @@ -857,6 +862,67 @@ ErrorCode ServerController::getAlreadyInstalledContainers(const ServerCredential containerConfig[config_key::responsePacketMagicHeader] = serverConfigMap.value(config_key::responsePacketMagicHeader); containerConfig[config_key::underloadPacketMagicHeader] = serverConfigMap.value(config_key::underloadPacketMagicHeader); containerConfig[config_key::transportPacketMagicHeader] = serverConfigMap.value(config_key::transportPacketMagicHeader); + } else if (protocol == Proto::Sftp) { + stdOut.clear(); + script = QString("sudo docker inspect --format '{{.Config.Cmd}}' %1").arg(name); + + ErrorCode errorCode = runScript(credentials, script, cbReadStdOut, cbReadStdErr); + if (errorCode != ErrorCode::NoError) { + return errorCode; + } + + auto sftpInfo = stdOut.split(":"); + if (sftpInfo.size() < 2) { + logger.error() << "Key parameters for the sftp container are missing"; + continue; + } + auto userName = sftpInfo.at(0); + userName = userName.remove(0, 1); + auto password = sftpInfo.at(1); + + containerConfig.insert(config_key::userName, userName); + containerConfig.insert(config_key::password, password); + } + + config.insert(config_key::container, ContainerProps::containerToString(container)); + } + config.insert(ProtocolProps::protoToString(protocol), containerConfig); + } + installedContainers.insert(container, config); + } + const static QRegularExpression torOrDnsRegExp("(amnezia-(?:torwebsite|dns)).*?([0-9]*)/(udp|tcp).*"); + QRegularExpressionMatch torOrDnsRegMatch = torOrDnsRegExp.match(containerInfo); + if (torOrDnsRegMatch.hasMatch()) { + QString name = torOrDnsRegMatch.captured(1); + QString port = torOrDnsRegMatch.captured(2); + QString transportProto = torOrDnsRegMatch.captured(3); + DockerContainer container = ContainerProps::containerFromString(name); + + QJsonObject config; + Proto mainProto = ContainerProps::defaultProtocol(container); + for (auto protocol : ContainerProps::protocolsForContainer(container)) { + QJsonObject containerConfig; + if (protocol == mainProto) { + containerConfig.insert(config_key::port, port); + containerConfig.insert(config_key::transport_proto, transportProto); + + if (protocol == Proto::TorWebSite) { + stdOut.clear(); + script = QString("sudo docker exec -i %1 sh -c 'cat /var/lib/tor/hidden_service/hostname'").arg(name); + + ErrorCode errorCode = runScript(credentials, script, cbReadStdOut, cbReadStdErr); + if (errorCode != ErrorCode::NoError) { + return errorCode; + } + + if (stdOut.isEmpty()) { + logger.error() << "Key parameters for the tor container are missing"; + continue; + } + + QString onion = stdOut; + onion.replace("\n", ""); + containerConfig.insert(config_key::site, onion); } config.insert(config_key::container, ContainerProps::containerToString(container));