From 0edfe8ff83e3fa8c6fef4e1ea5a27c58acc6b5d6 Mon Sep 17 00:00:00 2001 From: drouhana <56026339+drouhana@users.noreply.github.com> Date: Fri, 20 Jan 2023 10:15:18 -0800 Subject: [PATCH] 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) --- daemon/lokinet.cpp | 3 +++ include/llarp.hpp | 1 - llarp/config/config.cpp | 21 ++++++++++++++------- llarp/config/config.hpp | 2 +- llarp/context.cpp | 4 +--- llarp/router/router.cpp | 15 +++------------ llarp/router/router.hpp | 3 --- llarp/rpc/rpc_server.cpp | 14 +++++++++++--- llarp/rpc/rpc_server.hpp | 4 +++- pybind/llarp/config.cpp | 2 +- 10 files changed, 37 insertions(+), 32 deletions(-) diff --git a/daemon/lokinet.cpp b/daemon/lokinet.cpp index fbf2787ae..f4607a9f9 100644 --- a/daemon/lokinet.cpp +++ b/daemon/lokinet.cpp @@ -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(); ctx->Configure(std::move(conf)); diff --git a/include/llarp.hpp b/include/llarp.hpp index cb8ca495b..2d00bdeba 100644 --- a/include/llarp.hpp +++ b/include/llarp.hpp @@ -43,7 +43,6 @@ namespace llarp std::shared_ptr router = nullptr; std::shared_ptr loop = nullptr; std::shared_ptr nodedb = nullptr; - std::string nodedb_dir; Context(); virtual ~Context() = default; diff --git a/llarp/config/config.cpp b/llarp/config/config.cpp index 67d92fa2f..98a5f1571 100644 --- a/llarp/config/config.cpp +++ b/llarp/config/config.cpp @@ -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( "api", @@ -1128,20 +1133,22 @@ namespace llarp conf.defineOption( "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.", }); diff --git a/llarp/config/config.hpp b/llarp/config/config.hpp index 54dbcc443..76540f19f 100644 --- a/llarp/config/config.hpp +++ b/llarp/config/config.hpp @@ -189,7 +189,7 @@ namespace llarp struct ApiConfig { bool m_enableRPCServer = false; - std::string m_rpcBindAddr; + std::vector m_rpcBindAddresses; void defineConfigOptions(ConfigDefinition& conf, const ConfigGenParameters& params); diff --git a/llarp/context.cpp b/llarp/context.cpp index 990419a10..b8652a256 100644 --- a/llarp/context.cpp +++ b/llarp/context.cpp @@ -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_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 diff --git a/llarp/router/router.cpp b/llarp/router/router.cpp index 55997f3ec..38de414e0 100644 --- a/llarp/router/router.cpp +++ b/llarp/router/router.cpp @@ -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(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(m_lmq, this); return true; } diff --git a/llarp/router/router.hpp b/llarp/router/router.hpp index 3e86cff07..a5dd11a66 100644 --- a/llarp/router/router.hpp +++ b/llarp/router/router.hpp @@ -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 m_RPCServer; const llarp_time_t _randomStartDelay; diff --git a/llarp/rpc/rpc_server.cpp b/llarp/rpc/rpc_server.cpp index afab58387..954c6d7fe 100644 --- a/llarp/rpc/rpc_server.cpp +++ b/llarp/rpc/rpc_server.cpp @@ -1,5 +1,6 @@ #include "rpc_server.hpp" #include +#include #include #include #include @@ -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 @@ -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( diff --git a/llarp/rpc/rpc_server.hpp b/llarp/rpc/rpc_server.hpp index 5b411c494..02c44202f 100644 --- a/llarp/rpc/rpc_server.hpp +++ b/llarp/rpc/rpc_server.hpp @@ -1,6 +1,7 @@ #pragma once #include +#include #include #include #include @@ -18,8 +19,9 @@ namespace llarp::rpc { explicit RpcServer(LMQ_ptr, AbstractRouter*); ~RpcServer() = default; + void - AsyncServeRPC(oxenmq::address addr); + AddRPCCategories(); private: void diff --git a/pybind/llarp/config.cpp b/pybind/llarp/config.cpp index 8b686959d..8ca1a8da4 100644 --- a/pybind/llarp/config.cpp +++ b/pybind/llarp/config.cpp @@ -80,7 +80,7 @@ namespace llarp py::class_(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_(mod, "LokidConfig") .def(py::init<>())