propagate from branch 'i2p.i2p' (head 6ab0f64b9f4992591ed989f8d89a859fc3ceaeaf)
to branch 'i2p.i2p.zzz.test2' (head 3e85c6cfff244d09df42d967d3a3cdf77053890d)
This commit is contained in:
@ -401,7 +401,7 @@ public class I2PSnarkServlet extends HttpServlet {
|
||||
if (i > 0)
|
||||
filename = filename.substring(0, i);
|
||||
if (filename.length() > MAX_DISPLAYED_FILENAME_LENGTH)
|
||||
filename = filename.substring(0, MAX_DISPLAYED_FILENAME_LENGTH) + "...";
|
||||
filename = filename.substring(0, MAX_DISPLAYED_FILENAME_LENGTH) + "…";
|
||||
long total = snark.meta.getTotalLength();
|
||||
// Early typecast, avoid possibly overflowing a temp integer
|
||||
long remaining = (long) snark.storage.needed() * (long) snark.meta.getPieceLength(0);
|
||||
@ -453,7 +453,7 @@ public class I2PSnarkServlet extends HttpServlet {
|
||||
statusString = "<a title=\"" + err + "\">TrackerErr (" + curPeers + "/" + knownPeers + " peers)";
|
||||
else {
|
||||
if (err.length() > MAX_DISPLAYED_ERROR_LENGTH)
|
||||
err = err.substring(0, MAX_DISPLAYED_ERROR_LENGTH) + "...";
|
||||
err = err.substring(0, MAX_DISPLAYED_ERROR_LENGTH) + "…";
|
||||
statusString = "TrackerErr<br />(" + err + ")";
|
||||
}
|
||||
} else if (remaining <= 0) {
|
||||
|
@ -373,7 +373,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
|
||||
privKeyFile = new File(args[2]);
|
||||
if (!privKeyFile.isAbsolute())
|
||||
privKeyFile = new File(_context.getAppDir(), args[2]);
|
||||
privKeyFile = new File(_context.getConfigDir(), args[2]);
|
||||
if (!privKeyFile.canRead()) {
|
||||
l.log("private key file does not exist");
|
||||
_log.error(getPrefix() + "Private key file does not exist or is not readable: " + args[2]);
|
||||
@ -422,7 +422,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
|
||||
privKeyFile = new File(args[2]);
|
||||
if (!privKeyFile.isAbsolute())
|
||||
privKeyFile = new File(_context.getAppDir(), args[2]);
|
||||
privKeyFile = new File(_context.getConfigDir(), args[2]);
|
||||
if (!privKeyFile.canRead()) {
|
||||
l.log("private key file does not exist");
|
||||
_log.error(getPrefix() + "Private key file does not exist or is not readable: " + args[2]);
|
||||
@ -481,7 +481,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
|
||||
privKeyFile = new File(args[3]);
|
||||
if (!privKeyFile.isAbsolute())
|
||||
privKeyFile = new File(_context.getAppDir(), args[3]);
|
||||
privKeyFile = new File(_context.getConfigDir(), args[3]);
|
||||
if (!privKeyFile.canRead()) {
|
||||
l.log("private key file does not exist");
|
||||
_log.error(getPrefix() + "Private key file does not exist or is not readable: " + args[3]);
|
||||
@ -877,7 +877,7 @@ public class I2PTunnel implements Logging, EventDispatcher {
|
||||
|
||||
File privKeyFile = new File(args[1]);
|
||||
if (!privKeyFile.isAbsolute())
|
||||
privKeyFile = new File(_context.getAppDir(), args[1]);
|
||||
privKeyFile = new File(_context.getConfigDir(), args[1]);
|
||||
if (!privKeyFile.canRead()) {
|
||||
l.log("private key file does not exist");
|
||||
_log.error(getPrefix() + "Private key file does not exist or is not readable: " + args[3]);
|
||||
|
@ -404,6 +404,16 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
|
||||
}
|
||||
|
||||
line = method + " " + request.substring(pos);
|
||||
} else if (host.toLowerCase().equals("localhost") || host.equals("127.0.0.1")) {
|
||||
if (out != null) {
|
||||
out.write(ERR_LOCALHOST);
|
||||
out.write("<p /><i>Generated on: ".getBytes());
|
||||
out.write(new Date().toString().getBytes());
|
||||
out.write("</i></body></html>\n".getBytes());
|
||||
out.flush();
|
||||
}
|
||||
s.close();
|
||||
return;
|
||||
} else if (host.indexOf(".") != -1) {
|
||||
// rebuild host
|
||||
host = host + ":" + port;
|
||||
@ -431,16 +441,6 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
|
||||
usingWWWProxy = true;
|
||||
if (_log.shouldLog(Log.DEBUG))
|
||||
_log.debug(getPrefix(requestId) + "Host doesnt end with .i2p and it contains a period [" + host + "]: wwwProxy!");
|
||||
} else if (host.toLowerCase().startsWith("localhost:")) {
|
||||
if (out != null) {
|
||||
out.write(ERR_LOCALHOST);
|
||||
out.write("<p /><i>Generated on: ".getBytes());
|
||||
out.write(new Date().toString().getBytes());
|
||||
out.write("</i></body></html>\n".getBytes());
|
||||
out.flush();
|
||||
}
|
||||
s.close();
|
||||
return;
|
||||
} else {
|
||||
request = request.substring(pos + 1);
|
||||
pos = request.indexOf("/");
|
||||
|
@ -73,7 +73,7 @@ public class TunnelController implements Logging {
|
||||
|
||||
File keyFile = new File(getPrivKeyFile());
|
||||
if (!keyFile.isAbsolute())
|
||||
keyFile = new File(I2PAppContext.getGlobalContext().getAppDir(), getPrivKeyFile());
|
||||
keyFile = new File(I2PAppContext.getGlobalContext().getConfigDir(), getPrivKeyFile());
|
||||
if (keyFile.exists()) {
|
||||
//log("Not overwriting existing private keys in " + keyFile.getAbsolutePath());
|
||||
return;
|
||||
|
@ -53,7 +53,7 @@ public class I2PSocketOptionsImpl implements I2PSocketOptions {
|
||||
_writeTimeout = getInt(opts, PROP_WRITE_TIMEOUT, DEFAULT_WRITE_TIMEOUT);
|
||||
}
|
||||
|
||||
protected int getInt(Properties opts, String name, int defaultVal) {
|
||||
protected static int getInt(Properties opts, String name, int defaultVal) {
|
||||
if (opts == null) return defaultVal;
|
||||
String val = opts.getProperty(name);
|
||||
if (val == null) {
|
||||
|
@ -123,6 +123,7 @@
|
||||
<pathelement location="../../jetty/jettylib/javax.servlet.jar" />
|
||||
<pathelement location="../../jetty/jettylib/commons-logging.jar" />
|
||||
<pathelement location="../../jetty/jettylib/commons-el.jar" />
|
||||
<pathelement location="../../jetty/jettylib/org.mortbay.jetty.jar" />
|
||||
<pathelement location="../../systray/java/build/obj" />
|
||||
<pathelement location="../../systray/java/lib/systray4j.jar" />
|
||||
<pathelement location="../../../installer/lib/wrapper/win32/wrapper.jar" />
|
||||
|
@ -115,7 +115,7 @@ public class GraphHelper extends HelperBase {
|
||||
+ "\" /> pixels, height: <input size=\"4\" type=\"text\" name=\"height\" value=\"" + _height
|
||||
+ "\" /><br />\n");
|
||||
_out.write("Refresh delay: <select name=\"refreshDelay\"><option value=\"60\">1 minute</option><option value=\"120\">2 minutes</option><option value=\"300\">5 minutes</option><option value=\"600\">10 minutes</option><option value=\"1800\">30 minutes</option><option value=\"3600\">1 hour</option><option value=\"-1\">Never</option></select><br />\n");
|
||||
_out.write("<hr /><input type=\"submit\" value=\"Redraw\" /></div>");
|
||||
_out.write("<hr /><div class=\"formaction\"><input type=\"submit\" value=\"Redraw\" /></div></div>");
|
||||
} catch (IOException ioe) {
|
||||
ioe.printStackTrace();
|
||||
}
|
||||
|
@ -64,24 +64,15 @@ public class SummaryHelper extends HelperBase {
|
||||
return DataHelper.formatDuration(router.getUptime());
|
||||
}
|
||||
|
||||
private static final DateFormat _fmt = new java.text.SimpleDateFormat("HH:mm:ss", Locale.UK);
|
||||
public String getTime() {
|
||||
private String timeSkew() {
|
||||
if (_context == null) return "";
|
||||
|
||||
String now = null;
|
||||
synchronized (_fmt) {
|
||||
now = _fmt.format(new Date(_context.clock().now()));
|
||||
}
|
||||
|
||||
if (!_context.clock().getUpdatedSuccessfully())
|
||||
return now + " (Unknown skew)";
|
||||
|
||||
//if (!_context.clock().getUpdatedSuccessfully())
|
||||
// return " (Unknown skew)";
|
||||
long ms = _context.clock().getOffset();
|
||||
|
||||
long diff = Math.abs(ms);
|
||||
if (diff < 100)
|
||||
return now;
|
||||
return now + " (" + DataHelper.formatDuration(diff) + " skew)";
|
||||
if (diff < 3000)
|
||||
return "";
|
||||
return " (" + DataHelper.formatDuration(diff) + " skew)";
|
||||
}
|
||||
|
||||
public boolean allowReseed() {
|
||||
@ -90,9 +81,14 @@ public class SummaryHelper extends HelperBase {
|
||||
Boolean.valueOf(_context.getProperty("i2p.alwaysAllowReseed")).booleanValue());
|
||||
}
|
||||
|
||||
public int getAllPeers() { return _context.netDb().getKnownRouters(); }
|
||||
/** subtract one for ourselves, so if we know no other peers it displays zero */
|
||||
public int getAllPeers() { return Math.max(_context.netDb().getKnownRouters() - 1, 0); }
|
||||
|
||||
public String getReachability() {
|
||||
return reachability() + timeSkew();
|
||||
}
|
||||
|
||||
private String reachability() {
|
||||
if (_context.router().getUptime() > 60*1000 && (!_context.router().gracefulShutdownInProgress()) &&
|
||||
!_context.clientManager().isAlive())
|
||||
return "ERR-Client Manager I2CP Error - check logs"; // not a router problem but the user should know
|
||||
@ -354,7 +350,11 @@ public class SummaryHelper extends HelperBase {
|
||||
buf.append("<b>*</b> ");
|
||||
buf.append("<a href=\"tunnels.jsp#").append(client.calculateHash().toBase64().substring(0,4));
|
||||
buf.append("\" target=\"_top\" title=\"Show tunnels\">");
|
||||
buf.append(name).append("</a><br />\n");
|
||||
if (name.length() < 16)
|
||||
buf.append(name);
|
||||
else
|
||||
buf.append(name.substring(0,15)).append("…");
|
||||
buf.append("</a><br />\n");
|
||||
LeaseSet ls = _context.netDb().lookupLeaseSetLocally(client.calculateHash());
|
||||
if (ls != null) {
|
||||
long timeToExpire = ls.getEarliestLeaseDate() - _context.clock().now();
|
||||
|
32
apps/routerconsole/jsp/error.jsp
Normal file
32
apps/routerconsole/jsp/error.jsp
Normal file
@ -0,0 +1,32 @@
|
||||
<%@page contentType="text/html"%>
|
||||
<%@page pageEncoding="UTF-8"%>
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
<%
|
||||
// Let's make this easy...
|
||||
final Integer ERROR_CODE = (Integer) request.getAttribute(org.mortbay.jetty.servlet.ServletHandler.__J_S_ERROR_STATUS_CODE);
|
||||
final String ERROR_URI = (String) request.getAttribute(org.mortbay.jetty.servlet.ServletHandler.__J_S_ERROR_REQUEST_URI);
|
||||
final String ERROR_MESSAGE = (String) request.getAttribute(org.mortbay.jetty.servlet.ServletHandler.__J_S_ERROR_MESSAGE);
|
||||
if (ERROR_CODE != null && ERROR_MESSAGE != null) {
|
||||
// this is deprecated but we don't want sendError()
|
||||
response.setStatus(ERROR_CODE.intValue(), ERROR_MESSAGE);
|
||||
}
|
||||
// If it can't find the iframe or viewtheme.jsp I wonder if the whole thing blows up...
|
||||
%>
|
||||
<html><head>
|
||||
<title>I2P Router Console</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<%@include file="css.jsp" %>
|
||||
<link rel="shortcut icon" href="favicon.ico" />
|
||||
</head><body>
|
||||
<%
|
||||
if (System.getProperty("router.consoleNonce") == null) {
|
||||
System.setProperty("router.consoleNonce", new java.util.Random().nextLong() + "");
|
||||
}
|
||||
%>
|
||||
<%@include file="summary.jsp" %>
|
||||
<h1><%=ERROR_CODE%> <%=ERROR_MESSAGE%></h1>
|
||||
<div class="warning" id="warning">
|
||||
The Router Console page <%=ERROR_URI%> was not found.
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -3,9 +3,9 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||
|
||||
<html><head>
|
||||
<%@include file="css.jsp" %>
|
||||
<title>I2P Router Console - home</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
|
||||
<%@include file="css.jsp" %>
|
||||
<link rel="shortcut icon" href="/themes/console/images/favicon.ico" />
|
||||
</head><body>
|
||||
<%
|
||||
|
@ -26,9 +26,9 @@
|
||||
<jsp:getProperty name="linkhelper" property="content" />
|
||||
<% } else { %>
|
||||
<u><b>I2P Services</b></u><br />
|
||||
<a href="susimail/susimail" target="blank">Susimail</a>
|
||||
<a href="susidns/index.jsp" target="_blank">SusiDNS</a>
|
||||
<a href="susidns/index.jsp" target="_blank">Addressbook</a>
|
||||
<a href="i2psnark/" target="_blank">Torrents</a>
|
||||
<a href="susimail/susimail" target="blank">Webmail</a>
|
||||
<a href="http://127.0.0.1:7658/" target="_blank">Webserver</a><hr />
|
||||
<u><b>I2P Internals</b></u><br />
|
||||
<a href="i2ptunnel/index.jsp" target="_blank">I2PTunnel</a>
|
||||
@ -48,14 +48,16 @@
|
||||
<b>Ident:</b> (<a title="Your router identity is <jsp:getProperty name="helper" property="ident" />, never reveal it to anyone" href="netdb.jsp?r=." target="_top">view</a>)<br />
|
||||
<b>Version:</b> <jsp:getProperty name="helper" property="version" /><br />
|
||||
<b>Uptime:</b> <jsp:getProperty name="helper" property="uptime" /><br />
|
||||
<b>Now:</b> <jsp:getProperty name="helper" property="time" /><br />
|
||||
<b>Reachability:</b> <a href="config.jsp#help" target="_top"><jsp:getProperty name="helper" property="reachability" /></a>
|
||||
<%
|
||||
if (helper.updateAvailable()) {
|
||||
// display all the time so we display the final failure message
|
||||
out.print("<br />" + update.getStatus());
|
||||
if ("true".equals(System.getProperty("net.i2p.router.web.UpdateHandler.updateInProgress", "false"))) {
|
||||
} else if(!update.isDone()) {
|
||||
if ("true".equals(System.getProperty("net.i2p.router.web.UpdateHandler.updateInProgress"))) {
|
||||
} else if((!update.isDone()) &&
|
||||
request.getParameter("action") == null &&
|
||||
request.getParameter("updateNonce") == null &&
|
||||
net.i2p.router.web.ConfigRestartBean.getRestartTimeRemaining() > 12*60*1000) {
|
||||
long nonce = new java.util.Random().nextLong();
|
||||
String prev = System.getProperty("net.i2p.router.web.UpdateHandler.nonce");
|
||||
if (prev != null) System.setProperty("net.i2p.router.web.UpdateHandler.noncePrev", prev);
|
||||
|
@ -21,4 +21,8 @@
|
||||
<welcome-file>index.html</welcome-file>
|
||||
<welcome-file>index.jsp</welcome-file>
|
||||
</welcome-file-list>
|
||||
<error-page>
|
||||
<error-code>404</error-code>
|
||||
<location>/error.jsp</location>
|
||||
</error-page>
|
||||
</web-app>
|
||||
|
@ -284,6 +284,8 @@ public class ConnectionManager {
|
||||
// exporting non-public type through public API, this is a potential bug.
|
||||
public ConnectionHandler getConnectionHandler() { return _connectionHandler; }
|
||||
public PacketQueue getPacketQueue() { return _outboundQueue; }
|
||||
/** do we respond to pings that aren't on an existing connection? */
|
||||
public boolean answerPings() { return _defaultOptions.getAnswerPings(); }
|
||||
|
||||
/**
|
||||
* Something b0rked hard, so kill all of our connections without mercy.
|
||||
|
@ -9,6 +9,7 @@ import java.util.Properties;
|
||||
public class ConnectionOptions extends I2PSocketOptionsImpl {
|
||||
private int _connectDelay;
|
||||
private boolean _fullySigned;
|
||||
private boolean _answerPings;
|
||||
private volatile int _windowSize;
|
||||
private int _receiveWindow;
|
||||
private int _profile;
|
||||
@ -51,12 +52,15 @@ public class ConnectionOptions extends I2PSocketOptionsImpl {
|
||||
public static final String PROP_MAX_WINDOW_SIZE = "i2p.streaming.maxWindowSize";
|
||||
public static final String PROP_CONGESTION_AVOIDANCE_GROWTH_RATE_FACTOR = "i2p.streaming.congestionAvoidanceGrowthRateFactor";
|
||||
public static final String PROP_SLOW_START_GROWTH_RATE_FACTOR = "i2p.streaming.slowStartGrowthRateFactor";
|
||||
public static final String PROP_ANSWER_PINGS = "i2p.streaming.answerPings";
|
||||
|
||||
private static final int TREND_COUNT = 3;
|
||||
static final int INITIAL_WINDOW_SIZE = 6;
|
||||
static final int DEFAULT_MAX_SENDS = 8;
|
||||
public static final int DEFAULT_INITIAL_RTT = 8*1000;
|
||||
static final int MIN_WINDOW_SIZE = 1;
|
||||
private static final boolean DEFAULT_ANSWER_PINGS = true;
|
||||
|
||||
// Syncronization fix, but doing it this way causes NPE...
|
||||
// private final int _trend[] = new int[TREND_COUNT];
|
||||
private int _trend[];
|
||||
@ -198,6 +202,7 @@ public class ConnectionOptions extends I2PSocketOptionsImpl {
|
||||
setSlowStartGrowthRateFactor(opts.getSlowStartGrowthRateFactor());
|
||||
setWriteTimeout(opts.getWriteTimeout());
|
||||
setReadTimeout(opts.getReadTimeout());
|
||||
setAnswerPings(opts.getAnswerPings());
|
||||
}
|
||||
}
|
||||
|
||||
@ -221,8 +226,8 @@ public class ConnectionOptions extends I2PSocketOptionsImpl {
|
||||
setInboundBufferSize(getMaxMessageSize() * (Connection.MAX_WINDOW_SIZE + 2));
|
||||
setCongestionAvoidanceGrowthRateFactor(getInt(opts, PROP_CONGESTION_AVOIDANCE_GROWTH_RATE_FACTOR, 1));
|
||||
setSlowStartGrowthRateFactor(getInt(opts, PROP_SLOW_START_GROWTH_RATE_FACTOR, 1));
|
||||
|
||||
setConnectTimeout(getInt(opts, PROP_CONNECT_TIMEOUT, Connection.DISCONNECT_TIMEOUT));
|
||||
setAnswerPings(getBool(opts, PROP_ANSWER_PINGS, DEFAULT_ANSWER_PINGS));
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -260,9 +265,10 @@ public class ConnectionOptions extends I2PSocketOptionsImpl {
|
||||
setCongestionAvoidanceGrowthRateFactor(getInt(opts, PROP_CONGESTION_AVOIDANCE_GROWTH_RATE_FACTOR, 2));
|
||||
if (opts.contains(PROP_SLOW_START_GROWTH_RATE_FACTOR))
|
||||
setSlowStartGrowthRateFactor(getInt(opts, PROP_SLOW_START_GROWTH_RATE_FACTOR, 2));
|
||||
|
||||
if (opts.containsKey(PROP_CONNECT_TIMEOUT))
|
||||
setConnectTimeout(getInt(opts, PROP_CONNECT_TIMEOUT, Connection.DISCONNECT_TIMEOUT));
|
||||
if (opts.containsKey(PROP_ANSWER_PINGS))
|
||||
setAnswerPings(getBool(opts, PROP_ANSWER_PINGS, DEFAULT_ANSWER_PINGS));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -282,11 +288,22 @@ public class ConnectionOptions extends I2PSocketOptionsImpl {
|
||||
* or can we deal with signatures on the SYN and FIN packets
|
||||
* only?
|
||||
*
|
||||
* There is no property name defined for this, so it's safe to
|
||||
* say this is unused and always false.
|
||||
*
|
||||
* @return if we want signatures on all packets.
|
||||
*/
|
||||
public boolean getRequireFullySigned() { return _fullySigned; }
|
||||
public void setRequireFullySigned(boolean sign) { _fullySigned = sign; }
|
||||
|
||||
/**
|
||||
* Do we respond to a ping?
|
||||
*
|
||||
* @return if we do
|
||||
*/
|
||||
public boolean getAnswerPings() { return _answerPings; }
|
||||
public void setAnswerPings(boolean yes) { _answerPings = yes; }
|
||||
|
||||
/**
|
||||
* How many messages will we send before waiting for an ACK?
|
||||
*
|
||||
@ -492,6 +509,13 @@ public class ConnectionOptions extends I2PSocketOptionsImpl {
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
private static boolean getBool(Properties opts, String name, boolean defaultVal) {
|
||||
if (opts == null) return defaultVal;
|
||||
String val = opts.getProperty(name);
|
||||
if (val == null) return defaultVal;
|
||||
return Boolean.valueOf(val).booleanValue();
|
||||
}
|
||||
|
||||
public static void main(String args[]) {
|
||||
Properties p = new Properties();
|
||||
|
||||
|
@ -129,7 +129,10 @@ public class PacketHandler {
|
||||
private void receiveKnownCon(Connection con, Packet packet) {
|
||||
if (packet.isFlagSet(Packet.FLAG_ECHO)) {
|
||||
if (packet.getSendStreamId() > 0) {
|
||||
if (con.getOptions().getAnswerPings())
|
||||
receivePing(packet);
|
||||
else if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("Dropping Echo packet on existing con: " + packet);
|
||||
} else if (packet.getReceiveStreamId() > 0) {
|
||||
receivePong(packet);
|
||||
} else {
|
||||
@ -230,7 +233,10 @@ public class PacketHandler {
|
||||
private void receiveUnknownCon(Packet packet, long sendId, boolean queueIfNoConn) {
|
||||
if (packet.isFlagSet(Packet.FLAG_ECHO)) {
|
||||
if (packet.getSendStreamId() > 0) {
|
||||
if (_manager.answerPings())
|
||||
receivePing(packet);
|
||||
else if (_log.shouldLog(Log.WARN))
|
||||
_log.warn("Dropping Echo packet on unknown con: " + packet);
|
||||
} else if (packet.getReceiveStreamId() > 0) {
|
||||
receivePong(packet);
|
||||
} else {
|
||||
|
110
build.xml
110
build.xml
@ -205,7 +205,7 @@
|
||||
<fileset dir="." includes="**/*.java~" />
|
||||
</delete>
|
||||
</target>
|
||||
<target name="pkg" depends="distclean, updaterWithJettyFixes, preppkg, installer" />
|
||||
<target name="pkg" depends="distclean, updater, preppkg, installer" />
|
||||
<target name="pkgclean" depends="deletepkg-temp">
|
||||
<delete>
|
||||
<fileset dir="." includes="i2p.tar.bz2 install.jar i2pupdate.zip" />
|
||||
@ -571,4 +571,112 @@
|
||||
<target name="distcleanWithDesktopgui" depends="distclean">
|
||||
<ant dir="apps/desktopgui" target="build_clean" />
|
||||
</target>
|
||||
<target name="release" depends="pkg">
|
||||
<echo message="================================================================" />
|
||||
<echo message="Did you update these files?" />
|
||||
<exec executable="ls">
|
||||
<arg value="-l" />
|
||||
<arg value="history.txt" />
|
||||
<arg value="initialNews.xml" />
|
||||
<arg value="installer/install.xml" />
|
||||
<arg value="news.xml" />
|
||||
<arg value="core/java/src/net/i2p/CoreVersion.java" />
|
||||
<arg value="router/java/src/net/i2p/router/RouterVersion.java" />
|
||||
</exec>
|
||||
<echo message="Everything is checked in, right?" />
|
||||
<input message="Enter new version number:" addproperty="release.number" />
|
||||
<fail message="You must enter a version number." >
|
||||
<condition>
|
||||
<equals arg1="${release.number}" arg2=""/>
|
||||
</condition>
|
||||
</fail>
|
||||
<copy file="i2pupdate.zip" tofile="i2pupdate_${release.number}.zip" />
|
||||
<copy file="i2pinstall.exe" tofile="i2pinstall_${release.number}.exe" />
|
||||
<delete file="i2pupdate.sud" failonerror="false" />
|
||||
<input message="Enter private signing key file:" addproperty="release.privkey" />
|
||||
<fail message="You must enter a path." >
|
||||
<condition>
|
||||
<equals arg1="${release.privkey}" arg2=""/>
|
||||
</condition>
|
||||
</fail>
|
||||
<java classname="net.i2p.crypto.TrustedUpdate" fork="true" failonerror="true">
|
||||
<classpath>
|
||||
<pathelement location="build/i2p.jar" />
|
||||
</classpath>
|
||||
<arg value="sign" />
|
||||
<arg value="i2pupdate.zip" />
|
||||
<arg value="i2pupdate.sud" />
|
||||
<arg value="${release.privkey}" />
|
||||
<arg value="${release.number}" />
|
||||
</java>
|
||||
<fail message="i2pupdate.sud generation failed!" >
|
||||
<condition>
|
||||
<length file="i2pupdate.sud" when="lt" length="1000000" />
|
||||
</condition>
|
||||
</fail>
|
||||
<echo message="Verify version and VALID signature:" />
|
||||
<java classname="net.i2p.crypto.TrustedUpdate" fork="true" failonerror="true">
|
||||
<classpath>
|
||||
<pathelement location="build/i2p.jar" />
|
||||
</classpath>
|
||||
<arg value="verifysig" />
|
||||
<arg value="i2pupdate.sud" />
|
||||
</java>
|
||||
<java classname="net.i2p.crypto.TrustedUpdate" fork="true" failonerror="true">
|
||||
<classpath>
|
||||
<pathelement location="build/i2p.jar" />
|
||||
</classpath>
|
||||
<arg value="showversion" />
|
||||
<arg value="i2pupdate.sud" />
|
||||
</java>
|
||||
<!-- will this use the monotonerc file in the current workspace? -->
|
||||
<echo message="Checking out fresh copy into ../i2p-${release-number} for tarballing:" />
|
||||
<exec executable="mtn">
|
||||
<arg value="co" />
|
||||
<arg value="-b" />
|
||||
<arg value="i2p.i2p" />
|
||||
<arg value="../i2p-${release.number}/" />
|
||||
</exec>
|
||||
<exec executable="tar">
|
||||
<arg value="cjf" />
|
||||
<arg value="i2psource_${release.number}.tar.bz2" />
|
||||
<arg value="-C" />
|
||||
<arg value=".." />
|
||||
<arg value="--exclude" />
|
||||
<arg value="i2p-${release.number}/_MTN/" />
|
||||
<arg value="i2p-${release.number}/" />
|
||||
</exec>
|
||||
<echo message="Sign the files:" />
|
||||
<exec executable="gpg">
|
||||
<arg value="-b" />
|
||||
<arg value="i2pinstall_${release.number}.exe" />
|
||||
</exec>
|
||||
<exec executable="gpg">
|
||||
<arg value="-b" />
|
||||
<arg value="i2psource_${release.number}.tar.bz2" />
|
||||
</exec>
|
||||
<exec executable="gpg">
|
||||
<arg value="-b" />
|
||||
<arg value="i2pupdate_${release.number}.zip" />
|
||||
</exec>
|
||||
<echo message="File sizes:" />
|
||||
<exec executable="ls">
|
||||
<arg value="-l" />
|
||||
<arg value="i2pinstall_${release.number}.exe" />
|
||||
<arg value="i2psource_${release.number}.tar.bz2" />
|
||||
<arg value="i2pupdate_${release.number}.zip" />
|
||||
<arg value="i2pupdate.sud" />
|
||||
<arg value="i2pinstall_${release.number}.exe.sig" />
|
||||
<arg value="i2psource_${release.number}.tar.bz2.sig" />
|
||||
<arg value="i2pupdate_${release.number}.zip.sig" />
|
||||
</exec>
|
||||
<echo message="SHA256 sums:" />
|
||||
<exec executable="sha256sum">
|
||||
<arg value="i2pinstall_${release.number}.exe" />
|
||||
<arg value="i2psource_${release.number}.tar.bz2" />
|
||||
<arg value="i2pupdate_${release.number}.zip" />
|
||||
<arg value="i2pupdate.sud" />
|
||||
</exec>
|
||||
<echo message="Don't forget to mtn tag h: i2p-${release-number}" />
|
||||
</target>
|
||||
</project>
|
||||
|
@ -871,7 +871,7 @@ public class DataHelper {
|
||||
public static String formatDuration(long ms) {
|
||||
if (ms < 5 * 1000) {
|
||||
return ms + "ms";
|
||||
} else if (ms < 5 * 60 * 1000) {
|
||||
} else if (ms < 3 * 60 * 1000) {
|
||||
return (ms / 1000) + "s";
|
||||
} else if (ms < 120 * 60 * 1000) {
|
||||
return (ms / (60 * 1000)) + "m";
|
||||
|
@ -52,6 +52,15 @@ public class Timestamper implements Runnable {
|
||||
this(ctx, lsnr, true);
|
||||
}
|
||||
public Timestamper(I2PAppContext ctx, UpdateListener lsnr, boolean daemon) {
|
||||
// Don't bother starting a thread if we are disabled.
|
||||
// This means we no longer check every 5 minutes to see if we got enabled,
|
||||
// so the property must be set at startup.
|
||||
// We still need to be instantiated since the router calls clock().getTimestamper().waitForInitialization()
|
||||
String disabled = ctx.getProperty(PROP_DISABLED, DEFAULT_DISABLED);
|
||||
if (Boolean.valueOf(disabled).booleanValue()) {
|
||||
_initialized = true;
|
||||
return;
|
||||
}
|
||||
_context = ctx;
|
||||
_daemon = daemon;
|
||||
_initialized = false;
|
||||
|
@ -76,9 +76,10 @@ public class FileUtil {
|
||||
}
|
||||
|
||||
public static boolean extractZip(File zipfile, File targetDir) {
|
||||
ZipFile zip = null;
|
||||
try {
|
||||
byte buf[] = new byte[16*1024];
|
||||
ZipFile zip = new ZipFile(zipfile);
|
||||
zip = new ZipFile(zipfile);
|
||||
Enumeration entries = zip.entries();
|
||||
while (entries.hasMoreElements()) {
|
||||
ZipEntry entry = (ZipEntry)entries.nextElement();
|
||||
@ -124,12 +125,15 @@ public class FileUtil {
|
||||
}
|
||||
}
|
||||
}
|
||||
zip.close();
|
||||
return true;
|
||||
} catch (IOException ioe) {
|
||||
System.err.println("ERROR: Unable to extract the zip file");
|
||||
ioe.printStackTrace();
|
||||
return false;
|
||||
} finally {
|
||||
if (zip != null) {
|
||||
try { zip.close(); } catch (IOException ioe) {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
38
history.txt
38
history.txt
@ -1,3 +1,41 @@
|
||||
2009-08-07 zzz
|
||||
* build.xml:
|
||||
- Try to automate the release process
|
||||
- Take jetty back out of the updater after 4 releases
|
||||
* Console:
|
||||
- Add a custom error page
|
||||
- Don't count ourselves in known peers
|
||||
- Hide update button when shutting down
|
||||
- Increase skew warning threshold to 3s (was 100ms)
|
||||
- Remove UTC time from summary bar
|
||||
- Truncate long dest names
|
||||
- Try to reduce servlet problems on index page
|
||||
* Core:
|
||||
- Catch unzip fd leaks on error
|
||||
- Move 2 test classes out of the lib
|
||||
* Eepsite:
|
||||
- Quote the jetty.xml path in clients.config,
|
||||
and adjust the migration function, to fix the
|
||||
eepsite-won't-start bug on windows
|
||||
* HTTP Proxy:
|
||||
- Restore the localhost error message
|
||||
- Catch 127.0.0.1:xxxx addresses too
|
||||
* I2PTunnel:
|
||||
- Move the privkey files from the app dir to the
|
||||
config dir, in preparation for splitting the two
|
||||
dirs by default
|
||||
* Ministreaming:
|
||||
- Make getInt() static
|
||||
- Move the big TestSwarm class out of the lib
|
||||
* NetDb stats: Post-release cleanup
|
||||
* PersistentKeyRing: Fix broken storage of keys in config file
|
||||
* Router: Move the WorkingDir class from i2p.jar to router.jar
|
||||
* Streaming: New option i2p.streaming.answerPings (default true)
|
||||
* Timestamper: Don't start thread if not enabled
|
||||
* Wrapper:
|
||||
- Extend timeout to 20s (was 5s)
|
||||
- Shorten ping interval to 5m (was 10m)
|
||||
|
||||
2009-08-03 dr|z3d
|
||||
* Extensive update to the Classic theme; custom css hacks for IE.
|
||||
|
||||
|
@ -20,7 +20,7 @@ clientApp.2.startOnLoad=true
|
||||
# run our own eepsite with a seperate jetty instance
|
||||
clientApp.3.main=org.mortbay.jetty.Server
|
||||
clientApp.3.name=My eepsite web server
|
||||
clientApp.3.args=eepsite/jetty.xml
|
||||
clientApp.3.args="eepsite/jetty.xml"
|
||||
clientApp.3.delay=30
|
||||
clientApp.3.startOnLoad=true
|
||||
|
||||
|
@ -132,6 +132,10 @@ div.routersummary a:hover {
|
||||
color: #f60;
|
||||
}
|
||||
|
||||
div.routersummary input[type=text] {
|
||||
text-align: right !important;
|
||||
}
|
||||
|
||||
div.warning {
|
||||
margin: 20px 20px 10px 260px;
|
||||
padding: 0px 20px 20px 75px;
|
||||
@ -176,6 +180,7 @@ div.main {
|
||||
|
||||
div.main li {
|
||||
padding-bottom: 10px;
|
||||
list-style: square;
|
||||
}
|
||||
|
||||
div.main li:first-child {
|
||||
@ -223,6 +228,11 @@ div.news a:link {
|
||||
text-shadow: 0px 0px 1px rgba(128, 128, 48, 0.3);
|
||||
}
|
||||
|
||||
div.news a:visited {
|
||||
color: #f00 !important;
|
||||
text-shadow: 0px 0px 1px rgba(128, 128, 48, 0.3);
|
||||
}
|
||||
|
||||
div.news hr {
|
||||
color: #cc7;
|
||||
background: #cc7;
|
||||
@ -331,11 +341,20 @@ table {
|
||||
}
|
||||
|
||||
table hr {
|
||||
padding: 1px 0;
|
||||
padding: 0px 0;
|
||||
color: #bbf;
|
||||
background: #bbf;
|
||||
border: 0px solid #bbf;
|
||||
margin: 0px -5px;
|
||||
height: 1px;
|
||||
}
|
||||
|
||||
table tt {
|
||||
font-size: 7.5pt;
|
||||
}
|
||||
|
||||
th {
|
||||
background-color: #def;
|
||||
background-color: #fff;
|
||||
padding: 8px 2px;
|
||||
text-align: center;
|
||||
border-bottom: 1px solid #88f;
|
||||
@ -345,6 +364,10 @@ tt {
|
||||
font-size: 8pt;
|
||||
}
|
||||
|
||||
tt, pre {
|
||||
font: 8pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
|
||||
}
|
||||
|
||||
td {
|
||||
padding: 4px;
|
||||
}
|
||||
|
@ -36,8 +36,10 @@ div.configure table {
|
||||
}
|
||||
|
||||
h1 {
|
||||
padding: 15px 10px 16px 10px !important;
|
||||
padding: 15px 10px 16px -10px !important;
|
||||
margin: 0 0px 0 175px !important;
|
||||
background-color: #bbf !important;
|
||||
color: #001;
|
||||
}
|
||||
|
||||
h2 {
|
||||
@ -97,6 +99,11 @@ div.routersummary {
|
||||
border-left: 5px solid #bbf;
|
||||
}
|
||||
|
||||
div.routersummary submit {
|
||||
padding: 0;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
|
||||
div.news li {
|
||||
padding-top: 0px 0px !important;
|
||||
margin-bottom: -23px !important;
|
||||
@ -132,3 +139,14 @@ div.configure hr{
|
||||
input {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
div.graphspanel img {
|
||||
border: 1px solid #99f;
|
||||
margin: 6px 0 !important;
|
||||
background: #ddf;
|
||||
-moz-box-shadow: inset 0px 0px 1px 1px #99f;
|
||||
}
|
||||
|
||||
div.graphspanel hr {
|
||||
margin: 20px 0;
|
||||
}
|
@ -89,7 +89,7 @@ div.routersummary {
|
||||
width: 175px;
|
||||
padding: 10px;
|
||||
text-align: center;
|
||||
border: 1px solid #9999ff;
|
||||
border: 1px solid #99f;
|
||||
background: #003;
|
||||
background: url(images/darkbluebg.png);
|
||||
color: #eef;
|
||||
@ -102,6 +102,28 @@ div.routersummary {
|
||||
-moz-box-shadow: inset 0px 0px 1px 0px #eef;
|
||||
}
|
||||
|
||||
div.routersummary input[type=text] {
|
||||
text-align: right !important;
|
||||
-moz-box-shadow: inset 1px 1px 1px 0px #000;
|
||||
}
|
||||
|
||||
div.routersummary hr {
|
||||
color: #99f;
|
||||
background: #99f;
|
||||
height: 1px;
|
||||
border-bottom: 1px outset #bbf;
|
||||
margin: 5px -10px 4px -10px;
|
||||
}
|
||||
|
||||
div.routersummary hr {
|
||||
color: #bbf;
|
||||
background: #bbf;
|
||||
height: 2px;
|
||||
border-bottom: 1px outset #bbf;
|
||||
margin: 8px -10px 7px -10px;
|
||||
-moz-box-shadow: inset 0px -4px 2px 1px #001;
|
||||
}
|
||||
|
||||
div.warning {
|
||||
margin: 5px 20px 10px 240px;
|
||||
padding: 0px 25px 20px 75px;
|
||||
@ -254,6 +276,16 @@ table {
|
||||
background: #003;
|
||||
}
|
||||
|
||||
table hr {
|
||||
padding: 0px 0;
|
||||
color: #99f;
|
||||
background: #99f;
|
||||
border: 0px solid #99f;
|
||||
margin: 0px 0px;
|
||||
height: 1px;
|
||||
display: none;
|
||||
}
|
||||
|
||||
th {
|
||||
padding: 6px 2px;
|
||||
color: #eef;
|
||||
@ -392,7 +424,7 @@ h2 {
|
||||
color: #fff;
|
||||
text-shadow: 0px 0px 1px rgba(255, 255, 255, 0.5);
|
||||
letter-spacing: 0.05em;
|
||||
background: #003 url('images/darkbluebg.png');
|
||||
background: #003 url('images/titletile.png');
|
||||
padding: 5px 10px 8px 10px;
|
||||
wordwrap: none;
|
||||
border: 1px solid #99f;
|
||||
@ -435,9 +467,9 @@ h4 {
|
||||
font-size: 11pt;
|
||||
}
|
||||
|
||||
button {
|
||||
button, button:visited {
|
||||
font: bold 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
|
||||
border: 1px outset #ddddc0;
|
||||
border: 1px outset #77f;
|
||||
padding: 1px 3px;
|
||||
background: #bbf;
|
||||
text-decoration: none;
|
||||
@ -450,12 +482,23 @@ button {
|
||||
text-align: center;
|
||||
vertical-align: middle;
|
||||
min-width: 76px;
|
||||
-moz-box-shadow: inset 0px 1px 1px 0px #55f;
|
||||
background: #003;
|
||||
color: #99f;
|
||||
}
|
||||
|
||||
button:hover {
|
||||
border: 1px solid #f60;
|
||||
-moz-box-shadow: inset 0px 1px 1px 0px #eef;
|
||||
background: #001;
|
||||
color: #f60;
|
||||
}
|
||||
|
||||
button:active {
|
||||
border: 1px inset #f60;
|
||||
background: #f60;
|
||||
color: #fff;
|
||||
-moz-box-shadow: inset 0px 0px 0px 0px #f60;
|
||||
}
|
||||
|
||||
.underline {
|
||||
@ -488,9 +531,10 @@ sidebarlogo {
|
||||
}
|
||||
|
||||
input {
|
||||
border: 1px outset #bbf;
|
||||
background: #bbf;
|
||||
color: #002;
|
||||
border: 1px outset #55f;
|
||||
-moz-box-shadow: inset 0px 1px 1px 0px #55f;
|
||||
background: #003;
|
||||
color: #99f;
|
||||
margin: 5px;
|
||||
font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
|
||||
padding: 1px 2px;
|
||||
@ -502,9 +546,10 @@ input {
|
||||
}
|
||||
|
||||
input:hover {
|
||||
background: #003;
|
||||
background: #001;
|
||||
color: #f60;
|
||||
border: 1px solid #f60;
|
||||
-moz-box-shadow: inset 0px 1px 1px 0px #eef;
|
||||
}
|
||||
|
||||
input:active {
|
||||
@ -530,6 +575,7 @@ input[type=text] {
|
||||
border-radius: 4px;
|
||||
-moz-border-radius: 4px;
|
||||
-khtml-border-radius: 4px;
|
||||
-moz-box-shadow: inset 1px 1px 1px 0px #000;
|
||||
}
|
||||
|
||||
input[type=text]:active, input[type=text]:hover {
|
||||
|
BIN
installer/resources/themes/console/dark/images/titletile.png
Normal file
BIN
installer/resources/themes/console/dark/images/titletile.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.1 KiB |
@ -105,6 +105,19 @@ div.routersummary {
|
||||
-moz-box-shadow: inset 0px 0px 1px 0px #002;
|
||||
}
|
||||
|
||||
div.routersummary input[type=text] {
|
||||
text-align: right !important;
|
||||
}
|
||||
|
||||
div.routersummary hr {
|
||||
color: #eef;
|
||||
background: #eef;
|
||||
height: 2px;
|
||||
border-bottom: 1px solid #eef;
|
||||
margin: 8px -10px 7px -10px;
|
||||
-moz-box-shadow: inset 0px 1px 1px 1px #001;
|
||||
}
|
||||
|
||||
div.warning {
|
||||
margin: 5px 20px 10px 240px;
|
||||
padding: 0px 25px 20px 75px;
|
||||
@ -226,6 +239,7 @@ div.configure {
|
||||
border-radius: 4px;
|
||||
border: 1px solid #000022;
|
||||
-moz-box-shadow: inset 0px 0px 1px 0px #002;
|
||||
min-width: 400px;
|
||||
}
|
||||
|
||||
div.graphspanel {
|
||||
@ -237,9 +251,9 @@ div.graphspanel {
|
||||
border-radius: 4px;
|
||||
border: 1px solid #000022;
|
||||
-moz-box-shadow: inset 0px 0px 1px 0px #002;
|
||||
text-align: center !important;
|
||||
}
|
||||
|
||||
|
||||
div.graphspanel img {
|
||||
border: 1px solid #003;
|
||||
padding: 2px;
|
||||
@ -247,7 +261,7 @@ div.graphspanel img {
|
||||
text-align: center !important;
|
||||
background: #001;
|
||||
-moz-box-shadow: inset 0px 0px 1px 1px #99f;
|
||||
opacity: 0.9;
|
||||
opacity: 0.8;
|
||||
}
|
||||
|
||||
div.graphspanel img:hover {
|
||||
@ -260,6 +274,10 @@ div.graphspanel img:hover {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
div.graphspanel form {
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
div.messages {
|
||||
padding: 10px;
|
||||
margin: 10px 0 20px 0;
|
||||
@ -301,6 +319,16 @@ table {
|
||||
font: 7pt/130% "Lucida Sans Unicode", Verdana, Bitstream Vera Sans", Tahoma, Helvetica, sans-serif;
|
||||
}
|
||||
|
||||
table hr {
|
||||
padding: 0px 0;
|
||||
color: #99f;
|
||||
background: #99f;
|
||||
border: 0px solid #99f;
|
||||
margin: 0px 0px;
|
||||
height: 1px;
|
||||
display: none;
|
||||
}
|
||||
|
||||
th {
|
||||
padding: 6px 2px;
|
||||
color: #000;
|
||||
@ -433,7 +461,7 @@ h2 {
|
||||
font-size: 12pt;
|
||||
color: #001;
|
||||
letter-spacing: 0.05em;
|
||||
background: #ddf url('images/lightbluetile.png');
|
||||
background: #ddf url('images/titletile.png');
|
||||
text-shadow: 0px 0px 1px rgba(0, 0, 64, 0.5);
|
||||
padding: 7px 10px;
|
||||
wordwrap: none;
|
||||
@ -476,9 +504,9 @@ h4 {
|
||||
|
||||
button, button:visited {
|
||||
font: bold 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
|
||||
border: 1px outset #ddddc0;
|
||||
border: 1px outset #999;
|
||||
padding: 1px 3px;
|
||||
background: #bbf !important;
|
||||
background: #ddf !important;
|
||||
text-decoration: none;
|
||||
border-radius: 4px;
|
||||
-moz-border-radius: 4px;
|
||||
@ -488,18 +516,22 @@ button, button:visited {
|
||||
margin: 0 1px;
|
||||
text-align: center;
|
||||
min-width: 80px;
|
||||
-moz-box-shadow: inset 0px 2px 8px 0px #fff;
|
||||
color: #006;
|
||||
}
|
||||
|
||||
button:hover{
|
||||
border: 1px solid #f60;
|
||||
background: #f60 !important;
|
||||
color: #fff;
|
||||
-moz-box-shadow: inset 0px 0px 0px 1px #fff;
|
||||
}
|
||||
|
||||
button:active{
|
||||
border: 1px solid #f60;
|
||||
background: #001 !important;
|
||||
color: #f60;
|
||||
-moz-box-shadow: inset 0px 0px 0px 1px #f60;
|
||||
}
|
||||
|
||||
.underline {
|
||||
@ -531,8 +563,8 @@ input {
|
||||
}
|
||||
|
||||
input, input:visited {
|
||||
border: 1px outset #bbf;
|
||||
background: #bbf;
|
||||
border: 1px outset #999;
|
||||
background: #ddf;
|
||||
color: #001;
|
||||
margin: 5px;
|
||||
font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
|
||||
@ -542,6 +574,9 @@ input, input:visited {
|
||||
border-radius: 4px;
|
||||
-moz-border-radius: 4px;
|
||||
-khtml-border-radius: 4px;
|
||||
-moz-box-shadow: inset 0px 2px 8px 0px #fff;
|
||||
color: #006;
|
||||
opacity: 0.9;
|
||||
}
|
||||
|
||||
|
||||
@ -549,7 +584,9 @@ input:hover {
|
||||
background: #f60;
|
||||
color: #fff;
|
||||
border: 1px solid #f60;
|
||||
opacity: 0.9;
|
||||
opacity: 1.0;
|
||||
-moz-box-shadow: inset 0px 0px 0px 1px #fff;
|
||||
|
||||
}
|
||||
|
||||
input:active {
|
||||
@ -557,6 +594,7 @@ input:active {
|
||||
color: #f60;
|
||||
border: 1px solid #f60;
|
||||
opacity: 1.0;
|
||||
-moz-box-shadow: inset 0px 0px 0px 1px #f60;
|
||||
}
|
||||
|
||||
input[type=text] {
|
||||
@ -595,6 +633,7 @@ select {
|
||||
border-radius: 4px;
|
||||
-moz-border-radius: 4px;
|
||||
-khtml-border-radius: 4px;
|
||||
text-align: left !important;
|
||||
}
|
||||
|
||||
textarea {
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 3.4 KiB |
BIN
installer/resources/themes/console/light/images/titletile.png
Normal file
BIN
installer/resources/themes/console/light/images/titletile.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.1 KiB |
@ -56,8 +56,8 @@ body {
|
||||
font-size: 9pt;
|
||||
font-weight: bold;
|
||||
text-align: left;
|
||||
margin: 0 0 15px 0;
|
||||
padding: 0px;
|
||||
margin: 0 0px 10px 0px;
|
||||
padding: 0;
|
||||
border-spacing: 0px;
|
||||
-moz-border-radius: 4px 0 0 0;
|
||||
-khtml-border-radius: 4px;
|
||||
@ -68,7 +68,7 @@ body {
|
||||
background: #f40 url('../console/images/orangetile.png');
|
||||
color: #531;
|
||||
height: 64px;
|
||||
width: 100%;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
pre {
|
||||
@ -95,7 +95,7 @@ th {
|
||||
border-top: 1px outset #001;
|
||||
border-bottom: 1px inset #001;
|
||||
background: #f60 url('/themes/console/images/tabletitleorange.png') repeat-x;
|
||||
text-align: left;
|
||||
text-align: right;
|
||||
whitespace: nowrap;
|
||||
}
|
||||
|
||||
@ -107,7 +107,7 @@ th {
|
||||
|
||||
td {
|
||||
padding: 5px;
|
||||
text-align: left;
|
||||
text-align: right;
|
||||
}
|
||||
.snarkTorrentEven {
|
||||
background-color: #fb1;
|
||||
@ -176,7 +176,7 @@ hr {
|
||||
}
|
||||
|
||||
a:link{
|
||||
color: #830;
|
||||
color: #930;
|
||||
text-decoration: none;
|
||||
font-weight: bold;
|
||||
word-wrap: break-word;
|
||||
@ -189,7 +189,7 @@ a:visited{
|
||||
}
|
||||
|
||||
a:hover{
|
||||
color: #f40;
|
||||
color: #900;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
|
@ -158,8 +158,10 @@ wrapper.jvm_exit.timeout=30
|
||||
# Let's change the default from 60 to 15 seconds and see if anyone moans..
|
||||
wrapper.restart.delay=15
|
||||
|
||||
wrapper.ping.interval=600
|
||||
wrapper.ping.timeout=605
|
||||
wrapper.ping.interval=300
|
||||
# The ping timeout must be at least 5 seconds longer than the value of wrapper.ping.interval.
|
||||
# Extend this if you are getting 'JVM appears hung' shutdowns.
|
||||
wrapper.ping.timeout=320
|
||||
|
||||
# use the wrapper's internal timer thread. otherwise this would
|
||||
# force a restart of the router during daylight savings time as well
|
||||
|
@ -53,7 +53,7 @@ public class PersistentKeyRing extends KeyRing {
|
||||
if (key == null || key.length() != 44)
|
||||
continue;
|
||||
String hb = prop.substring(PROP_PFX.length());
|
||||
hb.replace("$", "=");
|
||||
hb = hb.replace("$", "=");
|
||||
Hash dest = new Hash();
|
||||
SessionKey sk = new SessionKey();
|
||||
try {
|
||||
@ -71,7 +71,7 @@ public class PersistentKeyRing extends KeyRing {
|
||||
for (Entry<Hash, SessionKey> e : entrySet()) {
|
||||
buf.append("\n<tr><td>");
|
||||
Hash h = e.getKey();
|
||||
buf.append(h.toBase64().substring(0, 6)).append("...");
|
||||
buf.append(h.toBase64().substring(0, 6)).append("…");
|
||||
buf.append("<td>");
|
||||
LeaseSet ls = _ctx.netDb().lookupLeaseSetLocally(h);
|
||||
if (ls != null) {
|
||||
@ -81,13 +81,13 @@ public class PersistentKeyRing extends KeyRing {
|
||||
if (in != null && in.getDestinationNickname() != null)
|
||||
buf.append(in.getDestinationNickname());
|
||||
else
|
||||
buf.append(dest.toBase64().substring(0, 6)).append("...");
|
||||
buf.append(dest.toBase64().substring(0, 6)).append("…");
|
||||
} else {
|
||||
String host = _ctx.namingService().reverseLookup(dest);
|
||||
if (host != null)
|
||||
buf.append(host);
|
||||
else
|
||||
buf.append(dest.toBase64().substring(0, 6)).append("...");
|
||||
buf.append(dest.toBase64().substring(0, 6)).append("…");
|
||||
}
|
||||
}
|
||||
buf.append("<td>");
|
||||
|
@ -35,6 +35,7 @@ import net.i2p.data.i2np.GarlicMessage;
|
||||
import net.i2p.router.message.GarlicMessageHandler;
|
||||
import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade;
|
||||
import net.i2p.router.startup.StartupJob;
|
||||
import net.i2p.router.startup.WorkingDir;
|
||||
import net.i2p.router.transport.FIFOBandwidthLimiter;
|
||||
import net.i2p.stat.Rate;
|
||||
import net.i2p.stat.RateStat;
|
||||
@ -44,7 +45,6 @@ import net.i2p.util.I2PThread;
|
||||
import net.i2p.util.Log;
|
||||
import net.i2p.util.SimpleScheduler;
|
||||
import net.i2p.util.SimpleTimer;
|
||||
import net.i2p.util.WorkingDir;
|
||||
|
||||
/**
|
||||
* Main driver for the router.
|
||||
|
@ -18,7 +18,7 @@ public class RouterVersion {
|
||||
/** deprecated */
|
||||
public final static String ID = "Monotone";
|
||||
public final static String VERSION = CoreVersion.VERSION;
|
||||
public final static long BUILD = 07;
|
||||
public final static long BUILD = 8;
|
||||
/** for example "-test" */
|
||||
public final static String EXTRA = "";
|
||||
public final static String FULL_VERSION = VERSION + "-" + BUILD + EXTRA;
|
||||
|
@ -139,18 +139,8 @@ public class StatisticsManager implements Service {
|
||||
|
||||
//includeRate("tunnel.buildRequestTime", stats, new long[] { 10*60*1000 });
|
||||
long rate = 60*60*1000;
|
||||
boolean commentOutIn076 = RouterVersion.VERSION.equals("0.7.5");
|
||||
if (commentOutIn076) {
|
||||
includeRate("tunnel.buildClientExpire", stats, new long[] { rate });
|
||||
includeRate("tunnel.buildClientReject", stats, new long[] { rate });
|
||||
includeRate("tunnel.buildClientSuccess", stats, new long[] { rate });
|
||||
includeRate("tunnel.buildExploratoryExpire", stats, new long[] { rate });
|
||||
includeRate("tunnel.buildExploratoryReject", stats, new long[] { rate });
|
||||
includeRate("tunnel.buildExploratorySuccess", stats, new long[] { rate });
|
||||
} else {
|
||||
includeTunnelRates("Client", stats, rate);
|
||||
includeTunnelRates("Exploratory", stats, rate);
|
||||
}
|
||||
//includeRate("tunnel.rejectTimeout", stats, new long[] { 10*60*1000 });
|
||||
//includeRate("tunnel.rejectOverloaded", stats, new long[] { 10*60*1000 });
|
||||
//includeRate("tunnel.acceptLoad", stats, new long[] { 10*60*1000 });
|
||||
|
@ -1,4 +1,4 @@
|
||||
package net.i2p.util;
|
||||
package net.i2p.router.startup;
|
||||
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.File;
|
||||
@ -195,8 +195,10 @@ public class WorkingDir {
|
||||
out.println("# Modified by I2P User dir migration script");
|
||||
String s = null;
|
||||
while ((s = DataHelper.readLine(in)) != null) {
|
||||
if (s.endsWith("=eepsite/jetty.xml")) {
|
||||
s = s.replace("=eepsite", '=' + todir.getAbsolutePath() + File.separatorChar + "eepsite");
|
||||
if (s.endsWith("=\"eepsite/jetty.xml\"")) {
|
||||
s = s.replace("=\"eepsite/jetty.xml\"", "=\"" + todir.getAbsolutePath() +
|
||||
File.separatorChar + "eepsite" +
|
||||
File.separatorChar + "jetty.xml\"");
|
||||
}
|
||||
out.println(s);
|
||||
}
|
Reference in New Issue
Block a user