📄 networkadminimpl.java
字号:
/*
* Created on 1 Nov 2006
* Created by Paul Gardner
* Copyright (C) 2006 Aelitis, All Rights Reserved.
*
* 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.
*
* AELITIS, SAS au capital de 63.529,40 euros
* 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France.
*
*/
package com.aelitis.azureus.core.networkmanager.admin.impl;
import java.io.PrintWriter;
import java.net.Authenticator;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.PasswordAuthentication;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.gudy.azureus2.core3.config.COConfigurationManager;
import org.gudy.azureus2.core3.config.ParameterListener;
import org.gudy.azureus2.core3.logging.LogAlert;
import org.gudy.azureus2.core3.logging.LogEvent;
import org.gudy.azureus2.core3.logging.LogIDs;
import org.gudy.azureus2.core3.logging.Logger;
import org.gudy.azureus2.core3.util.AEMonitor;
import org.gudy.azureus2.core3.util.Debug;
import org.gudy.azureus2.core3.util.IndentWriter;
import org.gudy.azureus2.core3.util.SimpleTimer;
import org.gudy.azureus2.core3.util.SystemTime;
import org.gudy.azureus2.core3.util.TimerEvent;
import org.gudy.azureus2.core3.util.TimerEventPerformer;
import org.gudy.azureus2.platform.PlatformManager;
import org.gudy.azureus2.platform.PlatformManagerCapabilities;
import org.gudy.azureus2.platform.PlatformManagerFactory;
import org.gudy.azureus2.platform.PlatformManagerPingCallback;
import org.gudy.azureus2.plugins.PluginInterface;
import org.gudy.azureus2.plugins.platform.PlatformManagerException;
import com.aelitis.azureus.core.AzureusCore;
import com.aelitis.azureus.core.AzureusCoreFactory;
import com.aelitis.azureus.core.networkmanager.admin.NetworkAdmin;
import com.aelitis.azureus.core.networkmanager.admin.NetworkAdminASNLookup;
import com.aelitis.azureus.core.networkmanager.admin.NetworkAdminException;
import com.aelitis.azureus.core.networkmanager.admin.NetworkAdminHTTPProxy;
import com.aelitis.azureus.core.networkmanager.admin.NetworkAdminNATDevice;
import com.aelitis.azureus.core.networkmanager.admin.NetworkAdminNetworkInterfaceAddress;
import com.aelitis.azureus.core.networkmanager.admin.NetworkAdminNetworkInterface;
import com.aelitis.azureus.core.networkmanager.admin.NetworkAdminNode;
import com.aelitis.azureus.core.networkmanager.admin.NetworkAdminPropertyChangeListener;
import com.aelitis.azureus.core.networkmanager.admin.NetworkAdminProtocol;
import com.aelitis.azureus.core.networkmanager.admin.NetworkAdminRouteListener;
import com.aelitis.azureus.core.networkmanager.admin.NetworkAdminSocksProxy;
import com.aelitis.azureus.core.networkmanager.impl.http.HTTPNetworkManager;
import com.aelitis.azureus.core.networkmanager.impl.tcp.TCPNetworkManager;
import com.aelitis.azureus.core.networkmanager.impl.udp.UDPNetworkManager;
import com.aelitis.azureus.core.proxy.socks.AESocksProxy;
import com.aelitis.azureus.core.proxy.socks.AESocksProxyFactory;
import com.aelitis.azureus.core.util.CopyOnWriteList;
import com.aelitis.azureus.plugins.upnp.UPnPPlugin;
import com.aelitis.azureus.plugins.upnp.UPnPPluginService;
public class
NetworkAdminImpl
extends NetworkAdmin
{
private static final LogIDs LOGID = LogIDs.NWMAN;
private Set old_network_interfaces;
private InetAddress old_bind_ip;
private CopyOnWriteList listeners = new CopyOnWriteList();
private NetworkAdminRouteListener
trace_route_listener = new NetworkAdminRouteListener()
{
private int node_count = 0;
public boolean
foundNode(
NetworkAdminNode node,
int distance,
int rtt )
{
node_count++;
return( true );
}
public boolean
timeout(
int distance )
{
if ( distance == 3 && node_count == 0 ){
return( false );
}
return( true );
}
};
public
NetworkAdminImpl()
{
COConfigurationManager.addParameterListener(
"Bind IP",
new ParameterListener()
{
public void
parameterChanged(
String parameterName )
{
checkDefaultBindAddress( false );
}
});
SimpleTimer.addPeriodicEvent(
"NetworkAdmin:checker",
15000,
new TimerEventPerformer()
{
public void
perform(
TimerEvent event )
{
checkNetworkInterfaces( false );
}
});
// populate initial values
checkNetworkInterfaces(true);
checkDefaultBindAddress(true);
}
protected void
checkNetworkInterfaces(
boolean first_time )
{
try{
Enumeration nis = NetworkInterface.getNetworkInterfaces();
boolean changed = false;
if ( nis == null && old_network_interfaces == null ){
}else if ( nis == null ){
old_network_interfaces = null;
changed = true;
}else if ( old_network_interfaces == null ){
Set new_network_interfaces = new HashSet();
while( nis.hasMoreElements()){
new_network_interfaces.add( nis.nextElement());
}
old_network_interfaces = new_network_interfaces;
changed = true;
}else{
Set new_network_interfaces = new HashSet();
while( nis.hasMoreElements()){
Object ni = nis.nextElement();
// NetworkInterface's "equals" method is based on ni name + addresses
if ( !old_network_interfaces.contains( ni )){
changed = true;
}
new_network_interfaces.add( ni );
}
if ( old_network_interfaces.size() != new_network_interfaces.size()){
changed = true;
}
old_network_interfaces = new_network_interfaces;
}
if ( changed ){
if ( !first_time ){
Logger.log(
new LogEvent(LOGID,
"NetworkAdmin: network interfaces have changed" ));
}
firePropertyChange( NetworkAdmin.PR_NETWORK_INTERFACES );
checkDefaultBindAddress( first_time );
}
}catch( Throwable e ){
}
}
public InetAddress
getDefaultBindAddress()
{
return( old_bind_ip );
}
protected void
checkDefaultBindAddress(
boolean first_time )
{
boolean changed = false;
String bind_ip = COConfigurationManager.getStringParameter("Bind IP", "").trim();
try{
if ( bind_ip.length() == 0 && old_bind_ip == null ){
}else if ( bind_ip.length() == 0 ){
old_bind_ip = null;
changed = true;
}else{
InetAddress new_bind_ip = null;
if ( bind_ip.indexOf('.') == -1 ){
// no dots -> interface name (e.g. eth0 )
Enumeration nis = NetworkInterface.getNetworkInterfaces();
while( nis.hasMoreElements()){
NetworkInterface ni = (NetworkInterface)nis.nextElement();
if ( bind_ip.equalsIgnoreCase( ni.getName())){
Enumeration addresses = ni.getInetAddresses();
if ( addresses.hasMoreElements()){
new_bind_ip = (InetAddress)addresses.nextElement();
}
}
}
if ( new_bind_ip == null ){
Logger.log(
new LogAlert(LogAlert.UNREPEATABLE,
LogAlert.AT_ERROR, "Bind IP '" + bind_ip + "' is invalid - no matching network interfaces" ));
return;
}
}else{
new_bind_ip = InetAddress.getByName( bind_ip );
}
if ( old_bind_ip == null || !old_bind_ip.equals( new_bind_ip )){
old_bind_ip = new_bind_ip;
changed = true;
}
}
if ( changed ){
if ( !first_time ){
Logger.log(
new LogEvent(LOGID,
"NetworkAdmin: default bind ip has changed to '" + (old_bind_ip==null?"none":old_bind_ip.getHostAddress()) + "'"));
}
firePropertyChange( NetworkAdmin.PR_DEFAULT_BIND_ADDRESS );
}
}catch( Throwable e ){
Logger.log(
new LogAlert(LogAlert.UNREPEATABLE,
LogAlert.AT_ERROR, "Bind IP '" + bind_ip + "' is invalid" ));
}
}
public String
getNetworkInterfacesAsString()
{
Set interfaces = old_network_interfaces;
if ( interfaces == null ){
return( "" );
}
Iterator it = interfaces.iterator();
String str = "";
while( it.hasNext()){
NetworkInterface ni = (NetworkInterface)it.next();
str += (str.length()==0?"":",") + ni.getName() + "=";
Enumeration addresses = ni.getInetAddresses();
int add_num = 0;
while( addresses.hasMoreElements()){
add_num++;
InetAddress ia = (InetAddress)addresses.nextElement();
str += (add_num==1?"":";") + ia.getHostAddress();
}
}
return( str );
}
protected void
firePropertyChange(
String property )
{
Iterator it = listeners.iterator();
while( it.hasNext()){
((NetworkAdminPropertyChangeListener)it.next()).propertyChanged( property );
}
}
public NetworkAdminNetworkInterface[]
getInterfaces()
{
Set interfaces = old_network_interfaces;
if ( interfaces == null ){
return( new NetworkAdminNetworkInterface[0] );
}
NetworkAdminNetworkInterface[] res = new NetworkAdminNetworkInterface[interfaces.size()];
Iterator it = interfaces.iterator();
int pos = 0;
while( it.hasNext()){
NetworkInterface ni = (NetworkInterface)it.next();
res[pos++] = new networkInterface( ni );
}
return( res );
}
public NetworkAdminProtocol[]
getOutboundProtocols()
{
AzureusCore azureus_core = AzureusCoreFactory.getSingleton();
NetworkAdminProtocol[] res =
{
new NetworkAdminProtocolImpl( azureus_core, NetworkAdminProtocol.PT_HTTP ),
new NetworkAdminProtocolImpl( azureus_core, NetworkAdminProtocol.PT_TCP ),
new NetworkAdminProtocolImpl( azureus_core, NetworkAdminProtocol.PT_UDP ),
};
return( res );
}
public NetworkAdminProtocol[]
getInboundProtocols()
{
AzureusCore azureus_core = AzureusCoreFactory.getSingleton();
List protocols = new ArrayList();
TCPNetworkManager tcp_manager = TCPNetworkManager.getSingleton();
if ( tcp_manager.isTCPListenerEnabled()){
protocols.add(
new NetworkAdminProtocolImpl(
azureus_core,
NetworkAdminProtocol.PT_TCP,
tcp_manager.getTCPListeningPortNumber()));
}
UDPNetworkManager udp_manager = UDPNetworkManager.getSingleton();
int done_udp = -1;
if ( udp_manager.isUDPListenerEnabled()){
protocols.add(
new NetworkAdminProtocolImpl(
azureus_core,
NetworkAdminProtocol.PT_UDP,
done_udp = udp_manager.getUDPListeningPortNumber()));
}
if ( udp_manager.isUDPNonDataListenerEnabled()){
int port = udp_manager.getUDPNonDataListeningPortNumber();
if ( port != done_udp ){
protocols.add(
new NetworkAdminProtocolImpl(
azureus_core,
NetworkAdminProtocol.PT_UDP,
done_udp = udp_manager.getUDPNonDataListeningPortNumber()));
}
}
HTTPNetworkManager http_manager = HTTPNetworkManager.getSingleton();
if ( http_manager.isHTTPListenerEnabled()){
protocols.add(
new NetworkAdminProtocolImpl(
azureus_core,
NetworkAdminProtocol.PT_HTTP,
http_manager.getHTTPListeningPortNumber()));
}
return((NetworkAdminProtocol[])protocols.toArray( new NetworkAdminProtocol[protocols.size()]));
}
public InetAddress
testProtocol(
NetworkAdminProtocol protocol )
throws NetworkAdminException
{
return( protocol.test( null ));
}
public NetworkAdminSocksProxy[]
getSocksProxies()
{
String host = System.getProperty( "socksProxyHost", "" ).trim();
String port = System.getProperty( "socksProxyPort", "" ).trim();
String user = System.getProperty("java.net.socks.username", "" ).trim();
String password = System.getProperty("java.net.socks.password", "").trim();
List res = new ArrayList();
NetworkAdminSocksProxyImpl p1 = new NetworkAdminSocksProxyImpl( host, port, user, password );
if ( p1.isConfigured()){
res.add( p1 );
}
if ( COConfigurationManager.getBooleanParameter( "Proxy.Data.Enable" ) &&
!COConfigurationManager.getBooleanParameter( "Proxy.Data.Same" )){
host = COConfigurationManager.getStringParameter( "Proxy.Data.Host" );
port = COConfigurationManager.getStringParameter( "Proxy.Data.Port" );
user = COConfigurationManager.getStringParameter( "Proxy.Data.Username" );
if ( user.trim().equalsIgnoreCase("<none>")){
user = "";
}
password = COConfigurationManager.getStringParameter( "Proxy.Data.Password" );
NetworkAdminSocksProxyImpl p2 = new NetworkAdminSocksProxyImpl( host, port, user, password );
if ( p2.isConfigured()){
res.add( p2 );
}
}
return((NetworkAdminSocksProxy[])res.toArray(new NetworkAdminSocksProxy[res.size()]));
}
public NetworkAdminHTTPProxy
getHTTPProxy()
{
NetworkAdminHTTPProxyImpl res = new NetworkAdminHTTPProxyImpl();
if ( !res.isConfigured()){
res = null;
}
return( res );
}
public NetworkAdminNATDevice[]
getNATDevices()
{
List devices = new ArrayList();
try{
PluginInterface upnp_pi = AzureusCoreFactory.getSingleton().getPluginManager().getPluginInterfaceByClass( UPnPPlugin.class );
if ( upnp_pi != null ){
UPnPPlugin upnp = (UPnPPlugin)upnp_pi.getPlugin();
UPnPPluginService[] services = upnp.getServices();
for (int i=0;i<services.length;i++){
devices.add( new NetworkAdminNATDeviceImpl( services[i] ));
}
}
}catch( Throwable e ){
Debug.printStackTrace( e );
}
return((NetworkAdminNATDevice[])devices.toArray(new NetworkAdminNATDevice[devices.size()]));
}
public NetworkAdminASNLookup
lookupASN(
InetAddress address )
throws NetworkAdminException
{
return( new NetworkAdminASNLookupImpl( address ));
}
public boolean
matchesCIDR(
String cidr,
InetAddress address )
throws NetworkAdminException
{
return( NetworkAdminASNLookupImpl.matchesCIDR( cidr, address ));
}
public void
runInitialChecks()
{
if ( COConfigurationManager.getBooleanParameter( "Proxy.Check.On.Start" )){
NetworkAdminSocksProxy[] socks = getSocksProxies();
for (int i=0;i<socks.length;i++){
NetworkAdminSocksProxy sock = socks[i];
try{
sock.getVersionsSupported();
}catch( Throwable e ){
Debug.printStackTrace( e );
Logger.log(
new LogAlert(
true,
LogAlert.AT_WARNING,
"Socks proxy " + sock.getName() + " check failed: " + Debug.getNestedExceptionMessage( e )));
}
}
NetworkAdminHTTPProxy http_proxy = getHTTPProxy();
if ( http_proxy != null ){
try{
http_proxy.getDetails();
}catch( Throwable e ){
Debug.printStackTrace( e );
Logger.log(
new LogAlert(
true,
LogAlert.AT_WARNING,
"HTTP proxy " + http_proxy.getName() + " check failed: " + Debug.getNestedExceptionMessage( e )));
}
}
}
}
public void
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -