diff --git a/I2PControl.cpp b/I2PControl.cpp index e8f98cbe..913f823c 100644 --- a/I2PControl.cpp +++ b/I2PControl.cpp @@ -38,6 +38,7 @@ namespace client // RouterManager m_RouterManagerHandlers[I2P_CONTROL_ROUTER_MANAGER_SHUTDOWN] = &I2PControlService::ShutdownHandler; m_RouterManagerHandlers[I2P_CONTROL_ROUTER_MANAGER_SHUTDOWN_GRACEFUL] = &I2PControlService::ShutdownGracefulHandler; + m_RouterManagerHandlers[I2P_CONTROL_ROUTER_MANAGER_RESEED] = &I2PControlService::ReseedHandler; } I2PControlService::~I2PControlService () @@ -330,7 +331,14 @@ namespace client }); } - // network setting + void I2PControlService::ReseedHandler (std::map& results) + { + LogPrint (eLogInfo, "Reseed requested"); + results[I2P_CONTROL_ROUTER_MANAGER_SHUTDOWN] = ""; + i2p::data::netdb.Reseed (); + } + +// network setting void I2PControlService::NetworkSettingHandler (const std::map& params, std::map& results) { LogPrint (eLogDebug, "I2PControl NetworkSetting"); diff --git a/I2PControl.h b/I2PControl.h index 007ac00e..e032c6fc 100644 --- a/I2PControl.h +++ b/I2PControl.h @@ -51,7 +51,8 @@ namespace client // RouterManager requests const char I2P_CONTROL_ROUTER_MANAGER_SHUTDOWN[] = "Shutdown"; const char I2P_CONTROL_ROUTER_MANAGER_SHUTDOWN_GRACEFUL[] = "ShutdownGraceful"; - + const char I2P_CONTROL_ROUTER_MANAGER_RESEED[] = "Reseed"; + class I2PControlService { public: @@ -101,6 +102,7 @@ namespace client typedef void (I2PControlService::*RouterManagerRequestHandler)(std::map& results); void ShutdownHandler (std::map& results); void ShutdownGracefulHandler (std::map& results); + void ReseedHandler (std::map& results); // NetworkSetting typedef void (I2PControlService::*NetworkSettingRequestHandler)(const std::string& value, std::map& results); diff --git a/NetDb.cpp b/NetDb.cpp index 3c593685..2c2ae884 100644 --- a/NetDb.cpp +++ b/NetDb.cpp @@ -13,7 +13,6 @@ #include "RouterContext.h" #include "Garlic.h" #include "NetDb.h" -#include "Reseed.h" #include "util.h" using namespace i2p::transport; @@ -72,13 +71,14 @@ namespace data #endif NetDb netdb; - NetDb::NetDb (): m_IsRunning (false), m_Thread (nullptr) + NetDb::NetDb (): m_IsRunning (false), m_Thread (nullptr), m_Reseeder (nullptr) { } NetDb::~NetDb () { Stop (); + delete m_Reseeder; } void NetDb::Start () @@ -86,24 +86,20 @@ namespace data Load (m_NetDbPath); if (m_RouterInfos.size () < 50) // reseed if # of router less than 50 { - Reseeder reseeder; - reseeder.LoadCertificates (); // we need certificates for SU3 verification - // try SU3 first - int reseedRetries = 0; - while (m_RouterInfos.size () < 50 && reseedRetries < 10) - { - reseeder.ReseedNowSU3(); - reseedRetries++; - } + Reseed (); - // if still not enough download .dat files - reseedRetries = 0; - while (m_RouterInfos.size () < 50 && reseedRetries < 10) + // deprecated + if (m_Reseeder) { - reseeder.reseedNow(); - reseedRetries++; - Load (m_NetDbPath); + // if still not enough download .dat files + int reseedRetries = 0; + while (m_RouterInfos.size () < 50 && reseedRetries < 10) + { + m_Reseeder->reseedNow(); + reseedRetries++; + Load (m_NetDbPath); + } } } m_IsRunning = true; @@ -314,6 +310,20 @@ namespace data return true; } + void NetDb::Reseed () + { + if (!m_Reseeder) + { + m_Reseeder = new Reseeder (); + m_Reseeder->LoadCertificates (); // we need certificates for SU3 verification + } + int reseedRetries = 0; + while (reseedRetries < 10 && !m_Reseeder->ReseedNowSU3 ()) + reseedRetries++; + if (reseedRetries >= 10) + LogPrint (eLogWarning, "Failed to reseed after 10 attempts"); + } + void NetDb::Load (const char * directory) { boost::filesystem::path p (i2p::util::filesystem::GetDataDir()); diff --git a/NetDb.h b/NetDb.h index c74ea113..afcae70d 100644 --- a/NetDb.h +++ b/NetDb.h @@ -15,6 +15,7 @@ #include "LeaseSet.h" #include "Tunnel.h" #include "TunnelPool.h" +#include "Reseed.h" namespace i2p { @@ -83,6 +84,8 @@ namespace data void PostI2NPMsg (I2NPMessage * msg); + void Reseed (); + // for web interface int GetNumRouters () const { return m_RouterInfos.size (); }; int GetNumFloodfills () const { return m_Floodfills.size (); }; @@ -119,6 +122,8 @@ namespace data std::thread * m_Thread; i2p::util::Queue m_Queue; // of I2NPDatabaseStoreMsg + Reseeder * m_Reseeder; + static const char m_NetDbPath[]; };