mirror of
https://github.com/PurpleI2P/i2pd
synced 2024-11-13 01:20:22 +03:00
Merge remote-tracking branch 'purple/openssl'
This commit is contained in:
commit
3125e05b49
@ -66,6 +66,7 @@ namespace client
|
|||||||
|
|
||||||
AddressBook& GetAddressBook () { return m_AddressBook; };
|
AddressBook& GetAddressBook () { return m_AddressBook; };
|
||||||
const SAMBridge * GetSAMBridge () const { return m_SamBridge; };
|
const SAMBridge * GetSAMBridge () const { return m_SamBridge; };
|
||||||
|
const I2CPServer * GetI2CPServer () const { return m_I2CPServer; };
|
||||||
|
|
||||||
std::vector<std::shared_ptr<DatagramSessionInfo> > GetForwardInfosFor(const i2p::data::IdentHash & destination);
|
std::vector<std::shared_ptr<DatagramSessionInfo> > GetForwardInfosFor(const i2p::data::IdentHash & destination);
|
||||||
|
|
||||||
|
2
Crypto.h
2
Crypto.h
@ -320,8 +320,6 @@ inline int DH_set0_key(DH *dh, BIGNUM *pub_key, BIGNUM *priv_key)
|
|||||||
inline void DH_get0_key(const DH *dh, const BIGNUM **pub_key, const BIGNUM **priv_key)
|
inline void DH_get0_key(const DH *dh, const BIGNUM **pub_key, const BIGNUM **priv_key)
|
||||||
{ *pub_key = dh->pub_key; *priv_key = dh->priv_key; }
|
{ *pub_key = dh->pub_key; *priv_key = dh->priv_key; }
|
||||||
|
|
||||||
inline int EVP_PKEY_base_id(const EVP_PKEY *pkey)
|
|
||||||
{ return EVP_PKEY_type(pkey->type); }
|
|
||||||
inline RSA *EVP_PKEY_get0_RSA(EVP_PKEY *pkey)
|
inline RSA *EVP_PKEY_get0_RSA(EVP_PKEY *pkey)
|
||||||
{ return pkey->pkey.rsa; }
|
{ return pkey->pkey.rsa; }
|
||||||
#endif
|
#endif
|
||||||
|
@ -113,7 +113,6 @@ namespace i2p
|
|||||||
} else {
|
} else {
|
||||||
// use stdout -- default
|
// use stdout -- default
|
||||||
}
|
}
|
||||||
i2p::log::Logger().Ready();
|
|
||||||
|
|
||||||
LogPrint(eLogInfo, "i2pd v", VERSION, " starting");
|
LogPrint(eLogInfo, "i2pd v", VERSION, " starting");
|
||||||
LogPrint(eLogDebug, "FS: main config file: ", config);
|
LogPrint(eLogDebug, "FS: main config file: ", config);
|
||||||
@ -246,6 +245,7 @@ namespace i2p
|
|||||||
|
|
||||||
bool Daemon_Singleton::start()
|
bool Daemon_Singleton::start()
|
||||||
{
|
{
|
||||||
|
i2p::log::Logger().Start();
|
||||||
LogPrint(eLogInfo, "Daemon: starting NetDB");
|
LogPrint(eLogInfo, "Daemon: starting NetDB");
|
||||||
i2p::data::netdb.Start();
|
i2p::data::netdb.Start();
|
||||||
|
|
||||||
@ -351,6 +351,7 @@ namespace i2p
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
i2p::crypto::TerminateCrypto ();
|
i2p::crypto::TerminateCrypto ();
|
||||||
|
i2p::log::Logger().Stop();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
59
Garlic.cpp
59
Garlic.cpp
@ -94,26 +94,16 @@ namespace garlic
|
|||||||
void GarlicRoutingSession::TagsConfirmed (uint32_t msgID)
|
void GarlicRoutingSession::TagsConfirmed (uint32_t msgID)
|
||||||
{
|
{
|
||||||
uint32_t ts = i2p::util::GetSecondsSinceEpoch ();
|
uint32_t ts = i2p::util::GetSecondsSinceEpoch ();
|
||||||
for (auto it = m_UnconfirmedTagsMsgs.begin (); it != m_UnconfirmedTagsMsgs.end ();)
|
auto it = m_UnconfirmedTagsMsgs.find (msgID);
|
||||||
|
if (it != m_UnconfirmedTagsMsgs.end ())
|
||||||
{
|
{
|
||||||
auto& tags = *it;
|
auto& tags = it->second;
|
||||||
if (tags->msgID == msgID)
|
if (ts < tags->tagsCreationTime + OUTGOING_TAGS_EXPIRATION_TIMEOUT)
|
||||||
{
|
{
|
||||||
if (ts < tags->tagsCreationTime + OUTGOING_TAGS_EXPIRATION_TIMEOUT)
|
for (int i = 0; i < tags->numTags; i++)
|
||||||
{
|
m_SessionTags.push_back (tags->sessionTags[i]);
|
||||||
for (int i = 0; i < tags->numTags; i++)
|
|
||||||
m_SessionTags.push_back (tags->sessionTags[i]);
|
|
||||||
}
|
|
||||||
it = m_UnconfirmedTagsMsgs.erase (it);
|
|
||||||
}
|
}
|
||||||
else if (ts >= tags->tagsCreationTime + OUTGOING_TAGS_CONFIRMATION_TIMEOUT)
|
m_UnconfirmedTagsMsgs.erase (it);
|
||||||
{
|
|
||||||
if (m_Owner)
|
|
||||||
m_Owner->RemoveDeliveryStatusSession (tags->msgID);
|
|
||||||
it = m_UnconfirmedTagsMsgs.erase (it);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
++it;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -144,10 +134,10 @@ namespace garlic
|
|||||||
// delete expired unconfirmed tags
|
// delete expired unconfirmed tags
|
||||||
for (auto it = m_UnconfirmedTagsMsgs.begin (); it != m_UnconfirmedTagsMsgs.end ();)
|
for (auto it = m_UnconfirmedTagsMsgs.begin (); it != m_UnconfirmedTagsMsgs.end ();)
|
||||||
{
|
{
|
||||||
if (ts >= (*it)->tagsCreationTime + OUTGOING_TAGS_CONFIRMATION_TIMEOUT)
|
if (ts >= it->second->tagsCreationTime + OUTGOING_TAGS_CONFIRMATION_TIMEOUT)
|
||||||
{
|
{
|
||||||
if (m_Owner)
|
if (m_Owner)
|
||||||
m_Owner->RemoveDeliveryStatusSession ((*it)->msgID);
|
m_Owner->RemoveDeliveryStatusSession (it->first);
|
||||||
it = m_UnconfirmedTagsMsgs.erase (it);
|
it = m_UnconfirmedTagsMsgs.erase (it);
|
||||||
ret = true;
|
ret = true;
|
||||||
}
|
}
|
||||||
@ -284,7 +274,7 @@ namespace garlic
|
|||||||
if (newTags) // new tags created
|
if (newTags) // new tags created
|
||||||
{
|
{
|
||||||
newTags->msgID = msgID;
|
newTags->msgID = msgID;
|
||||||
m_UnconfirmedTagsMsgs.emplace_back (newTags);
|
m_UnconfirmedTagsMsgs.emplace (msgID, std::unique_ptr<UnconfirmedTags>(newTags));
|
||||||
newTags = nullptr; // got acquired
|
newTags = nullptr; // got acquired
|
||||||
}
|
}
|
||||||
m_Owner->DeliveryStatusSent (shared_from_this (), msgID);
|
m_Owner->DeliveryStatusSent (shared_from_this (), msgID);
|
||||||
@ -650,37 +640,48 @@ namespace garlic
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// delivery status sessions
|
// delivery status sessions
|
||||||
for (auto it = m_DeliveryStatusSessions.begin (); it != m_DeliveryStatusSessions.end (); )
|
{
|
||||||
{
|
std::unique_lock<std::mutex> l(m_DeliveryStatusSessionsMutex);
|
||||||
if (it->second->GetOwner () != this)
|
for (auto it = m_DeliveryStatusSessions.begin (); it != m_DeliveryStatusSessions.end (); )
|
||||||
it = m_DeliveryStatusSessions.erase (it);
|
{
|
||||||
else
|
if (it->second->GetOwner () != this)
|
||||||
++it;
|
it = m_DeliveryStatusSessions.erase (it);
|
||||||
|
else
|
||||||
|
++it;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GarlicDestination::RemoveDeliveryStatusSession (uint32_t msgID)
|
void GarlicDestination::RemoveDeliveryStatusSession (uint32_t msgID)
|
||||||
{
|
{
|
||||||
|
std::unique_lock<std::mutex> l(m_DeliveryStatusSessionsMutex);
|
||||||
m_DeliveryStatusSessions.erase (msgID);
|
m_DeliveryStatusSessions.erase (msgID);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GarlicDestination::DeliveryStatusSent (GarlicRoutingSessionPtr session, uint32_t msgID)
|
void GarlicDestination::DeliveryStatusSent (GarlicRoutingSessionPtr session, uint32_t msgID)
|
||||||
{
|
{
|
||||||
|
std::unique_lock<std::mutex> l(m_DeliveryStatusSessionsMutex);
|
||||||
m_DeliveryStatusSessions[msgID] = session;
|
m_DeliveryStatusSessions[msgID] = session;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GarlicDestination::HandleDeliveryStatusMessage (std::shared_ptr<I2NPMessage> msg)
|
void GarlicDestination::HandleDeliveryStatusMessage (std::shared_ptr<I2NPMessage> msg)
|
||||||
{
|
{
|
||||||
uint32_t msgID = bufbe32toh (msg->GetPayload ());
|
uint32_t msgID = bufbe32toh (msg->GetPayload ());
|
||||||
|
GarlicRoutingSessionPtr session;
|
||||||
{
|
{
|
||||||
|
std::unique_lock<std::mutex> l(m_DeliveryStatusSessionsMutex);
|
||||||
auto it = m_DeliveryStatusSessions.find (msgID);
|
auto it = m_DeliveryStatusSessions.find (msgID);
|
||||||
if (it != m_DeliveryStatusSessions.end ())
|
if (it != m_DeliveryStatusSessions.end ())
|
||||||
{
|
{
|
||||||
it->second->MessageConfirmed (msgID);
|
session = it->second;
|
||||||
m_DeliveryStatusSessions.erase (it);
|
m_DeliveryStatusSessions.erase (it);
|
||||||
LogPrint (eLogDebug, "Garlic: message ", msgID, " acknowledged");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (session)
|
||||||
|
{
|
||||||
|
session->MessageConfirmed (msgID);
|
||||||
|
LogPrint (eLogDebug, "Garlic: message ", msgID, " acknowledged");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GarlicDestination::SetLeaseSetUpdated ()
|
void GarlicDestination::SetLeaseSetUpdated ()
|
||||||
|
3
Garlic.h
3
Garlic.h
@ -131,7 +131,7 @@ namespace garlic
|
|||||||
i2p::crypto::AESKey m_SessionKey;
|
i2p::crypto::AESKey m_SessionKey;
|
||||||
std::list<SessionTag> m_SessionTags;
|
std::list<SessionTag> m_SessionTags;
|
||||||
int m_NumTags;
|
int m_NumTags;
|
||||||
std::list<std::unique_ptr<UnconfirmedTags> > m_UnconfirmedTagsMsgs;
|
std::map<uint32_t, std::unique_ptr<UnconfirmedTags> > m_UnconfirmedTagsMsgs; // msgID->tags
|
||||||
|
|
||||||
LeaseSetUpdateStatus m_LeaseSetUpdateStatus;
|
LeaseSetUpdateStatus m_LeaseSetUpdateStatus;
|
||||||
uint32_t m_LeaseSetUpdateMsgID;
|
uint32_t m_LeaseSetUpdateMsgID;
|
||||||
@ -195,6 +195,7 @@ namespace garlic
|
|||||||
// incoming
|
// incoming
|
||||||
std::map<SessionTag, std::shared_ptr<i2p::crypto::CBCDecryption>> m_Tags;
|
std::map<SessionTag, std::shared_ptr<i2p::crypto::CBCDecryption>> m_Tags;
|
||||||
// DeliveryStatus
|
// DeliveryStatus
|
||||||
|
std::mutex m_DeliveryStatusSessionsMutex;
|
||||||
std::map<uint32_t, GarlicRoutingSessionPtr> m_DeliveryStatusSessions; // msgID -> session
|
std::map<uint32_t, GarlicRoutingSessionPtr> m_DeliveryStatusSessions; // msgID -> session
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
162
HTTPServer.cpp
162
HTTPServer.cpp
@ -71,6 +71,7 @@ namespace http {
|
|||||||
const char HTTP_PAGE_TRANSPORTS[] = "transports";
|
const char HTTP_PAGE_TRANSPORTS[] = "transports";
|
||||||
const char HTTP_PAGE_LOCAL_DESTINATIONS[] = "local_destinations";
|
const char HTTP_PAGE_LOCAL_DESTINATIONS[] = "local_destinations";
|
||||||
const char HTTP_PAGE_LOCAL_DESTINATION[] = "local_destination";
|
const char HTTP_PAGE_LOCAL_DESTINATION[] = "local_destination";
|
||||||
|
const char HTTP_PAGE_I2CP_LOCAL_DESTINATION[] = "i2cp_local_destination";
|
||||||
const char HTTP_PAGE_SAM_SESSIONS[] = "sam_sessions";
|
const char HTTP_PAGE_SAM_SESSIONS[] = "sam_sessions";
|
||||||
const char HTTP_PAGE_SAM_SESSION[] = "sam_session";
|
const char HTTP_PAGE_SAM_SESSION[] = "sam_session";
|
||||||
const char HTTP_PAGE_I2P_TUNNELS[] = "i2p_tunnels";
|
const char HTTP_PAGE_I2P_TUNNELS[] = "i2p_tunnels";
|
||||||
@ -86,7 +87,8 @@ namespace http {
|
|||||||
const char HTTP_PARAM_SAM_SESSION_ID[] = "id";
|
const char HTTP_PARAM_SAM_SESSION_ID[] = "id";
|
||||||
const char HTTP_PARAM_ADDRESS[] = "address";
|
const char HTTP_PARAM_ADDRESS[] = "address";
|
||||||
|
|
||||||
void ShowUptime (std::stringstream& s, int seconds) {
|
static void ShowUptime (std::stringstream& s, int seconds)
|
||||||
|
{
|
||||||
int num;
|
int num;
|
||||||
|
|
||||||
if ((num = seconds / 86400) > 0) {
|
if ((num = seconds / 86400) > 0) {
|
||||||
@ -104,7 +106,7 @@ namespace http {
|
|||||||
s << seconds << " seconds";
|
s << seconds << " seconds";
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShowTunnelDetails (std::stringstream& s, enum i2p::tunnel::TunnelState eState, int bytes)
|
static void ShowTunnelDetails (std::stringstream& s, enum i2p::tunnel::TunnelState eState, int bytes)
|
||||||
{
|
{
|
||||||
std::string state;
|
std::string state;
|
||||||
switch (eState) {
|
switch (eState) {
|
||||||
@ -121,7 +123,7 @@ namespace http {
|
|||||||
s << " " << (int) (bytes / 1024) << " KiB<br>\r\n";
|
s << " " << (int) (bytes / 1024) << " KiB<br>\r\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShowPageHead (std::stringstream& s)
|
static void ShowPageHead (std::stringstream& s)
|
||||||
{
|
{
|
||||||
s <<
|
s <<
|
||||||
"<!DOCTYPE html>\r\n"
|
"<!DOCTYPE html>\r\n"
|
||||||
@ -156,7 +158,7 @@ namespace http {
|
|||||||
"<div class=right>";
|
"<div class=right>";
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShowPageTail (std::stringstream& s)
|
static void ShowPageTail (std::stringstream& s)
|
||||||
{
|
{
|
||||||
s <<
|
s <<
|
||||||
"</div></div>\r\n"
|
"</div></div>\r\n"
|
||||||
@ -164,12 +166,12 @@ namespace http {
|
|||||||
"</html>\r\n";
|
"</html>\r\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShowError(std::stringstream& s, const std::string& string)
|
static void ShowError(std::stringstream& s, const std::string& string)
|
||||||
{
|
{
|
||||||
s << "<b>ERROR:</b> " << string << "<br>\r\n";
|
s << "<b>ERROR:</b> " << string << "<br>\r\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShowStatus (std::stringstream& s)
|
static void ShowStatus (std::stringstream& s)
|
||||||
{
|
{
|
||||||
s << "<b>Uptime:</b> ";
|
s << "<b>Uptime:</b> ";
|
||||||
ShowUptime(s, i2p::context.GetUptime ());
|
ShowUptime(s, i2p::context.GetUptime ());
|
||||||
@ -265,18 +267,75 @@ namespace http {
|
|||||||
s << "<b>Transit Tunnels:</b> " << std::to_string(transitTunnelCount) << "<br>\r\n";
|
s << "<b>Transit Tunnels:</b> " << std::to_string(transitTunnelCount) << "<br>\r\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShowLocalDestinations (std::stringstream& s)
|
static void ShowLocalDestinations (std::stringstream& s)
|
||||||
{
|
{
|
||||||
s << "<b>Local Destinations:</b><br>\r\n<br>\r\n";
|
s << "<b>Local Destinations:</b><br>\r\n<br>\r\n";
|
||||||
for (auto& it: i2p::client::context.GetDestinations ())
|
for (auto& it: i2p::client::context.GetDestinations ())
|
||||||
{
|
{
|
||||||
auto ident = it.second->GetIdentHash ();;
|
auto ident = it.second->GetIdentHash ();
|
||||||
s << "<a href=\"/?page=" << HTTP_PAGE_LOCAL_DESTINATION << "&b32=" << ident.ToBase32 () << "\">";
|
s << "<a href=\"/?page=" << HTTP_PAGE_LOCAL_DESTINATION << "&b32=" << ident.ToBase32 () << "\">";
|
||||||
s << i2p::client::context.GetAddressBook ().ToAddress(ident) << "</a><br>\r\n" << std::endl;
|
s << i2p::client::context.GetAddressBook ().ToAddress(ident) << "</a><br>\r\n" << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto i2cpServer = i2p::client::context.GetI2CPServer ();
|
||||||
|
if (i2cpServer)
|
||||||
|
{
|
||||||
|
s << "<br><b>I2CP Local Destinations:</b><br>\r\n<br>\r\n";
|
||||||
|
for (auto& it: i2cpServer->GetSessions ())
|
||||||
|
{
|
||||||
|
auto dest = it.second->GetDestination ();
|
||||||
|
if (dest)
|
||||||
|
{
|
||||||
|
auto ident = dest->GetIdentHash ();
|
||||||
|
s << "<a href=\"/?page=" << HTTP_PAGE_I2CP_LOCAL_DESTINATION << "&i2cp_id=" << it.first << "\">";
|
||||||
|
s << i2p::client::context.GetAddressBook ().ToAddress(ident) << "</a><br>\r\n" << std::endl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShowLocalDestination (std::stringstream& s, const std::string& b32)
|
static void ShowLeaseSetDestination (std::stringstream& s, std::shared_ptr<const i2p::client::LeaseSetDestination> dest)
|
||||||
|
{
|
||||||
|
s << "<b>Base64:</b><br>\r\n<textarea readonly=\"readonly\" cols=\"64\" rows=\"11\" wrap=\"on\">";
|
||||||
|
s << dest->GetIdentity ()->ToBase64 () << "</textarea><br>\r\n<br>\r\n";
|
||||||
|
s << "<b>LeaseSets:</b> <i>" << dest->GetNumRemoteLeaseSets () << "</i><br>\r\n";
|
||||||
|
if(dest->GetNumRemoteLeaseSets())
|
||||||
|
{
|
||||||
|
s << "<div class='slide'\r\n><label for='slide1'>Hidden content. Press on text to see.</label>\r\n<input type='checkbox' id='slide1'/>\r\n<p class='content'>\r\n";
|
||||||
|
for(auto& it: dest->GetLeaseSets ())
|
||||||
|
s << it.second->GetIdentHash ().ToBase32 () << "<br>\r\n";
|
||||||
|
s << "</p>\r\n</div>\r\n";
|
||||||
|
}
|
||||||
|
auto pool = dest->GetTunnelPool ();
|
||||||
|
if (pool)
|
||||||
|
{
|
||||||
|
s << "<b>Inbound tunnels:</b><br>\r\n";
|
||||||
|
for (auto & it : pool->GetInboundTunnels ()) {
|
||||||
|
it->Print(s);
|
||||||
|
if(it->LatencyIsKnown())
|
||||||
|
s << " ( " << it->GetMeanLatency() << "ms )";
|
||||||
|
ShowTunnelDetails(s, it->GetState (), it->GetNumReceivedBytes ());
|
||||||
|
}
|
||||||
|
s << "<br>\r\n";
|
||||||
|
s << "<b>Outbound tunnels:</b><br>\r\n";
|
||||||
|
for (auto & it : pool->GetOutboundTunnels ()) {
|
||||||
|
it->Print(s);
|
||||||
|
if(it->LatencyIsKnown())
|
||||||
|
s << " ( " << it->GetMeanLatency() << "ms )";
|
||||||
|
ShowTunnelDetails(s, it->GetState (), it->GetNumSentBytes ());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
s << "<br>\r\n";
|
||||||
|
s << "<b>Tags</b><br>Incoming: " << dest->GetNumIncomingTags () << "<br>Outgoing:<br>" << std::endl;
|
||||||
|
for (const auto& it: dest->GetSessions ())
|
||||||
|
{
|
||||||
|
s << i2p::client::context.GetAddressBook ().ToAddress(it.first) << " ";
|
||||||
|
s << it.second->GetNumOutgoingTags () << "<br>" << std::endl;
|
||||||
|
}
|
||||||
|
s << "<br>" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ShowLocalDestination (std::stringstream& s, const std::string& b32)
|
||||||
{
|
{
|
||||||
s << "<b>Local Destination:</b><br>\r\n<br>\r\n";
|
s << "<b>Local Destination:</b><br>\r\n<br>\r\n";
|
||||||
i2p::data::IdentHash ident;
|
i2p::data::IdentHash ident;
|
||||||
@ -284,55 +343,8 @@ namespace http {
|
|||||||
auto dest = i2p::client::context.FindLocalDestination (ident);
|
auto dest = i2p::client::context.FindLocalDestination (ident);
|
||||||
if (dest)
|
if (dest)
|
||||||
{
|
{
|
||||||
s << "<b>Base64:</b><br>\r\n<textarea readonly=\"readonly\" cols=\"64\" rows=\"11\" wrap=\"on\">";
|
ShowLeaseSetDestination (s, dest);
|
||||||
s << dest->GetIdentity ()->ToBase64 () << "</textarea><br>\r\n<br>\r\n";
|
// show streams
|
||||||
s << "<b>LeaseSets:</b> <i>" << dest->GetNumRemoteLeaseSets () << "</i><br>\r\n";
|
|
||||||
if(dest->GetNumRemoteLeaseSets())
|
|
||||||
{
|
|
||||||
s << "<div class='slide'\r\n><label for='slide1'>Hidden content. Press on text to see.</label>\r\n<input type='checkbox' id='slide1'/>\r\n<p class='content'>\r\n";
|
|
||||||
for(auto& it: dest->GetLeaseSets ())
|
|
||||||
s << it.second->GetIdentHash ().ToBase32 () << "<br>\r\n";
|
|
||||||
s << "</p>\r\n</div>\r\n";
|
|
||||||
}
|
|
||||||
auto pool = dest->GetTunnelPool ();
|
|
||||||
if (pool)
|
|
||||||
{
|
|
||||||
s << "<b>Inbound tunnels:</b><br>\r\n";
|
|
||||||
for (auto & it : pool->GetInboundTunnels ()) {
|
|
||||||
it->Print(s);
|
|
||||||
if(it->LatencyIsKnown())
|
|
||||||
s << " ( " << it->GetMeanLatency() << "ms )";
|
|
||||||
ShowTunnelDetails(s, it->GetState (), it->GetNumReceivedBytes ());
|
|
||||||
}
|
|
||||||
s << "<br>\r\n";
|
|
||||||
s << "<b>Outbound tunnels:</b><br>\r\n";
|
|
||||||
for (auto & it : pool->GetOutboundTunnels ()) {
|
|
||||||
it->Print(s);
|
|
||||||
if(it->LatencyIsKnown())
|
|
||||||
s << " ( " << it->GetMeanLatency() << "ms )";
|
|
||||||
ShowTunnelDetails(s, it->GetState (), it->GetNumSentBytes ());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
s << "<br>\r\n";
|
|
||||||
s << "<b>Tags</b><br>Incoming: " << dest->GetNumIncomingTags () << "<br>Outgoing:<br>" << std::endl;
|
|
||||||
for (const auto& it: dest->GetSessions ())
|
|
||||||
{
|
|
||||||
s << i2p::client::context.GetAddressBook ().ToAddress(it.first) << " ";
|
|
||||||
s << it.second->GetNumOutgoingTags () << "<br>" << std::endl;
|
|
||||||
}
|
|
||||||
s << "<br>" << std::endl;
|
|
||||||
// s << "<br>\r\n<b>Streams:</b><br>\r\n";
|
|
||||||
// for (auto it: dest->GetStreamingDestination ()->GetStreams ())
|
|
||||||
// {
|
|
||||||
// s << it.first << "->" << i2p::client::context.GetAddressBook ().ToAddress(it.second->GetRemoteIdentity ()) << " ";
|
|
||||||
// s << " [" << it.second->GetNumSentBytes () << ":" << it.second->GetNumReceivedBytes () << "]";
|
|
||||||
// s << " [out:" << it.second->GetSendQueueSize () << "][in:" << it.second->GetReceiveQueueSize () << "]";
|
|
||||||
// s << "[buf:" << it.second->GetSendBufferSize () << "]";
|
|
||||||
// s << "[RTT:" << it.second->GetRTT () << "]";
|
|
||||||
// s << "[Window:" << it.second->GetWindowSize () << "]";
|
|
||||||
// s << "[Status:" << (int)it.second->GetStatus () << "]";
|
|
||||||
// s << "<br>\r\n"<< std::endl;
|
|
||||||
// }
|
|
||||||
s << "<br>\r\n<table><caption>Streams</caption><tr>";
|
s << "<br>\r\n<table><caption>Streams</caption><tr>";
|
||||||
s << "<th>StreamID</th>";
|
s << "<th>StreamID</th>";
|
||||||
s << "<th>Destination</th>";
|
s << "<th>Destination</th>";
|
||||||
@ -365,7 +377,23 @@ namespace http {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShowLeasesSets(std::stringstream& s)
|
static void ShowI2CPLocalDestination (std::stringstream& s, const std::string& id)
|
||||||
|
{
|
||||||
|
auto i2cpServer = i2p::client::context.GetI2CPServer ();
|
||||||
|
if (i2cpServer)
|
||||||
|
{
|
||||||
|
s << "<b>I2CP Local Destination:</b><br>\r\n<br>\r\n";
|
||||||
|
auto it = i2cpServer->GetSessions ().find (std::stoi (id));
|
||||||
|
if (it != i2cpServer->GetSessions ().end ())
|
||||||
|
ShowLeaseSetDestination (s, it->second->GetDestination ());
|
||||||
|
else
|
||||||
|
ShowError(s, "I2CP session not found");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
ShowError(s, "I2CP is not enabled");
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ShowLeasesSets(std::stringstream& s)
|
||||||
{
|
{
|
||||||
s << "<div id='leasesets'><b>LeaseSets (click on to show info):</b></div><br>\r\n";
|
s << "<div id='leasesets'><b>LeaseSets (click on to show info):</b></div><br>\r\n";
|
||||||
int counter = 1;
|
int counter = 1;
|
||||||
@ -398,7 +426,7 @@ namespace http {
|
|||||||
// end for each lease set
|
// end for each lease set
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShowTunnels (std::stringstream& s)
|
static void ShowTunnels (std::stringstream& s)
|
||||||
{
|
{
|
||||||
s << "<b>Queue size:</b> " << i2p::tunnel::tunnels.GetQueueSize () << "<br>\r\n";
|
s << "<b>Queue size:</b> " << i2p::tunnel::tunnels.GetQueueSize () << "<br>\r\n";
|
||||||
|
|
||||||
@ -420,7 +448,7 @@ namespace http {
|
|||||||
s << "<br>\r\n";
|
s << "<br>\r\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShowCommands (std::stringstream& s)
|
static void ShowCommands (std::stringstream& s)
|
||||||
{
|
{
|
||||||
/* commands */
|
/* commands */
|
||||||
s << "<b>Router Commands</b><br>\r\n";
|
s << "<b>Router Commands</b><br>\r\n";
|
||||||
@ -442,7 +470,7 @@ namespace http {
|
|||||||
s << " <a href=\"/?cmd=" << HTTP_COMMAND_SHUTDOWN_NOW << "\">Force shutdown</a><br>\r\n";
|
s << " <a href=\"/?cmd=" << HTTP_COMMAND_SHUTDOWN_NOW << "\">Force shutdown</a><br>\r\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShowTransitTunnels (std::stringstream& s)
|
static void ShowTransitTunnels (std::stringstream& s)
|
||||||
{
|
{
|
||||||
s << "<b>Transit tunnels:</b><br>\r\n<br>\r\n";
|
s << "<b>Transit tunnels:</b><br>\r\n<br>\r\n";
|
||||||
for (const auto& it: i2p::tunnel::tunnels.GetTransitTunnels ())
|
for (const auto& it: i2p::tunnel::tunnels.GetTransitTunnels ())
|
||||||
@ -457,7 +485,7 @@ namespace http {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShowTransports (std::stringstream& s)
|
static void ShowTransports (std::stringstream& s)
|
||||||
{
|
{
|
||||||
s << "<b>Transports:</b><br>\r\n<br>\r\n";
|
s << "<b>Transports:</b><br>\r\n<br>\r\n";
|
||||||
auto ntcpServer = i2p::transport::transports.GetNTCPServer ();
|
auto ntcpServer = i2p::transport::transports.GetNTCPServer ();
|
||||||
@ -506,7 +534,7 @@ namespace http {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShowSAMSessions (std::stringstream& s)
|
static void ShowSAMSessions (std::stringstream& s)
|
||||||
{
|
{
|
||||||
auto sam = i2p::client::context.GetSAMBridge ();
|
auto sam = i2p::client::context.GetSAMBridge ();
|
||||||
if (!sam) {
|
if (!sam) {
|
||||||
@ -521,7 +549,7 @@ namespace http {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShowSAMSession (std::stringstream& s, const std::string& id)
|
static void ShowSAMSession (std::stringstream& s, const std::string& id)
|
||||||
{
|
{
|
||||||
s << "<b>SAM Session:</b><br>\r\n<br>\r\n";
|
s << "<b>SAM Session:</b><br>\r\n<br>\r\n";
|
||||||
auto sam = i2p::client::context.GetSAMBridge ();
|
auto sam = i2p::client::context.GetSAMBridge ();
|
||||||
@ -553,7 +581,7 @@ namespace http {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ShowI2PTunnels (std::stringstream& s)
|
static void ShowI2PTunnels (std::stringstream& s)
|
||||||
{
|
{
|
||||||
s << "<b>Client Tunnels:</b><br>\r\n<br>\r\n";
|
s << "<b>Client Tunnels:</b><br>\r\n<br>\r\n";
|
||||||
for (auto& it: i2p::client::context.GetClientTunnels ())
|
for (auto& it: i2p::client::context.GetClientTunnels ())
|
||||||
@ -743,6 +771,8 @@ namespace http {
|
|||||||
ShowLocalDestinations (s);
|
ShowLocalDestinations (s);
|
||||||
else if (page == HTTP_PAGE_LOCAL_DESTINATION)
|
else if (page == HTTP_PAGE_LOCAL_DESTINATION)
|
||||||
ShowLocalDestination (s, params["b32"]);
|
ShowLocalDestination (s, params["b32"]);
|
||||||
|
else if (page == HTTP_PAGE_I2CP_LOCAL_DESTINATION)
|
||||||
|
ShowI2CPLocalDestination (s, params["i2cp_id"]);
|
||||||
else if (page == HTTP_PAGE_SAM_SESSIONS)
|
else if (page == HTTP_PAGE_SAM_SESSIONS)
|
||||||
ShowSAMSessions (s);
|
ShowSAMSessions (s);
|
||||||
else if (page == HTTP_PAGE_SAM_SESSION)
|
else if (page == HTTP_PAGE_SAM_SESSION)
|
||||||
|
47
I2CP.cpp
47
I2CP.cpp
@ -346,6 +346,7 @@ namespace client
|
|||||||
void I2CPSession::CreateSessionMessageHandler (const uint8_t * buf, size_t len)
|
void I2CPSession::CreateSessionMessageHandler (const uint8_t * buf, size_t len)
|
||||||
{
|
{
|
||||||
RAND_bytes ((uint8_t *)&m_SessionID, 2);
|
RAND_bytes ((uint8_t *)&m_SessionID, 2);
|
||||||
|
m_Owner.InsertSession (shared_from_this ());
|
||||||
auto identity = std::make_shared<i2p::data::IdentityEx>();
|
auto identity = std::make_shared<i2p::data::IdentityEx>();
|
||||||
size_t offset = identity->FromBuffer (buf, len);
|
size_t offset = identity->FromBuffer (buf, len);
|
||||||
if (!offset)
|
if (!offset)
|
||||||
@ -460,23 +461,23 @@ namespace client
|
|||||||
{
|
{
|
||||||
i2p::data::IdentityEx identity;
|
i2p::data::IdentityEx identity;
|
||||||
size_t identsize = identity.FromBuffer (buf + offset, len - offset);
|
size_t identsize = identity.FromBuffer (buf + offset, len - offset);
|
||||||
if (identsize)
|
if (identsize)
|
||||||
{
|
{
|
||||||
offset += identsize;
|
offset += identsize;
|
||||||
uint32_t payloadLen = bufbe32toh (buf + offset);
|
uint32_t payloadLen = bufbe32toh (buf + offset);
|
||||||
if (payloadLen + offset <= len)
|
if (payloadLen + offset <= len)
|
||||||
{
|
{
|
||||||
offset += 4;
|
offset += 4;
|
||||||
uint32_t nonce = bufbe32toh (buf + offset + payloadLen);
|
uint32_t nonce = bufbe32toh (buf + offset + payloadLen);
|
||||||
if (m_IsSendAccepted)
|
if (m_IsSendAccepted)
|
||||||
SendMessageStatusMessage (nonce, eI2CPMessageStatusAccepted); // accepted
|
SendMessageStatusMessage (nonce, eI2CPMessageStatusAccepted); // accepted
|
||||||
m_Destination->SendMsgTo (buf + offset, payloadLen, identity.GetIdentHash (), nonce);
|
m_Destination->SendMsgTo (buf + offset, payloadLen, identity.GetIdentHash (), nonce);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
LogPrint(eLogError, "I2CP: cannot send message, too big");
|
LogPrint(eLogError, "I2CP: cannot send message, too big");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
LogPrint(eLogError, "I2CP: invalid identity");
|
LogPrint(eLogError, "I2CP: invalid identity");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -711,7 +712,6 @@ namespace client
|
|||||||
{
|
{
|
||||||
LogPrint (eLogDebug, "I2CP: new connection from ", ep);
|
LogPrint (eLogDebug, "I2CP: new connection from ", ep);
|
||||||
auto session = std::make_shared<I2CPSession>(*this, socket);
|
auto session = std::make_shared<I2CPSession>(*this, socket);
|
||||||
m_Sessions[session->GetSessionID ()] = session;
|
|
||||||
session->Start ();
|
session->Start ();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -724,6 +724,17 @@ namespace client
|
|||||||
Accept ();
|
Accept ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool I2CPServer::InsertSession (std::shared_ptr<I2CPSession> session)
|
||||||
|
{
|
||||||
|
if (!session) return false;
|
||||||
|
if (!m_Sessions.insert({session->GetSessionID (), session}).second)
|
||||||
|
{
|
||||||
|
LogPrint (eLogError, "I2CP: duplicate session id ", session->GetSessionID ());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
void I2CPServer::RemoveSession (uint16_t sessionID)
|
void I2CPServer::RemoveSession (uint16_t sessionID)
|
||||||
{
|
{
|
||||||
m_Sessions.erase (sessionID);
|
m_Sessions.erase (sessionID);
|
||||||
|
5
I2CP.h
5
I2CP.h
@ -112,6 +112,7 @@ namespace client
|
|||||||
void Start ();
|
void Start ();
|
||||||
void Stop ();
|
void Stop ();
|
||||||
uint16_t GetSessionID () const { return m_SessionID; };
|
uint16_t GetSessionID () const { return m_SessionID; };
|
||||||
|
std::shared_ptr<const I2CPDestination> GetDestination () const { return m_Destination; };
|
||||||
|
|
||||||
// called from I2CPDestination
|
// called from I2CPDestination
|
||||||
void SendI2CPMessage (uint8_t type, const uint8_t * payload, size_t len);
|
void SendI2CPMessage (uint8_t type, const uint8_t * payload, size_t len);
|
||||||
@ -173,6 +174,7 @@ namespace client
|
|||||||
void Stop ();
|
void Stop ();
|
||||||
boost::asio::io_service& GetService () { return m_Service; };
|
boost::asio::io_service& GetService () { return m_Service; };
|
||||||
|
|
||||||
|
bool InsertSession (std::shared_ptr<I2CPSession> session);
|
||||||
void RemoveSession (uint16_t sessionID);
|
void RemoveSession (uint16_t sessionID);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@ -196,6 +198,9 @@ namespace client
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
const decltype(m_MessagesHandlers)& GetMessagesHandlers () const { return m_MessagesHandlers; };
|
const decltype(m_MessagesHandlers)& GetMessagesHandlers () const { return m_MessagesHandlers; };
|
||||||
|
|
||||||
|
// for HTTP
|
||||||
|
const decltype(m_Sessions)& GetSessions () const { return m_Sessions; };
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
97
Log.cpp
97
Log.cpp
@ -58,13 +58,30 @@ namespace log {
|
|||||||
|
|
||||||
Log::Log():
|
Log::Log():
|
||||||
m_Destination(eLogStdout), m_MinLevel(eLogInfo),
|
m_Destination(eLogStdout), m_MinLevel(eLogInfo),
|
||||||
m_LogStream (nullptr), m_Logfile(""), m_IsReady(false), m_HasColors(true)
|
m_LogStream (nullptr), m_Logfile(""), m_HasColors(true),
|
||||||
|
m_IsRunning (false), m_Thread (nullptr)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
Log::~Log ()
|
Log::~Log ()
|
||||||
{
|
{
|
||||||
switch (m_Destination) {
|
delete m_Thread;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Log::Start ()
|
||||||
|
{
|
||||||
|
if (!m_IsRunning)
|
||||||
|
{
|
||||||
|
Reopen ();
|
||||||
|
m_IsRunning = true;
|
||||||
|
m_Thread = new std::thread (std::bind (&Log::Run, this));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Log::Stop ()
|
||||||
|
{
|
||||||
|
switch (m_Destination)
|
||||||
|
{
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
case eLogSyslog :
|
case eLogSyslog :
|
||||||
closelog();
|
closelog();
|
||||||
@ -78,7 +95,14 @@ namespace log {
|
|||||||
/* do nothing */
|
/* do nothing */
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
Process();
|
m_IsRunning = false;
|
||||||
|
m_Queue.WakeUp ();
|
||||||
|
if (m_Thread)
|
||||||
|
{
|
||||||
|
m_Thread->join ();
|
||||||
|
delete m_Thread;
|
||||||
|
m_Thread = nullptr;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Log::SetLogLevel (const std::string& level) {
|
void Log::SetLogLevel (const std::string& level) {
|
||||||
@ -106,45 +130,52 @@ namespace log {
|
|||||||
* Unfortunately, with current startup process with late fork() this
|
* Unfortunately, with current startup process with late fork() this
|
||||||
* will give us nothing but pain. Maybe later. See in NetDb as example.
|
* will give us nothing but pain. Maybe later. See in NetDb as example.
|
||||||
*/
|
*/
|
||||||
void Log::Process() {
|
void Log::Process(std::shared_ptr<LogMsg> msg)
|
||||||
std::unique_lock<std::mutex> l(m_OutputLock);
|
{
|
||||||
|
if (!msg) return;
|
||||||
std::hash<std::thread::id> hasher;
|
std::hash<std::thread::id> hasher;
|
||||||
unsigned short short_tid;
|
unsigned short short_tid;
|
||||||
while (1) {
|
short_tid = (short) (hasher(msg->tid) % 1000);
|
||||||
auto msg = m_Queue.GetNextWithTimeout (1);
|
switch (m_Destination) {
|
||||||
if (!msg)
|
|
||||||
break;
|
|
||||||
short_tid = (short) (hasher(msg->tid) % 1000);
|
|
||||||
switch (m_Destination) {
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
case eLogSyslog:
|
case eLogSyslog:
|
||||||
syslog(GetSyslogPrio(msg->level), "[%03u] %s", short_tid, msg->text.c_str());
|
syslog(GetSyslogPrio(msg->level), "[%03u] %s", short_tid, msg->text.c_str());
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
case eLogFile:
|
case eLogFile:
|
||||||
case eLogStream:
|
case eLogStream:
|
||||||
if (m_LogStream)
|
if (m_LogStream)
|
||||||
*m_LogStream << TimeAsString(msg->timestamp)
|
*m_LogStream << TimeAsString(msg->timestamp)
|
||||||
<< "@" << short_tid
|
|
||||||
<< "/" << g_LogLevelStr[msg->level]
|
|
||||||
<< " - " << msg->text << std::endl;
|
|
||||||
break;
|
|
||||||
case eLogStdout:
|
|
||||||
default:
|
|
||||||
std::cout << TimeAsString(msg->timestamp)
|
|
||||||
<< "@" << short_tid
|
<< "@" << short_tid
|
||||||
<< "/" << LogMsgColors[msg->level] << g_LogLevelStr[msg->level] << LogMsgColors[eNumLogLevels]
|
<< "/" << g_LogLevelStr[msg->level]
|
||||||
<< " - " << msg->text << std::endl;
|
<< " - " << msg->text << std::endl;
|
||||||
break;
|
break;
|
||||||
} // switch
|
case eLogStdout:
|
||||||
} // while
|
default:
|
||||||
|
std::cout << TimeAsString(msg->timestamp)
|
||||||
|
<< "@" << short_tid
|
||||||
|
<< "/" << LogMsgColors[msg->level] << g_LogLevelStr[msg->level] << LogMsgColors[eNumLogLevels]
|
||||||
|
<< " - " << msg->text << std::endl;
|
||||||
|
break;
|
||||||
|
} // switch
|
||||||
}
|
}
|
||||||
|
|
||||||
void Log::Append(std::shared_ptr<i2p::log::LogMsg> & msg) {
|
void Log::Run ()
|
||||||
|
{
|
||||||
|
while (m_IsRunning)
|
||||||
|
{
|
||||||
|
std::shared_ptr<LogMsg> msg;
|
||||||
|
while (msg = m_Queue.Get ())
|
||||||
|
Process (msg);
|
||||||
|
if (m_LogStream) m_LogStream->flush();
|
||||||
|
if (m_IsRunning)
|
||||||
|
m_Queue.Wait ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void Log::Append(std::shared_ptr<i2p::log::LogMsg> & msg)
|
||||||
|
{
|
||||||
m_Queue.Put(msg);
|
m_Queue.Put(msg);
|
||||||
if (!m_IsReady)
|
|
||||||
return;
|
|
||||||
Process();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Log::SendTo (const std::string& path)
|
void Log::SendTo (const std::string& path)
|
||||||
|
20
Log.h
20
Log.h
@ -16,6 +16,7 @@
|
|||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <thread>
|
||||||
#include "Queue.h"
|
#include "Queue.h"
|
||||||
|
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
@ -56,9 +57,9 @@ namespace log {
|
|||||||
std::time_t m_LastTimestamp;
|
std::time_t m_LastTimestamp;
|
||||||
char m_LastDateTime[64];
|
char m_LastDateTime[64];
|
||||||
i2p::util::Queue<std::shared_ptr<LogMsg> > m_Queue;
|
i2p::util::Queue<std::shared_ptr<LogMsg> > m_Queue;
|
||||||
volatile bool m_IsReady;
|
|
||||||
bool m_HasColors;
|
bool m_HasColors;
|
||||||
mutable std::mutex m_OutputLock;
|
volatile bool m_IsRunning;
|
||||||
|
std::thread * m_Thread;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
@ -66,10 +67,8 @@ namespace log {
|
|||||||
Log (const Log &);
|
Log (const Log &);
|
||||||
const Log& operator=(const Log&);
|
const Log& operator=(const Log&);
|
||||||
|
|
||||||
/**
|
void Run ();
|
||||||
* @brief process stored messages in queue
|
void Process (std::shared_ptr<LogMsg> msg);
|
||||||
*/
|
|
||||||
void Process ();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Makes formatted string from unix timestamp
|
* @brief Makes formatted string from unix timestamp
|
||||||
@ -87,6 +86,9 @@ namespace log {
|
|||||||
LogType GetLogType () { return m_Destination; };
|
LogType GetLogType () { return m_Destination; };
|
||||||
LogLevel GetLogLevel () { return m_MinLevel; };
|
LogLevel GetLogLevel () { return m_MinLevel; };
|
||||||
|
|
||||||
|
void Start ();
|
||||||
|
void Stop ();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Sets minimal allowed level for log messages
|
* @brief Sets minimal allowed level for log messages
|
||||||
* @param level String with wanted minimal msg level
|
* @param level String with wanted minimal msg level
|
||||||
@ -120,12 +122,6 @@ namespace log {
|
|||||||
*/
|
*/
|
||||||
void Append(std::shared_ptr<i2p::log::LogMsg> &);
|
void Append(std::shared_ptr<i2p::log::LogMsg> &);
|
||||||
|
|
||||||
/** @brief Allow log output */
|
|
||||||
void Ready() { m_IsReady = true; }
|
|
||||||
|
|
||||||
/** @brief Flushes the output log stream */
|
|
||||||
void Flush();
|
|
||||||
|
|
||||||
/** @brief Reopen log file */
|
/** @brief Reopen log file */
|
||||||
void Reopen();
|
void Reopen();
|
||||||
};
|
};
|
||||||
|
@ -215,8 +215,8 @@ namespace i2p
|
|||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case low : /* not set */; break;
|
case low : /* not set */; break;
|
||||||
|
case extra : caps |= i2p::data::RouterInfo::eExtraBandwidth; // no break here
|
||||||
case high : caps |= i2p::data::RouterInfo::eHighBandwidth; break;
|
case high : caps |= i2p::data::RouterInfo::eHighBandwidth; break;
|
||||||
case extra : caps |= i2p::data::RouterInfo::eExtraBandwidth; break;
|
|
||||||
}
|
}
|
||||||
m_RouterInfo.SetCaps (caps);
|
m_RouterInfo.SetCaps (caps);
|
||||||
UpdateRouterInfo ();
|
UpdateRouterInfo ();
|
||||||
|
3
UPnP.cpp
3
UPnP.cpp
@ -66,10 +66,13 @@ namespace transport
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
m_Service.run ();
|
m_Service.run ();
|
||||||
|
// Discover failed
|
||||||
|
break; // terminate the thread
|
||||||
}
|
}
|
||||||
catch (std::exception& ex)
|
catch (std::exception& ex)
|
||||||
{
|
{
|
||||||
LogPrint (eLogError, "UPnP: runtime exception: ", ex.what ());
|
LogPrint (eLogError, "UPnP: runtime exception: ", ex.what ());
|
||||||
|
PortMapping ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
3
api.cpp
3
api.cpp
@ -47,7 +47,7 @@ namespace api
|
|||||||
i2p::log::Logger().SendTo (logStream);
|
i2p::log::Logger().SendTo (logStream);
|
||||||
else
|
else
|
||||||
i2p::log::Logger().SendTo (i2p::fs::DataDirPath (i2p::fs::GetAppName () + ".log"));
|
i2p::log::Logger().SendTo (i2p::fs::DataDirPath (i2p::fs::GetAppName () + ".log"));
|
||||||
i2p::log::Logger().Ready();
|
i2p::log::Logger().Start ();
|
||||||
LogPrint(eLogInfo, "API: starting NetDB");
|
LogPrint(eLogInfo, "API: starting NetDB");
|
||||||
i2p::data::netdb.Start();
|
i2p::data::netdb.Start();
|
||||||
LogPrint(eLogInfo, "API: starting Transports");
|
LogPrint(eLogInfo, "API: starting Transports");
|
||||||
@ -65,6 +65,7 @@ namespace api
|
|||||||
i2p::transport::transports.Stop();
|
i2p::transport::transports.Stop();
|
||||||
LogPrint(eLogInfo, "API: stopping NetDB");
|
LogPrint(eLogInfo, "API: stopping NetDB");
|
||||||
i2p::data::netdb.Stop();
|
i2p::data::netdb.Stop();
|
||||||
|
i2p::log::Logger().Stop ();
|
||||||
}
|
}
|
||||||
|
|
||||||
void RunPeerTest ()
|
void RunPeerTest ()
|
||||||
|
Loading…
Reference in New Issue
Block a user