YaCy can now automatically forward ports on home routers off by default git-svn-id: https://svn.berlios.de/svnroot/repos/yacy/trunk@5609 6c8d7289-2bf4-0310-a012-ef5d649a1542pull/1/head
parent
62762ba81a
commit
4aad461100
Binary file not shown.
@ -0,0 +1,136 @@
|
||||
// UPnP.java
|
||||
// (C) 2009 by David Wieditz; d.wieditz@gmx.de
|
||||
// first published 14.02.2009 on http://yacy.net
|
||||
//
|
||||
// This is a part of YaCy, a peer-to-peer based web search engine
|
||||
//
|
||||
// $LastChangedDate: $
|
||||
// $LastChangedRevision: $
|
||||
// $LastChangedBy: $
|
||||
//
|
||||
// LICENSE
|
||||
//
|
||||
// This program is free software; you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation; either version 2 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// This program is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with this program; if not, write to the Free Software
|
||||
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
package de.anomic.tools;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.net.InetAddress;
|
||||
|
||||
import net.sbbi.upnp.impls.InternetGatewayDevice;
|
||||
import net.sbbi.upnp.messages.UPNPResponseException;
|
||||
import de.anomic.kelondro.util.Log;
|
||||
import de.anomic.plasma.plasmaSwitchboard;
|
||||
|
||||
public class UPnP {
|
||||
|
||||
public final static Log log = new Log("UPNP");
|
||||
private static plasmaSwitchboard sb;
|
||||
|
||||
private final static int discoveryTimeout = 5000; // seconds to receive a response from devices
|
||||
private static InternetGatewayDevice[] IGDs = null;
|
||||
|
||||
// mapping variables
|
||||
private final static String mappedName = "YaCy";
|
||||
private final static String mappedProtocol = "TCP";
|
||||
private static int mappedPort = 0;
|
||||
private static String localHostIP = null;;
|
||||
|
||||
public static void setSb(plasmaSwitchboard switchboard) {
|
||||
sb = switchboard;
|
||||
}
|
||||
|
||||
private static boolean init() {
|
||||
boolean init = true;
|
||||
try {
|
||||
IGDs = InternetGatewayDevice.getDevices(discoveryTimeout);
|
||||
localHostIP = InetAddress.getLocalHost().getHostAddress();
|
||||
} catch (IOException e) {
|
||||
init = false;
|
||||
}
|
||||
if (IGDs != null) {
|
||||
for (InternetGatewayDevice IGD : IGDs) {
|
||||
log.logInfo("found device: " + IGD.getIGDRootDevice().getFriendlyName());
|
||||
}
|
||||
} else {
|
||||
log.logInfo("no device found");
|
||||
init = false;
|
||||
}
|
||||
|
||||
return init;
|
||||
}
|
||||
|
||||
/**
|
||||
* add port mapping for configured port
|
||||
*/
|
||||
public static void addPortMapping() {
|
||||
if (sb == null) return;
|
||||
addPortMapping(Integer.parseInt(sb.getConfig("port", "0")));
|
||||
}
|
||||
|
||||
/**
|
||||
* add TCP port mapping to all IGDs on the network<br/>
|
||||
* latest port mapping will be removed
|
||||
* @param port
|
||||
*/
|
||||
public static void addPortMapping(final int port) { //TODO: don't map already mapped port again
|
||||
if (port < 1) return;
|
||||
if (mappedPort > 0) deletePortMapping(); // delete old mapping first
|
||||
if (mappedPort == 0 && ((IGDs != null && localHostIP != null) || init())) {
|
||||
mappedPort = port;
|
||||
for (InternetGatewayDevice IGD : IGDs) {
|
||||
try {
|
||||
boolean mapped = IGD.addPortMapping(mappedName, null, mappedPort, mappedPort, localHostIP, 0, mappedProtocol);
|
||||
String msg = "port " + mappedPort + " on device "+ IGD.getIGDRootDevice().getFriendlyName();
|
||||
if (mapped) log.logInfo("mapped " + msg);
|
||||
else log.logWarning("could not map " + msg);
|
||||
} catch (IOException e) {} catch (UPNPResponseException e) { log.logSevere("mapping error: " + e.getMessage()); }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* delete current port mapping
|
||||
*/
|
||||
public static void deletePortMapping() {
|
||||
if (mappedPort > 0 && IGDs != null && localHostIP != null) {
|
||||
for (InternetGatewayDevice IGD : IGDs) {
|
||||
try {
|
||||
boolean unmapped = IGD.deletePortMapping(null, mappedPort, mappedProtocol);
|
||||
String msg = "port " + mappedPort + " on device "+ IGD.getIGDRootDevice().getFriendlyName();
|
||||
if (unmapped) log.logInfo("unmapped " + msg);
|
||||
else log.logWarning("could not unmap " + msg);
|
||||
} catch (IOException e) {} catch (UPNPResponseException e) { log.logSevere("unmapping error: " + e.getMessage()); }
|
||||
}
|
||||
mappedPort = 0; // reset mapped port
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @return mapped port or 0
|
||||
*/
|
||||
public static int getMappedPort() {
|
||||
return mappedPort;
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
deletePortMapping(); // nothing
|
||||
addPortMapping(40000); // map
|
||||
addPortMapping(40000); // unmap, map
|
||||
deletePortMapping(); // unmap
|
||||
deletePortMapping(); // nothing
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in new issue