Add upnp html output, fix up logging

This commit is contained in:
zzz
2009-02-20 18:51:39 +00:00
parent 312e6071d7
commit 78075cb3aa
4 changed files with 121 additions and 112 deletions

View File

@@ -619,8 +619,8 @@ public class FIFOBandwidthLimiter {
public void renderStatusHTML(Writer out) throws IOException { public void renderStatusHTML(Writer out) throws IOException {
long now = now(); long now = now();
StringBuffer buf = new StringBuffer(4096); StringBuffer buf = new StringBuffer(4096);
buf.append("<br /><i id=\"bwlim\">Limiter status: ").append(getStatus().toString()).append("</i><br />\n"); buf.append("<p><b id=\"bwlim\">Limiter Status:</b><br />").append(getStatus().toString()).append("</p>\n");
buf.append("<b>Pending bandwidth requests:</b><ul>"); buf.append("<p><b>Pending bandwidth requests:</b><ul>");
buf.append("<li>Inbound requests: <ol>"); buf.append("<li>Inbound requests: <ol>");
synchronized (_pendingInboundRequests) { synchronized (_pendingInboundRequests) {
for (int i = 0; i < _pendingInboundRequests.size(); i++) { for (int i = 0; i < _pendingInboundRequests.size(); i++) {
@@ -643,7 +643,7 @@ public class FIFOBandwidthLimiter {
buf.append("ms ago</li>\n"); buf.append("ms ago</li>\n");
} }
} }
buf.append("</ol></li></ul>\n"); buf.append("</ol></li></ul></p>\n");
out.write(buf.toString()); out.write(buf.toString());
out.flush(); out.flush();
} }

View File

@@ -369,7 +369,7 @@ public class TransportManager implements TransportEventListener {
t.renderStatusHTML(out, urlBase, sortFlags); t.renderStatusHTML(out, urlBase, sortFlags);
} }
StringBuffer buf = new StringBuffer(4*1024); StringBuffer buf = new StringBuffer(4*1024);
buf.append("Listening on: <br /><pre>\n"); buf.append("<p><b>Router Transport Addresses:</b><br /><pre>\n");
for (int i = 0; i < _transports.size(); i++) { for (int i = 0; i < _transports.size(); i++) {
Transport t = (Transport)_transports.get(i); Transport t = (Transport)_transports.get(i);
if (t.getCurrentAddress() != null) if (t.getCurrentAddress() != null)
@@ -379,6 +379,8 @@ public class TransportManager implements TransportEventListener {
} }
buf.append("</pre>\n"); buf.append("</pre>\n");
out.write(buf.toString()); out.write(buf.toString());
out.write(_upnpManager.renderStatusHTML());
buf.append("</p>\n");
out.flush(); out.flush();
} }
} }

View File

@@ -108,11 +108,17 @@ public class UPnP extends ControlPoint implements DeviceChangeListener {
DetectedIP result = null; DetectedIP result = null;
final String natAddress = getNATAddress(); final String natAddress = getNATAddress();
if (natAddress == null || natAddress.length() <= 0) {
_log.warn("No external address returned");
return null;
}
try { try {
InetAddress detectedIP = InetAddress.getByName(natAddress); InetAddress detectedIP = InetAddress.getByName(natAddress);
short status = DetectedIP.NOT_SUPPORTED; short status = DetectedIP.NOT_SUPPORTED;
thinksWeAreDoubleNatted = !TransportImpl.isPubliclyRoutable(detectedIP.getAddress()); thinksWeAreDoubleNatted = !TransportImpl.isPubliclyRoutable(detectedIP.getAddress());
// If we have forwarded a port AND we don't have a private address // If we have forwarded a port AND we don't have a private address
_log.warn("NATAddress: \"" + natAddress + "\" detectedIP: " + detectedIP + " double? " + thinksWeAreDoubleNatted);
if((portsForwarded.size() > 1) && (!thinksWeAreDoubleNatted)) if((portsForwarded.size() > 1) && (!thinksWeAreDoubleNatted))
status = DetectedIP.FULL_INTERNET; status = DetectedIP.FULL_INTERNET;
@@ -291,6 +297,7 @@ public class UPnP extends ControlPoint implements DeviceChangeListener {
return Integer.valueOf(getIP.getOutputArgumentList().getArgument("NewDownstreamMaxBitRate").getValue()); return Integer.valueOf(getIP.getOutputArgumentList().getArgument("NewDownstreamMaxBitRate").getValue());
} }
/***
private void listStateTable(Service serv, StringBuilder sb) { private void listStateTable(Service serv, StringBuilder sb) {
ServiceStateTable table = serv.getServiceStateTable(); ServiceStateTable table = serv.getServiceStateTable();
sb.append("<div><small>"); sb.append("<div><small>");
@@ -320,6 +327,7 @@ public class UPnP extends ControlPoint implements DeviceChangeListener {
sb.append("</div>"); sb.append("</div>");
} }
} }
***/
private String toString(String action, String Argument, Service serv) { private String toString(String action, String Argument, Service serv) {
Action getIP = serv.getAction(action); Action getIP = serv.getAction(action);
@@ -333,122 +341,103 @@ public class UPnP extends ControlPoint implements DeviceChangeListener {
// TODO: extend it! RTFM // TODO: extend it! RTFM
private void listSubServices(Device dev, StringBuilder sb) { private void listSubServices(Device dev, StringBuilder sb) {
ServiceList sl = dev.getServiceList(); ServiceList sl = dev.getServiceList();
if (sl.size() <= 0)
return;
sb.append("<ul>\n");
for(int i=0; i<sl.size(); i++) { for(int i=0; i<sl.size(); i++) {
Service serv = sl.getService(i); Service serv = sl.getService(i);
if(serv == null) continue; if(serv == null) continue;
sb.append("<div>service ("+i+") : "+serv.getServiceType()+"<br>"); sb.append("<li>Service: ");
if("urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1".equals(serv.getServiceType())){ if("urn:schemas-upnp-org:service:WANCommonInterfaceConfig:1".equals(serv.getServiceType())){
sb.append("WANCommonInterfaceConfig"); sb.append("WAN Common Interface Config<ul>");
sb.append(" status: " + toString("GetCommonLinkProperties", "NewPhysicalLinkStatus", serv)); sb.append("<li>Status: " + toString("GetCommonLinkProperties", "NewPhysicalLinkStatus", serv));
sb.append(" type: " + toString("GetCommonLinkProperties", "NewWANAccessType", serv)); sb.append("<li>Type: " + toString("GetCommonLinkProperties", "NewWANAccessType", serv));
sb.append(" upstream: " + toString("GetCommonLinkProperties", "NewLayer1UpstreamMaxBitRate", serv)); sb.append("<li>Upstream: " + toString("GetCommonLinkProperties", "NewLayer1UpstreamMaxBitRate", serv));
sb.append(" downstream: " + toString("GetCommonLinkProperties", "NewLayer1DownstreamMaxBitRate", serv) + "<br>"); sb.append("<li>Downstream: " + toString("GetCommonLinkProperties", "NewLayer1DownstreamMaxBitRate", serv) + "<br>");
}else if("urn:schemas-upnp-org:service:WANPPPConnection:1".equals(serv.getServiceType())){ }else if("urn:schemas-upnp-org:service:WANPPPConnection:1".equals(serv.getServiceType())){
sb.append("WANPPPConnection"); sb.append("WAN PPP Connection<ul>");
sb.append(" status: " + toString("GetStatusInfo", "NewConnectionStatus", serv)); sb.append("<li>Status: " + toString("GetStatusInfo", "NewConnectionStatus", serv));
sb.append(" type: " + toString("GetConnectionTypeInfo", "NewConnectionType", serv)); sb.append("<li>Type: " + toString("GetConnectionTypeInfo", "NewConnectionType", serv));
sb.append(" upstream: " + toString("GetLinkLayerMaxBitRates", "NewUpstreamMaxBitRate", serv)); sb.append("<li>Upstream: " + toString("GetLinkLayerMaxBitRates", "NewUpstreamMaxBitRate", serv));
sb.append(" downstream: " + toString("GetLinkLayerMaxBitRates", "NewDownstreamMaxBitRate", serv) + "<br>"); sb.append("<li>Downstream: " + toString("GetLinkLayerMaxBitRates", "NewDownstreamMaxBitRate", serv) + "<br>");
sb.append(" external IP: " + toString("GetExternalIPAddress", "NewExternalIPAddress", serv) + "<br>"); sb.append("<li>External IP: " + toString("GetExternalIPAddress", "NewExternalIPAddress", serv) + "<br>");
}else if("urn:schemas-upnp-org:service:Layer3Forwarding:1".equals(serv.getServiceType())){ }else if("urn:schemas-upnp-org:service:Layer3Forwarding:1".equals(serv.getServiceType())){
sb.append("Layer3Forwarding"); sb.append("Layer 3 Forwarding<ul>");
sb.append("DefaultConnectionService: " + toString("GetDefaultConnectionService", "NewDefaultConnectionService", serv)); sb.append("<li>Default Connection Service: " + toString("GetDefaultConnectionService", "NewDefaultConnectionService", serv));
}else if(WAN_IP_CONNECTION.equals(serv.getServiceType())){ }else if(WAN_IP_CONNECTION.equals(serv.getServiceType())){
sb.append("WANIPConnection"); sb.append("WAN IP Connection<ul>");
sb.append(" status: " + toString("GetStatusInfo", "NewConnectionStatus", serv)); sb.append("<li>Status: " + toString("GetStatusInfo", "NewConnectionStatus", serv));
sb.append(" type: " + toString("GetConnectionTypeInfo", "NewConnectionType", serv)); sb.append("<li>Type: " + toString("GetConnectionTypeInfo", "NewConnectionType", serv));
sb.append(" external IP: " + toString("GetExternalIPAddress", "NewExternalIPAddress", serv) + "<br>"); sb.append("<li>External IP: " + toString("GetExternalIPAddress", "NewExternalIPAddress", serv) + "<br>");
}else if("urn:schemas-upnp-org:service:WANEthernetLinkConfig:1".equals(serv.getServiceType())){ }else if("urn:schemas-upnp-org:service:WANEthernetLinkConfig:1".equals(serv.getServiceType())){
sb.append("WANEthernetLinkConfig"); sb.append("WAN Ethernet Link Config<ol>");
sb.append(" status: " + toString("GetEthernetLinkStatus", "NewEthernetLinkStatus", serv) + "<br>"); sb.append("<li>Status: " + toString("GetEthernetLinkStatus", "NewEthernetLinkStatus", serv) + "<br>");
}else }else
sb.append("~~~~~~~ "+serv.getServiceType()); sb.append("~~~~~~~ "+serv.getServiceType() + "<ul>");
listActions(serv, sb); //listActions(serv, sb);
listStateTable(serv, sb); //listStateTable(serv, sb);
sb.append("</div>"); sb.append("</ul>\n");
} }
sb.append("</ul>\n");
} }
private void listSubDev(String prefix, Device dev, StringBuilder sb){ private void listSubDev(String prefix, Device dev, StringBuilder sb){
sb.append("<div><p>Device : "+dev.getFriendlyName()+" - "+ dev.getDeviceType()+"<br>"); if (prefix == null)
sb.append("Device: ");
else
sb.append("<li>Subdevice: ");
sb.append(dev.getFriendlyName());
listSubServices(dev, sb); listSubServices(dev, sb);
DeviceList dl = dev.getDeviceList(); DeviceList dl = dev.getDeviceList();
if (dl.size() <= 0)
return;
sb.append("<ul>\n");
for(int j=0; j<dl.size(); j++) { for(int j=0; j<dl.size(); j++) {
Device subDev = dl.getDevice(j); Device subDev = dl.getDevice(j);
if(subDev == null) continue; if(subDev == null) continue;
sb.append("<div>");
listSubDev(dev.getFriendlyName(), subDev, sb); listSubDev(dev.getFriendlyName(), subDev, sb);
sb.append("</div></div>");
} }
sb.append("</p></div>"); sb.append("</ul>\n");
} }
/***** public String renderStatusHTML() {
public String handleHTTPGet(HTTPRequest request) throws PluginHTTPException { final StringBuilder sb = new StringBuilder();
if(request.isParameterSet("getDeviceCapabilities")) { sb.append("<b>UPnP Status:</b><br />");
final StringBuilder sb = new StringBuilder();
sb.append("<html><head><title>UPnP report</title></head><body>"); if(isDisabled) {
listSubDev("WANDevice", _router, sb); sb.append("The plugin has been disabled; Do you have more than one UPnP Internet Gateway Device on your LAN ?");
sb.append("</body></html>"); return sb.toString();
} else if(!isNATPresent()) {
sb.append("The plugin hasn't found any UPnP aware, compatible device on your LAN.");
return sb.toString(); return sb.toString();
} }
HTMLNode pageNode = pr.getPageMaker().getPageNode("UP&P plugin configuration page", false, null);
HTMLNode contentNode = pr.getPageMaker().getContentNode(pageNode);
if(isDisabled) {
HTMLNode disabledInfobox = contentNode.addChild("div", "class", "infobox infobox-error");
HTMLNode disabledInfoboxHeader = disabledInfobox.addChild("div", "class", "infobox-header");
HTMLNode disabledInfoboxContent = disabledInfobox.addChild("div", "class", "infobox-content");
disabledInfoboxHeader.addChild("#", "UP&P plugin report");
disabledInfoboxContent.addChild("#", "The plugin has been disabled; Do you have more than one UP&P IGD on your LAN ?");
return pageNode.generate();
} else if(!isNATPresent()) {
HTMLNode notFoundInfobox = contentNode.addChild("div", "class", "infobox infobox-warning");
HTMLNode notFoundInfoboxHeader = notFoundInfobox.addChild("div", "class", "infobox-header");
HTMLNode notFoundInfoboxContent = notFoundInfobox.addChild("div", "class", "infobox-content");
notFoundInfoboxHeader.addChild("#", "UP&P plugin report");
notFoundInfoboxContent.addChild("#", "The plugin hasn't found any UP&P aware, compatible device on your LAN.");
return pageNode.generate();
}
HTMLNode foundInfobox = contentNode.addChild("div", "class", "infobox infobox-normal");
HTMLNode foundInfoboxHeader = foundInfobox.addChild("div", "class", "infobox-header");
HTMLNode foundInfoboxContent = foundInfobox.addChild("div", "class", "infobox-content");
// FIXME L10n! // FIXME L10n!
foundInfoboxHeader.addChild("#", "UP&P plugin report"); sb.append("<p>Found ");
foundInfoboxContent.addChild("p", "The following device has been found : ").addChild("a", "href", "?getDeviceCapabilities").addChild("#", _router.getFriendlyName()); listSubDev(null, _router, sb);
foundInfoboxContent.addChild("p", "Our current external ip address is : " + getNATAddress()); sb.append("<br>The current external IP address reported by UPnP is " + getNATAddress());
int downstreamMaxBitRate = getDownstreamMaxBitRate(); int downstreamMaxBitRate = getDownstreamMaxBitRate();
int upstreamMaxBitRate = getUpstramMaxBitRate(); int upstreamMaxBitRate = getUpstramMaxBitRate();
if(downstreamMaxBitRate > 0) if(downstreamMaxBitRate > 0)
foundInfoboxContent.addChild("p", "Our reported max downstream bit rate is : " + getDownstreamMaxBitRate()+ " bits/sec"); sb.append("<br>UPnP reports the max downstream bit rate is : " + getDownstreamMaxBitRate()+ " bits/sec\n");
if(upstreamMaxBitRate > 0) if(upstreamMaxBitRate > 0)
foundInfoboxContent.addChild("p", "Our reported max upstream bit rate is : " + getUpstramMaxBitRate()+ " bits/sec"); sb.append("<br>UPnP reports the max upstream bit rate is : " + getUpstramMaxBitRate()+ " bits/sec\n");
synchronized(lock) { synchronized(lock) {
if(portsToForward != null) { if(portsToForward != null) {
for(ForwardPort port : portsToForward) { for(ForwardPort port : portsToForward) {
if(portsForwarded.contains(port)) { sb.append("<br>" + protoToString(port.protocol) + " port " + port.portNumber + " for " + port.name);
foundInfoboxContent.addChild("p", "The "+port.name+" port "+port.portNumber+" / "+port.protocol+" has been forwarded successfully."); if(portsForwarded.contains(port))
} else { sb.append(" has been forwarded successfully by UPnP.\n");
foundInfoboxContent.addChild("p", "The "+port.name+" port "+port.portNumber+" / "+port.protocol+" has not been forwarded."); else
} sb.append(" has not been forwarded UPnP.\n");
} }
} }
} }
return pageNode.generate(); sb.append("</p>");
return sb.toString();
} }
public String handleHTTPPost(HTTPRequest request) throws PluginHTTPException {
return null;
}
***/
private boolean addMapping(String protocol, int port, String description, ForwardPort fp) { private boolean addMapping(String protocol, int port, String description, ForwardPort fp) {
if(isDisabled || !isNATPresent() || _router == null) { if(isDisabled || !isNATPresent() || _router == null) {
@@ -457,8 +446,8 @@ public class UPnP extends ControlPoint implements DeviceChangeListener {
} }
// Just in case... // Just in case...
// this confuses my linksys - zzz // this confuses my linksys? - zzz
// removeMapping(protocol, port, fp, true); removeMapping(protocol, port, fp, true);
Action add = _service.getAction("AddPortMapping"); Action add = _service.getAction("AddPortMapping");
if(add == null) { if(add == null) {
@@ -557,14 +546,18 @@ public class UPnP extends ControlPoint implements DeviceChangeListener {
registerPorts(portsToForwardNow); registerPorts(portsToForwardNow);
} }
private static String protoToString(int p) {
if(p == ForwardPort.PROTOCOL_UDP_IPV4)
return "UDP";
if(p == ForwardPort.PROTOCOL_TCP_IPV4)
return "TCP";
return "?";
}
private void registerPorts(Set<ForwardPort> portsToForwardNow) { private void registerPorts(Set<ForwardPort> portsToForwardNow) {
for(ForwardPort port : portsToForwardNow) { for(ForwardPort port : portsToForwardNow) {
String proto; String proto = protoToString(port.protocol);
if(port.protocol == ForwardPort.PROTOCOL_UDP_IPV4) if (proto.length() <= 1) {
proto = "UDP";
else if(port.protocol == ForwardPort.PROTOCOL_TCP_IPV4)
proto = "TCP";
else {
HashMap<ForwardPort, ForwardPortStatus> map = new HashMap<ForwardPort, ForwardPortStatus>(); HashMap<ForwardPort, ForwardPortStatus> map = new HashMap<ForwardPort, ForwardPortStatus>();
map.put(port, new ForwardPortStatus(ForwardPortStatus.DEFINITE_FAILURE, "Protocol not supported", port.portNumber)); map.put(port, new ForwardPortStatus(ForwardPortStatus.DEFINITE_FAILURE, "Protocol not supported", port.portNumber));
forwardCallback.portForwardStatus(map); forwardCallback.portForwardStatus(map);
@@ -586,15 +579,10 @@ public class UPnP extends ControlPoint implements DeviceChangeListener {
private void unregisterPorts(Set<ForwardPort> portsToForwardNow) { private void unregisterPorts(Set<ForwardPort> portsToForwardNow) {
for(ForwardPort port : portsToForwardNow) { for(ForwardPort port : portsToForwardNow) {
String proto; String proto = protoToString(port.protocol);
if(port.protocol == ForwardPort.PROTOCOL_UDP_IPV4) if (proto.length() <= 1)
proto = "UDP";
else if(port.protocol == ForwardPort.PROTOCOL_TCP_IPV4)
proto = "TCP";
else {
// Ignore, we've already complained about it // Ignore, we've already complained about it
continue; continue;
}
removeMapping(proto, port.portNumber, port, false); removeMapping(proto, port.portNumber, port, false);
} }
} }

View File

@@ -45,15 +45,18 @@ public class UPnPManager {
} }
public synchronized void start() { public synchronized void start() {
_log.error("UPnP Start"); if (_log.shouldLog(Log.DEBUG)) {
Debug.on(); // UPnP stuff -> wrapper log _log.debug("UPnP Start");
Debug.on(); // UPnP stuff -> wrapper log
}
if (!_isRunning) if (!_isRunning)
_upnp.runPlugin(); _upnp.runPlugin();
_isRunning = true; _isRunning = true;
} }
public synchronized void stop() { public synchronized void stop() {
_log.error("UPnP Stop"); if (_log.shouldLog(Log.DEBUG))
_log.debug("UPnP Stop");
if (_isRunning) if (_isRunning)
_upnp.terminate(); _upnp.terminate();
_isRunning = false; _isRunning = false;
@@ -61,7 +64,8 @@ public class UPnPManager {
/** call when the ports might have changed */ /** call when the ports might have changed */
public void update(Map<String, RouterAddress> addresses) { public void update(Map<String, RouterAddress> addresses) {
_log.error("UPnP Update:"); if (_log.shouldLog(Log.DEBUG))
_log.debug("UPnP Update:");
if (!_isRunning) if (!_isRunning)
return; return;
Set<ForwardPort> forwards = new HashSet(addresses.size()); Set<ForwardPort> forwards = new HashSet(addresses.size());
@@ -86,7 +90,8 @@ public class UPnPManager {
protocol = ForwardPort.PROTOCOL_TCP_IPV4; protocol = ForwardPort.PROTOCOL_TCP_IPV4;
else else
continue; continue;
_log.error("Adding: " + style + " " + port); if (_log.shouldLog(Log.DEBUG))
_log.debug("Adding: " + style + " " + port);
ForwardPort fp = new ForwardPort(style, false, protocol, port); ForwardPort fp = new ForwardPort(style, false, protocol, port);
forwards.add(fp); forwards.add(fp);
} }
@@ -98,18 +103,32 @@ public class UPnPManager {
/** Called to indicate status on one or more forwarded ports. */ /** Called to indicate status on one or more forwarded ports. */
public void portForwardStatus(Map<ForwardPort,ForwardPortStatus> statuses) { public void portForwardStatus(Map<ForwardPort,ForwardPortStatus> statuses) {
_log.error("UPnP Callback:"); if (_log.shouldLog(Log.DEBUG))
_log.debug("UPnP Callback:");
DetectedIP[] ips = _upnp.getAddress(); DetectedIP[] ips = _upnp.getAddress();
for (DetectedIP ip : ips) { if (ips != null) {
_log.error("External address: " + ip.publicAddress + " type: " + ip.natType); for (DetectedIP ip : ips) {
} if (_log.shouldLog(Log.DEBUG))
_log.debug("External address: " + ip.publicAddress + " type: " + ip.natType);
}
} else {
if (_log.shouldLog(Log.DEBUG))
_log.debug("No external address returned");
}
for (ForwardPort fp : statuses.keySet()) { for (ForwardPort fp : statuses.keySet()) {
ForwardPortStatus fps = statuses.get(fp); ForwardPortStatus fps = statuses.get(fp);
_log.error(fp.name + " " + fp.protocol + " " + fp.portNumber + if (_log.shouldLog(Log.DEBUG))
" status: " + fps.status + " reason: " + fps.reasonString + " ext port: " + fps.externalPort); _log.debug(fp.name + " " + fp.protocol + " " + fp.portNumber +
} " status: " + fps.status + " reason: " + fps.reasonString + " ext port: " + fps.externalPort);
} }
}
}
public String renderStatusHTML() {
if (!_isRunning)
return "<b>UPnP is not enabled</b>\n";
return _upnp.renderStatusHTML();
} }
} }