diff --git a/I2PControl.cpp b/I2PControl.cpp index 31e5dbf4..030676f3 100644 --- a/I2PControl.cpp +++ b/I2PControl.cpp @@ -20,10 +20,17 @@ namespace client m_Acceptor (m_Service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port)), m_ShutdownTimer (m_Service) { - m_MethodHanders[I2P_CONTROL_METHOD_AUTHENTICATE] = &I2PControlService::AuthenticateHandler; - m_MethodHanders[I2P_CONTROL_METHOD_ECHO] = &I2PControlService::EchoHandler; - m_MethodHanders[I2P_CONTROL_METHOD_ROUTER_INFO] = &I2PControlService::RouterInfoHandler; - m_MethodHanders[I2P_CONTROL_METHOD_ROUTER_MANAGER] = &I2PControlService::RouterManagerHandler; + m_MethodHandlers[I2P_CONTROL_METHOD_AUTHENTICATE] = &I2PControlService::AuthenticateHandler; + m_MethodHandlers[I2P_CONTROL_METHOD_ECHO] = &I2PControlService::EchoHandler; + m_MethodHandlers[I2P_CONTROL_METHOD_ROUTER_INFO] = &I2PControlService::RouterInfoHandler; + m_MethodHandlers[I2P_CONTROL_METHOD_ROUTER_MANAGER] = &I2PControlService::RouterManagerHandler; + + // RouterInfo + m_RouterInfoHandlers[I2P_CONTROL_ROUTER_INFO_NETDB_KNOWNPEERS] = &I2PControlService::NetDbKnownPeersHandler; + + // RouterManager + m_RouterManagerHandlers[I2P_CONTROL_ROUTER_MANAGER_SHUTDOWN] = &I2PControlService::ShutdownHandler; + m_RouterManagerHandlers[I2P_CONTROL_ROUTER_MANAGER_SHUTDOWN_GRACEFUL] = &I2PControlService::ShutdownGracefulHandler; } I2PControlService::~I2PControlService () @@ -118,8 +125,8 @@ namespace client boost::property_tree::ptree pt; boost::property_tree::read_json (ss, pt); std::string method = pt.get(I2P_CONTROL_PROPERTY_METHOD); - auto it = m_MethodHanders.find (method); - if (it != m_MethodHanders.end ()) + auto it = m_MethodHandlers.find (method); + if (it != m_MethodHandlers.end ()) { std::map params; for (auto& v: pt.get_child (I2P_CONTROL_PROPERTY_PARAMS)) @@ -195,48 +202,69 @@ namespace client results[I2P_CONTROL_PARAM_RESULT] = echo; } +// RouterInfo + void I2PControlService::RouterInfoHandler (const std::map& params, std::map& results) { LogPrint (eLogDebug, "I2PControl RouterInfo"); for (auto& it: params) { LogPrint (eLogDebug, it.first); - if (it.first == I2P_CONTROL_PARAM_RI_NETDB_KNOWNPEERS) - results[I2P_CONTROL_PARAM_RI_NETDB_KNOWNPEERS] = boost::lexical_cast(i2p::data::netdb.GetNumRouters ()); + auto it1 = m_RouterInfoHandlers.find (it.first); + if (it1 != m_RouterInfoHandlers.end ()) + (this->*(it1->second))(results); + else + LogPrint (eLogError, "I2PControl RouterInfo unknown request ", it.first); + } } + void I2PControlService::NetDbKnownPeersHandler (std::map& results) + { + results[I2P_CONTROL_ROUTER_INFO_NETDB_KNOWNPEERS] = boost::lexical_cast(i2p::data::netdb.GetNumRouters ()); + } + +// RouterManager + void I2PControlService::RouterManagerHandler (const std::map& params, std::map& results) { LogPrint (eLogDebug, "I2PControl RouterManager"); for (auto& it: params) { LogPrint (eLogDebug, it.first); - if (it.first == I2P_CONTROL_PARAM_ROUTER_MANAGER_SHUTDOWN) - { - LogPrint (eLogInfo, "Shutdown requested"); - results[I2P_CONTROL_PARAM_ROUTER_MANAGER_SHUTDOWN] = ""; - m_ShutdownTimer.expires_from_now (boost::posix_time::seconds(1)); // 1 second to make sure response has been sent - m_ShutdownTimer.async_wait ( - [](const boost::system::error_code& ecode) - { - Daemon.running = 0; - }); - } - else if (it.first == I2P_CONTROL_PARAM_ROUTER_MANAGER_SHUTDOWN_GRACEFUL) - { - i2p::context.SetAcceptsTunnels (false); - int timeout = i2p::tunnel::tunnels.GetTransitTunnelsExpirationTimeout (); - LogPrint (eLogInfo, "Graceful shutdown requested. Will shutdown after ", timeout, " seconds"); - results[I2P_CONTROL_PARAM_ROUTER_MANAGER_SHUTDOWN_GRACEFUL] = ""; - m_ShutdownTimer.expires_from_now (boost::posix_time::seconds(timeout + 1)); // + 1 second - m_ShutdownTimer.async_wait ( - [](const boost::system::error_code& ecode) - { - Daemon.running = 0; - }); - } + auto it1 = m_RouterManagerHandlers.find (it.first); + if (it1 != m_RouterManagerHandlers.end ()) + (this->*(it1->second))(results); + else + LogPrint (eLogError, "I2PControl RouterManager unknown request ", it.first); } } + + + void I2PControlService::ShutdownHandler (std::map& results) + { + LogPrint (eLogInfo, "Shutdown requested"); + results[I2P_CONTROL_ROUTER_MANAGER_SHUTDOWN] = ""; + m_ShutdownTimer.expires_from_now (boost::posix_time::seconds(1)); // 1 second to make sure response has been sent + m_ShutdownTimer.async_wait ( + [](const boost::system::error_code& ecode) + { + Daemon.running = 0; + }); + } + + void I2PControlService::ShutdownGracefulHandler (std::map& results) + { + i2p::context.SetAcceptsTunnels (false); + int timeout = i2p::tunnel::tunnels.GetTransitTunnelsExpirationTimeout (); + LogPrint (eLogInfo, "Graceful shutdown requested. Will shutdown after ", timeout, " seconds"); + results[I2P_CONTROL_ROUTER_MANAGER_SHUTDOWN_GRACEFUL] = ""; + m_ShutdownTimer.expires_from_now (boost::posix_time::seconds(timeout + 1)); // + 1 second + m_ShutdownTimer.async_wait ( + [](const boost::system::error_code& ecode) + { + Daemon.running = 0; + }); + } } } diff --git a/I2PControl.h b/I2PControl.h index 7874a3a2..db530b09 100644 --- a/I2PControl.h +++ b/I2PControl.h @@ -34,12 +34,12 @@ namespace client const char I2P_CONTROL_PARAM_ECHO[] = "Echo"; const char I2P_CONTROL_PARAM_RESULT[] = "Result"; - // RouterInfo params - const char I2P_CONTROL_PARAM_RI_NETDB_KNOWNPEERS[] = "i2p.router.netdb.knownpeers"; + // RouterInfo requests + const char I2P_CONTROL_ROUTER_INFO_NETDB_KNOWNPEERS[] = "i2p.router.netdb.knownpeers"; - // RouterManager params - const char I2P_CONTROL_PARAM_ROUTER_MANAGER_SHUTDOWN[] = "Shutdown"; - const char I2P_CONTROL_PARAM_ROUTER_MANAGER_SHUTDOWN_GRACEFUL[] = "ShutdownGraceful"; + // RouterManager requests + const char I2P_CONTROL_ROUTER_MANAGER_SHUTDOWN[] = "Shutdown"; + const char I2P_CONTROL_ROUTER_MANAGER_SHUTDOWN_GRACEFUL[] = "ShutdownGraceful"; class I2PControlService { @@ -67,11 +67,23 @@ namespace client private: + // methods + typedef void (I2PControlService::*MethodHandler)(const std::map& params, std::map& results); + void AuthenticateHandler (const std::map& params, std::map& results); void EchoHandler (const std::map& params, std::map& results); void RouterInfoHandler (const std::map& params, std::map& results); void RouterManagerHandler (const std::map& params, std::map& results); + // RouterInfo + typedef void (I2PControlService::*RouterInfoRequestHandler)(std::map& results); + void NetDbKnownPeersHandler (std::map& results); + + // RouterManager + typedef void (I2PControlService::*RouterManagerRequestHandler)(std::map& results); + void ShutdownHandler (std::map& results); + void ShutdownGracefulHandler (std::map& results); + private: bool m_IsRunning; @@ -81,8 +93,10 @@ namespace client boost::asio::ip::tcp::acceptor m_Acceptor; boost::asio::deadline_timer m_ShutdownTimer; - typedef void (I2PControlService::*MethodHandler)(const std::map& params, std::map& results); - std::map m_MethodHanders; + + std::map m_MethodHandlers; + std::map m_RouterInfoHandlers; + std::map m_RouterManagerHandlers; }; } }