mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-01-27 21:34:17 +00:00
display NTCP2 session in web console
This commit is contained in:
parent
fc52b2b940
commit
910a9600bd
@ -259,6 +259,12 @@ namespace http {
|
|||||||
s << "<b>Our external address:</b>" << "<br>\r\n" ;
|
s << "<b>Our external address:</b>" << "<br>\r\n" ;
|
||||||
for (const auto& address : i2p::context.GetRouterInfo().GetAddresses())
|
for (const auto& address : i2p::context.GetRouterInfo().GetAddresses())
|
||||||
{
|
{
|
||||||
|
if (address->IsNTCP2 ())
|
||||||
|
{
|
||||||
|
// TODO: show actual address
|
||||||
|
s << "NTCP2 supported <br>\r\n";
|
||||||
|
continue;
|
||||||
|
}
|
||||||
switch (address->transportStyle)
|
switch (address->transportStyle)
|
||||||
{
|
{
|
||||||
case i2p::data::RouterInfo::eTransportNTCP:
|
case i2p::data::RouterInfo::eTransportNTCP:
|
||||||
@ -540,6 +546,46 @@ namespace http {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename Sessions>
|
||||||
|
static void ShowNTCPTransports (std::stringstream& s, const Sessions& sessions, const std::string name)
|
||||||
|
{
|
||||||
|
std::stringstream tmp_s, tmp_s6; uint16_t cnt = 0, cnt6 = 0;
|
||||||
|
for (const auto& it: sessions )
|
||||||
|
{
|
||||||
|
if (it.second && it.second->IsEstablished () && !it.second->GetSocket ().remote_endpoint ().address ().is_v6 ())
|
||||||
|
{
|
||||||
|
// incoming connection doesn't have remote RI
|
||||||
|
if (it.second->IsOutgoing ()) tmp_s << " ⇒ ";
|
||||||
|
tmp_s << i2p::data::GetIdentHashAbbreviation (it.second->GetRemoteIdentity ()->GetIdentHash ()) << ": "
|
||||||
|
<< it.second->GetSocket ().remote_endpoint().address ().to_string ();
|
||||||
|
if (!it.second->IsOutgoing ()) tmp_s << " ⇒ ";
|
||||||
|
tmp_s << " [" << it.second->GetNumSentBytes () << ":" << it.second->GetNumReceivedBytes () << "]";
|
||||||
|
tmp_s << "<br>\r\n" << std::endl;
|
||||||
|
cnt++;
|
||||||
|
}
|
||||||
|
if (it.second && it.second->IsEstablished () && it.second->GetSocket ().remote_endpoint ().address ().is_v6 ())
|
||||||
|
{
|
||||||
|
if (it.second->IsOutgoing ()) tmp_s6 << " ⇒ ";
|
||||||
|
tmp_s6 << i2p::data::GetIdentHashAbbreviation (it.second->GetRemoteIdentity ()->GetIdentHash ()) << ": "
|
||||||
|
<< "[" << it.second->GetSocket ().remote_endpoint().address ().to_string () << "]";
|
||||||
|
if (!it.second->IsOutgoing ()) tmp_s6 << " ⇒ ";
|
||||||
|
tmp_s6 << " [" << it.second->GetNumSentBytes () << ":" << it.second->GetNumReceivedBytes () << "]";
|
||||||
|
tmp_s6 << "<br>\r\n" << std::endl;
|
||||||
|
cnt6++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!tmp_s.str ().empty ())
|
||||||
|
{
|
||||||
|
s << "<div class='slide'><label for='slide_ntcp'><b>" << name << "</b> ( " << cnt << " )</label>\r\n<input type='checkbox' id='slide_ntcp'/>\r\n<p class='content'>";
|
||||||
|
s << tmp_s.str () << "</p>\r\n</div>\r\n";
|
||||||
|
}
|
||||||
|
if (!tmp_s6.str ().empty ())
|
||||||
|
{
|
||||||
|
s << "<div class='slide'><label for='slide_ntcp6'><b>" << name << "6</b> ( " << cnt6 << " )</label>\r\n<input type='checkbox' id='slide_ntcp6'/>\r\n<p class='content'>";
|
||||||
|
s << tmp_s6.str () << "</p>\r\n</div>\r\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ShowTransports (std::stringstream& s)
|
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";
|
||||||
@ -548,43 +594,14 @@ namespace http {
|
|||||||
{
|
{
|
||||||
auto sessions = ntcpServer->GetNTCPSessions ();
|
auto sessions = ntcpServer->GetNTCPSessions ();
|
||||||
if (!sessions.empty ())
|
if (!sessions.empty ())
|
||||||
{
|
ShowNTCPTransports (s, sessions, "NTCP");
|
||||||
std::stringstream tmp_s, tmp_s6; uint16_t cnt = 0, cnt6 = 0;
|
}
|
||||||
for (const auto& it: sessions )
|
auto ntcp2Server = i2p::transport::transports.GetNTCP2Server ();
|
||||||
{
|
if (ntcp2Server)
|
||||||
if (it.second && it.second->IsEstablished () && !it.second->GetSocket ().remote_endpoint ().address ().is_v6 ())
|
{
|
||||||
{
|
auto sessions = ntcp2Server->GetNTCP2Sessions ();
|
||||||
// incoming connection doesn't have remote RI
|
if (!sessions.empty ())
|
||||||
if (it.second->IsOutgoing ()) tmp_s << " ⇒ ";
|
ShowNTCPTransports (s, sessions, "NTCP2");
|
||||||
tmp_s << i2p::data::GetIdentHashAbbreviation (it.second->GetRemoteIdentity ()->GetIdentHash ()) << ": "
|
|
||||||
<< it.second->GetSocket ().remote_endpoint().address ().to_string ();
|
|
||||||
if (!it.second->IsOutgoing ()) tmp_s << " ⇒ ";
|
|
||||||
tmp_s << " [" << it.second->GetNumSentBytes () << ":" << it.second->GetNumReceivedBytes () << "]";
|
|
||||||
tmp_s << "<br>\r\n" << std::endl;
|
|
||||||
cnt++;
|
|
||||||
}
|
|
||||||
if (it.second && it.second->IsEstablished () && it.second->GetSocket ().remote_endpoint ().address ().is_v6 ())
|
|
||||||
{
|
|
||||||
if (it.second->IsOutgoing ()) tmp_s6 << " ⇒ ";
|
|
||||||
tmp_s6 << i2p::data::GetIdentHashAbbreviation (it.second->GetRemoteIdentity ()->GetIdentHash ()) << ": "
|
|
||||||
<< "[" << it.second->GetSocket ().remote_endpoint().address ().to_string () << "]";
|
|
||||||
if (!it.second->IsOutgoing ()) tmp_s6 << " ⇒ ";
|
|
||||||
tmp_s6 << " [" << it.second->GetNumSentBytes () << ":" << it.second->GetNumReceivedBytes () << "]";
|
|
||||||
tmp_s6 << "<br>\r\n" << std::endl;
|
|
||||||
cnt6++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!tmp_s.str ().empty ())
|
|
||||||
{
|
|
||||||
s << "<div class='slide'><label for='slide_ntcp'><b>NTCP</b> ( " << cnt << " )</label>\r\n<input type='checkbox' id='slide_ntcp'/>\r\n<p class='content'>";
|
|
||||||
s << tmp_s.str () << "</p>\r\n</div>\r\n";
|
|
||||||
}
|
|
||||||
if (!tmp_s6.str ().empty ())
|
|
||||||
{
|
|
||||||
s << "<div class='slide'><label for='slide_ntcp6'><b>NTCP6</b> ( " << cnt6 << " )</label>\r\n<input type='checkbox' id='slide_ntcp6'/>\r\n<p class='content'>";
|
|
||||||
s << tmp_s6.str () << "</p>\r\n</div>\r\n";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
auto ssuServer = i2p::transport::transports.GetSSUServer ();
|
auto ssuServer = i2p::transport::transports.GetSSUServer ();
|
||||||
if (ssuServer)
|
if (ssuServer)
|
||||||
|
@ -154,6 +154,9 @@ namespace transport
|
|||||||
m_IsTerminated = true;
|
m_IsTerminated = true;
|
||||||
m_IsEstablished = false;
|
m_IsEstablished = false;
|
||||||
m_Socket.close ();
|
m_Socket.close ();
|
||||||
|
transports.PeerDisconnected (shared_from_this ());
|
||||||
|
m_Server.RemoveNTCP2Session (shared_from_this ());
|
||||||
|
m_SendQueue.clear ();
|
||||||
LogPrint (eLogDebug, "NTCP2: session terminated");
|
LogPrint (eLogDebug, "NTCP2: session terminated");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -741,6 +744,14 @@ namespace transport
|
|||||||
|
|
||||||
void NTCP2Server::Stop ()
|
void NTCP2Server::Stop ()
|
||||||
{
|
{
|
||||||
|
{
|
||||||
|
// we have to copy it because Terminate changes m_NTCP2Sessions
|
||||||
|
auto ntcpSessions = m_NTCP2Sessions;
|
||||||
|
for (auto& it: ntcpSessions)
|
||||||
|
it.second->Terminate ();
|
||||||
|
}
|
||||||
|
m_NTCP2Sessions.clear ();
|
||||||
|
|
||||||
if (m_IsRunning)
|
if (m_IsRunning)
|
||||||
{
|
{
|
||||||
m_IsRunning = false;
|
m_IsRunning = false;
|
||||||
@ -769,12 +780,44 @@ namespace transport
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool NTCP2Server::AddNTCP2Session (std::shared_ptr<NTCP2Session> session)
|
||||||
|
{
|
||||||
|
if (!session || !session->GetRemoteIdentity ()) return false;
|
||||||
|
auto& ident = session->GetRemoteIdentity ()->GetIdentHash ();
|
||||||
|
auto it = m_NTCP2Sessions.find (ident);
|
||||||
|
if (it != m_NTCP2Sessions.end ())
|
||||||
|
{
|
||||||
|
LogPrint (eLogWarning, "NTCP2: session to ", ident.ToBase64 (), " already exists");
|
||||||
|
session->Terminate();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
m_NTCP2Sessions.insert (std::make_pair (ident, session));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void NTCP2Server::RemoveNTCP2Session (std::shared_ptr<NTCP2Session> session)
|
||||||
|
{
|
||||||
|
if (session && session->GetRemoteIdentity ())
|
||||||
|
m_NTCP2Sessions.erase (session->GetRemoteIdentity ()->GetIdentHash ());
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<NTCP2Session> NTCP2Server::FindNTCP2Session (const i2p::data::IdentHash& ident)
|
||||||
|
{
|
||||||
|
auto it = m_NTCP2Sessions.find (ident);
|
||||||
|
if (it != m_NTCP2Sessions.end ())
|
||||||
|
return it->second;
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
void NTCP2Server::Connect(const boost::asio::ip::address & address, uint16_t port, std::shared_ptr<NTCP2Session> conn)
|
void NTCP2Server::Connect(const boost::asio::ip::address & address, uint16_t port, std::shared_ptr<NTCP2Session> conn)
|
||||||
{
|
{
|
||||||
LogPrint (eLogDebug, "NTCP2: Connecting to ", address ,":", port);
|
LogPrint (eLogDebug, "NTCP2: Connecting to ", address ,":", port);
|
||||||
m_Service.post([this, address, port, conn]()
|
m_Service.post([this, address, port, conn]()
|
||||||
{
|
{
|
||||||
conn->GetSocket ().async_connect (boost::asio::ip::tcp::endpoint (address, port), std::bind (&NTCP2Server::HandleConnect, this, std::placeholders::_1, conn));
|
if (this->AddNTCP2Session (conn))
|
||||||
|
{
|
||||||
|
conn->GetSocket ().async_connect (boost::asio::ip::tcp::endpoint (address, port), std::bind (&NTCP2Server::HandleConnect, this, std::placeholders::_1, conn));
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
#include <thread>
|
#include <thread>
|
||||||
#include <list>
|
#include <list>
|
||||||
|
#include <map>
|
||||||
#include <openssl/bn.h>
|
#include <openssl/bn.h>
|
||||||
#include <boost/asio.hpp>
|
#include <boost/asio.hpp>
|
||||||
#include "RouterInfo.h"
|
#include "RouterInfo.h"
|
||||||
@ -70,6 +71,9 @@ namespace transport
|
|||||||
|
|
||||||
boost::asio::ip::tcp::socket& GetSocket () { return m_Socket; };
|
boost::asio::ip::tcp::socket& GetSocket () { return m_Socket; };
|
||||||
|
|
||||||
|
bool IsEstablished () const { return m_IsEstablished; };
|
||||||
|
bool IsTerminated () const { return m_IsTerminated; };
|
||||||
|
|
||||||
void ClientLogin (); // Alice
|
void ClientLogin (); // Alice
|
||||||
void ServerLogin (); // Bob
|
void ServerLogin (); // Bob
|
||||||
void SendI2NPMessages (const std::vector<std::shared_ptr<I2NPMessage> >& msgs);
|
void SendI2NPMessages (const std::vector<std::shared_ptr<I2NPMessage> >& msgs);
|
||||||
@ -139,6 +143,10 @@ namespace transport
|
|||||||
void Start ();
|
void Start ();
|
||||||
void Stop ();
|
void Stop ();
|
||||||
|
|
||||||
|
bool AddNTCP2Session (std::shared_ptr<NTCP2Session> session);
|
||||||
|
void RemoveNTCP2Session (std::shared_ptr<NTCP2Session> session);
|
||||||
|
std::shared_ptr<NTCP2Session> FindNTCP2Session (const i2p::data::IdentHash& ident);
|
||||||
|
|
||||||
boost::asio::io_service& GetService () { return m_Service; };
|
boost::asio::io_service& GetService () { return m_Service; };
|
||||||
|
|
||||||
void Connect(const boost::asio::ip::address & address, uint16_t port, std::shared_ptr<NTCP2Session> conn);
|
void Connect(const boost::asio::ip::address & address, uint16_t port, std::shared_ptr<NTCP2Session> conn);
|
||||||
@ -154,6 +162,12 @@ namespace transport
|
|||||||
std::thread * m_Thread;
|
std::thread * m_Thread;
|
||||||
boost::asio::io_service m_Service;
|
boost::asio::io_service m_Service;
|
||||||
boost::asio::io_service::work m_Work;
|
boost::asio::io_service::work m_Work;
|
||||||
|
std::map<i2p::data::IdentHash, std::shared_ptr<NTCP2Session> > m_NTCP2Sessions;
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
// for HTTP/I2PControl
|
||||||
|
const decltype(m_NTCP2Sessions)& GetNTCP2Sessions () const { return m_NTCP2Sessions; };
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user