From dd036368e2f9c9c48bd2eaf63f2c156afeb2f801 Mon Sep 17 00:00:00 2001 From: XMRig Date: Sat, 30 Mar 2019 00:16:01 +0700 Subject: [PATCH] New API class. --- CMakeLists.txt | 4 +- src/App.cpp | 25 +------- src/App.h | 2 - src/api/Api.cpp | 124 ++++++++++++++++++++++++++++++++-------- src/api/Api.h | 46 +++++++++------ src/api/ApiRouter.h | 2 +- src/api/Httpd.cpp | 6 +- src/base/base.cmake | 1 - src/core/Controller.cpp | 37 ++++++++++++ src/core/Controller.h | 3 + src/net/Network.cpp | 2 +- 11 files changed, 178 insertions(+), 74 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index eb0c8936..1522da86 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -203,13 +203,13 @@ endif() if (WITH_HTTPD) set(HTTPD_SOURCES -# src/api/Api.h + src/api/Api.h # src/api/ApiRouter.h # src/common/api/HttpBody.h src/api/Httpd.h # src/common/api/HttpReply.h # src/common/api/HttpRequest.h -# src/api/Api.cpp + src/api/Api.cpp # src/api/ApiRouter.cpp src/api/Httpd.cpp # src/common/api/HttpRequest.cpp diff --git a/src/App.cpp b/src/App.cpp index 08597eda..f7e80ef7 100644 --- a/src/App.cpp +++ b/src/App.cpp @@ -45,14 +45,8 @@ #include "workers/Workers.h" -#ifdef XMRIG_FEATURE_HTTP -# include "api/Httpd.h" -#endif - - xmrig::App::App(Process *process) : m_console(nullptr), - m_httpd(nullptr), m_signals(nullptr) { m_controller = new Controller(process); @@ -71,10 +65,6 @@ xmrig::App::~App() delete m_signals; delete m_console; delete m_controller; - -# ifdef XMRIG_FEATURE_HTTP - delete m_httpd; -# endif } @@ -98,18 +88,9 @@ int xmrig::App::exec() return 0; } -# ifdef XMRIG_FEATURE_API - Api::start(m_controller); -# endif - -# ifdef XMRIG_FEATURE_HTTP - m_httpd = new Httpd(m_controller); - m_httpd->start(); -# endif - Workers::start(m_controller); - m_controller->network()->connect(); + m_controller->start(); const int r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); uv_loop_close(uv_default_loop()); @@ -179,10 +160,6 @@ void xmrig::App::onSignal(int signum) void xmrig::App::close() { -# ifdef XMRIG_FEATURE_HTTP - m_httpd->stop(); -# endif - m_signals->stop(); m_console->stop(); m_controller->stop(); diff --git a/src/App.h b/src/App.h index 86f281e8..aa534aad 100644 --- a/src/App.h +++ b/src/App.h @@ -36,7 +36,6 @@ namespace xmrig { class Console; class Controller; -class Httpd; class Network; class Process; class Signals; @@ -60,7 +59,6 @@ private: Console *m_console; Controller *m_controller; - Httpd *m_httpd; Signals *m_signals; }; diff --git a/src/api/Api.cpp b/src/api/Api.cpp index 2abdf4be..84463922 100644 --- a/src/api/Api.cpp +++ b/src/api/Api.cpp @@ -22,52 +22,128 @@ * along with this program. If not, see . */ -#include + +#include #include "api/Api.h" -#include "api/ApiRouter.h" -#include "common/api/HttpReply.h" -#include "common/api/HttpRequest.h" +#include "base/tools/Buffer.h" +#include "common/crypto/keccak.h" +#include "core/Config.h" +#include "core/Controller.h" +#include "version.h" -ApiRouter *Api::m_router = nullptr; +#ifdef XMRIG_FEATURE_HTTP +# include "api/Httpd.h" +#endif -bool Api::start(xmrig::Controller *controller) +xmrig::Api::Api(Controller *controller) : + m_id(), + m_workerId(), + m_controller(controller), + m_httpd(nullptr) { - m_router = new ApiRouter(controller); + controller->addListener(this); - return true; + genId(m_controller->config()->apiId()); } -void Api::release() +xmrig::Api::~Api() { - delete m_router; +# ifdef XMRIG_FEATURE_HTTP + delete m_httpd; +# endif } -void Api::exec(const xmrig::HttpRequest &req, xmrig::HttpReply &reply) +void xmrig::Api::request(const HttpRequest &req) { - if (!m_router) { - reply.status = 500; + +} + + +void xmrig::Api::start() +{ + genWorkerId(m_controller->config()->apiWorkerId()); + +# ifdef XMRIG_FEATURE_HTTP + m_httpd = new Httpd(m_controller); + m_httpd->start(); +# endif +} + + +void xmrig::Api::stop() +{ +# ifdef XMRIG_FEATURE_HTTP + m_httpd->stop(); +# endif +} + + +void xmrig::Api::onConfigChanged(Config *config, Config *previousConfig) +{ + if (config->apiId() != previousConfig->apiId()) { + genId(config->apiId()); + } + + if (config->apiWorkerId() != previousConfig->apiWorkerId()) { + genWorkerId(config->apiWorkerId()); + } +} + + +void xmrig::Api::genId(const String &id) +{ + memset(m_id, 0, sizeof(m_id)); + + if (id.size() > 0) { + strncpy(m_id, id.data(), sizeof(m_id) - 1); return; } - if (req.method() == xmrig::HttpRequest::Get) { - return m_router->get(req, reply); - } + uv_interface_address_t *interfaces; + int count = 0; - m_router->exec(req, reply); -} - - -void Api::tick(const xmrig::NetworkState &network) -{ - if (!m_router) { + if (uv_interface_addresses(&interfaces, &count) < 0) { return; } - m_router->tick(network); + for (int i = 0; i < count; i++) { + if (!interfaces[i].is_internal && interfaces[i].address.address4.sin_family == AF_INET) { + uint8_t hash[200]; + const size_t addrSize = sizeof(interfaces[i].phys_addr); + const size_t inSize = strlen(APP_KIND) + addrSize + sizeof(uint16_t); + const uint16_t port = static_cast(m_controller->config()->http().port()); + + uint8_t *input = new uint8_t[inSize](); + memcpy(input, &port, sizeof(uint16_t)); + memcpy(input + sizeof(uint16_t), interfaces[i].phys_addr, addrSize); + memcpy(input + sizeof(uint16_t) + addrSize, APP_KIND, strlen(APP_KIND)); + + xmrig::keccak(input, inSize, hash); + xmrig::Buffer::toHex(hash, 8, m_id); + + delete [] input; + break; + } + } + + uv_free_interface_addresses(interfaces, count); +} + + +void xmrig::Api::genWorkerId(const String &id) +{ + memset(m_workerId, 0, sizeof(m_workerId)); + + if (id.size() > 0) { + strncpy(m_workerId, id.data(), sizeof(m_workerId) - 1); + } + else { + gethostname(m_workerId, sizeof(m_workerId) - 1); + } } diff --git a/src/api/Api.h b/src/api/Api.h index caee887a..a46e95c1 100644 --- a/src/api/Api.h +++ b/src/api/Api.h @@ -26,32 +26,46 @@ #define XMRIG_API_H -#include - - -class ApiRouter; -class Hashrate; +#include "base/kernel/interfaces/IControllerListener.h" namespace xmrig { - class Controller; - class HttpReply; - class HttpRequest; - class NetworkState; -} -class Api +class Controller; +class Httpd; +class HttpRequest; +class String; + + +class Api : public IControllerListener { public: - static bool start(xmrig::Controller *controller); - static void release(); + Api(Controller *controller); + ~Api() override; - static void exec(const xmrig::HttpRequest &req, xmrig::HttpReply &reply); - static void tick(const xmrig::NetworkState &results); + inline const char *id() const { return m_id; } + inline const char *workerId() const { return m_workerId; } + + void request(const HttpRequest &req); + void start(); + void stop(); + +protected: + void onConfigChanged(Config *config, Config *previousConfig) override; private: - static ApiRouter *m_router; + void genId(const String &id); + void genWorkerId(const String &id); + + char m_id[32]; + char m_workerId[128]; + Controller *m_controller; + Httpd *m_httpd; }; + +} // namespace xmrig + + #endif /* XMRIG_API_H */ diff --git a/src/api/ApiRouter.h b/src/api/ApiRouter.h index a92173ce..61c05201 100644 --- a/src/api/ApiRouter.h +++ b/src/api/ApiRouter.h @@ -27,7 +27,7 @@ #include "api/NetworkState.h" -#include "common/interfaces/IControllerListener.h" +#include "base/kernel/interfaces/IControllerListener.h" #include "rapidjson/fwd.h" diff --git a/src/api/Httpd.cpp b/src/api/Httpd.cpp index 2e3194e6..444fdb3e 100644 --- a/src/api/Httpd.cpp +++ b/src/api/Httpd.cpp @@ -24,10 +24,11 @@ #include "3rdparty/http-parser/http_parser.h" +#include "api/Api.h" #include "api/Httpd.h" #include "base/io/log/Log.h" -#include "base/net/http/HttpRequest.h" #include "base/net/http/HttpApiResponse.h" +#include "base/net/http/HttpRequest.h" #include "base/net/http/HttpServer.h" #include "base/net/tools/TcpServer.h" #include "core/Config.h" @@ -136,8 +137,7 @@ void xmrig::Httpd::onHttpRequest(const HttpRequest &req) } } - HttpApiResponse res(req.id()); - res.end(); + m_controller->api()->request(req); } diff --git a/src/base/base.cmake b/src/base/base.cmake index 09c28d0e..5f32f425 100644 --- a/src/base/base.cmake +++ b/src/base/base.cmake @@ -106,7 +106,6 @@ if (WITH_HTTPD) add_definitions(/DXMRIG_FEATURE_HTTP) add_definitions(/DXMRIG_FEATURE_API) - remove_definitions(/DXMRIG_FEATURE_API) else() set(HEADERS_BASE_HTTP "") set(SOURCES_BASE_HTTP "") diff --git a/src/core/Controller.cpp b/src/core/Controller.cpp index 26034988..fe1537f3 100644 --- a/src/core/Controller.cpp +++ b/src/core/Controller.cpp @@ -43,10 +43,16 @@ #endif +#ifdef XMRIG_FEATURE_API +# include "api/Api.h" +#endif + + class xmrig::ControllerPrivate { public: inline ControllerPrivate(Process *process) : + api(nullptr), config(nullptr), network(nullptr), process(process) @@ -55,11 +61,16 @@ public: inline ~ControllerPrivate() { +# ifdef XMRIG_FEATURE_API + delete api; +# endif + delete network; delete config; } + Api *api; Config *config; Network *network; Process *process; @@ -79,6 +90,14 @@ xmrig::Controller::~Controller() } +xmrig::Api *xmrig::Controller::api() const +{ + assert(d_ptr->api != nullptr); + + return d_ptr->api; +} + + bool xmrig::Controller::isReady() const { return d_ptr->config && d_ptr->network; @@ -102,6 +121,10 @@ int xmrig::Controller::init() return 1; } +# ifdef XMRIG_FEATURE_API + d_ptr->api = new Api(this); +# endif + Platform::init(config()->userAgent()); Platform::setProcessPriority(d_ptr->config->priority()); @@ -165,8 +188,22 @@ void xmrig::Controller::onNewConfig(IConfig *config) } +void xmrig::Controller::start() +{ + network()->connect(); + +# ifdef XMRIG_FEATURE_API + api()->start(); +# endif +} + + void xmrig::Controller::stop() { +# ifdef XMRIG_FEATURE_API + api()->stop(); +# endif + ConfigLoader::release(); delete d_ptr->network; diff --git a/src/core/Controller.h b/src/core/Controller.h index 7c74b53c..82a90b84 100644 --- a/src/core/Controller.h +++ b/src/core/Controller.h @@ -35,6 +35,7 @@ class StatsData; namespace xmrig { +class Api; class Config; class ControllerPrivate; class IControllerListener; @@ -48,12 +49,14 @@ public: Controller(Process *process); ~Controller() override; + Api *api() const; bool isReady() const; Config *config() const; int init(); Network *network() const; void addListener(IControllerListener *listener); void save(); + void start(); void stop(); protected: diff --git a/src/net/Network.cpp b/src/net/Network.cpp index b8e2e012..7f3f81d3 100644 --- a/src/net/Network.cpp +++ b/src/net/Network.cpp @@ -198,6 +198,6 @@ void xmrig::Network::tick() } # ifdef XMRIG_FEATURE_API - Api::tick(m_state); + //Api::tick(m_state); # endif }