New API class.

This commit is contained in:
XMRig 2019-03-30 00:16:01 +07:00
parent 9cb43f9883
commit dd036368e2
11 changed files with 178 additions and 74 deletions

View file

@ -22,52 +22,128 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <string.h>
#include <uv.h>
#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<uint16_t>(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);
}
}

View file

@ -26,32 +26,46 @@
#define XMRIG_API_H
#include <uv.h>
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 */

View file

@ -27,7 +27,7 @@
#include "api/NetworkState.h"
#include "common/interfaces/IControllerListener.h"
#include "base/kernel/interfaces/IControllerListener.h"
#include "rapidjson/fwd.h"

View file

@ -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);
}