From e542a502600b3734dd39672712ac27e2af49da20 Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Thu, 19 Mar 2020 18:12:52 +0000 Subject: [PATCH] status page with some MW internals --- .../main/groovy/com/muwire/core/Core.groovy | 6 +-- .../core/connection/ConnectionAcceptor.groovy | 2 +- .../java/com/muwire/webui/StatusServlet.java | 53 +++++++++++++++++++ .../src/main/java/com/muwire/webui/Util.java | 7 +++ webui/src/main/js/status.js | 27 ++++++++++ webui/src/main/webapp/MuStatus.jsp | 53 +++++++++++++++++++ webui/src/main/webapp/sidebar.jsi | 4 ++ webui/templates/web.xml.template | 15 ++++++ 8 files changed, 163 insertions(+), 4 deletions(-) create mode 100644 webui/src/main/java/com/muwire/webui/StatusServlet.java create mode 100644 webui/src/main/js/status.js create mode 100644 webui/src/main/webapp/MuStatus.jsp diff --git a/core/src/main/groovy/com/muwire/core/Core.groovy b/core/src/main/groovy/com/muwire/core/Core.groovy index f4b6aec5..d2889077 100644 --- a/core/src/main/groovy/com/muwire/core/Core.groovy +++ b/core/src/main/groovy/com/muwire/core/Core.groovy @@ -113,11 +113,11 @@ public class Core { final TrustSubscriber trustSubscriber private final PersisterService persisterService private final PersisterFolderService persisterFolderService - private final HostCache hostCache - private final ConnectionManager connectionManager + final HostCache hostCache + final ConnectionManager connectionManager private final CacheClient cacheClient private final UpdateClient updateClient - private final ConnectionAcceptor connectionAcceptor + final ConnectionAcceptor connectionAcceptor private final ConnectionEstablisher connectionEstablisher private final HasherService hasherService final DownloadManager downloadManager diff --git a/core/src/main/groovy/com/muwire/core/connection/ConnectionAcceptor.groovy b/core/src/main/groovy/com/muwire/core/connection/ConnectionAcceptor.groovy index 720387ef..25b711c7 100644 --- a/core/src/main/groovy/com/muwire/core/connection/ConnectionAcceptor.groovy +++ b/core/src/main/groovy/com/muwire/core/connection/ConnectionAcceptor.groovy @@ -60,7 +60,7 @@ class ConnectionAcceptor { private volatile shutdown - private volatile int browsed + volatile int browsed ConnectionAcceptor(EventBus eventBus, UltrapeerConnectionManager manager, MuWireSettings settings, I2PAcceptor acceptor, HostCache hostCache, diff --git a/webui/src/main/java/com/muwire/webui/StatusServlet.java b/webui/src/main/java/com/muwire/webui/StatusServlet.java new file mode 100644 index 00000000..b398fc31 --- /dev/null +++ b/webui/src/main/java/com/muwire/webui/StatusServlet.java @@ -0,0 +1,53 @@ +package com.muwire.webui; + +import java.io.IOException; + +import javax.servlet.ServletConfig; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import com.muwire.core.Core; + +public class StatusServlet extends HttpServlet { + + private Core core; + + @Override + protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { + StringBuilder sb = new StringBuilder(); + sb.append(""); + + int incoming = (int)core.getConnectionManager().getConnections().stream().filter(c -> c.isIncoming()).count(); + int outgoing = (int)core.getConnectionManager().getConnections().stream().filter(c -> !c.isIncoming()).count(); + int knownHosts = core.getHostCache().getHosts().size(); + int failingHosts = core.getHostCache().countFailingHosts(); + int hopelessHosts = core.getHostCache().countHopelessHosts(); + int timesBrowsed = core.getConnectionAcceptor().getBrowsed(); + + + sb.append(""); + sb.append("").append(incoming).append(""); + sb.append("").append(outgoing).append(""); + sb.append("").append(knownHosts).append(""); + sb.append("").append(failingHosts).append(""); + sb.append("").append(hopelessHosts).append(""); + sb.append("").append(timesBrowsed).append(""); + sb.append(""); + + resp.setContentType("text/xml"); + resp.setCharacterEncoding("UTF-8"); + resp.setDateHeader("Expires", 0); + resp.setHeader("Pragma", "no-cache"); + resp.setHeader("Cache-Control", "no-store, max-age=0, no-cache, must-revalidate"); + byte[] out = sb.toString().getBytes("UTF-8"); + resp.setContentLength(out.length); + resp.getOutputStream().write(out); + } + + @Override + public void init(ServletConfig config) throws ServletException { + core = (Core) config.getServletContext().getAttribute("core"); + } +} diff --git a/webui/src/main/java/com/muwire/webui/Util.java b/webui/src/main/java/com/muwire/webui/Util.java index bcd2671c..084792f3 100644 --- a/webui/src/main/java/com/muwire/webui/Util.java +++ b/webui/src/main/java/com/muwire/webui/Util.java @@ -57,6 +57,7 @@ public class Util { _x("Enter a full MuWire id"), _x("Enter Reason (Optional)"), _x("ETA"), + _x("Failing Hosts"), _x("Feed configuration for {0}"), _x("Feed update frequency (minutes)"), _x("Feeds"), @@ -67,16 +68,21 @@ public class Util { _x("Hashing"), _x("Hide Certificates"), _x("Hide Comment"), + _x("Hopeless Hosts"), _x("Host"), _x("Import"), _x("Imported"), + _x("Incoming Connections"), + _x("Known Hosts"), _x("Known Sources"), _x("Last Updated"), _x("Mark Distrusted"), _x("Mark Neutral"), _x("Mark Trusted"), + _x("MuWire Status"), _x("Name"), _x("Number of items to keep on disk (-1 means unlimited)"), + _x("Outgoing Connections"), // verb _x("Pause"), _x("Piece Size"), @@ -111,6 +117,7 @@ public class Util { _x("Submit"), _x("Subscribe"), _x("Subscribed"), + _x("Times Browsed"), _x("Total Pieces"), _x("Trust"), _x("Trusted"), diff --git a/webui/src/main/js/status.js b/webui/src/main/js/status.js new file mode 100644 index 00000000..8e5ba2a9 --- /dev/null +++ b/webui/src/main/js/status.js @@ -0,0 +1,27 @@ +function refreshStatus() { + var xmlhttp = new XMLHttpRequest(); + xmlhttp.onreadystatechange = function() { + if (this.readyState == 4 && this.status == 200) { + var incomingConnections = this.responseXML.getElementsByTagName("IncomingConnections")[0].childNodes[0].nodeValue + var outgoingConnections = this.responseXML.getElementsByTagName("OutgoingConnections")[0].childNodes[0].nodeValue + var knownHosts = this.responseXML.getElementsByTagName("KnownHosts")[0].childNodes[0].nodeValue + var failingHosts = this.responseXML.getElementsByTagName("FailingHosts")[0].childNodes[0].nodeValue + var hopelessHosts = this.responseXML.getElementsByTagName("HopelessHosts")[0].childNodes[0].nodeValue + var timesBrowsed = this.responseXML.getElementsByTagName("TimesBrowsed")[0].childNodes[0].nodeValue + + document.getElementById("incoming-connections").innerHTML = incomingConnections + document.getElementById("outgoing-connections").innerHTML = outgoingConnections + document.getElementById("known-hosts").innerHTML = knownHosts + document.getElementById("failing-hosts").innerHTML = failingHosts + document.getElementById("hopeless-hosts").innerHTML = hopelessHosts + document.getElementById("times-browsed").innerHTML = timesBrowsed + } + } + xmlhttp.open("GET", "/MuWire/Status", true); + xmlhttp.send(); +} + +function initStatus() { + setInterval(refreshStatus, 3000); + setTimeout(refreshStatus, 1); +} diff --git a/webui/src/main/webapp/MuStatus.jsp b/webui/src/main/webapp/MuStatus.jsp new file mode 100644 index 00000000..a2258104 --- /dev/null +++ b/webui/src/main/webapp/MuStatus.jsp @@ -0,0 +1,53 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ page import="com.muwire.webui.*" %> +<%@include file="initcode.jsi"%> + +<% + +String pagetitle=Util._t("MuWire Status"); + +%> + + + +<%@ include file="css.jsi"%> + + + + +<%@ include file="header.jsi"%> + +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
<%=Util._t("Incoming Connections")%>
<%=Util._t("Outgoing Connections")%>
<%=Util._t("Known Hosts")%>
<%=Util._t("Failing Hosts")%>
<%=Util._t("Hopeless Hosts")%>
<%=Util._t("Times Browsed")%>
+
+ + diff --git a/webui/src/main/webapp/sidebar.jsi b/webui/src/main/webapp/sidebar.jsi index 56b5b201..a878510c 100644 --- a/webui/src/main/webapp/sidebar.jsi +++ b/webui/src/main/webapp/sidebar.jsi @@ -81,6 +81,10 @@ + + + +