diff --git a/htroot/ConfigBasic.html b/htroot/ConfigBasic.html index c7937c03f..04dcca271 100644 --- a/htroot/ConfigBasic.html +++ b/htroot/ConfigBasic.html @@ -52,7 +52,9 @@ Your YaCy Peer needs some basic information to operate properly
  • #(statusName)# Your peer name has not been customized; please set your own peer name:: You have a nice peer name#(/statusName)#
    Peer Name:

  • #(statusPort)# Your peer cannot be reached from outside (what is not fatal, but would be good for the YaCy network); please open your firewall for this port and/or set a virtual server option in your router to allow connections on this port.:: Your peer can be reached by other peers#(/statusPort)#
    - Peer Port:

  • + Peer Port:
    + #(upnp)#::Configure your router for yacy: #(/upnp)#
    +
         diff --git a/htroot/ConfigBasic.java b/htroot/ConfigBasic.java index 8b989cefc..cf0ca5084 100644 --- a/htroot/ConfigBasic.java +++ b/htroot/ConfigBasic.java @@ -48,6 +48,7 @@ // if the shell's current path is HTROOT import java.io.File; +import java.lang.reflect.Method; import de.anomic.data.translator; import de.anomic.http.httpHeader; @@ -58,6 +59,7 @@ import de.anomic.server.serverCore; import de.anomic.server.serverInstantThread; import de.anomic.server.serverObjects; import de.anomic.server.serverSwitch; +import de.anomic.server.portForwarding.serverPortForwarding; import de.anomic.yacy.yacyCore; import de.anomic.yacy.yacySeed; @@ -70,7 +72,9 @@ public class ConfigBasic { public static serverObjects respond(httpHeader header, serverObjects post, serverSwitch env) { + // return variable that accumulates replacements + ConfigBasic config = new ConfigBasic(); plasmaSwitchboard sb = (plasmaSwitchboard) env; serverObjects prop = new serverObjects(); String langPath = new File(env.getRootPath(), env.getConfig("langPath", "DATA/LOCALE")).toString(); @@ -83,11 +87,40 @@ public class ConfigBasic { return prop; } + // reconfigure port forwarding + if ((post != null)) config.reinitPortForwarding(post, env); + + // starting a peer ping + boolean doPeerPing = false; if ((yacyCore.seedDB.mySeed.isVirgin()) || (yacyCore.seedDB.mySeed.isJunior())) { serverInstantThread.oneTimeJob(sb.yc, "peerPing", null, 0); - try {Thread.sleep(3000);} catch (InterruptedException e) {} // wait a little bit for success of ping + doPeerPing = true; + } + + // scan for Upnp routers + long begin = System.currentTimeMillis(); + boolean upnpRouterFound = config.findUPnPRouter(3000); + long end = System.currentTimeMillis(); + + // if the upnp router scan has taken less than 3 sec, we need to wait + // a little bit for success of peer ping + if ((doPeerPing) && ((end - begin) < 3000 )) { + try {Thread.sleep(3000-(end - begin));} catch (InterruptedException e) {/* */} } + // if a UPnP router is available + String currentForwarder = env.getConfig("portForwarding.Type", "none"); + boolean forwardingEnabled = env.getConfigBool("portForwarding.Enabled",false); + boolean otherForwarderEnabled = serverCore.portForwardingEnabled && serverCore.portForwarding != null && !currentForwarder.equalsIgnoreCase("upnp"); + if (otherForwarderEnabled) { + prop.put("upnp",0); + } else { + prop.put("upnp", upnpRouterFound ? 1 : 0); + } + + // if UPnp is already enabled + prop.put("upnp_enabled", currentForwarder.equalsIgnoreCase("upnp") && forwardingEnabled ? 1 : 0); + // language settings if ((post != null) && (!(post.get("language", "default").equals(lang)))) { translator.changeLang(env, langPath, post.get("language", "default") + ".lng"); @@ -201,4 +234,80 @@ public class ConfigBasic { return prop; } + private boolean findUPnPRouter(int timeout) { + + // determine if the upnp port forwarding class is available and load it dynamically + Object[] UpnpForwarder = this.getUpnpForwarderClasses(); + serverPortForwarding upnp = (serverPortForwarding) UpnpForwarder[0]; + Method scanForRouter = (Method) UpnpForwarder[1]; + if ((upnp == null) || (scanForRouter == null)) return false; + + // trying to find a upnp router + try { + Object result = scanForRouter.invoke(upnp, new Object[]{new Integer(timeout)}); + if ((result != null)&&(result instanceof Boolean)) { + return ((Boolean)result).booleanValue(); + } + } catch (Exception e) {/* ignore this error */ + } catch (Error e) {/* ignore this error */} + return false; + } + + private Object[] getUpnpForwarderClasses() { + serverPortForwarding upnp = null; + Method scanForRouter = null; + + try { + + // trying to load the upnp forwarder class + Class forwarderClass = Class.forName("de.anomic.server.portForwarding.upnp.serverPortForwardingUpnp"); + // create a new instance + upnp = (serverPortForwarding) forwarderClass.newInstance(); + // trying to get the proper method for router scanning + scanForRouter = upnp.getClass().getMethod("routerAvailable", new Class[] {int.class}); + + } catch (Exception e) {/* ignore this error */ + } catch (Error e) {/* ignore this error */} + + return new Object[]{upnp,scanForRouter}; + } + + private void reinitPortForwarding(serverObjects post, serverSwitch env) { + if ((post != null)) { + try { + boolean reinitPortForwarding = false; + + if (post.containsKey("enableUpnp")) { + // upnp should be enabled + env.setConfig("portForwarding.Enabled","true"); + env.setConfig("portForwarding.Type", "upnp"); + reinitPortForwarding = true; + } else { + String currentForwarder = env.getConfig("portForwarding.Type", "none"); + boolean otherForwarderEnabled = serverCore.portForwardingEnabled && serverCore.portForwarding != null && !currentForwarder.equalsIgnoreCase("upnp"); + + // if no other forwarder is running we deactivate forwarding + // and try to stop an eventually running upnp forwarder + if (!otherForwarderEnabled) { + env.setConfig("portForwarding.Enabled","false"); + env.setConfig("portForwarding.Type", "none"); + reinitPortForwarding = true; + } + } + + if (reinitPortForwarding) { + if ((serverCore.portForwardingEnabled) && (serverCore.portForwarding != null)) { + // trying to shutdown the current port forwarding channel + serverCore.portForwarding.disconnect(); + } + + // trying to reinitialize the port forwarding + serverCore httpd = (serverCore) env.getThread("10_httpd"); + httpd.initPortForwarding(); + } + + } catch (Exception e) { /* */ } + } + } + } diff --git a/source/de/anomic/plasma/plasmaCrawlWorker.java b/source/de/anomic/plasma/plasmaCrawlWorker.java index 6970e887a..9fc3ffedd 100644 --- a/source/de/anomic/plasma/plasmaCrawlWorker.java +++ b/source/de/anomic/plasma/plasmaCrawlWorker.java @@ -497,6 +497,8 @@ public final class plasmaCrawlWorker extends Thread { // if the response has not the right response type then reject file log.logInfo("REJECTED WRONG STATUS TYPE '" + res.status + "' for URL " + url.toString()); // not processed any further + + // TODO: add the url into the error url DB } if (remote != null) remote.close(); diff --git a/source/de/anomic/server/portForwarding/upnp/serverPortForwardingUpnp.java b/source/de/anomic/server/portForwarding/upnp/serverPortForwardingUpnp.java index 20227b5e1..8d7fc58e0 100644 --- a/source/de/anomic/server/portForwarding/upnp/serverPortForwardingUpnp.java +++ b/source/de/anomic/server/portForwarding/upnp/serverPortForwardingUpnp.java @@ -57,13 +57,11 @@ import de.anomic.server.logging.serverLog; import de.anomic.server.portForwarding.serverPortForwarding; public class serverPortForwardingUpnp implements serverPortForwarding { - private InternetGatewayDevice gateway; - - private String localHost; - private int localHostPort; + private InternetGatewayDevice gateway; + private String localHost; + private int localHostPort; private String externalAddress = null; - private serverLog log; public serverPortForwardingUpnp() { @@ -126,6 +124,16 @@ public class serverPortForwardingUpnp implements serverPortForwarding { throw new IOException(e.getMessage()); } } + + public boolean routerAvailable(int timeout) { + try { + InternetGatewayDevice[] IGDs = InternetGatewayDevice.getDevices(timeout); + return (IGDs != null) && (IGDs.length > 0); + } catch (Exception e) { + this.log.logSevere("Unable to determine available routers: " + e.getMessage()); + return false; + } + } public void disconnect() throws IOException { if (this.gateway == null) throw new IOException("No connection established.");