From 39f3d6cc8065189b4d1d407ef8a107d11cf6ccd8 Mon Sep 17 00:00:00 2001 From: jrandom Date: Thu, 9 Sep 2004 02:26:42 +0000 Subject: [PATCH] (release in the next hour or so) 2004-09-08 jrandom * Updated the "Active:" peer count to display the # of connections as well as the number of recently active router identities. * Implement some basic updating code - on startup, if there is a file named "i2pupdate.zip" in the I2P installation directory, extract it, delete it, then restart. * Added an ugly little script to allow launching the router on win9x machines without a dos box (using javaw to run a .bat file). * Logging updates. * Updated VERSION constants to 0.4.0.1 --- .../src/net/i2p/router/web/SummaryHelper.java | 12 +++- apps/routerconsole/jsp/summary.jsp | 2 +- build.xml | 12 ++-- core/java/src/net/i2p/CoreVersion.java | 4 +- core/java/src/net/i2p/data/DataHelper.java | 61 ++++++++++++++++++ core/java/src/net/i2p/util/ShellCommand.java | 14 ++++ history.txt | 15 ++++- installer/resources/i2prouter_win9x.bat | 5 ++ .../resources/install_i2p_service_winnt.bat | 2 +- .../resources/uninstall_i2p_service_winnt.bat | 2 +- .../src/net/i2p/router/CommSystemFacade.java | 2 + router/java/src/net/i2p/router/JobQueue.java | 64 ++++++++++--------- .../src/net/i2p/router/MessageValidator.java | 8 ++- router/java/src/net/i2p/router/Router.java | 22 +++++++ .../src/net/i2p/router/RouterVersion.java | 6 +- .../transport/CommSystemFacadeImpl.java | 2 + .../transport/OutboundMessageRegistry.java | 12 ++-- .../net/i2p/router/transport/Transport.java | 2 + .../i2p/router/transport/TransportImpl.java | 2 + .../router/transport/TransportManager.java | 8 +++ .../router/transport/tcp/TCPTransport.java | 7 ++ 21 files changed, 211 insertions(+), 53 deletions(-) create mode 100644 installer/resources/i2prouter_win9x.bat diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java index 7f2aabd9ea..f6ffae3704 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java @@ -78,10 +78,20 @@ public class SummaryHelper { } /** - * How many active peers the router has. + * How many peers we are talking to now * */ public int getActivePeers() { + if (_context == null) + return 0; + else + return _context.commSystem().countActivePeers(); + } + /** + * How many active identities have we spoken with recently + * + */ + public int getActiveProfiles() { if (_context == null) return 0; else diff --git a/apps/routerconsole/jsp/summary.jsp b/apps/routerconsole/jsp/summary.jsp index c0d5103fa1..144f35dacb 100644 --- a/apps/routerconsole/jsp/summary.jsp +++ b/apps/routerconsole/jsp/summary.jsp @@ -11,7 +11,7 @@
Peers
- Active:
+ Active: /
Fast:
High capacity:
Well integrated:
diff --git a/build.xml b/build.xml index 0758c4c32a..dad90fdb0d 100644 --- a/build.xml +++ b/build.xml @@ -176,6 +176,7 @@ + @@ -228,10 +229,13 @@ - - - - + + + + + + + diff --git a/core/java/src/net/i2p/CoreVersion.java b/core/java/src/net/i2p/CoreVersion.java index 99d0c47886..74a01ebe01 100644 --- a/core/java/src/net/i2p/CoreVersion.java +++ b/core/java/src/net/i2p/CoreVersion.java @@ -14,8 +14,8 @@ package net.i2p; * */ public class CoreVersion { - public final static String ID = "$Revision: 1.18 $ $Date: 2004/08/20 14:56:35 $"; - public final static String VERSION = "0.4"; + public final static String ID = "$Revision: 1.19 $ $Date: 2004/09/03 14:46:07 $"; + public final static String VERSION = "0.4.0.1"; public static void main(String args[]) { System.out.println("I2P Core version: " + VERSION); diff --git a/core/java/src/net/i2p/data/DataHelper.java b/core/java/src/net/i2p/data/DataHelper.java index 0c4f6e3bd8..a186ff38a3 100644 --- a/core/java/src/net/i2p/data/DataHelper.java +++ b/core/java/src/net/i2p/data/DataHelper.java @@ -24,12 +24,15 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.Date; +import java.util.Enumeration; import java.util.Iterator; import java.util.List; import java.util.Properties; import java.util.TreeMap; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; import net.i2p.util.OrderedProperties; @@ -636,4 +639,62 @@ public class DataHelper { if (fis != null) try { fis.close(); } catch (IOException ioe) {} } } + + public static boolean extractZip(File zipfile, File targetDir) { + try { + byte buf[] = new byte[16*1024]; + ZipFile zip = new ZipFile(zipfile); + Enumeration entries = zip.entries(); + while (entries.hasMoreElements()) { + ZipEntry entry = (ZipEntry)entries.nextElement(); + if (entry.getName().indexOf("..") != -1) { + System.err.println("ERROR: Refusing to extract a zip entry with '..' in it [" + entry.getName() + "]"); + return false; + } + File target = new File(targetDir, entry.getName()); + File parent = target.getParentFile(); + if ( (parent != null) && (!parent.exists()) ) { + boolean parentsOk = parent.mkdirs(); + if (!parentsOk) { + System.err.println("ERROR: Unable to create the parent dir for " + entry.getName() + ": [" + parent.getAbsolutePath() + "]"); + return false; + } + } + if (entry.isDirectory()) { + if (!target.exists()) { + boolean created = target.mkdirs(); + if (!created) { + System.err.println("ERROR: Unable to create the directory [" + entry.getName() + "]"); + return false; + } else { + System.err.println("INFO: Creating directory [" + entry.getName() + "]"); + } + } + } else { + try { + InputStream in = zip.getInputStream(entry); + FileOutputStream fos = new FileOutputStream(target); + int read = 0; + while ( (read = in.read(buf)) != -1) { + fos.write(buf, 0, read); + } + fos.close(); + in.close(); + + System.err.println("INFO: File [" + entry.getName() + "] extracted"); + } catch (IOException ioe) { + System.err.println("ERROR: Error extracting the zip entry (" + entry.getName() + "]"); + ioe.printStackTrace(); + return false; + } + } + } + zip.close(); + return true; + } catch (IOException ioe) { + System.err.println("ERROR: Unable to extract the zip file"); + ioe.printStackTrace(); + return false; + } + } } diff --git a/core/java/src/net/i2p/util/ShellCommand.java b/core/java/src/net/i2p/util/ShellCommand.java index d3345b613c..9ad9b91272 100644 --- a/core/java/src/net/i2p/util/ShellCommand.java +++ b/core/java/src/net/i2p/util/ShellCommand.java @@ -339,6 +339,20 @@ public class ShellCommand { return _outputStream; } + public static void main(String args[]) { + if (args.length <= 0) { + System.err.println("Usage: ShellCommand commandline"); + return; + } + ShellCommand cmd = new ShellCommand(); + StringBuffer command = new StringBuffer(64); + for (int i = 0; i < args.length; i++) { + command.append("\"").append(args[i]).append("\" "); + } + cmd.execute(command.toString()); + return; + } + private boolean execute(String shellCommand, boolean consumeOutput, boolean waitForExitStatus) { StreamConsumer processStderrConsumer; diff --git a/history.txt b/history.txt index 61d24a6dd2..8b95a4460f 100644 --- a/history.txt +++ b/history.txt @@ -1,4 +1,17 @@ -$Id: history.txt,v 1.14 2004/09/08 17:05:35 hypercubus Exp $ +$Id: history.txt,v 1.15 2004/09/08 17:15:43 hypercubus Exp $ + +* 2004-09-08 0.4.0.1 released + +2004-09-08 jrandom + * Updated the "Active:" peer count to display the # of connections as well + as the number of recently active router identities. + * Implement some basic updating code - on startup, if there is a file named + "i2pupdate.zip" in the I2P installation directory, extract it, delete it, + then restart. + * Added an ugly little script to allow launching the router on win9x + machines without a dos box (using javaw to run a .bat file). + * Logging updates. + * Updated VERSION constants to 0.4.0.1 2004-09-08 hypercubus * Bugfix: Running the installer as a non-privileged user on Red Hat (and diff --git a/installer/resources/i2prouter_win9x.bat b/installer/resources/i2prouter_win9x.bat new file mode 100644 index 0000000000..732b234dd2 --- /dev/null +++ b/installer/resources/i2prouter_win9x.bat @@ -0,0 +1,5 @@ +@echo off +setlocal +REM Isn't it great the lengths we go through to launch a task without a dos box? +start javaw -cp lib\i2p.jar net.i2p.util.ShellCommand i2prouter.bat +exit diff --git a/installer/resources/install_i2p_service_winnt.bat b/installer/resources/install_i2p_service_winnt.bat index 9ce2d0a1f1..fb668c64a7 100644 --- a/installer/resources/install_i2p_service_winnt.bat +++ b/installer/resources/install_i2p_service_winnt.bat @@ -23,7 +23,7 @@ rem :conf set _WRAPPER_CONF="%~f1" if not %_WRAPPER_CONF%=="" goto startup -set _WRAPPER_CONF="%_REALPATH%wrapper.conf" +set _WRAPPER_CONF="%_REALPATH%wrapper.config" rem rem Install the Wrapper as an NT service. diff --git a/installer/resources/uninstall_i2p_service_winnt.bat b/installer/resources/uninstall_i2p_service_winnt.bat index f1353ab542..e36af92a19 100644 --- a/installer/resources/uninstall_i2p_service_winnt.bat +++ b/installer/resources/uninstall_i2p_service_winnt.bat @@ -23,7 +23,7 @@ rem :conf set _WRAPPER_CONF="%~f1" if not %_WRAPPER_CONF%=="" goto startup -set _WRAPPER_CONF="%_REALPATH%wrapper.conf" +set _WRAPPER_CONF="%_REALPATH%wrapper.config" rem rem Uninstall the Wrapper as an NT service. diff --git a/router/java/src/net/i2p/router/CommSystemFacade.java b/router/java/src/net/i2p/router/CommSystemFacade.java index aec948175a..b5e65b1679 100644 --- a/router/java/src/net/i2p/router/CommSystemFacade.java +++ b/router/java/src/net/i2p/router/CommSystemFacade.java @@ -25,6 +25,8 @@ public abstract class CommSystemFacade implements Service { /** Create the set of RouterAddress structures based on the router's config */ public Set createAddresses() { return new HashSet(); } + + public int countActivePeers() { return 0; } } class DummyCommSystemFacade extends CommSystemFacade { diff --git a/router/java/src/net/i2p/router/JobQueue.java b/router/java/src/net/i2p/router/JobQueue.java index 64152b4fc1..c714d12858 100644 --- a/router/java/src/net/i2p/router/JobQueue.java +++ b/router/java/src/net/i2p/router/JobQueue.java @@ -251,39 +251,41 @@ public class JobQueue { void shutdown() { _alive = false; - StringBuffer buf = new StringBuffer(1024); - buf.append("current jobs: \n"); - for (Iterator iter = _queueRunners.values().iterator(); iter.hasNext(); ) { - JobQueueRunner runner = (JobQueueRunner)iter.next(); - Job j = runner.getCurrentJob(); - - buf.append("Runner ").append(runner.getRunnerId()).append(": "); - if (j == null) { - buf.append("no current job "); - } else { - buf.append(j.toString()); - buf.append(" started ").append(_context.clock().now() - j.getTiming().getActualStart()); - buf.append("ms ago"); - } - - j = runner.getLastJob(); - if (j == null) { - buf.append("no last job"); - } else { - buf.append(j.toString()); - buf.append(" started ").append(_context.clock().now() - j.getTiming().getActualStart()); - buf.append("ms ago and finished "); - buf.append(_context.clock().now() - j.getTiming().getActualEnd()); - buf.append("ms ago"); + if (_log.shouldLog(Log.WARN)) { + StringBuffer buf = new StringBuffer(1024); + buf.append("current jobs: \n"); + for (Iterator iter = _queueRunners.values().iterator(); iter.hasNext(); ) { + JobQueueRunner runner = (JobQueueRunner)iter.next(); + Job j = runner.getCurrentJob(); + + buf.append("Runner ").append(runner.getRunnerId()).append(": "); + if (j == null) { + buf.append("no current job "); + } else { + buf.append(j.toString()); + buf.append(" started ").append(_context.clock().now() - j.getTiming().getActualStart()); + buf.append("ms ago"); + } + + j = runner.getLastJob(); + if (j == null) { + buf.append("no last job"); + } else { + buf.append(j.toString()); + buf.append(" started ").append(_context.clock().now() - j.getTiming().getActualStart()); + buf.append("ms ago and finished "); + buf.append(_context.clock().now() - j.getTiming().getActualEnd()); + buf.append("ms ago"); + } } + buf.append("\nready jobs: ").append(_readyJobs.size()).append("\n\t"); + for (int i = 0; i < _readyJobs.size(); i++) + buf.append(_readyJobs.get(i).toString()).append("\n\t"); + buf.append("\n\ntimed jobs: ").append(_timedJobs.size()).append("\n\t"); + for (int i = 0; i < _timedJobs.size(); i++) + buf.append(_timedJobs.get(i).toString()).append("\n\t"); + _log.log(Log.WARN, buf.toString()); } - buf.append("\nready jobs: ").append(_readyJobs.size()).append("\n\t"); - for (int i = 0; i < _readyJobs.size(); i++) - buf.append(_readyJobs.get(i).toString()).append("\n\t"); - buf.append("\n\ntimed jobs: ").append(_timedJobs.size()).append("\n\t"); - for (int i = 0; i < _timedJobs.size(); i++) - buf.append(_timedJobs.get(i).toString()).append("\n\t"); - _log.log(Log.CRIT, buf.toString()); } boolean isAlive() { return _alive; } diff --git a/router/java/src/net/i2p/router/MessageValidator.java b/router/java/src/net/i2p/router/MessageValidator.java index 28beffcf03..e9f17b968a 100644 --- a/router/java/src/net/i2p/router/MessageValidator.java +++ b/router/java/src/net/i2p/router/MessageValidator.java @@ -131,8 +131,10 @@ public class MessageValidator { } void shutdown() { - StringBuffer buf = new StringBuffer(1024); - buf.append("Validated messages: ").append(_receivedIds.size()); - _log.log(Log.CRIT, buf.toString()); + if (_log.shouldLog(Log.WARN)) { + StringBuffer buf = new StringBuffer(1024); + buf.append("Validated messages: ").append(_receivedIds.size()); + _log.log(Log.WARN, buf.toString()); + } } } diff --git a/router/java/src/net/i2p/router/Router.java b/router/java/src/net/i2p/router/Router.java index 8d6bba3206..5c7df9b6dc 100644 --- a/router/java/src/net/i2p/router/Router.java +++ b/router/java/src/net/i2p/router/Router.java @@ -716,10 +716,32 @@ public class Router { } public static void main(String args[]) { + installUpdates(); Router r = new Router(); r.runRouter(); } + private static final String UPDATE_FILE = "i2pupdate.zip"; + + private static void installUpdates() { + File updateFile = new File(UPDATE_FILE); + if (updateFile.exists()) { + System.out.println("INFO: Update file exists [" + UPDATE_FILE + "] - installing"); + boolean ok = DataHelper.extractZip(updateFile, new File(".")); + if (ok) + System.out.println("INFO: Update installed"); + else + System.out.println("ERROR: Update failed!"); + boolean deleted = updateFile.delete(); + if (!deleted) { + System.out.println("ERROR: Unable to delete the update file!"); + updateFile.deleteOnExit(); + } + System.out.println("INFO: Restarting after update"); + System.exit(EXIT_HARD_RESTART); + } + } + private static String getPingFile(Properties envProps) { if (envProps != null) return envProps.getProperty("router.pingFile", "router.ping"); diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index df935e221c..9d721f0051 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -15,9 +15,9 @@ import net.i2p.CoreVersion; * */ public class RouterVersion { - public final static String ID = "$Revision: 1.27 $ $Date: 2004/09/07 17:13:11 $"; - public final static String VERSION = "0.4"; - public final static long BUILD = 10; + public final static String ID = "$Revision: 1.28 $ $Date: 2004/09/08 17:05:35 $"; + public final static String VERSION = "0.4.0.1"; + public final static long BUILD = 0; public static void main(String args[]) { System.out.println("I2P Router version: " + VERSION); System.out.println("Router ID: " + RouterVersion.ID); diff --git a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java index 18ddff2d5f..5923f7f53a 100644 --- a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java +++ b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java @@ -52,6 +52,8 @@ public class CommSystemFacadeImpl extends CommSystemFacade { _manager.restart(); } + public int countActivePeers() { return _manager.countActivePeers(); } + public List getBids(OutNetMessage msg) { return _manager.getBids(msg); } diff --git a/router/java/src/net/i2p/router/transport/OutboundMessageRegistry.java b/router/java/src/net/i2p/router/transport/OutboundMessageRegistry.java index 98802223ca..7fe5462d6f 100644 --- a/router/java/src/net/i2p/router/transport/OutboundMessageRegistry.java +++ b/router/java/src/net/i2p/router/transport/OutboundMessageRegistry.java @@ -40,12 +40,14 @@ public class OutboundMessageRegistry { } public void shutdown() { - StringBuffer buf = new StringBuffer(1024); - buf.append("Pending messages: ").append(_pendingMessages.size()).append("\n"); - for (Iterator iter = _pendingMessages.values().iterator(); iter.hasNext(); ) { - buf.append(iter.next().toString()).append("\n\t"); + if (_log.shouldLog(Log.WARN)) { + StringBuffer buf = new StringBuffer(1024); + buf.append("Pending messages: ").append(_pendingMessages.size()).append("\n"); + for (Iterator iter = _pendingMessages.values().iterator(); iter.hasNext(); ) { + buf.append(iter.next().toString()).append("\n\t"); + } + _log.log(Log.WARN, buf.toString()); } - _log.log(Log.CRIT, buf.toString()); } /** diff --git a/router/java/src/net/i2p/router/transport/Transport.java b/router/java/src/net/i2p/router/transport/Transport.java index f481204aca..3846c8ffc3 100644 --- a/router/java/src/net/i2p/router/transport/Transport.java +++ b/router/java/src/net/i2p/router/transport/Transport.java @@ -37,5 +37,7 @@ public interface Transport { public void setListener(TransportEventListener listener); public String getStyle(); + public int countActivePeers(); + public String renderStatusHTML(); } diff --git a/router/java/src/net/i2p/router/transport/TransportImpl.java b/router/java/src/net/i2p/router/transport/TransportImpl.java index 438bb9ea49..ab76b0998e 100644 --- a/router/java/src/net/i2p/router/transport/TransportImpl.java +++ b/router/java/src/net/i2p/router/transport/TransportImpl.java @@ -52,6 +52,8 @@ public abstract class TransportImpl implements Transport { _currentAddresses = new HashSet(); } + public int countActivePeers() { return 0; } + public OutNetMessage getNextMessage() { OutNetMessage msg = null; synchronized (_sendPool) { diff --git a/router/java/src/net/i2p/router/transport/TransportManager.java b/router/java/src/net/i2p/router/transport/TransportManager.java index 34237302e4..0600c1e522 100644 --- a/router/java/src/net/i2p/router/transport/TransportManager.java +++ b/router/java/src/net/i2p/router/transport/TransportManager.java @@ -124,6 +124,14 @@ public class TransportManager implements TransportEventListener { return false; } + public int countActivePeers() { + int peers = 0; + for (int i = 0; i < _transports.size(); i++) { + peers += ((Transport)_transports.get(i)).countActivePeers(); + } + return peers; + } + public List getBids(OutNetMessage msg) { if (msg == null) throw new IllegalArgumentException("Null message? no bidding on a null outNetMessage!"); diff --git a/router/java/src/net/i2p/router/transport/tcp/TCPTransport.java b/router/java/src/net/i2p/router/transport/tcp/TCPTransport.java index 53c24282f6..89f64ff63a 100644 --- a/router/java/src/net/i2p/router/transport/tcp/TCPTransport.java +++ b/router/java/src/net/i2p/router/transport/tcp/TCPTransport.java @@ -103,6 +103,13 @@ public class TCPTransport extends TransportImpl { SigningPrivateKey getMySigningKey() { return _context.keyManager().getSigningPrivateKey(); } int getListenPort() { return _listenPort; } + + public int countActivePeers() { + synchronized (_connections) { + return _connections.size(); + } + } + /** fetch all of our TCP listening addresses */ TCPAddress[] getMyAddresses() { if (_address != null) {