Console: start consolidation of tunnels page

This commit is contained in:
dr|z3d 2021-08-17 02:08:38 +00:00
parent 04739d5dc9
commit 5eaf4ee9c4
2 changed files with 157 additions and 44 deletions

View file

@ -341,7 +341,8 @@ namespace http {
s << internalCSS; s << internalCSS;
} }
const char HTTP_PAGE_TUNNELS[] = "tunnels"; const char HTTP_PAGE_TUNNEL_SUMMARY[] = "tunnel_summary";
const char HTTP_PAGE_CLIENT_TUNNELS[] = "client_tunnels";
const char HTTP_PAGE_TRANSIT_TUNNELS[] = "transit_tunnels"; const char HTTP_PAGE_TRANSIT_TUNNELS[] = "transit_tunnels";
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";
@ -524,7 +525,7 @@ namespace http {
"<a title=\"" << tr("Router Transports and associated connections") << "\" href=\"" << webroot << "<a title=\"" << tr("Router Transports and associated connections") << "\" href=\"" << webroot <<
"?page=" << HTTP_PAGE_TRANSPORTS << "\">" << tr ("Transports") << "</a>\r\n" "?page=" << HTTP_PAGE_TRANSPORTS << "\">" << tr ("Transports") << "</a>\r\n"
"<a title=\"" << tr("All active tunnels") << "\" href=\"" << webroot << "?page=" "<a title=\"" << tr("All active tunnels") << "\" href=\"" << webroot << "?page="
<< HTTP_PAGE_TUNNELS << "\">" << tr("Tunnels") << "</a>\r\n"; << HTTP_PAGE_TUNNEL_SUMMARY << "\">" << tr("Tunnels") << "</a>\r\n";
if (sam && sam->GetSessions ().size ()) { if (sam && sam->GetSessions ().size ()) {
s << "<a title=\"" << tr("Current SAM sessions") << "\" href=\"" << webroot << "?page=" s << "<a title=\"" << tr("Current SAM sessions") << "\" href=\"" << webroot << "?page="
<< HTTP_PAGE_SAM_SESSIONS << "\">" << tr("SAM Sessions") << "</a>\r\n"; << HTTP_PAGE_SAM_SESSIONS << "\">" << tr("SAM Sessions") << "</a>\r\n";
@ -672,11 +673,10 @@ namespace http {
clientTunnelCount += i2p::tunnel::tunnels.CountInboundTunnels(); clientTunnelCount += i2p::tunnel::tunnels.CountInboundTunnels();
std::string webroot; i2p::config::GetOption("http.webroot", webroot); std::string webroot; i2p::config::GetOption("http.webroot", webroot);
s << "<tr><td>" << tr("Service Tunnels") << "</td><td><a class=\"view\" href=\""; s << "<tr><td>" << tr("Service Tunnels") << "</td><td>" << std::to_string(clientTunnelCount) << "</td></tr>\r\n";
s << webroot << "?page=" << HTTP_PAGE_I2P_TUNNELS << "\">" << std::to_string(clientTunnelCount) << "</a></td></tr>\r\n";
if (i2p::context.AcceptsTunnels () || i2p::tunnel::tunnels.CountTransitTunnels()) { if (i2p::context.AcceptsTunnels () || i2p::tunnel::tunnels.CountTransitTunnels()) {
s << "<tr><td>" << tr("Transit Tunnels") << "</td><td><a class=\"view\" href=\""; s << "<tr><td>" << tr("Transit Tunnels") << "</td><td>"
s << webroot << "?page=" << HTTP_PAGE_TRANSIT_TUNNELS << "\">" << std::to_string(i2p::tunnel::tunnels.CountTransitTunnels()) << "</a></td></tr>\r\n"; << std::to_string(i2p::tunnel::tunnels.CountTransitTunnels()) << "</td></tr>\r\n";
} }
if(outputFormat==OutputFormatEnum::forWebConsole) { if(outputFormat==OutputFormatEnum::forWebConsole) {
@ -1096,16 +1096,35 @@ namespace http {
s << "</div>\r\n</div>\r\n</div>\r\n</td></tr>\r\n"; s << "</div>\r\n</div>\r\n</div>\r\n</td></tr>\r\n";
} }
void ShowTunnelSummary (std::stringstream& s) {
std::string webroot; i2p::config::GetOption("http.webroot", webroot);
s << "<tr><th class=\"sectiontitle\" colspan=\"2\"><span>" << tr("Tunnel Summary") << "</span></th></tr>\r\n";
s << "<tr><td class=\"center nopadding\" colspan=\"2\">\r\n";
s << "<table id=\"tunnelsummary\">\r\n<thead>"
<< "<tr><th>" << tr("Type") << "</th>"
<< "<th class=\"in\">" << tr("Inbound") << "</th><th class=\"out\">" << tr("Outbound") << "</th>"
<< "<th>" << tr("View Details") << "</th></tr>\r\n</thead>\r\n";
if (i2p::tunnel::tunnels.CountTransitTunnels() > 0) {
s << "<tr><td>" << tr("Transit") << "</td><td class=\"in\">---</td><td class=\"out\">---</td>"
<< "<td><a class=\"button\" href=\"" << webroot << "?page=" << HTTP_PAGE_TRANSIT_TUNNELS << "\">View</a></td></tr>\r\n";
}
s << "<tr><td>" << tr("Exploratory") << "</td><td class=\"in\">---</td><td class=\"out\">---</td>"
<< "<td><a class=\"button\" href=\"#\">View</a></td></tr>\r\n"
<< "<tr><td>" << tr("Exploratory + Service") << "</td><td class=\"in\">---</td><td class=\"out\">---</td>"
<< "<td><a class=\"button\" href=\"" << webroot << "?page=" << HTTP_PAGE_CLIENT_TUNNELS << "\">View</a></td></tr>\r\n"
// << "<tr><td>" << tr("Service") << "</td><td>count in/out</td><td><a class=\"button\" href=\"#\">View</a></td></tr>\r\n"
<< "<tr><td class=\"center nopadding\" colspan=\"4\">";
ShowI2PTunnels (s);
s << "</td></tr>\r\n</table>\r\n";
s << "</td></tr>\r\n";
}
static void ShowCommands (std::stringstream& s, uint32_t token) static void ShowCommands (std::stringstream& s, uint32_t token)
{ {
// s << "<tr><th class=\"sectiontitle configuration\" colspan=\"2\"><span>" << tr("Router Configuration") << "</span></th></tr>";
s << "<tr><td class=\"center nopadding\" colspan=\"2\">\r\n"; s << "<tr><td class=\"center nopadding\" colspan=\"2\">\r\n";
s << "<div class=\"slide\">\r\n<input hidden type=\"checkbox\" class=\"toggle\" id=\"slide_routerinfo\" />\r\n" s << "<div class=\"slide\">\r\n<input hidden type=\"checkbox\" class=\"toggle\" id=\"slide_routerinfo\" />\r\n"
<< "<label for=\"slide_routerinfo\">i2pd " VERSION "</label>\r\n"; << "<label for=\"slide_routerinfo\">i2pd " VERSION "</label>\r\n";
s << "<div class=\"slidecontent\">\r\n<table id=\"routerinfos\">\r\n"; s << "<div class=\"slidecontent\">\r\n<table id=\"routerinfos\">\r\n";
s << "<tr><td>" << tr("Router Identity") << "</td><td class=\"nopadding\"><span id=\"rid\" class=\"sensitive\" hidden>" s << "<tr><td>" << tr("Router Identity") << "</td><td class=\"nopadding\"><span id=\"rid\" class=\"sensitive\" hidden>"
<< i2p::context.GetRouterInfo().GetIdentHashBase64() << "</span></td></tr>\r\n"; << i2p::context.GetRouterInfo().GetIdentHashBase64() << "</span></td></tr>\r\n";
s << "<tr><td>" << tr("Router Caps") << "</td><td>" << i2p::context.GetRouterInfo().GetProperty("caps") << "</td></tr>\r\n"; s << "<tr><td>" << tr("Router Caps") << "</td><td>" << i2p::context.GetRouterInfo().GetProperty("caps") << "</td></tr>\r\n";
@ -1181,7 +1200,7 @@ namespace http {
else else
s << " <a id=\"transitaccept\" class=\"cmd\" href=\"" << webroot << "?cmd=" s << " <a id=\"transitaccept\" class=\"cmd\" href=\"" << webroot << "?cmd="
<< HTTP_COMMAND_ENABLE_TRANSIT << "&token=" << token << HTTP_COMMAND_ENABLE_TRANSIT << "&token=" << token
<< "\" data-tooltip=\"" << tr("Decline transit tunnels") << "\">" << "\" data-tooltip=\"" << tr("Accept transit tunnels") << "\">"
<< tr("Accept transit tunnels") << "</a><br>\r\n"; << tr("Accept transit tunnels") << "</a><br>\r\n";
if (i2p::tunnel::tunnels.CountTransitTunnels()) { if (i2p::tunnel::tunnels.CountTransitTunnels()) {
@ -1538,8 +1557,10 @@ namespace http {
void ShowI2PTunnels (std::stringstream& s) void ShowI2PTunnels (std::stringstream& s)
{ {
std::string webroot; i2p::config::GetOption("http.webroot", webroot); std::string webroot; i2p::config::GetOption("http.webroot", webroot);
s << "<tr><th class=\"sectiontitle\" colspan=\"2\"><span>" << tr("Service Tunnels") << "</span></th></tr><tr>" s << "<div class=\"slide\">\r\n<input hidden type=\"checkbox\" class=\"toggle\" id=\"slide_servicetunnels\" />\r\n"
<< "<td class=\"center nopadding i2ptunnels\" colspan=\"2\">\r\n<div class=\"list\">\r\n"; << "<label for=\"slide_servicetunnels\">" << tr("Service Tunnels") << " <span class=\"hide\">[</span><span class=\"count\">"
<< "in / out" << "</span><span class=\"hide\">]</span></label>\r\n";
s << "<div id=\"servicetunnels\" class=\"slidecontent list\">\r\n";
for (auto& it: i2p::client::context.GetClientTunnels ()) for (auto& it: i2p::client::context.GetClientTunnels ())
{ {
auto& ident = it.second->GetLocalDestination ()->GetIdentHash(); auto& ident = it.second->GetLocalDestination ()->GetIdentHash();
@ -1566,7 +1587,7 @@ namespace http {
s << i2p::client::context.GetAddressBook ().ToAddress(ident); s << i2p::client::context.GetAddressBook ().ToAddress(ident);
s << "</span></div>\r\n" << std::endl; s << "</span></div>\r\n" << std::endl;
} }
s << "</div></td></tr>\r\n"; s << "</div>\r\n</div>\r\n";
auto& serverTunnels = i2p::client::context.GetServerTunnels (); auto& serverTunnels = i2p::client::context.GetServerTunnels ();
if (!serverTunnels.empty ()) { if (!serverTunnels.empty ()) {
@ -1610,7 +1631,7 @@ namespace http {
s << i2p::client::context.GetAddressBook ().ToAddress(ident); s << i2p::client::context.GetAddressBook ().ToAddress(ident);
s << "</span></div>\r\n"<< std::endl; s << "</span></div>\r\n"<< std::endl;
} }
s << "</div></td></tr>\r\n"; s << "</div></table>\r\n";
} }
} }
@ -1769,35 +1790,36 @@ namespace http {
url.parse_query(params); url.parse_query(params);
page = params["page"]; page = params["page"];
if (page == HTTP_PAGE_TRANSPORTS) if (page == HTTP_PAGE_TRANSPORTS) {
ShowTransports (s); ShowTransports (s);
else if (page == HTTP_PAGE_TUNNELS) } else if (page == HTTP_PAGE_TUNNEL_SUMMARY) {
ShowTunnelSummary (s);
/*
ShowTunnels (s); ShowTunnels (s);
else if (page == HTTP_PAGE_COMMANDS) ShowI2PTunnels (s);
{ ShowTransitTunnels (s);
*/
} else if (page == HTTP_PAGE_COMMANDS) {
uint32_t token = CreateToken (); uint32_t token = CreateToken ();
ShowCommands (s, token); ShowCommands (s, token);
} } else if (page == HTTP_PAGE_TRANSIT_TUNNELS) {
else if (page == HTTP_PAGE_TRANSIT_TUNNELS)
ShowTransitTunnels (s); ShowTransitTunnels (s);
else if (page == HTTP_PAGE_LOCAL_DESTINATIONS) } else if (page == HTTP_PAGE_LOCAL_DESTINATIONS) {
ShowLocalDestinations (s); ShowLocalDestinations (s);
else if (page == HTTP_PAGE_LOCAL_DESTINATION) } else if (page == HTTP_PAGE_LOCAL_DESTINATION) {
{
uint32_t token = CreateToken (); uint32_t token = CreateToken ();
ShowLocalDestination (s, params["b32"], token); ShowLocalDestination (s, params["b32"], token);
} } else if (page == HTTP_PAGE_I2CP_LOCAL_DESTINATION) {
else if (page == HTTP_PAGE_I2CP_LOCAL_DESTINATION)
ShowI2CPLocalDestination (s, params["i2cp_id"]); 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) {
ShowSAMSession (s, params["sam_id"]); ShowSAMSession (s, params["sam_id"]);
else if (page == HTTP_PAGE_I2P_TUNNELS) } else if (page == HTTP_PAGE_CLIENT_TUNNELS) {
ShowI2PTunnels (s); ShowTunnels (s);
else if (page == HTTP_PAGE_LEASESETS) } else if (page == HTTP_PAGE_LEASESETS) {
ShowLeasesSets(s); ShowLeasesSets(s);
else { } else {
res.code = 400; res.code = 400;
ShowError(s, tr("Unknown page") + ": " + page); ShowError(s, tr("Unknown page") + ": " + page);
return; return;

View file

@ -461,6 +461,18 @@ th {
background: var(--th_multicolumn); background: var(--th_multicolumn);
} }
th.in, th.out {
font-size: 0;
}
th.in {
background: var(--arrow_down) no-repeat center center / 14px, var(--th_multicolumn);
}
th.out {
background: var(--arrow_up) no-repeat center center / 14px, var(--th_multicolumn);
}
th:not(.sectiontitle)[colspan="2"], #routerservices { th:not(.sectiontitle)[colspan="2"], #routerservices {
background: linear-gradient(to right, rgba(0,0,0.6), rgba(0,0,0,0), rgba(0,0,0,.6)), var(--th); background: linear-gradient(to right, rgba(0,0,0.6), rgba(0,0,0,0), rgba(0,0,0,.6)), var(--th);
background: linear-gradient(to right, rgba(0,0,0,.4), rgba(0,0,0,0), rgba(0,0,0,.4)), rgba(32,0,32,.4); background: linear-gradient(to right, rgba(0,0,0,.4), rgba(0,0,0,0), rgba(0,0,0,.4)), rgba(32,0,32,.4);
@ -1075,22 +1087,63 @@ input[type=checkbox]:checked + label::after {
min-width: 0; min-width: 0;
box-sizing: border-box; box-sizing: border-box;
vertical-align: middle; vertical-align: middle;
border: 1px solid var(--button-border);
border-radius: 2px;
box-shadow: var(--highlight);
}
.cmd:active {
box-shadow: var(--highlight), var(--active_shadow);
background-blend-mode: luminosity;
} }
#testpeer { #testpeer {
background: #313 var(--testpeer) no-repeat center center / 32px; background: var(--testpeer) no-repeat center center / 32px, var(--button);
}
#testpeer:hover, #testpeer:focus {
background: var(--testpeer) no-repeat center center / 32px, var(--button_hover);
}
#testpeer:active {
background: var(--testpeer) no-repeat center center / 32px, var(--button_active);
} }
#transitaccept { #transitaccept {
background: #313 var(--transit) no-repeat center center / 32px; background: var(--transit) no-repeat center center / 32px, var(--button);
}
#transitaccept:hover, #transitaccept:focus {
background: var(--transit) no-repeat center center / 32px, var(--button_hover);
}
#transitaccept:active {
background: var(--transit) no-repeat center center / 32px, var(--button_active);
} }
#transitdecline { #transitdecline {
background: #313 var(--notransit) no-repeat center center / 32px; background: var(--notransit) no-repeat center center / 32px, var(--button);
}
#transitdecline:hover, #transitdecline:focus {
background: var(--notransit) no-repeat center center / 32px, var(--button_hover);
}
#transitdecline:active {
background: var(--notransit) no-repeat center center / 32px, var(--button_active);
} }
#shutdownforce, #shutdowngraceful { #shutdownforce, #shutdowngraceful {
background: #313 var(--shutdown_hover) no-repeat center center / 32px; /* prompt user for forceful shutdown if garceful clicked when transit tunnels active */ /* prompt user for forceful shutdown if graceful clicked when transit tunnels active */
background: var(--shutdown_hover) no-repeat center center / 32px, var(--button);
}
#shutdownforce:hover, #shutdownforce:focus {
background: var(--shutdown_hover) no-repeat center center / 32px, var(--button_hover);
}
#shutdownforce:active {
background: var(--shutdown_hover) no-repeat center center / 32px, var(--button_active);
} }
#shutdowngraceful { #shutdowngraceful {
@ -1098,11 +1151,48 @@ input[type=checkbox]:checked + label::after {
} }
#shutdowncancel { #shutdowncancel {
background: #313 var(--noshutdown) no-repeat center center / 32px; background: var(--noshutdown) no-repeat center center / 32px, var(--button);
}
#shutdowncancel:hover, #shutdowncancel:focus {
background: var(--noshutdown) no-repeat center center / 32px, var(--button_hover);
}
#shutdowncancel:active {
background: var(--noshutdown) no-repeat center center / 32px, var(--button_active);
} }
#reloadcss { #reloadcss {
background: #313 var(--reloadcss) no-repeat center center / 32px; background: var(--reloadcss) no-repeat center center / 32px, var(--button);
}
#reloadcss:hover, #reloadcss:focus {
background: var(--reloadcss) no-repeat center center / 32px, var(--button_hover);
}
#reloadcss:active {
background: var(--reloadcss) no-repeat center center / 32px, var(--button_active);
}
#tunnelsummary td {
text-align: center;
}
#tunnelsummary .button {
margin: 0;
display: inline-block;
width: 40px;
height: 16px;
background: var(--eye) no-repeat center center / 16px, var(--button) !important;
font-size: 0 !important;
}
#tunnelsummary .button:hover, #tunnelsummary .button:focus {
background: var(--eye_hover) no-repeat center center / 16px, var(--button_hover) !important;
}
#tunnelsummary .button:active, #tunnelsummary .button:focus {
background: var(--eye) no-repeat center center / 16px, var(--button_active) !important;
} }
@media screen and (max-width: 1000px) { @media screen and (max-width: 1000px) {
@ -1144,7 +1234,6 @@ input[type=checkbox]:checked + label::after {
display: inline-block; display: inline-block;
vertical-align: middle; vertical-align: middle;
} }
}
@media screen and (-webkit-min-device-pixel-ratio: 1.5) { @media screen and (-webkit-min-device-pixel-ratio: 1.5) {
body { body {
@ -1155,6 +1244,7 @@ input[type=checkbox]:checked + label::after {
max-width: 200px !important; max-width: 200px !important;
} }
} }
}
@media screen and (max-width: 800px) { @media screen and (max-width: 800px) {
#main { #main {
@ -1375,6 +1465,7 @@ input[type=checkbox]:checked + label::after {
.note { .note {
padding: 15px 90px !important; padding: 15px 90px !important;
}
} }
@media screen and (min-width: 1200px) and (min-height: 600px) { @media screen and (min-width: 1200px) and (min-height: 600px) {