Console: Add status and banned tabs to /peers (WIP)

Status tab now the default
This commit is contained in:
zzz
2022-11-23 12:23:17 -05:00
parent a825949a8a
commit 965f84bbfa
4 changed files with 158 additions and 38 deletions

View File

@@ -23,6 +23,7 @@ import net.i2p.router.transport.udp.PeerState;
import net.i2p.router.transport.udp.UDPTransport;
import net.i2p.router.web.HelperBase;
import static net.i2p.router.web.helpers.UDPSorters.*;
import net.i2p.util.Addresses;
import net.i2p.util.SystemVersion;
@@ -34,16 +35,20 @@ public class PeerHelper extends HelperBase {
private boolean _graphical;
private static final String titles[] = {
_x("Status"),
_x("Addresses"),
"NTCP",
"SSU",
_x("Banned"),
_x("UPnP Status")
};
private static final String links[] = {
"",
"?tx=addresses",
"?tx=ntcp",
"?tx=ssu",
"?tx=banned",
"?tx=upnp"
};
@@ -101,7 +106,7 @@ public class PeerHelper extends HelperBase {
return;
}
renderNavBar(out);
if (isAdvanced() && _transport == null) {
if (_transport == null) {
out.write("<p id=\"upnpstatus\"><b>");
out.write(_t("Status"));
out.write(": ");
@@ -110,37 +115,7 @@ public class PeerHelper extends HelperBase {
}
SortedMap<String, Transport> transports = _context.commSystem().getTransports();
if (_transport != null && !_transport.equals("upnp")) {
boolean rendered = false;
for (Map.Entry<String, Transport> e : transports.entrySet()) {
String style = e.getKey();
Transport t = e.getValue();
if (style.equals("NTCP") && "ntcp".equals(_transport)) {
NTCPTransport nt = (NTCPTransport) t;
render(nt, out, urlBase, sortFlags);
rendered = true;
break;
} else if (style.equals("SSU") && "ssu".equals(_transport)) {
UDPTransport ut = (UDPTransport) t;
render(ut, out, urlBase, sortFlags);
rendered = true;
break;
} else if (style.equals(_transport)) {
// pluggable (none yet)
t.renderStatusHTML(out, urlBase, sortFlags);
rendered = true;
break;
}
}
if (rendered) {
out.write(getTransportsLegend());
} else {
out.write("<p class=\"infohelp\">" +
"Transport not enabled: " +
DataHelper.escapeHTML(_transport) +
"</p>");
}
} else if (_transport == null) {
if ("addresses".equals(_transport)) {
StringBuilder buf = new StringBuilder(4*1024);
buf.append("<h3 id=\"transports\">").append(_t("Router Transport Addresses")).append("</h3><pre id=\"transports\">\n");
if (!transports.isEmpty()) {
@@ -179,6 +154,98 @@ public class PeerHelper extends HelperBase {
.append("</p></div>");
out.write(buf.toString());
_context.commSystem().renderStatusHTML(_out, _urlBase, _sortFlags);
} else if ("banned".equals(_transport)) {
BanlistRenderer br = new BanlistRenderer(_context);
br.renderStatusHTML(_out);
} else if (_transport != null) {
boolean rendered = false;
for (Map.Entry<String, Transport> e : transports.entrySet()) {
String style = e.getKey();
Transport t = e.getValue();
if (style.equals("NTCP") && "ntcp".equals(_transport)) {
NTCPTransport nt = (NTCPTransport) t;
render(nt, out, urlBase, sortFlags);
rendered = true;
break;
} else if (style.equals("SSU") && "ssu".equals(_transport)) {
UDPTransport ut = (UDPTransport) t;
render(ut, out, urlBase, sortFlags);
rendered = true;
break;
} else if (style.equals(_transport)) {
// pluggable (none yet)
t.renderStatusHTML(out, urlBase, sortFlags);
rendered = true;
break;
}
}
if (rendered) {
out.write(getTransportsLegend());
} else {
out.write("<p class=\"infohelp\">" +
"Transport not enabled: " +
DataHelper.escapeHTML(_transport) +
"</p>");
}
} else {
// summary
StringBuilder buf = new StringBuilder(512);
buf.append("<h3 id=\"transports\">").append(_t("Peer Connections")).append("</h3><table><tr><th>")
.append(_t("Transport")).append("</th><th>")
.append(_t("Total")).append("</th><th>")
.append(_t("IPv4")).append(" <img src=\"/themes/console/images/inbound.png\" alt=\"").append(_t("Inbound")).append("\" title=\"").append(_t("Inbound")).append("\"/></th><th>")
.append(_t("IPv4")).append(" <img src=\"/themes/console/images/outbound.png\" alt=\"").append(_t("Outbound")).append("\" title=\"").append(_t("Outbound")).append("\"/></th><th>")
.append(_t("IPv6")).append(" <img src=\"/themes/console/images/inbound.png\" alt=\"").append(_t("Inbound")).append("\" title=\"").append(_t("Inbound")).append("\"/></th><th>")
.append(_t("IPv6")).append(" <img src=\"/themes/console/images/outbound.png\" alt=\"").append(_t("Outbound")).append("\" title=\"").append(_t("Outbound")).append("\"/></th></tr>\n");
boolean warnInbound = !_context.router().isHidden() && _context.router().getUptime() > 15*60*1000;
boolean warnIPv6 = Addresses.isConnectedIPv6();
int[] totals = new int[5];
for (Map.Entry<String, Transport> e : transports.entrySet()) {
String style = e.getKey();
Transport t = e.getValue();
int[] counts = t.getPeerCounts();
for (int idx = 0; idx < 8; idx += 4) {
if (style.equals("NTCP") && idx == 0)
continue;
buf.append("<tr><td align=\"center\"><b>")
.append(style)
.append(1 + (idx / 4))
.append("</b></td><td align=\"center\">");
int total = 0;
for (int i = 0; i < 4; i++) {
total += counts[idx + i];
}
if (total <= 0)
buf.append("<img src=\"themes/console/images/info/infowarn.png\"> ");
else
totals[0] += total;
buf.append(total);
for (int i = 0; i < 4; i++) {
int cnt = counts[idx + i];
buf.append("</td><td align=\"center\">");
if (cnt <= 0) {
if ((i >= 2 || warnIPv6) && ((i & 0x01) != 0 || warnInbound))
buf.append("<img src=\"themes/console/images/info/infohelp.png\"> ");
} else {
totals[i + 1] += cnt;
}
buf.append(cnt);
}
buf.append("</td></tr>\n");
}
}
buf.append("<tr><td align=\"center\"><b>").append(_t("Total")).append("</b>");
for (int i = 0; i < 5; i++) {
int cnt = totals[i];
buf.append("</td><td align=\"center\">");
if (cnt <= 0) {
if ((i >= 3 || warnIPv6) && ((i & 0x01) == 0 || warnInbound))
buf.append("<img src=\"themes/console/images/info/infowarn.png\"> ");
}
buf.append("<b>").append(cnt).append("</b");
}
buf.append("</td></tr></table>\n");
out.write(buf.toString());
}
out.flush();
}
@@ -187,12 +254,16 @@ public class PeerHelper extends HelperBase {
* @since 0.9.38
*/
private int getTab() {
if ("ntcp".equals(_transport))
if ("addresses".equals(_transport))
return 1;
if ("ssu".equals(_transport))
if ("ntcp".equals(_transport))
return 2;
if ("upnp".equals(_transport))
if ("ssu".equals(_transport))
return 3;
if ("banned".equals(_transport))
return 4;
if ("upnp".equals(_transport))
return 5;
return 0;
}
@@ -213,10 +284,10 @@ public class PeerHelper extends HelperBase {
buf.append("<span class=\"tab2\">");
buf.append(_t(titles[i]));
} else {
if (i == 1) {
if (i == 2) {
if (!_context.getBooleanPropertyDefaultTrue(TransportManager.PROP_ENABLE_NTCP))
continue;
} else if (i == 2) {
} else if (i == 3) {
if (!_context.getBooleanPropertyDefaultTrue(TransportManager.PROP_ENABLE_UDP))
continue;
}
@@ -734,7 +805,7 @@ public class PeerHelper extends HelperBase {
//buf.append("</b></td><td>&nbsp;</td><td align=\"center\"><b>");
buf.append("</b></td><td align=\"right\"><b>");
buf.append(DataHelper.formatDuration2(rtoTotal/numPeers));
buf.append("</b></td><td align=\"center\"><b>").append(ut.getMTU(false)).append("</b></td>");
buf.append("</b></td><td></td>"); // MTU
}
buf.append("<td align=\"right\"><b>");
buf.append(recvTotal).append("</b></td><td align=\"right\"><b>").append(sendTotal).append("</b></td>\n" +

View File

@@ -173,6 +173,15 @@ public interface Transport {
public int countPeers();
public int countActivePeers();
public int countActiveSendPeers();
/**
* @return 8 bytes:
* version 1 ipv4 in/out, ipv6 in/out
* version 2 ipv4 in/out, ipv6 in/out
* @since 0.9.57
*/
public int[] getPeerCounts();
public boolean haveCapacity();
public boolean haveCapacity(int pct);

View File

@@ -724,6 +724,25 @@ public class NTCPTransport extends TransportImpl {
public int countPeers() {
return _conByIdent.size();
}
/**
* @return 8 bytes:
* version 1 4 bytes all zeros
* version 2 ipv4 in/out, ipv6 in/out
* @since 0.9.57
*/
public int[] getPeerCounts() {
int[] rv = new int[8];
for (NTCPConnection con : _conByIdent.values()) {
int idx = 4;
if (con.isIPv6())
idx += 2;
if (!con.isInbound())
idx++;
rv[idx]++;
}
return rv;
}
/**
* For /peers UI only. Not a public API, not for external use.

View File

@@ -3399,6 +3399,27 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
return _peersByIdent.size();
}
/**
* @return 8 bytes:
* version 1 ipv4 in/out, ipv6 in/out
* version 2 ipv4 in/out, ipv6 in/out
* @since 0.9.57
*/
public int[] getPeerCounts() {
int[] rv = new int[8];
for (PeerState peer : _peersByIdent.values()) {
int idx = 0;
if (peer.getVersion() > 1)
idx += 4;
if (peer.isIPv6())
idx += 2;
if (!peer.isInbound())
idx++;
rv[idx]++;
}
return rv;
}
public int countActivePeers() {
long old = _context.clock().now() - 5*60*1000;
int active = 0;