IPC Socket Fixes (#2111)

* Updated RpcServer Initialization and Logic

-- Moved all RPCServer initialization logic to rpcserver constructor
-- Fixed config logic, fxn binding to rpc address, fxn adding rpc cats
-- router hive failed CI/CD resulting from outdated reference to rpcBindAddr
-- ipc socket as default hidden from windows (for now)
This commit is contained in:
drouhana 2023-01-20 10:15:18 -08:00 committed by GitHub
parent 245f968d33
commit 0edfe8ff83
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 37 additions and 32 deletions

View File

@ -588,6 +588,9 @@ namespace
return;
}
// change cwd to dataDir to support relative paths in config
fs::current_path(conf->router.m_dataDir);
ctx = std::make_shared<llarp::Context>();
ctx->Configure(std::move(conf));

View File

@ -43,7 +43,6 @@ namespace llarp
std::shared_ptr<AbstractRouter> router = nullptr;
std::shared_ptr<EventLoop> loop = nullptr;
std::shared_ptr<NodeDB> nodedb = nullptr;
std::string nodedb_dir;
Context();
virtual ~Context() = default;

View File

@ -1114,7 +1114,12 @@ namespace llarp
void
ApiConfig::defineConfigOptions(ConfigDefinition& conf, const ConfigGenParameters& params)
{
constexpr Default DefaultRPCBindAddr{"tcp://127.0.0.1:1190"};
constexpr std::array DefaultRPCBind{
Default{"tcp://127.0.0.1:1190"},
#ifndef _WIN32
Default{"ipc://rpc.sock"},
#endif
};
conf.defineOption<bool>(
"api",
@ -1128,20 +1133,22 @@ namespace llarp
conf.defineOption<std::string>(
"api",
"bind",
DefaultRPCBindAddr,
[this](std::string arg) {
if (arg.empty())
DefaultRPCBind,
MultiValue,
[this, first = true](std::string arg) mutable {
if (first)
{
arg = DefaultRPCBindAddr.val;
m_rpcBindAddresses.clear();
first = false;
}
if (arg.find("://") == std::string::npos)
{
arg = "tcp://" + arg;
}
m_rpcBindAddr = std::move(arg);
m_rpcBindAddresses.emplace_back(arg);
},
Comment{
"IP address and port to bind to.",
"IP addresses and ports to bind to.",
"Recommend localhost-only for security purposes.",
});

View File

@ -189,7 +189,7 @@ namespace llarp
struct ApiConfig
{
bool m_enableRPCServer = false;
std::string m_rpcBindAddr;
std::vector<oxenmq::address> m_rpcBindAddresses;
void
defineConfigOptions(ConfigDefinition& conf, const ConfigGenParameters& params);

View File

@ -45,8 +45,6 @@ namespace llarp
throw std::runtime_error("Config already exists");
config = std::move(conf);
nodedb_dir = fs::path{config->router.m_dataDir / nodedb_dirname}.string();
}
bool
@ -92,7 +90,7 @@ namespace llarp
Context::makeNodeDB()
{
return std::make_shared<NodeDB>(
nodedb_dir, [r = router.get()](auto call) { r->QueueDiskIO(std::move(call)); });
nodedb_dirname, [r = router.get()](auto call) { r->QueueDiskIO(std::move(call)); });
}
std::shared_ptr<AbstractRouter>

View File

@ -413,10 +413,8 @@ namespace llarp
log::clear_sinks();
log::add_sink(log_type, log_type == log::Type::System ? "lokinet" : conf.logging.m_logFile);
enableRPCServer = conf.api.m_enableRPCServer;
// re-add rpc log sink if rpc enabled, else free it
if (enableRPCServer and llarp::logRingBuffer)
if (m_Config->api.m_enableRPCServer and llarp::logRingBuffer)
log::add_sink(llarp::logRingBuffer, llarp::log::DEFAULT_PATTERN_MONO);
else
llarp::logRingBuffer = nullptr;
@ -430,9 +428,6 @@ namespace llarp
m_lokidRpcClient = std::make_shared<rpc::LokidRpcClient>(m_lmq, weak_from_this());
}
if (enableRPCServer)
rpcBindAddr = oxenmq::address(conf.api.m_rpcBindAddr);
log::debug(logcat, "Starting RPC server");
if (not StartRpcServer())
throw std::runtime_error("Failed to start rpc server");
@ -1260,12 +1255,8 @@ namespace llarp
bool
Router::StartRpcServer()
{
if (enableRPCServer)
{
m_RPCServer.reset(new rpc::RpcServer{m_lmq, this});
m_RPCServer->AsyncServeRPC(rpcBindAddr);
LogInfo("Bound RPC server to ", rpcBindAddr.full_address());
}
if (m_Config->api.m_enableRPCServer)
m_RPCServer = std::make_unique<rpc::RpcServer>(m_lmq, this);
return true;
}

View File

@ -298,9 +298,6 @@ namespace llarp
void
PumpLL();
const oxenmq::address DefaultRPCBindAddr = oxenmq::address::tcp("127.0.0.1", 1190);
bool enableRPCServer = false;
oxenmq::address rpcBindAddr = DefaultRPCBindAddr;
std::unique_ptr<rpc::RpcServer> m_RPCServer;
const llarp_time_t _randomStartDelay;

View File

@ -1,5 +1,6 @@
#include "rpc_server.hpp"
#include <llarp/router/route_poker.hpp>
#include <llarp/config/config.hpp>
#include <llarp/constants/platform.hpp>
#include <llarp/constants/version.hpp>
#include <nlohmann/json.hpp>
@ -23,7 +24,15 @@ namespace llarp::rpc
{
RpcServer::RpcServer(LMQ_ptr lmq, AbstractRouter* r)
: m_LMQ{std::move(lmq)}, m_Router{r}, log_subs{*m_LMQ, llarp::logRingBuffer}
{}
{
for (const auto& addr : r->GetConfig()->api.m_rpcBindAddresses)
{
m_LMQ->listen_plain(addr.zmq_address());
LogInfo("Bound RPC server to ", addr.full_address());
}
this->AddRPCCategories();
}
/// maybe parse json from message paramter at index
std::optional<nlohmann::json>
@ -141,9 +150,8 @@ namespace llarp::rpc
}
void
RpcServer::AsyncServeRPC(oxenmq::address url)
RpcServer::AddRPCCategories()
{
m_LMQ->listen_plain(url.zmq_address());
m_LMQ->add_category("llarp", oxenmq::AuthLevel::none)
.add_request_command("logs", [this](oxenmq::Message& msg) { HandleLogsSubRequest(msg); })
.add_request_command(

View File

@ -1,6 +1,7 @@
#pragma once
#include <string_view>
#include <llarp/config/config.hpp>
#include <oxenmq/oxenmq.h>
#include <oxenmq/address.h>
#include <oxen/log/omq_logger.hpp>
@ -18,8 +19,9 @@ namespace llarp::rpc
{
explicit RpcServer(LMQ_ptr, AbstractRouter*);
~RpcServer() = default;
void
AsyncServeRPC(oxenmq::address addr);
AddRPCCategories();
private:
void

View File

@ -80,7 +80,7 @@ namespace llarp
py::class_<ApiConfig>(mod, "ApiConfig")
.def(py::init<>())
.def_readwrite("enableRPCServer", &ApiConfig::m_enableRPCServer)
.def_readwrite("rpcBindAddr", &ApiConfig::m_rpcBindAddr);
.def_readwrite("rpcBindAddresses", &ApiConfig::m_rpcBindAddresses);
py::class_<LokidConfig>(mod, "LokidConfig")
.def(py::init<>())