diff --git a/src/base/api/Api.cpp b/src/base/api/Api.cpp index c4b2c5a7d..d30cda81b 100644 --- a/src/base/api/Api.cpp +++ b/src/base/api/Api.cpp @@ -37,6 +37,7 @@ #include "base/api/requests/HttpApiRequest.h" #include "base/io/json/Json.h" #include "base/kernel/Base.h" +#include "base/kernel/Env.h" #include "base/tools/Buffer.h" #include "base/tools/Chrono.h" #include "core/config/Config.h" @@ -158,7 +159,7 @@ void xmrig::Api::exec(IApiRequest &request) auto &reply = request.reply(); reply.AddMember("id", StringRef(m_id), allocator); - reply.AddMember("worker_id", StringRef(m_workerId), allocator); + reply.AddMember("worker_id", m_workerId.toJSON(), allocator); reply.AddMember("uptime", (Chrono::currentMSecsSinceEpoch() - m_timestamp) / 1000, allocator); reply.AddMember("restricted", request.isRestricted(), allocator); reply.AddMember("resources", getResources(request.doc()), allocator); @@ -245,12 +246,8 @@ void xmrig::Api::genId(const String &id) 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); + m_workerId = Env::expand(id); + if (m_workerId.isEmpty()) { + m_workerId = Env::hostname(); } } diff --git a/src/base/api/Api.h b/src/base/api/Api.h index 130ce78ef..0ee9ca6ae 100644 --- a/src/base/api/Api.h +++ b/src/base/api/Api.h @@ -32,6 +32,7 @@ #include "base/kernel/interfaces/IBaseListener.h" #include "base/tools/Object.h" +#include "base/tools/String.h" namespace xmrig { @@ -71,7 +72,7 @@ private: Base *m_base; char m_id[32]{}; - char m_workerId[128]{}; + String m_workerId; const uint64_t m_timestamp; Httpd *m_httpd = nullptr; std::vector m_listeners; diff --git a/src/base/base.cmake b/src/base/base.cmake index 615d9ac5e..56aafdead 100644 --- a/src/base/base.cmake +++ b/src/base/base.cmake @@ -12,6 +12,7 @@ set(HEADERS_BASE src/base/kernel/config/BaseConfig.h src/base/kernel/config/BaseTransform.h src/base/kernel/Entry.h + src/base/kernel/Env.h src/base/kernel/interfaces/IBaseListener.h src/base/kernel/interfaces/IClient.h src/base/kernel/interfaces/IClientListener.h @@ -66,6 +67,7 @@ set(SOURCES_BASE src/base/kernel/config/BaseConfig.cpp src/base/kernel/config/BaseTransform.cpp src/base/kernel/Entry.cpp + src/base/kernel/Env.cpp src/base/kernel/Platform.cpp src/base/kernel/Process.cpp src/base/kernel/Signals.cpp diff --git a/src/base/io/log/backends/FileLog.cpp b/src/base/io/log/backends/FileLog.cpp index c581b880d..47fad1ed8 100644 --- a/src/base/io/log/backends/FileLog.cpp +++ b/src/base/io/log/backends/FileLog.cpp @@ -25,6 +25,7 @@ #include "base/io/log/backends/FileLog.h" +#include "base/kernel/Env.h" #include @@ -35,7 +36,7 @@ xmrig::FileLog::FileLog(const char *fileName) { uv_fs_t req; - m_file = uv_fs_open(uv_default_loop(), &req, fileName, O_CREAT | O_APPEND | O_WRONLY, 0644, nullptr); + m_file = uv_fs_open(uv_default_loop(), &req, Env::expand(fileName), O_CREAT | O_APPEND | O_WRONLY, 0644, nullptr); uv_fs_req_cleanup(&req); } diff --git a/src/base/kernel/Env.cpp b/src/base/kernel/Env.cpp new file mode 100644 index 000000000..1ec323737 --- /dev/null +++ b/src/base/kernel/Env.cpp @@ -0,0 +1,106 @@ +/* XMRig + * Copyright 2010 Jeff Garzik + * Copyright 2012-2014 pooler + * Copyright 2014 Lucas Jones + * Copyright 2014-2016 Wolf9466 + * Copyright 2016 Jay D Dee + * Copyright 2017-2018 XMR-Stak , + * Copyright 2018-2019 SChernykh + * Copyright 2016-2019 XMRig , + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +#include "base/kernel/Env.h" + + +#include +#include + + +#ifndef UV_MAXHOSTNAMESIZE +# ifdef MAXHOSTNAMELEN +# define UV_MAXHOSTNAMESIZE (MAXHOSTNAMELEN + 1) +# else +# define UV_MAXHOSTNAMESIZE 256 +# endif +#endif + + +xmrig::String xmrig::Env::expand(const char *in) +{ + if (in == nullptr) { + return {}; + } + + std::string text(in); + if (text.size() < 4) { + return text.c_str(); + } + + static const std::regex env_re{R"--(\$\{([^}]+)\})--"}; + + std::map vars; + + for (std::sregex_iterator i = std::sregex_iterator(text.begin(), text.end(), env_re); i != std::sregex_iterator(); ++i) { + std::smatch m = *i; + const auto var = m.str(); + + if (vars.count(var)) { + continue; + } + + vars.insert({ var, get(m[1].str().c_str()) }); + } + + for (const auto &kv : vars) { + if (kv.second.isNull()) { + continue; + } + + size_t pos = 0; + while ((pos = text.find(kv.first, pos)) != std::string::npos) { + text.replace(pos, kv.first.size(), kv.second); + pos += kv.second.size(); + } + } + + return text.c_str(); +} + + +xmrig::String xmrig::Env::get(const char *name) +{ + return static_cast(getenv(name)); +} + + +xmrig::String xmrig::Env::hostname() +{ + char buf[UV_MAXHOSTNAMESIZE]{}; + size_t size = sizeof(buf); + +# if UV_VERSION_HEX >= 0x010c00 + if (uv_os_gethostname(buf, &size) == 0) { + return static_cast(buf); + } +# else + if (gethostname(buf, size) == 0) { + return static_cast(buf); + } +# endif + + return {}; +} diff --git a/src/base/kernel/Env.h b/src/base/kernel/Env.h new file mode 100644 index 000000000..449376b67 --- /dev/null +++ b/src/base/kernel/Env.h @@ -0,0 +1,47 @@ +/* XMRig + * Copyright 2010 Jeff Garzik + * Copyright 2012-2014 pooler + * Copyright 2014 Lucas Jones + * Copyright 2014-2016 Wolf9466 + * Copyright 2016 Jay D Dee + * Copyright 2017-2018 XMR-Stak , + * Copyright 2018-2019 SChernykh + * Copyright 2016-2019 XMRig , + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef XMRIG_ENV_H +#define XMRIG_ENV_H + + +#include "base/tools/String.h" + + +namespace xmrig { + + +class Env +{ +public: + static String expand(const char *in); + static String get(const char *name); + static String hostname(); +}; + + +} /* namespace xmrig */ + + +#endif /* XMRIG_ENV_H */