forked from I2P_Developers/i2p.i2p
* i2ptunnel:
- Fixes for stopping client tunnels - Fix status display for shared clients - Log tweaks
This commit is contained in:
@ -43,6 +43,7 @@ import java.io.OutputStream;
|
|||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.net.UnknownHostException;
|
import java.net.UnknownHostException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
@ -306,19 +307,33 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
|
|||||||
" -w, -wait, --wait : do not run the command line interface or GUI";
|
" -w, -wait, --wait : do not run the command line interface or GUI";
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return A copy, non-null */
|
/**
|
||||||
|
* @return A copy, unmodifiable, non-null
|
||||||
|
*/
|
||||||
List<I2PSession> getSessions() {
|
List<I2PSession> getSessions() {
|
||||||
return new ArrayList<I2PSession>(_sessions);
|
if (_sessions.isEmpty())
|
||||||
|
return Collections.emptyList();
|
||||||
|
return new ArrayList<I2PSession>(_sessions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param session null ok
|
||||||
|
*/
|
||||||
void addSession(I2PSession session) {
|
void addSession(I2PSession session) {
|
||||||
if (session == null) return;
|
if (session == null) return;
|
||||||
_sessions.add(session);
|
boolean added = _sessions.add(session);
|
||||||
|
if (added && _log.shouldLog(Log.INFO))
|
||||||
|
_log.info(getPrefix() + " session added: " + session, new Exception());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param session null ok
|
||||||
|
*/
|
||||||
void removeSession(I2PSession session) {
|
void removeSession(I2PSession session) {
|
||||||
if (session == null) return;
|
if (session == null) return;
|
||||||
_sessions.remove(session);
|
boolean removed = _sessions.remove(session);
|
||||||
|
if (removed && _log.shouldLog(Log.INFO))
|
||||||
|
_log.info(getPrefix() + " session removed: " + session, new Exception());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -334,6 +349,11 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
|
|||||||
tsk.setId(next_task_id);
|
tsk.setId(next_task_id);
|
||||||
next_task_id++;
|
next_task_id++;
|
||||||
tasks.add(tsk);
|
tasks.add(tsk);
|
||||||
|
if (_log.shouldLog(Log.INFO))
|
||||||
|
_log.info(getPrefix() + " adding task: " + tsk);
|
||||||
|
} else {
|
||||||
|
if (_log.shouldLog(Log.INFO))
|
||||||
|
_log.info(getPrefix() + " not adding task that isn't open: " + tsk);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1521,6 +1541,10 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
|
|||||||
}
|
}
|
||||||
if (args[argindex].equalsIgnoreCase("all")) {
|
if (args[argindex].equalsIgnoreCase("all")) {
|
||||||
boolean error = false;
|
boolean error = false;
|
||||||
|
if (tasks.isEmpty()) {
|
||||||
|
if (_log.shouldLog(Log.INFO))
|
||||||
|
_log.info(getPrefix() + " runClose(all) no tasks");
|
||||||
|
}
|
||||||
for (I2PTunnelTask t : tasks) {
|
for (I2PTunnelTask t : tasks) {
|
||||||
if (!closetask(t, forced, l)) {
|
if (!closetask(t, forced, l)) {
|
||||||
notifyEvent("closeResult", "error");
|
notifyEvent("closeResult", "error");
|
||||||
@ -1693,7 +1717,8 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
|
|||||||
*/
|
*/
|
||||||
public void log(String s) {
|
public void log(String s) {
|
||||||
System.out.println(s);
|
System.out.println(s);
|
||||||
_log.info(getPrefix() + "Display: " + s);
|
if (_log.shouldLog(Log.INFO))
|
||||||
|
_log.info(getPrefix() + "Display: " + s);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -346,6 +346,10 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
|||||||
} else {
|
} else {
|
||||||
if (_log.shouldLog(Log.INFO))
|
if (_log.shouldLog(Log.INFO))
|
||||||
_log.info(tunnel.getClientOptions().getProperty("inbound.nickname") + ": Not building a new socket manager since the old one is open [s=" + s + "]");
|
_log.info(tunnel.getClientOptions().getProperty("inbound.nickname") + ": Not building a new socket manager since the old one is open [s=" + s + "]");
|
||||||
|
// If some other tunnel created the session, we need to add it
|
||||||
|
// as our session too.
|
||||||
|
// It's a Set in I2PTunnel
|
||||||
|
tunnel.addSession(s);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (_log.shouldLog(Log.INFO))
|
if (_log.shouldLog(Log.INFO))
|
||||||
@ -767,6 +771,12 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
|
|||||||
if (!chained) {
|
if (!chained) {
|
||||||
I2PSession session = sockMgr.getSession();
|
I2PSession session = sockMgr.getSession();
|
||||||
getTunnel().removeSession(session);
|
getTunnel().removeSession(session);
|
||||||
|
if (_ownDest) {
|
||||||
|
try {
|
||||||
|
session.destroySession();
|
||||||
|
} catch (I2PException ex) {}
|
||||||
|
}
|
||||||
|
// TCG will try to destroy it too
|
||||||
} // else the app chaining to this one closes it!
|
} // else the app chaining to this one closes it!
|
||||||
}
|
}
|
||||||
l.log("Stopping client " + toString());
|
l.log("Stopping client " + toString());
|
||||||
|
@ -4,9 +4,12 @@ import java.io.File;
|
|||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import net.i2p.I2PAppContext;
|
import net.i2p.I2PAppContext;
|
||||||
import net.i2p.I2PException;
|
import net.i2p.I2PException;
|
||||||
@ -387,10 +390,9 @@ public class TunnelController implements Logging {
|
|||||||
* Note the fact that we are no longer using some sessions, and if
|
* Note the fact that we are no longer using some sessions, and if
|
||||||
* no other tunnels are using them, close them.
|
* no other tunnels are using them, close them.
|
||||||
*/
|
*/
|
||||||
private void release() {
|
private void release(Collection<I2PSession> sessions) {
|
||||||
if (_sessions != null && !_sessions.isEmpty()) {
|
if (!sessions.isEmpty()) {
|
||||||
for (int i = 0; i < _sessions.size(); i++) {
|
for (I2PSession s : sessions) {
|
||||||
I2PSession s = _sessions.get(i);
|
|
||||||
if (_log.shouldLog(Log.INFO))
|
if (_log.shouldLog(Log.INFO))
|
||||||
_log.info("Releasing session " + s);
|
_log.info("Releasing session " + s);
|
||||||
TunnelControllerGroup group = TunnelControllerGroup.getInstance();
|
TunnelControllerGroup group = TunnelControllerGroup.getInstance();
|
||||||
@ -403,6 +405,22 @@ public class TunnelController implements Logging {
|
|||||||
_log.warn("No sessions to release? for " + getName());
|
_log.warn("No sessions to release? for " + getName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all the sessions we may be using.
|
||||||
|
*
|
||||||
|
* @return a copy, non-null
|
||||||
|
* @since 0.9.15
|
||||||
|
*/
|
||||||
|
private Collection<I2PSession> getAllSessions() {
|
||||||
|
// We use _sessions AND the tunnel sessions as
|
||||||
|
// _sessions will be null for delay-open tunnels - see acquire().
|
||||||
|
// We want the current sessions.
|
||||||
|
Set<I2PSession> sessions = new HashSet(_tunnel.getSessions());
|
||||||
|
if (_sessions != null)
|
||||||
|
sessions.addAll(_sessions);
|
||||||
|
return sessions;
|
||||||
|
}
|
||||||
|
|
||||||
private void startClient() {
|
private void startClient() {
|
||||||
setListenOn();
|
setListenOn();
|
||||||
@ -522,8 +540,11 @@ public class TunnelController implements Logging {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void stopTunnel() {
|
public void stopTunnel() {
|
||||||
|
// I2PTunnel removes the session in close(),
|
||||||
|
// so save the sessions to pass to release() and TCG
|
||||||
|
Collection<I2PSession> sessions = getAllSessions();
|
||||||
_tunnel.runClose(new String[] { "forced", "all" }, this);
|
_tunnel.runClose(new String[] { "forced", "all" }, this);
|
||||||
release();
|
release(sessions);
|
||||||
_running = false;
|
_running = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -568,12 +589,8 @@ public class TunnelController implements Logging {
|
|||||||
// tell i2ptunnel, who will tell the TunnelTask, who will tell the SocketManager
|
// tell i2ptunnel, who will tell the TunnelTask, who will tell the SocketManager
|
||||||
setSessionOptions();
|
setSessionOptions();
|
||||||
|
|
||||||
// we use the tunnel sessions, not _sessions, as
|
if (_running) {
|
||||||
// _sessions will be null for delay-open tunnels - see acquire().
|
Collection<I2PSession> sessions = getAllSessions();
|
||||||
// We want the current sessions.
|
|
||||||
//List<I2PSession> sessions = _sessions;
|
|
||||||
List<I2PSession> sessions = _tunnel.getSessions();
|
|
||||||
if (_running && sessions != null) {
|
|
||||||
if (sessions.isEmpty()) {
|
if (sessions.isEmpty()) {
|
||||||
if (_log.shouldLog(Log.DEBUG))
|
if (_log.shouldLog(Log.DEBUG))
|
||||||
_log.debug("Running but no sessions to update");
|
_log.debug("Running but no sessions to update");
|
||||||
@ -591,10 +608,7 @@ public class TunnelController implements Logging {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (_log.shouldLog(Log.DEBUG)) {
|
if (_log.shouldLog(Log.DEBUG)) {
|
||||||
if (!_running)
|
_log.debug("Not running, not updating sessions");
|
||||||
_log.debug("Not running, not updating sessions");
|
|
||||||
if (sessions == null)
|
|
||||||
_log.debug("null sessions, nothing to update");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -683,6 +697,7 @@ public class TunnelController implements Logging {
|
|||||||
|
|
||||||
public boolean getIsRunning() { return _running; }
|
public boolean getIsRunning() { return _running; }
|
||||||
public boolean getIsStarting() { return _starting; }
|
public boolean getIsStarting() { return _starting; }
|
||||||
|
|
||||||
/** if running but no open sessions, we are in standby */
|
/** if running but no open sessions, we are in standby */
|
||||||
public boolean getIsStandby() {
|
public boolean getIsStandby() {
|
||||||
if (!_running)
|
if (!_running)
|
||||||
@ -835,4 +850,12 @@ public class TunnelController implements Logging {
|
|||||||
}
|
}
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @since 0.9.15
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "TC " + getType() + ' ' + getName() + " for " + _tunnel;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,8 @@
|
|||||||
|
2014-09-13 zzz
|
||||||
|
* i2ptunnel:
|
||||||
|
- Fixes for stopping client tunnels
|
||||||
|
- Fix status display for shared clients
|
||||||
|
|
||||||
2014-09-12 zzz
|
2014-09-12 zzz
|
||||||
* i2psnark: Escape fixes
|
* i2psnark: Escape fixes
|
||||||
* i2ptunnel: Fix updating session options on a running delay-open client tunnel
|
* i2ptunnel: Fix updating session options on a running delay-open client tunnel
|
||||||
|
@ -18,7 +18,7 @@ public class RouterVersion {
|
|||||||
/** deprecated */
|
/** deprecated */
|
||||||
public final static String ID = "Monotone";
|
public final static String ID = "Monotone";
|
||||||
public final static String VERSION = CoreVersion.VERSION;
|
public final static String VERSION = CoreVersion.VERSION;
|
||||||
public final static long BUILD = 18;
|
public final static long BUILD = 19;
|
||||||
|
|
||||||
/** for example "-test" */
|
/** for example "-test" */
|
||||||
public final static String EXTRA = "-rc";
|
public final static String EXTRA = "-rc";
|
||||||
|
Reference in New Issue
Block a user