merge of '60987f4b854cedf353de8adef7747f79ca24b941'

and '8760d93a324f2eb837d218bc3b7450c80bb83b70'
This commit is contained in:
z3d
2010-11-25 13:43:58 +00:00
47 changed files with 715 additions and 458 deletions

View File

@ -4,7 +4,7 @@
i2p_start() { i2p_start() {
# Check if router is up first! # Check if router is up first!
/bin/su - -c "( export PATH=\"$PATH:/usr/lib/java/bin:/usr/lib/java/jre/bin\"; directory status )" > /dev/null /bin/su - -c "( export PATH=\"$PATH:/usr/lib/java/bin:/usr/lib/java/jre/bin\"; directory status )" > /dev/null
if [ ! $? -eq 0 ] ; then { if [ $? -eq 0 ] ; then {
# I2p is already running, so tell the user. # I2p is already running, so tell the user.
echo "I2P is already running..." echo "I2P is already running..."
i2p_status i2p_status

View File

@ -261,11 +261,16 @@ class PeerState implements DataLoader
// This is used to flag that we have to back up from the firstOutstandingRequest // This is used to flag that we have to back up from the firstOutstandingRequest
// when calculating how far we've gotten // when calculating how far we've gotten
Request pendingRequest = null; private Request pendingRequest;
/** /**
* Called when a partial piece request has been handled by * Called when a full chunk (i.e. a piece message) has been received by
* PeerConnectionIn. * PeerConnectionIn.
*
* This may block quite a while if it is the last chunk for a piece,
* as it calls the listener, who stores the piece and then calls
* havePiece for every peer on the torrent (including us).
*
*/ */
void pieceMessage(Request req) void pieceMessage(Request req)
{ {
@ -273,11 +278,15 @@ class PeerState implements DataLoader
downloaded += size; downloaded += size;
listener.downloaded(peer, size); listener.downloaded(peer, size);
pendingRequest = null; if (_log.shouldLog(Log.DEBUG))
_log.debug("got end of Chunk("
+ req.piece + "," + req.off + "," + req.len + ") from "
+ peer);
// Last chunk needed for this piece? // Last chunk needed for this piece?
if (getFirstOutstandingRequest(req.piece) == -1) if (getFirstOutstandingRequest(req.piece) == -1)
{ {
// warning - may block here for a while
if (listener.gotPiece(peer, req.piece, req.bs)) if (listener.gotPiece(peer, req.piece, req.bs))
{ {
if (_log.shouldLog(Log.DEBUG)) if (_log.shouldLog(Log.DEBUG))
@ -288,9 +297,15 @@ class PeerState implements DataLoader
if (_log.shouldLog(Log.WARN)) if (_log.shouldLog(Log.WARN))
_log.warn("Got BAD " + req.piece + " from " + peer); _log.warn("Got BAD " + req.piece + " from " + peer);
// XXX ARGH What now !?! // XXX ARGH What now !?!
// FIXME Why would we set downloaded to 0?
downloaded = 0; downloaded = 0;
} }
} }
// ok done with this one
synchronized(this) {
pendingRequest = null;
}
} }
synchronized private int getFirstOutstandingRequest(int piece) synchronized private int getFirstOutstandingRequest(int piece)
@ -303,15 +318,16 @@ class PeerState implements DataLoader
/** /**
* Called when a piece message is being processed by the incoming * Called when a piece message is being processed by the incoming
* connection. Returns null when there was no such request. It also * connection. That is, when the header of the piece message was received.
* Returns null when there was no such request. It also
* requeues/sends requests when it thinks that they must have been * requeues/sends requests when it thinks that they must have been
* lost. * lost.
*/ */
Request getOutstandingRequest(int piece, int begin, int length) Request getOutstandingRequest(int piece, int begin, int length)
{ {
if (_log.shouldLog(Log.DEBUG)) if (_log.shouldLog(Log.DEBUG))
_log.debug("getChunk(" _log.debug("got start of Chunk("
+ piece + "," + begin + "," + length + ") " + piece + "," + begin + "," + length + ") from "
+ peer); + peer);
int r = getFirstOutstandingRequest(piece); int r = getFirstOutstandingRequest(piece);
@ -351,6 +367,9 @@ class PeerState implements DataLoader
downloaded = 0; // XXX - punishment? downloaded = 0; // XXX - punishment?
return null; return null;
} }
// note that this request is being read
pendingRequest = req;
// Report missing requests. // Report missing requests.
if (r != 0) if (r != 0)
@ -374,13 +393,12 @@ class PeerState implements DataLoader
// Request more if necessary to keep the pipeline filled. // Request more if necessary to keep the pipeline filled.
addRequest(); addRequest();
pendingRequest = req;
return req; return req;
} }
// get longest partial piece // get longest partial piece
Request getPartialRequest() synchronized Request getPartialRequest()
{ {
Request req = null; Request req = null;
for (int i = 0; i < outstandingRequests.size(); i++) { for (int i = 0; i < outstandingRequests.size(); i++) {
@ -401,10 +419,13 @@ class PeerState implements DataLoader
return req; return req;
} }
// return array of pieces terminated by -1 /**
// remove most duplicates * return array of pieces terminated by -1
// but still could be some duplicates, not guaranteed * remove most duplicates
int[] getRequestedPieces() * but still could be some duplicates, not guaranteed
* TODO rework this Java-style to return a Set or a List
*/
synchronized int[] getRequestedPieces()
{ {
int size = outstandingRequests.size(); int size = outstandingRequests.size();
int[] arr = new int[size+2]; int[] arr = new int[size+2];
@ -514,6 +535,8 @@ class PeerState implements DataLoader
* @since 0.8.1 * @since 0.8.1
*/ */
synchronized boolean isRequesting(int piece) { synchronized boolean isRequesting(int piece) {
if (pendingRequest != null && pendingRequest.piece == piece)
return true;
for (Request req : outstandingRequests) { for (Request req : outstandingRequests) {
if (req.piece == piece) if (req.piece == piece)
return true; return true;
@ -616,6 +639,10 @@ class PeerState implements DataLoader
return true; return true;
} }
} }
// Note that in addition to the bitfield, PeerCoordinator uses
// its request tracking and isRequesting() to determine
// what piece to give us next.
int nextPiece = listener.wantPiece(peer, bitfield); int nextPiece = listener.wantPiece(peer, bitfield);
if (nextPiece != -1 if (nextPiece != -1
&& (lastRequest == null || lastRequest.piece != nextPiece)) { && (lastRequest == null || lastRequest.piece != nextPiece)) {

View File

@ -533,9 +533,9 @@ public class SnarkManager implements Snark.CompleteListener {
File f = new File(filename); File f = new File(filename);
if (!dontAutoStart && shouldAutoStart()) { if (!dontAutoStart && shouldAutoStart()) {
torrent.startTorrent(); torrent.startTorrent();
addMessage(_("Torrent added and started: \"{0}\"", f.getName())); addMessage(_("Torrent added and started: \"{0}\"", torrent.storage.getBaseName()));
} else { } else {
addMessage(_("Torrent added: \"{0}\"", f.getName())); addMessage(_("Torrent added: \"{0}\"", torrent.storage.getBaseName()));
} }
} }
@ -742,8 +742,14 @@ public class SnarkManager implements Snark.CompleteListener {
// I2PServerSocket.accept() call properly?) // I2PServerSocket.accept() call properly?)
////_util. ////_util.
} }
String name;
if (torrent.storage != null) {
name = torrent.storage.getBaseName();
} else {
name = sfile.getName();
}
if (!wasStopped) if (!wasStopped)
addMessage(_("Torrent stopped: \"{0}\"", sfile.getName())); addMessage(_("Torrent stopped: \"{0}\"", name));
} }
return torrent; return torrent;
} }
@ -756,9 +762,14 @@ public class SnarkManager implements Snark.CompleteListener {
if (torrent != null) { if (torrent != null) {
File torrentFile = new File(filename); File torrentFile = new File(filename);
torrentFile.delete(); torrentFile.delete();
if (torrent.storage != null) String name;
if (torrent.storage != null) {
removeTorrentStatus(torrent.storage.getMetaInfo()); removeTorrentStatus(torrent.storage.getMetaInfo());
addMessage(_("Torrent removed: \"{0}\"", torrentFile.getName())); name = torrent.storage.getBaseName();
} else {
name = torrentFile.getName();
}
addMessage(_("Torrent removed: \"{0}\"", name));
} }
} }

View File

@ -163,7 +163,7 @@ public class I2PSnarkServlet extends Default {
String peerParam = req.getParameter("p"); String peerParam = req.getParameter("p");
String peerString; String peerString;
if (peerParam == null) { if (peerParam == null || !_manager.util().connected()) {
peerString = ""; peerString = "";
} else { } else {
peerString = "?p=" + peerParam; peerString = "?p=" + peerParam;
@ -248,6 +248,9 @@ public class I2PSnarkServlet extends Default {
out.write(uri); out.write(uri);
out.write("\" method=\"POST\">\n"); out.write("\" method=\"POST\">\n");
out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" >\n"); out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" >\n");
// don't lose peer setting
if (peerParam != null)
out.write("<input type=\"hidden\" name=\"p\" value=\"" + peerParam + "\" >\n");
} }
out.write(TABLE_HEADER); out.write(TABLE_HEADER);
out.write("<img border=\"0\" src=\"/themes/snark/ubergine/images/status.png\""); out.write("<img border=\"0\" src=\"/themes/snark/ubergine/images/status.png\"");
@ -435,11 +438,12 @@ public class I2PSnarkServlet extends Default {
if (torrent != null) { if (torrent != null) {
byte infoHash[] = Base64.decode(torrent); byte infoHash[] = Base64.decode(torrent);
if ( (infoHash != null) && (infoHash.length == 20) ) { // valid sha1 if ( (infoHash != null) && (infoHash.length == 20) ) { // valid sha1
for (Iterator iter = _manager.listTorrentFiles().iterator(); iter.hasNext(); ) { for (String name : _manager.listTorrentFiles()) {
String name = (String)iter.next();
Snark snark = _manager.getTorrent(name); Snark snark = _manager.getTorrent(name);
if ( (snark != null) && (DataHelper.eq(infoHash, snark.meta.getInfoHash())) ) { if ( (snark != null) && (DataHelper.eq(infoHash, snark.meta.getInfoHash())) ) {
snark.startTorrent(); snark.startTorrent();
if (snark.storage != null)
name = snark.storage.getBaseName();
_manager.addMessage(_("Starting up torrent {0}", name)); _manager.addMessage(_("Starting up torrent {0}", name));
break; break;
} }
@ -1001,6 +1005,10 @@ public class I2PSnarkServlet extends Default {
out.write("<form action=\"" + uri + "\" method=\"POST\">\n"); out.write("<form action=\"" + uri + "\" method=\"POST\">\n");
out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" >\n"); out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" >\n");
out.write("<input type=\"hidden\" name=\"action\" value=\"Add\" >\n"); out.write("<input type=\"hidden\" name=\"action\" value=\"Add\" >\n");
// don't lose peer setting
String peerParam = req.getParameter("p");
if (peerParam != null)
out.write("<input type=\"hidden\" name=\"p\" value=\"" + peerParam + "\" >\n");
out.write("<div class=\"addtorrentsection\"><span class=\"snarkConfigTitle\">"); out.write("<div class=\"addtorrentsection\"><span class=\"snarkConfigTitle\">");
out.write("<img border=\"0\" src=\"/themes/snark/ubergine/images/add.png\">"); out.write("<img border=\"0\" src=\"/themes/snark/ubergine/images/add.png\">");
out.write(_("Add Torrent")); out.write(_("Add Torrent"));
@ -1036,6 +1044,10 @@ public class I2PSnarkServlet extends Default {
out.write("<form action=\"" + uri + "\" method=\"POST\">\n"); out.write("<form action=\"" + uri + "\" method=\"POST\">\n");
out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" >\n"); out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" >\n");
out.write("<input type=\"hidden\" name=\"action\" value=\"Create\" >\n"); out.write("<input type=\"hidden\" name=\"action\" value=\"Create\" >\n");
// don't lose peer setting
String peerParam = req.getParameter("p");
if (peerParam != null)
out.write("<input type=\"hidden\" name=\"p\" value=\"" + peerParam + "\" >\n");
out.write("<span class=\"snarkConfigTitle\">"); out.write("<span class=\"snarkConfigTitle\">");
out.write("<img border=\"0\" src=\"/themes/snark/ubergine/images/create.png\">"); out.write("<img border=\"0\" src=\"/themes/snark/ubergine/images/create.png\">");
out.write(_("Create Torrent")); out.write(_("Create Torrent"));

View File

@ -14,7 +14,6 @@ import net.i2p.util.Log;
* *
*/ */
public class ConfigTunnelsHandler extends FormHandler { public class ConfigTunnelsHandler extends FormHandler {
private Log configTunnel_log;
private Map _settings; private Map _settings;
private boolean _shouldSave; private boolean _shouldSave;
@ -44,11 +43,10 @@ public class ConfigTunnelsHandler extends FormHandler {
* *
*/ */
private void saveChanges() { private void saveChanges() {
configTunnel_log = _context.logManager().getLog(ConfigTunnelsHandler.class);
boolean saveRequired = false; boolean saveRequired = false;
if (configTunnel_log.shouldLog(Log.DEBUG)) if (_log.shouldLog(Log.DEBUG))
configTunnel_log.debug("Saving changes, with props = " + _settings + "."); _log.debug("Saving changes, with props = " + _settings + ".");
int updated = 0; int updated = 0;
int index = 0; int index = 0;
@ -111,16 +109,16 @@ public class ConfigTunnelsHandler extends FormHandler {
} }
if ("exploratory".equals(poolName)) { if ("exploratory".equals(poolName)) {
if (configTunnel_log.shouldLog(Log.DEBUG)) { if (_log.shouldLog(Log.DEBUG)) {
configTunnel_log.debug("Inbound exploratory settings: " + in); _log.debug("Inbound exploratory settings: " + in);
configTunnel_log.debug("Outbound exploratory settings: " + out); _log.debug("Outbound exploratory settings: " + out);
} }
_context.tunnelManager().setInboundSettings(in); _context.tunnelManager().setInboundSettings(in);
_context.tunnelManager().setOutboundSettings(out); _context.tunnelManager().setOutboundSettings(out);
} else { } else {
if (configTunnel_log.shouldLog(Log.DEBUG)) { if (_log.shouldLog(Log.DEBUG)) {
configTunnel_log.debug("Inbound settings for " + client.toBase64() + ": " + in); _log.debug("Inbound settings for " + client.toBase64() + ": " + in);
configTunnel_log.debug("Outbound settings for " + client.toBase64() + ": " + out); _log.debug("Outbound settings for " + client.toBase64() + ": " + out);
} }
_context.tunnelManager().setInboundSettings(client, in); _context.tunnelManager().setInboundSettings(client, in);
_context.tunnelManager().setOutboundSettings(client, out); _context.tunnelManager().setOutboundSettings(client, out);

View File

@ -46,10 +46,11 @@ public class ConfigUIHelper extends HelperBase {
return rv; return rv;
} }
private static final String langs[] = {"de", "en", "es", "fr", "nl", "ru", "sv", "zh"}; private static final String langs[] = {"de", "en", "es", "fr", "nl", "pt", "ru", "sv", "zh"};
private static final String flags[] = {"de", "us", "es", "fr", "nl", "ru", "se", "cn"}; private static final String flags[] = {"de", "us", "es", "fr", "nl", "pt", "ru", "se", "cn"};
private static final String xlangs[] = {_x("German"), _x("English"), _x("Spanish"),_x("French"), private static final String xlangs[] = {_x("German"), _x("English"), _x("Spanish"),_x("French"),
_x("Dutch"), _x("Russian"), _x("Swedish"), _x("Chinese")}; _x("Dutch"), _x("Portuguese"), _x("Russian"),
_x("Swedish"), _x("Chinese")};
/** todo sort by translated string */ /** todo sort by translated string */
public String getLangSettings() { public String getLangSettings() {

View File

@ -50,6 +50,7 @@ public class PluginStarter implements Runnable {
private static Map<String, ThreadGroup> pluginThreadGroups = new ConcurrentHashMap<String, ThreadGroup>(); // one thread group per plugin (map key=plugin name) private static Map<String, ThreadGroup> pluginThreadGroups = new ConcurrentHashMap<String, ThreadGroup>(); // one thread group per plugin (map key=plugin name)
private static Map<String, Collection<Job>> pluginJobs = new ConcurrentHashMap<String, Collection<Job>>(); private static Map<String, Collection<Job>> pluginJobs = new ConcurrentHashMap<String, Collection<Job>>();
private static Map<String, ClassLoader> _clCache = new ConcurrentHashMap(); private static Map<String, ClassLoader> _clCache = new ConcurrentHashMap();
private static Map<String, Collection<String>> pluginWars = new ConcurrentHashMap<String, Collection<String>>();
public PluginStarter(RouterContext ctx) { public PluginStarter(RouterContext ctx) {
_context = ctx; _context = ctx;
@ -125,6 +126,8 @@ public class PluginStarter implements Runnable {
File webappDir = new File(consoleDir, "webapps"); File webappDir = new File(consoleDir, "webapps");
String fileNames[] = webappDir.list(RouterConsoleRunner.WarFilenameFilter.instance()); String fileNames[] = webappDir.list(RouterConsoleRunner.WarFilenameFilter.instance());
if (fileNames != null) { if (fileNames != null) {
if(!pluginWars.containsKey(appName))
pluginWars.put(appName, new ConcurrentHashSet<String>());
for (int i = 0; i < fileNames.length; i++) { for (int i = 0; i < fileNames.length; i++) {
try { try {
String warName = fileNames[i].substring(0, fileNames[i].lastIndexOf(".war")); String warName = fileNames[i].substring(0, fileNames[i].lastIndexOf(".war"));
@ -139,6 +142,7 @@ public class PluginStarter implements Runnable {
//log.error("Starting webapp: " + warName); //log.error("Starting webapp: " + warName);
String path = new File(webappDir, fileNames[i]).getCanonicalPath(); String path = new File(webappDir, fileNames[i]).getCanonicalPath();
WebAppStarter.startWebApp(ctx, server, warName, path); WebAppStarter.startWebApp(ctx, server, warName, path);
pluginWars.get(appName).add(warName);
} }
} catch (IOException ioe) { } catch (IOException ioe) {
log.error("Error resolving '" + fileNames[i] + "' in '" + webappDir, ioe); log.error("Error resolving '" + fileNames[i] + "' in '" + webappDir, ioe);
@ -215,6 +219,7 @@ public class PluginStarter implements Runnable {
// stop console webapps in console/webapps // stop console webapps in console/webapps
Server server = WebAppStarter.getConsoleServer(); Server server = WebAppStarter.getConsoleServer();
if (server != null) { if (server != null) {
/*
File consoleDir = new File(pluginDir, "console"); File consoleDir = new File(pluginDir, "console");
Properties props = RouterConsoleRunner.webAppProperties(consoleDir.getAbsolutePath()); Properties props = RouterConsoleRunner.webAppProperties(consoleDir.getAbsolutePath());
File webappDir = new File(consoleDir, "webapps"); File webappDir = new File(consoleDir, "webapps");
@ -228,6 +233,13 @@ public class PluginStarter implements Runnable {
WebAppStarter.stopWebApp(server, warName); WebAppStarter.stopWebApp(server, warName);
} }
} }
*/
Iterator <String> wars = pluginWars.get(appName).iterator();
while (wars.hasNext()) {
String warName = wars.next();
WebAppStarter.stopWebApp(server, warName);
}
pluginWars.get(appName).clear();
} }
// remove summary bar link // remove summary bar link
@ -487,10 +499,25 @@ public class PluginStarter implements Runnable {
isJobRunning = true; isJobRunning = true;
break; break;
} }
boolean isWarRunning = false;
if(pluginWars.containsKey(pluginName)) {
Iterator <String> it = pluginWars.get(pluginName).iterator();
while(it.hasNext() && !isWarRunning) {
String warName = it.next();
if(WebAppStarter.isWebAppRunning(warName)) {
isWarRunning = true;
}
}
}
if (log.shouldLog(Log.DEBUG)) if (log.shouldLog(Log.DEBUG))
log.debug("plugin name = <" + pluginName + ">; threads running? " + isClientThreadRunning(pluginName) + "; webapp runing? " + WebAppStarter.isWebAppRunning(pluginName) + "; jobs running? " + isJobRunning); log.debug("plugin name = <" + pluginName + ">; threads running? " + isClientThreadRunning(pluginName) + "; webapp runing? " + isWarRunning + "; jobs running? " + isJobRunning);
return isClientThreadRunning(pluginName) || WebAppStarter.isWebAppRunning(pluginName) || isJobRunning; return isClientThreadRunning(pluginName) || isWarRunning || isJobRunning;
//
//if (log.shouldLog(Log.DEBUG))
// log.debug("plugin name = <" + pluginName + ">; threads running? " + isClientThreadRunning(pluginName) + "; webapp runing? " + WebAppStarter.isWebAppRunning(pluginName) + "; jobs running? " + isJobRunning);
//return isClientThreadRunning(pluginName) || WebAppStarter.isWebAppRunning(pluginName) || isJobRunning;
//
} }
/** /**

View File

@ -6,6 +6,7 @@ import java.io.OutputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.StringTokenizer; import java.util.StringTokenizer;
import java.util.concurrent.Semaphore;
import net.i2p.router.RouterContext; import net.i2p.router.RouterContext;
import net.i2p.stat.Rate; import net.i2p.stat.Rate;
@ -20,17 +21,20 @@ import org.jrobin.graph.RrdGraphDef;
* *
*/ */
public class StatSummarizer implements Runnable { public class StatSummarizer implements Runnable {
private RouterContext _context; private final RouterContext _context;
private Log _log; private final Log _log;
/** list of SummaryListener instances */ /** list of SummaryListener instances */
private List _listeners; private final List<SummaryListener> _listeners;
private static StatSummarizer _instance; private static StatSummarizer _instance;
private static final int MAX_CONCURRENT_PNG = 3;
private final Semaphore _sem;
public StatSummarizer() { public StatSummarizer() {
_context = (RouterContext)RouterContext.listContexts().get(0); // fuck it, only summarize one per jvm _context = (RouterContext)RouterContext.listContexts().get(0); // fuck it, only summarize one per jvm
_log = _context.logManager().getLog(getClass()); _log = _context.logManager().getLog(getClass());
_listeners = new ArrayList(16); _listeners = new ArrayList(16);
_instance = this; _instance = this;
_sem = new Semaphore(MAX_CONCURRENT_PNG, true);
} }
public static StatSummarizer instance() { return _instance; } public static StatSummarizer instance() { return _instance; }
@ -44,7 +48,7 @@ public class StatSummarizer implements Runnable {
} }
/** list of SummaryListener instances */ /** list of SummaryListener instances */
List getListeners() { return _listeners; } List<SummaryListener> getListeners() { return _listeners; }
private static final String DEFAULT_DATABASES = "bw.sendRate.60000" + private static final String DEFAULT_DATABASES = "bw.sendRate.60000" +
",bw.recvRate.60000" + ",bw.recvRate.60000" +
@ -77,31 +81,32 @@ public class StatSummarizer implements Runnable {
( (spec != null) && (oldSpecs != null) && (oldSpecs.equals(spec))) ) ( (spec != null) && (oldSpecs != null) && (oldSpecs.equals(spec))) )
return oldSpecs; return oldSpecs;
List old = parseSpecs(oldSpecs); List<Rate> old = parseSpecs(oldSpecs);
List newSpecs = parseSpecs(spec); List<Rate> newSpecs = parseSpecs(spec);
// remove old ones // remove old ones
for (int i = 0; i < old.size(); i++) { for (Rate r : old) {
Rate r = (Rate)old.get(i);
if (!newSpecs.contains(r)) if (!newSpecs.contains(r))
removeDb(r); removeDb(r);
} }
// add new ones // add new ones
StringBuilder buf = new StringBuilder(); StringBuilder buf = new StringBuilder();
for (int i = 0; i < newSpecs.size(); i++) { boolean comma = false;
Rate r = (Rate)newSpecs.get(i); for (Rate r : newSpecs) {
if (!old.contains(r)) if (!old.contains(r))
addDb(r); addDb(r);
buf.append(r.getRateStat().getName()).append(".").append(r.getPeriod()); if (comma)
if (i + 1 < newSpecs.size())
buf.append(','); buf.append(',');
else
comma = true;
buf.append(r.getRateStat().getName()).append(".").append(r.getPeriod());
} }
return buf.toString(); return buf.toString();
} }
private void removeDb(Rate r) { private void removeDb(Rate r) {
for (int i = 0; i < _listeners.size(); i++) { for (int i = 0; i < _listeners.size(); i++) {
SummaryListener lsnr = (SummaryListener)_listeners.get(i); SummaryListener lsnr = _listeners.get(i);
if (lsnr.getRate().equals(r)) { if (lsnr.getRate().equals(r)) {
_listeners.remove(i); _listeners.remove(i);
lsnr.stopListening(); lsnr.stopListening();
@ -115,16 +120,40 @@ public class StatSummarizer implements Runnable {
lsnr.startListening(); lsnr.startListening();
//System.out.println("Start listening for " + r.getRateStat().getName() + ": " + r.getPeriod()); //System.out.println("Start listening for " + r.getRateStat().getName() + ": " + r.getPeriod());
} }
public boolean renderPng(Rate rate, OutputStream out) throws IOException { public boolean renderPng(Rate rate, OutputStream out) throws IOException {
return renderPng(rate, out, -1, -1, false, false, false, false, -1, true); return renderPng(rate, out, -1, -1, false, false, false, false, -1, true);
} }
public boolean renderPng(Rate rate, OutputStream out, int width, int height, boolean hideLegend, boolean hideGrid, boolean hideTitle, boolean showEvents, int periodCount, boolean showCredit) throws IOException {
/**
* This does the single data graphs.
* For the two-data bandwidth graph see renderRatePng().
* Synchronized to conserve memory.
* @return success
*/
public boolean renderPng(Rate rate, OutputStream out, int width, int height, boolean hideLegend,
boolean hideGrid, boolean hideTitle, boolean showEvents, int periodCount,
boolean showCredit) throws IOException {
try {
try {
_sem.acquire();
} catch (InterruptedException ie) {}
return locked_renderPng(rate, out, width, height, hideLegend, hideGrid, hideTitle, showEvents,
periodCount, showCredit);
} finally {
_sem.release();
}
}
private boolean locked_renderPng(Rate rate, OutputStream out, int width, int height, boolean hideLegend,
boolean hideGrid, boolean hideTitle, boolean showEvents, int periodCount,
boolean showCredit) throws IOException {
if (width > GraphHelper.MAX_X) if (width > GraphHelper.MAX_X)
width = GraphHelper.MAX_X; width = GraphHelper.MAX_X;
if (height > GraphHelper.MAX_Y) if (height > GraphHelper.MAX_Y)
height = GraphHelper.MAX_Y; height = GraphHelper.MAX_Y;
for (int i = 0; i < _listeners.size(); i++) { for (int i = 0; i < _listeners.size(); i++) {
SummaryListener lsnr = (SummaryListener)_listeners.get(i); SummaryListener lsnr = _listeners.get(i);
if (lsnr.getRate().equals(rate)) { if (lsnr.getRate().equals(rate)) {
lsnr.renderPng(out, width, height, hideLegend, hideGrid, hideTitle, showEvents, periodCount, showCredit); lsnr.renderPng(out, width, height, hideLegend, hideGrid, hideTitle, showEvents, periodCount, showCredit);
return true; return true;
@ -132,13 +161,15 @@ public class StatSummarizer implements Runnable {
} }
return false; return false;
} }
public boolean renderPng(OutputStream out, String templateFilename) throws IOException { public boolean renderPng(OutputStream out, String templateFilename) throws IOException {
SummaryRenderer.render(_context, out, templateFilename); SummaryRenderer.render(_context, out, templateFilename);
return true; return true;
} }
public boolean getXML(Rate rate, OutputStream out) throws IOException { public boolean getXML(Rate rate, OutputStream out) throws IOException {
for (int i = 0; i < _listeners.size(); i++) { for (int i = 0; i < _listeners.size(); i++) {
SummaryListener lsnr = (SummaryListener)_listeners.get(i); SummaryListener lsnr = _listeners.get(i);
if (lsnr.getRate().equals(rate)) { if (lsnr.getRate().equals(rate)) {
lsnr.getData().exportXml(out); lsnr.getData().exportXml(out);
out.write(("<!-- Rate: " + lsnr.getRate().getRateStat().getName() + " for period " + lsnr.getRate().getPeriod() + " -->\n").getBytes()); out.write(("<!-- Rate: " + lsnr.getRate().getRateStat().getName() + " for period " + lsnr.getRate().getPeriod() + " -->\n").getBytes());
@ -152,8 +183,26 @@ public class StatSummarizer implements Runnable {
/** /**
* This does the two-data bandwidth graph only. * This does the two-data bandwidth graph only.
* For all other graphs see SummaryRenderer * For all other graphs see SummaryRenderer
* Synchronized to conserve memory.
* @return success
*/ */
public boolean renderRatePng(OutputStream out, int width, int height, boolean hideLegend, boolean hideGrid, boolean hideTitle, boolean showEvents, int periodCount, boolean showCredit) throws IOException { public boolean renderRatePng(OutputStream out, int width, int height, boolean hideLegend,
boolean hideGrid, boolean hideTitle, boolean showEvents,
int periodCount, boolean showCredit) throws IOException {
try {
try {
_sem.acquire();
} catch (InterruptedException ie) {}
return locked_renderRatePng(out, width, height, hideLegend, hideGrid, hideTitle, showEvents,
periodCount, showCredit);
} finally {
_sem.release();
}
}
private boolean locked_renderRatePng(OutputStream out, int width, int height, boolean hideLegend,
boolean hideGrid, boolean hideTitle, boolean showEvents,
int periodCount, boolean showCredit) throws IOException {
long end = _context.clock().now() - 60*1000; long end = _context.clock().now() - 60*1000;
if (width > GraphHelper.MAX_X) if (width > GraphHelper.MAX_X)
width = GraphHelper.MAX_X; width = GraphHelper.MAX_X;
@ -230,9 +279,9 @@ public class StatSummarizer implements Runnable {
* @param specs statName.period,statName.period,statName.period * @param specs statName.period,statName.period,statName.period
* @return list of Rate objects * @return list of Rate objects
*/ */
private List parseSpecs(String specs) { private List<Rate> parseSpecs(String specs) {
StringTokenizer tok = new StringTokenizer(specs, ","); StringTokenizer tok = new StringTokenizer(specs, ",");
List rv = new ArrayList(); List<Rate> rv = new ArrayList();
while (tok.hasMoreTokens()) { while (tok.hasMoreTokens()) {
String spec = tok.nextToken(); String spec = tok.nextToken();
int split = spec.lastIndexOf('.'); int split = spec.lastIndexOf('.');

View File

@ -10,7 +10,11 @@
<h1><%=intl._("I2P Router Logs")%></h1> <h1><%=intl._("I2P Router Logs")%></h1>
<div class="main" id="main"> <div class="main" id="main">
<div class="joblog"><h3><%=intl._("I2P Version & Running Environment")%></h3><a name="version"> </a> <div class="joblog"><h3><%=intl._("I2P Version & Running Environment")%></h3><a name="version"> </a>
<p><%=intl._("Please report bugs on <a href=\"http://trac.i2p2.i2p/newticket\">trac.i2p2.i2p</a> or <a href=\"http://trac.i2p2.de/newticket\">trac.i2p2.de</a>.")%> <p>
<% /* note to translators - both parameters are URLs */
%><%=intl._("Please report bugs on {0} or {1}.",
"<a href=\"http://trac.i2p2.i2p/newticket\">trac.i2p2.i2p</a>",
"<a href=\"http://trac.i2p2.de/newticket\">trac.i2p2.de</a>")%>
<%=intl._("You may use the username \"guest\" and password \"guest\" if you do not wish to register.")%> <%=intl._("You may use the username \"guest\" and password \"guest\" if you do not wish to register.")%>
<p><i><%=intl._("Please include this information in bug reports")%>:</i> <p><i><%=intl._("Please include this information in bug reports")%>:</i>
<p> <p>

View File

@ -80,7 +80,9 @@ public class Base64 {
} }
/** /**
* Decodes data from Base64 notation.
* @param s Base 64 encoded string using the I2P alphabet A-Z, a-z, 0-9, -, ~ * @param s Base 64 encoded string using the I2P alphabet A-Z, a-z, 0-9, -, ~
* @return the decoded data, null on error
*/ */
public static byte[] decode(String s) { public static byte[] decode(String s) {
return safeDecode(s, false); return safeDecode(s, false);
@ -234,6 +236,7 @@ public class Base64 {
System.out.println("or : Base64 test"); System.out.println("or : Base64 test");
} }
/*******
private static void test() { private static void test() {
String orig = "you smell"; String orig = "you smell";
String encoded = Base64.encode(orig.getBytes()); String encoded = Base64.encode(orig.getBytes());
@ -255,6 +258,7 @@ public class Base64 {
else else
throw new RuntimeException("D(E([all bytes])) != [all bytes]!!!"); throw new RuntimeException("D(E([all bytes])) != [all bytes]!!!");
} }
*******/
/* ******** E N C O D I N G M E T H O D S ******** */ /* ******** E N C O D I N G M E T H O D S ******** */

View File

@ -82,10 +82,20 @@ public abstract class SimpleDataStructure extends DataStructureImpl {
return Base64.encode(_data); return Base64.encode(_data);
} }
/**
* Sets the data.
* @throws DataFormatException if decoded data is not the legal number of bytes or on decoding error
*/
@Override @Override
public void fromBase64(String data) throws DataFormatException { public void fromBase64(String data) throws DataFormatException {
if (data == null) throw new DataFormatException("Null data passed in"); if (data == null) throw new DataFormatException("Null data passed in");
_data = Base64.decode(data); byte[] d = Base64.decode(data);
if (d == null)
throw new DataFormatException("Bad Base64 encoded data");
if (d.length != _length)
throw new DataFormatException("Bad decoded data length, expected " + _length + " got " + d.length);
// call setData() instead of _data = data in case overridden
setData(d);
} }
/** @return the SHA256 hash of the byte array, or null if the data is null */ /** @return the SHA256 hash of the byte array, or null if the data is null */
@ -106,7 +116,7 @@ public abstract class SimpleDataStructure extends DataStructureImpl {
/** /**
* Overridden for efficiency. * Overridden for efficiency.
* Does the same thing as getData() but null not allowed. * Does the same thing as setData() but null not allowed.
* @param data non-null * @param data non-null
* @throws DataFormatException if null or wrong length * @throws DataFormatException if null or wrong length
*/ */
@ -114,7 +124,8 @@ public abstract class SimpleDataStructure extends DataStructureImpl {
public void fromByteArray(byte data[]) throws DataFormatException { public void fromByteArray(byte data[]) throws DataFormatException {
if (data == null) throw new DataFormatException("Null data passed in"); if (data == null) throw new DataFormatException("Null data passed in");
if (data.length != _length) throw new DataFormatException("Bad data length"); if (data.length != _length) throw new DataFormatException("Bad data length");
_data = data; // call setData() instead of _data = data in case overridden
setData(data);
} }
@Override @Override

9
debian/changelog vendored
View File

@ -1,3 +1,12 @@
i2p (0.8.1-4) all; urgency=low
* I2P 0.8.1-6
* Closes: #448638
-- Hungry Hobo <HungryHobo@i2pmail.org> Mon, 24 Nov 2010 17:14:57 +0000
i2p (0.8.1-3) all; urgency=low
* I2P 0.8.1-3
-- Hungry Hobo <HungryHobo@i2pmail.org> Mon, 21 Nov 2010 17:14:57 +0000
i2p (0.8.1) all; urgency=low i2p (0.8.1) all; urgency=low
* Speedups * Speedups
* Bugfixes * Bugfixes

6
debian/makerepo.sh vendored
View File

@ -1,4 +1,4 @@
#!/bin/bash #!/bin/sh
# This script creates a Debian repository in ${DIR} using the reprepro tool. # This script creates a Debian repository in ${DIR} using the reprepro tool.
# The packages are signed with the key referenced in the newest changelog entry. # The packages are signed with the key referenced in the newest changelog entry.
@ -9,9 +9,7 @@ DIR=./repo
CONFDIR=conf CONFDIR=conf
CONFFILE=${CONFDIR}/distributions CONFFILE=${CONFDIR}/distributions
SIGNER=`parsechangelog --file changelog | grep Maintainer | cut -d: -f2` SIGNER=`parsechangelog --file changelog | grep Maintainer | cut -d\< -f2 | cut -d\> -f1`
SIGNER=${SIGNER//^ /}
SIGNER=`echo ${SIGNER} | cut -d\ -f1`
KEYID=`gpg --list-keys "${SIGNER}" | cut -d: -f2 | grep -w pub | cut -d/ -f2 | cut -d\ -f1` KEYID=`gpg --list-keys "${SIGNER}" | cut -d: -f2 | grep -w pub | cut -d/ -f2 | cut -d\ -f1`
echo Using signing key: ${SIGNER} echo Using signing key: ${SIGNER}
echo Key ID: ${KEYID} echo Key ID: ${KEYID}

View File

@ -1,3 +1,29 @@
2010-11-24 zzz
* configui: Add .pt
* configtunnels: Log cleanup
* graphs: Synch to conserve memory; cleanup
* i2psnark:
- Prevent dup requests during end game
(ticket 331 - thanks sponge and Oct!)
- POST parameter tweaks
- Message cleanup
* logs: Add trac login hint
* Router:
- Save some info to config file when installing or updating
- Remove global lock on accessing config
- Add global lock on reading/writing config file
* SimpleDataStructure: Fix problem in fromBase64() that
manifested itself as a configtunnels.jsp bug
2010-11-24 sponge
* Slackware, fix rc.i2p, bad logic.
2010-11-24 sponge
* Plugin: ticket 104 Fix webapp isRunning to check ALL webapps.
The only defecency is that if one is running, that it considers the
entire pliugin to be running. I'm not sure if that is a good thing
or a bad thing, but the other code checks threads that way.
2010-11-22 zzz 2010-11-22 zzz
* Addressbook: Fix rename error on Windows (tkt 323 - thanks RN!) * Addressbook: Fix rename error on Windows (tkt 323 - thanks RN!)
* build.xml: Cleanup, fix distclean error in older ants. * build.xml: Cleanup, fix distclean error in older ants.

View File

@ -6,7 +6,7 @@
<a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a> <a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a>
<a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Fran&ccedil;ais" alt="Fran&ccedil;ais"></a> <a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Fran&ccedil;ais" alt="Fran&ccedil;ais"></a>
<a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Espa&ntilde;ol" alt="Espa&ntilde;ol"></a> <a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Espa&ntilde;ol" alt="Espa&ntilde;ol"></a>
<a href="/index.jsp?lang=br"><img src="/flags.jsp?c=br" title="Português" alt="Português"></a> <a href="/index.jsp?lang=pt"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a>
<a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a> <a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a>
<a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a> <a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a>
<a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div> <a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div>

View File

@ -6,7 +6,7 @@
<a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a> <a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a>
<a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Fran&ccedil;ais" alt="Fran&ccedil;ais"></a> <a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Fran&ccedil;ais" alt="Fran&ccedil;ais"></a>
<a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Espa&ntilde;ol" alt="Espa&ntilde;ol"></a> <a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Espa&ntilde;ol" alt="Espa&ntilde;ol"></a>
<a href="/index.jsp?lang=br"><img src="/flags.jsp?c=br" title="Português" alt="Português"></a> <a href="/index.jsp?lang=pt"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a>
<a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a> <a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a>
<a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a> <a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a>
<a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a> <a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a>

View File

@ -6,7 +6,7 @@
<a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a> <a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a>
<a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Fran&ccedil;ais" alt="Fran&ccedil;ais"></a> <a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Fran&ccedil;ais" alt="Fran&ccedil;ais"></a>
<a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Espa&ntilde;ol" alt="Espa&ntilde;ol"></a> <a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Espa&ntilde;ol" alt="Espa&ntilde;ol"></a>
<a href="/index.jsp?lang=br"><img src="/flags.jsp?c=br" title="Português" alt="Português"></a> <a href="/index.jsp?lang=pt"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a>
<a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a> <a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a>
<a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a> <a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a>
<a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div> <a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div>

View File

@ -6,7 +6,7 @@
<a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a> <a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a>
<a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Fran&ccedil;ais" alt="Fran&ccedil;ais"></a> <a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Fran&ccedil;ais" alt="Fran&ccedil;ais"></a>
<a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Espa&ntilde;ol" alt="Espa&ntilde;ol"></a> <a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Espa&ntilde;ol" alt="Espa&ntilde;ol"></a>
<a href="/index.jsp?lang=br"><img src="/flags.jsp?c=br" title="Português" alt="Português"></a> <a href="/index.jsp?lang=pt"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a>
<a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a> <a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a>
<a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a> <a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a>
<a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div> <a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div>

View File

@ -6,7 +6,7 @@
<a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a> <a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a>
<a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Fran&ccedil;ais" alt="Fran&ccedil;ais"></a> <a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Fran&ccedil;ais" alt="Fran&ccedil;ais"></a>
<a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Espa&ntilde;ol" alt="Espa&ntilde;ol"></a> <a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Espa&ntilde;ol" alt="Espa&ntilde;ol"></a>
<a href="/index.jsp?lang=br"><img src="/flags.jsp?c=br" title="Português" alt="Português"></a> <a href="/index.jsp?lang=pt"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a>
<a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a> <a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a>
<a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a> <a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a>
<a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div> <a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div>

View File

@ -6,7 +6,7 @@
<a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a> <a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a>
<a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Fran&ccedil;ais" alt="Fran&ccedil;ais"></a> <a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Fran&ccedil;ais" alt="Fran&ccedil;ais"></a>
<a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Espa&ntilde;ol" alt="Espa&ntilde;ol"></a> <a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Espa&ntilde;ol" alt="Espa&ntilde;ol"></a>
<a href="/index.jsp?lang=br"><img src="/flags.jsp?c=br" title="Português" alt="Português"></a> <a href="/index.jsp?lang=pt"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a>
<a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a> <a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a>
<a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a> <a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a>
<a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div> <a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div>

View File

@ -5,7 +5,7 @@
<a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a> <a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a>
<a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a> <a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a>
<a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Espa&ntilde;ol" alt="Espa&ntilde;ol"></a> <a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Espa&ntilde;ol" alt="Espa&ntilde;ol"></a>
<a href="/index.jsp?lang=br"><img src="/flags.jsp?c=br" title="Português" alt="Português"></a> <a href="/index.jsp?lang=pt"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a>
<a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a> <a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a>
<a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a> <a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a>
<a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div> <a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div>

View File

@ -6,7 +6,7 @@
<a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a> <a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a>
<a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Fran&ccedil;ais" alt="Fran&ccedil;ais"></a> <a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Fran&ccedil;ais" alt="Fran&ccedil;ais"></a>
<a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Espa&ntilde;ol" alt="Espa&ntilde;ol"></a> <a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Espa&ntilde;ol" alt="Espa&ntilde;ol"></a>
<a href="/index.jsp?lang=br"><img src="/flags.jsp?c=br" title="Português" alt="Português"></a> <a href="/index.jsp?lang=pt"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a>
<a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a> <a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a>
<a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a> <a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a>
<a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div> <a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div>

View File

@ -1,11 +1,10 @@
/* I2P Theme: Classic */ /* I2P Theme: Classic (aka corporat) */
/* Description: Classic theme, loosely based on duck's original */ /* I2P Description: Light blue "classic" I2P theme; optimized for less capable browsers and system specifications. */
/* Optimized for less capable browsers and system specifications */
/* Author: dr|z3d */ /* Author: dr|z3d */
body { body {
margin: 2px 0 0 2px; margin: 5px 3px 5px 6px;
padding: 0; padding: 0;
text-align: left; text-align: left;
background: #bbf; background: #bbf;
@ -28,6 +27,8 @@ pre {
padding-top: 10px; padding-top: 10px;
} }
/* Sidepanel for proxy errors */
div.logo { div.logo {
float: left; float: left;
position-relative: top 20px ; position-relative: top 20px ;
@ -37,9 +38,7 @@ div.logo {
text-align: center; text-align: center;
border: 5px solid #ddf; border: 5px solid #ddf;
background-color: #eef; background-color: #eef;
-moz-border-radius: 15px;
-moz-box-shadow: inset 0px 0px 0px 2px #99f; -moz-box-shadow: inset 0px 0px 0px 2px #99f;
-khtml-border-radius: 15px;
-khtml-box-shadow: inset 0px 0px 0px 2px #99f; -khtml-box-shadow: inset 0px 0px 0px 2px #99f;
} }
@ -65,6 +64,8 @@ div.logo a:hover {
color: #900; color: #900;
} }
/* HTTP Proxy warning Main box */
div.warning { div.warning {
margin: 20px 20px 10px 260px; margin: 20px 20px 10px 260px;
padding: 0px 20px 20px 75px; padding: 0px 20px 20px 75px;
@ -75,9 +76,7 @@ div.warning {
background-image:url("../images/itoopie_sm.png"); background-image:url("../images/itoopie_sm.png");
background-position: 12px center; background-position: 12px center;
background-repeat:no-repeat; background-repeat:no-repeat;
-moz-border-radius: 15px;
-moz-box-shadow: inset 0px 0px 0px 2px #f60; -moz-box-shadow: inset 0px 0px 0px 2px #f60;
-kthml-border-radius: 15px;
-khtml-box-shadow: inset 0px 0px 0px 2px #f60; -khtml-box-shadow: inset 0px 0px 0px 2px #f60;
} }
@ -92,7 +91,7 @@ div.warning a:visited{
div.warning a:hover{ div.warning a:hover{
color: #d30; color: #d30;
text-shadow: 0px 0px 1px rgba(255, 96, 0, 0.7); text-shadow: 0px 0px 1px rgba(255, 96, 0, 0.7);
} }
div.warning a:active{ div.warning a:active{
@ -107,25 +106,32 @@ div.warning hr {
margin: 5px 0; margin: 5px 0;
} }
div.warning h3 {
border: 0;
border-bottom: 5px solid #fb7;
padding-bottom: 10px;
background: #ffd;
padding-left: 0;
}
/* console error messages */ /* console error messages */
div.sorry { div.sorry {
padding: 20px; padding: 20px;
background: #ddf; background: #ddf;
margin: -2px 1px 0 195px; margin: -1px 1px 0 200px;
border: 5px solid #bbf; border: 1px solid #89f;
text-align: justify; text-align: justify;
-moz-box-shadow: inset 0px 0px 0px 1px #d00;
word-wrap: break-word; word-wrap: break-word;
font-weight: bold; font-weight: bold;
color: #001; color: #001;
} }
div.sorry hr { div.sorry hr {
color: #001; color: #89f;
background: #001; background: #89f;
height: 1px; height: 1px;
border: 1px solid #001; border: 0px solid #89f;
margin: 10px 0; margin: 10px 0;
} }
@ -135,9 +141,11 @@ div.toolbar {
display: none !important; display: none !important;
} }
/* Side panel */
div.routersummaryouter { div.routersummaryouter {
float: left; float: left;
width: 200px; width: 193px;
margin: 0; margin: 0;
padding: 0; padding: 0;
border: 0; border: 0;
@ -146,16 +154,16 @@ div.routersummaryouter {
div.routersummary { div.routersummary {
background: #ddf; background: #ddf;
width: 185px; width: 193px;
color: inherit; color: inherit;
margin: 0; margin: 0;
padding: 10px 1px 7px 1px; padding: 10px 1px 7px 1px;
text-align: center !important; text-align: center !important;
border: 5px solid #bbf; border: 1px solid #89f;
font-size: 9pt; border-bottom: 1px solid #89f;
border-right: 1px solid #89f;
word-wrap: break-word; word-wrap: break-word;
font: 9pt/125%; font: 9pt/125% !important;
-moz-box-shadow: inset 0px 0px 0px 1px #99f;
} }
div.routersummary input[type=text] { div.routersummary input[type=text] {
@ -163,45 +171,49 @@ div.routersummary input[type=text] {
} }
div.routersummary hr { div.routersummary hr {
color: #eef; color: #89f;
background: #eef; background: #89f;
height: 2px; height: 0px;
border-bottom: 1px solid #eef; border-bottom: 1px solid #89f;
margin: 8px 1px 7px 1px; margin: 8px -1px 7px -1px;
-moz-box-shadow: inset 0px 1px 1px 1px #99f;
} }
div.routersummary h3 { div.routersummary h3 {
border: 0px solid #f00; border: 0px solid #f00;
font-size: 9.5pt; font-size: 9.5pt;
letter-spacing: 0.05em; letter-spacing: 0.05em;
margin: -7px 1px -7px 1px; margin: -7px 0px -8px 0px;
padding: 1px 0; padding: 1px 0;
background: #c5d5fb; background: #c5d5fb;
text-transform: uppercase; text-transform: uppercase;
} }
div.routersummary h4 { div.routersummary h4 {
border: 0px solid #f00; border: 0;
border-bottom: 0 !important; border-bottom: 0 !important;
font-size: 8.5pt; font-size: 8.5pt;
letter-spacing: 0.05em; letter-spacing: 0.05em;
margin: -7px 1px -7px 1px !important; margin: -7px 0px -8px 0px !important;
padding: 1px 3px; padding: 3px 0;
background: #c1d1f7; background: #c1d1f7;
text-transform: capitalize; text-transform: capitalize;
text-decoration: none !important; text-decoration: none !important;
color: #2b2; color: #2b2;
line-height: 90%;
}
div.routersummary h3 a, div.routersummary h4 a {
text-decoration: none;
} }
div.routersummary table { div.routersummary table {
border: 0; border: 0;
text-align: center !important; text-align: center !important;
margin: -5px 4px -5px 3px; margin: -5px 0px -5px 0px;
width: 180px !important; width: 193px !important;
overflow: hidden; overflow: hidden;
font-size: 8pt; font-size: 8pt;
padding: 0 -10px; padding: 0 -12px;
background-image: none !important; background-image: none !important;
background-color: transparent !important; background-color: transparent !important;
} }
@ -212,20 +224,47 @@ div.routersummary tr {
border: 0 !important; border: 0 !important;
} }
div.tunnels table {
margin: 0 -7px !important;
width: 193px;
}
div.tunnels table{ div.tunnels table{
margin: 0 !important; margin: -2px 0px -4px 0px !important;
text-align: center !important;
width: 190px;
} }
.tunnels tr { .tunnels tr {
padding: 2px 0 !important; padding: 2px 0 !important;
margin-left: -7px !important;
} }
.tunnels a {
text-transform: capitalize;
}
.tunnels td:first-child {
width: 16px !important;
padding-right: 0px;
text-align: left;
}
.tunnels td:last-child {
width: 12px;
text-align: right;
margin-right: -2px;
}
div.routersummary form { div.routersummary form {
margin-top: -6px !important; margin-top: -6px !important;
margin-bottom: -4px !important; margin-bottom: -4px !important;
} }
div.routersummary form:last-child {
padding-top: 3px !important;
margin-bottom: -10px !important;
}
div.refresh { div.refresh {
margin-top: 10px !important; margin-top: 10px !important;
margin-bottom: 10px !important; margin-bottom: 10px !important;
@ -251,21 +290,17 @@ div.routersummary td {
border: 0 !important; border: 0 !important;
} }
div.warning h3 {
border-bottom: 5px solid #fb7;
padding-bottom: 10px;
}
div.main { div.main {
margin: 0px 0px 0px 195px; margin: 0px 1px 0px 200px;
padding: 15px 15px 10px 15px; padding: 15px 15px 10px 15px;
background: #eef; background: #eef;
border: 5px solid #bbf; border: 1px solid #89f;
border-bottom: 1px solid #89f;
border-right: 1px solid #89f;
border-top: 0; border-top: 0;
text-align: left; text-align: left;
color: #001; color: #001;
min-width: 570px; min-width: 500px;
-moz-box-shadow: inset 0px 0px 0px 1px #99f;
} }
div.main ul { div.main ul {
@ -295,7 +330,7 @@ div.main textarea {
div.main h2 { div.main h2 {
margin-top: 20px; margin-top: 20px;
margin-bottom: -5px; margin-bottom: 0px;
} }
div.welcome { div.welcome {
@ -325,17 +360,18 @@ div.wideload p !important {
} }
div.news { div.news {
margin: -5px 0px 0 195px; margin: -1px 1px 0 200px;
padding: -10px 0px 8px 0px; padding: -10px 0px 8px 0px;
background: #ffffc0; background: #ffffc0;
border: 5px solid #bbf; border: 1px solid #89f;
border-bottom: 1px solid #89f;
border-right: 1px solid #89f;
text-align: right; text-align: right;
color: #770; color: #770;
min-width: 600px; min-width: 500px;
padding-bottom: 8px; padding-bottom: 8px;
padding-left: 10px; padding-left: 10px;
padding-right: 10px; padding-right: 10px;
-moz-box-shadow: inset 0px 0px 0px 1px #99f;
font-size: 7pt; font-size: 7pt;
} }
@ -387,16 +423,19 @@ div.news hr {
color: #cc7; color: #cc7;
background: #cc7; background: #cc7;
height: 1px; height: 1px;
border: 0px solid #cccc77; border: 0px solid #cc7;
margin: 20px 0 2px 0; margin: 20px 0 0 0;
} }
div.confignav { div.confignav {
padding: 12px 0 15px 0; padding: 10px 0 11px 0;
background: #cfc; background: #ddf;
margin: -20px -20px 0 -20px; margin: -16px -16px 0 -16px;
border: 5px solid #bbf; border: 1px solid #89f;
-moz-box-shadow: inset 0px 0px 0px 1px #99f; font-size: 9.5pt;
}
div.confignav a {
} }
div.configure { div.configure {
@ -411,7 +450,7 @@ div.configure hr {
div.configure table { div.configure table {
font-size: 9pt; font-size: 9pt;
font-weight: bold; font-weight: bold;
border: 1px solid #bbf; border: 1px solid #89f;
} }
div.configure tr, div.configure td { div.configure tr, div.configure td {
@ -419,7 +458,6 @@ div.configure tr, div.configure td {
} }
div.configure tr { div.configure tr {
-moz-box-shadow: inset 0px 0px 1px 0px #bbf;
} }
div.configure li:first-child, div.main li:first-child { div.configure li:first-child, div.main li:first-child {
@ -442,14 +480,13 @@ div.configure h2:first-child {
div.messages { div.messages {
padding: 0px 10px; padding: 0px 10px;
background: #fff; background: #fff;
border: 5px solid #bbf; border: 1px solid #89f;
border-right: 0; border-right: 0;
margin: -5px -15px 10px -20px; margin: -1px -15px 10px -16px;
text-align: center; text-align: center;
font-size: 9pt; font-size: 9pt;
font-weight: bold; font-weight: bold;
color: #474; color: #474;
-moz-box-shadow: inset 0px 0px 0px 1px #99f;
} }
div.messages li, div.messages ul { div.messages li, div.messages ul {
@ -469,32 +506,42 @@ h1 {
font-size: 18pt; font-size: 18pt;
text-shadow: 0px 0px 1px rgba(0, 0, 32, 0.7); text-shadow: 0px 0px 1px rgba(0, 0, 32, 0.7);
text-align: center; text-align: center;
border: 5px solid #bbf; border: 1px solid #89f;
padding: 13px 10px 12px 10px; border-bottom: 1px solid #89f;
margin: 0 0px 0 195px; border-right: 1px solid #89f;
padding: 16px 10px 16px 10px;
margin: 0 1px 0 200px;
line-height: 93%; line-height: 93%;
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 0.3em; letter-spacing: 0.3em;
background: #fff; background: #fff;
min-width: 600px; min-width: 500px;
-moz-box-shadow: inset 0px 0px 0px 1px #99f;
} }
h2 { h2 {
font-size: 14pt; font-size: 14pt;
padding: 0px 10px 10px 10px; padding: 10px;
border-bottom: 3px solid #aaf; border: 1px solid #89f;
border-top: 0px solid #aaf;
letter-spacing: 0.04em; letter-spacing: 0.04em;
font-variant: small-caps;
text-transform: capitalize;
background: #fff;
text-shadow: 0px 0px 1px rgba(0, 0, 32, 0.7);
} }
h3 { h3 {
font-size: 12pt; font-size: 12pt;
padding: 0 10px 10px 10px; padding: 5px 10px;
border-bottom: 3px solid #aaf; border: 1px solid #89f;
border-top: 0px solid #aaf;
letter-spacing: 0.04em; letter-spacing: 0.04em;
margin-bottom: 10px; margin-bottom: 10px;
background: #fff;
}
h2, h3 {
background-image: url("images/titlebg.png");
background-repeat: no-repeat;
background-position: right center;
} }
.proxyfooter{ .proxyfooter{
@ -504,7 +551,7 @@ h3 {
table { table {
border-collapse: collapse; border-collapse: collapse;
border: 1px solid #bbf; border: 1px solid #89f;
margin: 0 0 5px 0; margin: 0 0 5px 0;
cell-padding: 1px; cell-padding: 1px;
font-size: 7.5pt; font-size: 7.5pt;
@ -513,11 +560,11 @@ table {
} }
table hr { table hr {
padding: 0px 0; padding: 0;
color: #bbf; color: #89f;
background: #bbf; background: #89f;
border: 0px solid #bbf; border: 0px solid #89f;
margin: 0px -5px; margin: -5px -5px -10px -5px !important;
height: 1px; height: 1px;
} }
@ -525,11 +572,15 @@ table tt {
font-size: 7.5pt; font-size: 7.5pt;
} }
table code {
font-size: 120%;
}
th { th {
background-color: #fff; background-color: #fff;
padding: 8px 2px; padding: 8px 2px;
text-align: center; text-align: center;
border-bottom: 1px solid #bbf; border-bottom: 1px solid #89f;
} }
tt { tt {
@ -553,10 +604,10 @@ tr:nth-child(odd) {
} }
hr { hr {
color: #aaf; color: #89f;
background: #aaf; background: #89f;
height: 3px; height: 2px;
border: 0px solid #aaf; border: 0px solid #89f;
margin: 3px 0; margin: 3px 0;
} }
@ -655,10 +706,10 @@ p {
} }
.langbox { .langbox {
margin: 10px -20px 0px 5px; margin: 18px -20px 0px 5px;
color: #001; color: #001;
font-size: 7pt; font-size: 7pt;
width: 220px; width: 280px;
text-align: center; text-align: center;
float: right; float: right;
valign: middle; valign: middle;
@ -695,6 +746,7 @@ a:hover{
color: #f60; color: #f60;
text-decoration: underline; text-decoration: underline;
font-weight: bold; font-weight: bold;
text-shadow: 0px 0px 1px rgba(255, 96, 0, 0.7);
} }
a:active{ a:active{
@ -713,9 +765,9 @@ tt {
font-weight: bold; font-weight: bold;
color: darkgreen; color: darkgreen;
} }
.tablefooter { .tablefooter {
border: 1px solid #bbf; border: 1px solid #a8f;
} }
.tablefooter tr, .tablefooter td { .tablefooter tr, .tablefooter td {
@ -725,7 +777,7 @@ tt {
line-height: 150%; line-height: 150%;
word-wrap: nowrap; word-wrap: nowrap;
padding: 8px 1px; padding: 8px 1px;
border-top: 2px solid #bbf; border-top: 2px solid #89f;
} }
.tidylist { .tidylist {
@ -735,14 +787,9 @@ tt {
} }
div.graphspanel { div.graphspanel {
padding: 15px 5px 20px 5px; padding: 10px 5px 20px 5px;
margin: -20px; margin: -16px -16px -11px -16px;
background: #ddf url('images/lightbluetile.png'); border: 1px solid #89f;
-moz-border-radius: 4px;
-khtml-border-radius: 4px;
border-radius: 4px;
border: 5px solid #bbf;
-moz-box-shadow: inset 0px 0px 1px 0px #002;
text-align: center !important; text-align: center !important;
} }
@ -756,7 +803,7 @@ div.graphspanel img {
} }
div.graphspanel img:hover { div.graphspanel img:hover {
border: 1px solid #003; border: 1px solid #89f;
padding: 2px; padding: 2px;
margin: 6px; margin: 6px;
text-align: center !important; text-align: center !important;
@ -777,4 +824,4 @@ div.graphspanel form:last-child {
div.graphspanel h3 { div.graphspanel h3 {
text-align: left; text-align: left;
margin: 10px 20px 10px 20px; margin: 10px 20px 10px 20px;
} }

View File

@ -1,5 +1,5 @@
/* I2P Theme: I2P Classic Theme Override */ /* I2P Theme: I2P Classic Theme Override */
/* Description: Larger fontsize override for console to accomodate foreign charactersets */ /* I2P Description: Larger fontsize override for console to accomodate foreign charactersets */
/* Author: Dr|Z3d */ /* Author: Dr|Z3d */
@ -20,8 +20,6 @@ div.routersummary h4 {
div.routersummary table { div.routersummary table {
font-size: 9pt; font-size: 9pt;
margin: -5px 0px -5px -1px;
width: 188px !important;
} }
div.routersummary table a:link, div.routersummary table a:visited { div.routersummary table a:link, div.routersummary table a:visited {
@ -33,9 +31,6 @@ div.tunnels a {
} }
div.tunnels table { div.tunnels table {
width: 186px !important;
text-align: center;
margin: -4px 1px !important;
} }
div.tunnels td:first-child, div.tunnels td:last-child { div.tunnels td:first-child, div.tunnels td:last-child {

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

@ -1,12 +1,13 @@
/* Not yet complete. Subject to flux and change. dr|z3d - 07.25.09 */ /* I2P Console theme: "Camo" by dr|z3d. Aka "dark". As in ops. */
body { body {
margin: 20px 5px 0 15px; margin: 20px 5px 0 15px;
padding: 0; padding: 0;
text-align: center; text-align: center;
background: #002; background: #010 url('images/camotile.png') center bottom;
color: #FFF; color: #EE9;
font: 9pt/130% "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; font: 9pt/130% "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
} }
.hide { .hide {
@ -22,20 +23,20 @@ pre {
overflow-x: scroll; overflow-x: scroll;
text-align: left; text-align: left;
font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
color: #fff; color: #EE9;
} }
div.logo { div.logo {
float: left; float: left;
padding: 10px; padding: 10px;
text-align: center; text-align: center;
font-color: #fff; font-color: #EE9;
margin: 0 20px 0 20px; margin: 0 20px 0 20px;
border: 1px solid #99f; border: 1px solid #494;
-moz-border-radius: 4px; -moz-border-radius: 4px;
-khtml-border-radius: 4px; -khtml-border-radius: 4px;
border-radius: 4px; border-radius: 4px;
background: #003 url('images/darkbluebg.png'); background: #030 url('images/darkbluebg.png');
width: 175px; width: 175px;
-moz-box-shadow: inset 0px 0px 1px 0px #009; -moz-box-shadow: inset 0px 0px 1px 0px #009;
-khtml-box-shadow: inset 0px 0px 1px 0px #009; -khtml-box-shadow: inset 0px 0px 1px 0px #009;
@ -46,8 +47,8 @@ div.toolbar {
margin: 0; margin: 0;
padding: 10px; padding: 10px;
font-weight: bold; font-weight: bold;
background: #eef; background: #000;
border: 1px solid #002; border: 1px solid #000;
display: none; display: none;
} }
@ -59,7 +60,7 @@ div.toolbar a:link {
border-radius: 4px; border-radius: 4px;
-moz-border-radius: 4px; -moz-border-radius: 4px;
-khtml-border-radius: 4px; -khtml-border-radius: 4px;
color: #002; color: #000;
} }
div.toolbar a:visited { div.toolbar a:visited {
@ -68,7 +69,7 @@ div.toolbar a:visited {
div.toolbar a:hover, button:hover{ div.toolbar a:hover, button:hover{
border: 1px solid #f60; border: 1px solid #f60;
background: #003; background: #030;
color: #f60; color: #f60;
} }
@ -91,19 +92,20 @@ div.routersummary {
width: 175px; width: 175px;
padding: 10px; padding: 10px;
text-align: center; text-align: center;
border: 1px solid #99f; border: 1px solid #494;
background: #003; background: #000;
background: url(images/darkbluebg.png); background: #000 url(images/camotile2.png);
color: #eef; color: #EE9;
font-size: 8pt; font-size: 8pt;
clear: left;/* fixes a bug in Opera */ clear: left;/* fixes a bug in Opera */
-moz-border-radius: 4px; -moz-border-radius: 4px;
-khtml-border-radius: 4px; -khtml-border-radius: 4px;
border-radius: 4px; border-radius: 4px;
float: left; float: left;
-moz-box-shadow: inset 0px 0px 1px 0px #eef; /* -moz-box-shadow: inset 0px 0px 0px 0px #EE9;
-khtml-box-shadow: inset 0px 0px 1px 0px #eef; -khtml-box-shadow: inset 0px 0px 1px 0px #EE9;
box-shadow: inset 0px 0px 1px 0px #eef; box-shadow: inset 0px 0px 1px 0px #EE9;*/
-moz-box-shadow: 0 1px 5px #000;
} }
div.routersummary input[type=text] { div.routersummary input[type=text] {
@ -114,27 +116,26 @@ div.routersummary input[type=text] {
} }
div.routersummary hr { div.routersummary hr {
color: #99f; color: #494;
background: #99f; background: #494;
height: 2px; height: 2px;
border-bottom: 1px solid #99f; border-bottom: 1px solid #494;
margin: 8px -10px 7px -10px; margin: 8px -10px 7px -10px;
-moz-box-shadow: inset 0px 1px 1px 1px #001; -moz-box-shadow: inset 0px 1px 1px 1px #000;
} }
div.routersummary h3 { div.routersummary h3 {
border: 0; border: 0;
font-size: 9.5pt; font-size: 9.5pt;
letter-spacing: 0.04em; letter-spacing: 0.04em;
margin: -7px -9px -8px -9px; margin: -7px -10px -8px -10px;
padding: 2px 0 3px 0 !important; padding: 2px 0 3px 0 !important;
background: #007;
text-transform: uppercase; text-transform: uppercase;
-moz-border-radius: 0; -moz-border-radius: 0;
-khtml-border-radius: 0; -khtml-border-radius: 0;
border-radius: 0; border-radius: 0;
background: #007; background: #000 url('images/header.png') center center ;
background-image: -moz-linear-gradient(top, bottom, from(#007), to(#005), color-stop(7%, #007), color-stop(100%, #005)); background-image: -moz-linear-gradient(top, bottom, from(#005), to(#030), color-stop(7%, #000), color-stop(100%, #005));
} }
div.routersummary h4 { div.routersummary h4 {
@ -144,19 +145,19 @@ div.routersummary h4 {
letter-spacing: 0.02em; letter-spacing: 0.02em;
margin: -7px -9px -10px -9px !important; margin: -7px -9px -10px -9px !important;
padding: 2px 3px 5px 3px; padding: 2px 3px 5px 3px;
background: #005; background: #000;
text-transform: capitalize; text-transform: capitalize;
text-decoration: none !important; text-decoration: none !important;
color: #2b2; color: #2b2;
background-image: -moz-linear-gradient(top, bottom, from(#001), to(#005), color-stop(10%, #005), color-stop(100%, #004)); background-image: -moz-linear-gradient(top, bottom, from(#000), to(#005), color-stop(10%, #005), color-stop(100%, #004));
line-height: 100%; line-height: 100%;
} }
div.routersummary table { div.routersummary table {
border: 0; border: 0;
text-align: center !important; text-align: center !important;
margin: -5px -4px -5px -5px !important; margin: -5px -7px -5px -7px !important;
width: 185px !important; width: 188px !important;
overflow: hidden; overflow: hidden;
font-size: 8pt; font-size: 8pt;
padding: 0 -10px; padding: 0 -10px;
@ -189,7 +190,8 @@ div.refresh {
} }
div.routersummary a:link, div.routersummary a:visited { div.routersummary a:link, div.routersummary a:visited {
text-shadow: 0px 0px 1px rgba(192, 192, 255, 0.5); text-shadow: 1px 1px 1px rgba(0, 16, 0, 0.8);
text-shadow: 0px 0px 2px #010 !important;
} }
div.routersummary a:hover { div.routersummary a:hover {
@ -210,28 +212,39 @@ div routersummary hr:last-child {
div.tunnels { div.tunnels {
padding-top: 3px !important; padding-top: 3px !important;
margin-left: -2px; margin-left: -4px;
text-align: center; text-align: center;
} }
div.tunnels table { div.tunnels table {
margin: -3px 0 !important; margin: -5px 0 -5px -2px !important;
} }
div.tunnels td { div.tunnels td {
padding: 1px 2px 1px 2px; padding: 1px 0px 1px 0px;
} }
div.tunnels td:first-child { div.tunnels td:first-child {
width: 16px; width: 16px;
text-align: left;
padding-right: 2px;
}
div.tunnels td:last-child {
text-align: right;
}
div.tunnels tr {
/* border: 1px solid #494 !important;*/
} }
div.warning { div.warning {
margin: 5px 20px 10px 240px; margin: 5px 20px 10px 240px;
padding: 5px 25px 20px 75px; padding: 5px 25px 20px 75px;
background: #005; background: #005;
border: 1px solid #99f; border: 1px solid #494;
text-align: left; text-align: left;
color: #fff; color: #EE9;
-moz-border-radius: 4px; -moz-border-radius: 4px;
-khtml-border-radius: 4px; -khtml-border-radius: 4px;
border-radius: 4px; border-radius: 4px;
@ -250,8 +263,8 @@ div.warning {
div.sorry { div.sorry {
margin: 15px 15px 10px 220px; margin: 15px 15px 10px 220px;
padding: 20px 20px 20px 75px; padding: 20px 20px 20px 75px;
background: #005; background: #020;
border: 1px solid #99f; border: 1px solid #494;
-moz-border-radius: 4px; -moz-border-radius: 4px;
-khtml-border-radius: 4px; -khtml-border-radius: 4px;
border-radius: 4px; border-radius: 4px;
@ -262,65 +275,74 @@ div.sorry {
-moz-box-shadow: inset 0px 0px 0px 1px #d00; -moz-box-shadow: inset 0px 0px 0px 1px #d00;
word-wrap: break-word; word-wrap: break-word;
font-weight: bold; font-weight: bold;
color: #eef; color: #EE9;
} }
div.sorry hr { div.sorry hr {
color: #eef; color: #EE9;
background: #eef; background: #EE9;
height: 1px; height: 1px;
border: 1px solid #eef; border: 1px solid #EE9;
margin: 10px 0; margin: 10px 0;
} }
div.main { div.main {
margin: 0px 0px 20px 195px; margin: 15px 15px 20px 220px;
padding: 0 15px 15px 25px; padding: 0 15px 15px 15px;
background: #002;
text-align: left; text-align: left;
color: #eef; color: #EE9;
width: auto; width: auto;
/* overflow-x: scroll; */ /* overflow-x: scroll; */
border: 1px solid #494;
-moz-border-radius: 4px;
-khtml-border-radius: 4px;
border-radius: 4px;
background: #000;/* url(images/camotile2.png);*/
min-width: 620px;
-moz-box-shadow: 0 1px 5px #000;
} }
div.main textarea { div.main textarea {
background: #002; background: #000;
color: #fff; color: #EE9;
font: 8pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; font: 8pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
} }
div.news { div.news {
margin: 15px 15px 15px 220px; margin: 15px 15px 15px 220px;
padding: 5px 30px 10px 30px; padding: 5px 30px 10px 30px;
border: 1px solid #99f; border: 1px solid #494;
background: #004; background: #000;
background-image: -moz-linear-gradient(top, bottom, from(#003), to(#005), color-stop(30%, #003), color-stop(100%, #001)); /* background-image: -moz-linear-gradient(top, bottom, from(#030), to(#005), color-stop(30%, #030), color-stop(100%, #000));///*/
/* background: #003 url("images/darkbluetile.png");*/ background: #000 url("images/bg2.png")no-repeat scroll bottom right;
color: #aaf; color: #7b7;
border-radius: 4px; border-radius: 4px;
-moz-border-radius: 4px; -moz-border-radius: 4px;
-khtml-border-radius: 4px; -khtml-border-radius: 4px;
font-size: 7.5pt; font-size: 7.5pt;
text-align: right; text-align: right;
-moz-box-shadow: inset 0px 0px 1px 0px #eef; /* -moz-box-shadow: inset 0px 0px 0px 0px #EE9;
-khtml-box-shadow: inset 0px 0px 1px 0px #eef; -khtml-box-shadow: inset 0px 0px 1px 0px #EE9;
box-shadow: inset 0px 0px 1px 0px #eef; box-shadow: inset 0px 0px 1px 0px #EE9;*/
-moz-box-shadow: 0 1px 5px #000;
min-width: 590px;
} }
div.news li { div.news li {
text-align: justify; text-align: justify;
list-style: url('images/info_dark.png'); list-style: url('images/info_dark.png');
margin: 0 10px 0 20px; list-style: none;
margin: 0 10px 0 0px;
padding: 5px 5px 5px 0; padding: 5px 5px 5px 0;
vertical-align: middle; vertical-align: middle;
word-wrap: break-word; word-wrap: break-word;
color: #99f; color: #494;
} }
div.news h4 { div.news h4 {
border-bottom: 1px; border-bottom: 1px;
border-bottom-style: dotted; border-bottom-style: dotted;
border-bottom-color: #99f; border-bottom-color: #494;
padding: 0 0 0px 0; padding: 0 0 0px 0;
margin: 5px 0 10px 0; margin: 5px 0 10px 0;
font-size: 10pt; font-size: 10pt;
@ -337,7 +359,7 @@ div.news h4:first-child {
div.news p { div.news p {
margin-top: -5px; margin-top: -5px;
font-size: 8.5pt; font-size: 8.5pt;
color: #eef; color: #EE9;
} }
div.news hr { div.news hr {
@ -347,31 +369,25 @@ div.news hr {
div.confignav { div.confignav {
padding: 15px 10px !important; padding: 15px 10px !important;
margin: 15px 0; margin: 15px 0;
background: #004 url('images/darkbluebg.png'); background: #000 url('images/header.png') center center repeat-x ;
-moz-border-radius: 4px; -moz-border-radius: 4px;
-khtml-border-radius: 4px; -khtml-border-radius: 4px;
border-radius: 4px; border-radius: 4px;
border: 1px solid #99f; border: 1px solid #494;
font-size: 9.5pt !important; font-size: 9.5pt !important;
font-weight: bold !important; font-weight: bold !important;
line-height: 160% !important; line-height: 160% !important;
-moz-box-shadow: inset 0px 0px 1px 0px #eef;
-khtml-box-shadow: inset 0px 0px 1px 0px #eef;
box-shadow: inset 0px 0px 1px 0px #eef;
} }
div.configure { div.configure {
padding: 5px 15px 0 15px; /* padding: 5px 15px 0 15px;
margin: 10px 0px; margin: 10px 0px;
background: #005;
-moz-border-radius: 4px; -moz-border-radius: 4px;
-khtml-border-radius: 4px; -khtml-border-radius: 4px;
border-radius: 4px; border-radius: 4px;
border: 1px solid #99f; border: 1px solid #494; */
background: #003 url(images/darkbluebg.png); background: #000;/* url(images/camotile2.png);*/
-moz-box-shadow: inset 0px 0px 1px 0px #eef;
-khtml-box-shadow: inset 0px 0px 1px 0px #eef;
box-shadow: inset 0px 0px 1px 0px #eef;
} }
div.messages { div.messages {
@ -380,11 +396,8 @@ div.messages {
-moz-border-radius: 4px; -moz-border-radius: 4px;
-khtml-border-radius: 4px; -khtml-border-radius: 4px;
border-radius: 4px; border-radius: 4px;
border: 1px solid #99f; border: 1px solid #494;
background: #008 url('images/lightbluetile.png'); background: #000;/* url('images/lightbluetile.png');*/
-moz-box-shadow: inset 0px 0px 1px 0px #eef;
-khtml-box-shadow: inset 0px 0px 1px 0px #eef;
box-shadow: inset 0px 0px 1px 0px #eef;
font-weight: bold; font-weight: bold;
font-size: 9pt; font-size: 9pt;
color: #ddf; color: #ddf;
@ -408,20 +421,20 @@ div.messages li {
} }
div.graphspanel { div.graphspanel {
padding: 10px 15px 0 15px; padding: 0;
margin: 15px 0px; margin: 15px 0px -15px 0;
background: #005;
-moz-border-radius: 4px; -moz-border-radius: 4px;
-khtml-border-radius: 4px; -khtml-border-radius: 4px;
border-radius: 4px; border-radius: 4px;
border: 1px solid #99f; /* border: 1px solid #494;*/
background: #003 url(images/darkbluebg.png); background: #000;/* url(images/camotile.png);*/
-moz-box-shadow: inset 0px 0px 1px 0px #eef;
-khtml-box-shadow: inset 0px 0px 1px 0px #eef;
box-shadow: inset 0px 0px 1px 0px #eef;
text-align: center; text-align: center;
} }
div.widepanel h3 {
text-align: left !important;
}
div.graphspanel form { div.graphspanel form {
text-align: left; text-align: left;
padding: 0 15px 0px 15px; padding: 0 15px 0px 15px;
@ -432,23 +445,21 @@ div.graphspanel hr {
} }
div.graphspanel img { div.graphspanel img {
border: 1px solid #001; border: 1px solid #494;
padding: 3px; padding: 3px;
margin: 5px; margin: 5px;
text-align: center !important; text-align: center !important;
background: #002; background: #000;
-moz-box-shadow: inset 0px 0px 1px 0px #eef;
-khtml-box-shadow: inset 0px 0px 1px 0px #eef;
box-shadow: inset 0px 0px 1px 0px #eef;
opacity: 0.8; opacity: 0.8;
} }
div.graphspanel img:hover { div.graphspanel img:hover {
border: 1px solid #001; border: 1px solid #000;
padding: 3px; padding: 3px;
margin: 5px; margin: 5px;
text-align: center !important; text-align: center !important;
background: #002; background: #000;
-moz-box-shadow: inset 0px 0px 1px 1px #f60; -moz-box-shadow: inset 0px 0px 1px 1px #f60;
-khtml-box-shadow: inset 0px 0px 1px 1px #f60; -khtml-box-shadow: inset 0px 0px 1px 1px #f60;
box-shadow: inset 0px 0px 1px 1px #f60; box-shadow: inset 0px 0px 1px 1px #f60;
@ -458,18 +469,18 @@ div.graphspanel img:hover {
table { table {
border-collapse: collapse; border-collapse: collapse;
width: 100%; width: 100%;
border: 1px solid #99f; border: 1px solid #494;
cell-padding: 1px; cell-padding: 1px;
font-size: 7pt; font-size: 7pt;
background: #003; background: #030;
margin: 1px 0; margin: 1px 0;
} }
table hr { table hr {
padding: 0px 0; padding: 0px 0;
color: #99f; color: #494;
background: #99f; background: #494;
border: 0px solid #99f; border: 0px solid #494;
margin: 0px 0px; margin: 0px 0px;
height: 1px; height: 1px;
display: none; display: none;
@ -477,12 +488,13 @@ table hr {
th { th {
padding: 6px 2px; padding: 6px 2px;
color: #eef; color: #EE9;
text-align: center; text-align: center;
font-size: 9pt; font-size: 9pt;
background: #004 url('images/tabletitledark.png') repeat-x; background: #000; /*url('images/tabletitledark.png') repeat-x;*/
border-top: 1px solid #99f; background: #000 url('images/header.png') center center repeat-x ;
border-bottom: 1px solid #99f !important; border-top: 1px solid #494;
border-bottom: 1px solid #494 !important;
line-height: 110%; line-height: 110%;
} }
@ -491,27 +503,27 @@ tr {
} }
tr:nth-child(even) { tr:nth-child(even) {
background: #002 url('images/darkerbluetile.png') !important; background: #010;/* url('images/darkerbluetile.png') !important;*/
vertical-align: middle; vertical-align: middle;
} }
tr:nth-child(odd) { tr:nth-child(odd) {
background: #003 url('images/darkbluetile.png') !important; background: #000800;/* url('images/darkbluetile.png') !important;*/
vertical-align: middle; vertical-align: middle;
} }
/* /*
tr:last-child { tr:last-child {
background: #004 url('images/lightbluetile.png') !important; background: #004 url('images/lightbluetile.png') !important;
font-weight: bold; font-weight: bold;
border: 1px solid #99f !important; border: 1px solid #494 !important;
} }
*/ */
td { td {
padding: 6px 3px; padding: 4px 6px;
color: #eef; color: #EE9;
vertical-align: middle; vertical-align: middle;
border-top: 1px inset #006; border-top: 1px inset #494;
border-bottom: 1px outset #006; border-bottom: 1px outset #494;
} }
td img { td img {
@ -529,7 +541,7 @@ div.main li {
list-style: square; list-style: square;
margin: 2px 0px 2px 30px; margin: 2px 0px 2px 30px;
padding: 1px 20px 1px 0px; padding: 1px 20px 1px 0px;
line-height: 150%; /* line-height: 150%;*/
word-wrap: break-word; word-wrap: break-word;
} }
@ -559,18 +571,19 @@ ul {
code { code {
text-align: left; text-align: left;
font: 8pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; font: 8.5pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
color: #dd0;
} }
a:link, h2 a:link{ a:link, h2 a:link{
color: #99f; color: #494;
text-decoration: none; text-decoration: none;
font-weight: bold; font-weight: bold;
word-wrap: break-word; word-wrap: break-word;
} }
a:visited{ a:visited{
color: #77f; color: #7b7;
text-decoration: none; text-decoration: none;
font-weight: bold; font-weight: bold;
word-wrap: break-word; word-wrap: break-word;
@ -601,7 +614,7 @@ p {
h1 { h1 {
text-align: left; text-align: left;
color: #fff; color: #EE9;
padding: 10px 15px; padding: 10px 15px;
margin: 0 15px 10px 220px; margin: 0 15px 10px 220px;
font-size: 16pt; font-size: 16pt;
@ -609,65 +622,68 @@ h1 {
font-style: normal; font-style: normal;
text-transform: uppercase; text-transform: uppercase;
letter-spacing: 0.15em; letter-spacing: 0.15em;
text-shadow: 0px 0px 3px rgba(255, 255, 255, 0.8); text-shadow: 0px 0px 2px #010;
white-space: normal; white-space: normal;
background: #002 //url('images/darkbluebg.png'); background: #000 url("images/scope.png")no-repeat scroll right top;
background-image: -moz-linear-gradient(top, bottom, from(#001), to(#003), color-stop(30%, #001), color-stop(100%, #001)); background: #000 url("images/bg2.png")no-repeat scroll top right;
-moz-box-shadow: inset 0px 0px 1px 0px #eef; background: #000 url('images/header.png') center center ;
-khtml-box-shadow: inset 0px 0px 1px 0px #eef; background-image: -moz-linear-gradient(top, bottom, from(#000), to(#030), color-stop(30%, #000), color-stop(100%, #000));
box-shadow: inset 0px 0px 1px 0px #eef; border: 1px solid #494;
border: 1px solid #99f;
border-radius: 4px; border-radius: 4px;
-moz-border-radius: 4px; -moz-border-radius: 4px;
-khtml-border-radius: 4px; -khtml-border-radius: 4px;
line-height: 120%; line-height: 120%;
min-width: 620px;
-moz-box-shadow: 0 1px 5px #000;
} }
h2 { h2 {
font-size: 12pt; font-size: 12pt;
color: #fff; color: #EE9;
text-shadow: 0px 0px 1px rgba(255, 255, 255, 0.5); text-shadow: 0px 0px 2px #010;
letter-spacing: 0.05em; letter-spacing: 0.05em;
background: #002; // url('images/darkbluebg.png'); background: #000 url(images/camotile2.png);
background-image: -moz-linear-gradient(top, bottom, from(#001), to(#003), color-stop(30%, #001), color-stop(100%, #001)); background-image: -moz-linear-gradient(top, bottom, from(#000), to(#030), color-stop(30%, #000), color-stop(100%, #000));
background: #000 url('images/header.png') center center ;
padding: 5px 10px 8px 10px; padding: 5px 10px 8px 10px;
wordwrap: none; wordwrap: none;
border: 1px solid #99f; border: 1px solid #494;
border-radius: 4px; border-radius: 4px;
-moz-border-radius: 4px; -moz-border-radius: 4px;
-khtml-border-radius: 4px; -khtml-border-radius: 4px;
vertical-align: middle; vertical-align: middle;
margin: 15px 0 12px 0 !important; margin: 15px 0 12px 0 !important;
-moz-box-shadow: inset 0px 0px 1px 0px #eef; text-transform: uppercase;
-khtml-box-shadow: inset 0px 0px 1px 0px #eef;
box-shadow: inset 0px 0px 1px 0px #eef;
word-wrap: break-word; word-wrap: break-word;
} }
h2 a:visited { h2 a:visited {
color: #44f; color: #191;
} }
h2 a:hover { h2 a:hover {
color: #f60; color: #f60;
text-shadow: 0px 0px 1px rgba(255, 255, 72, 0.9); text-shadow: 0px 0px 1px rgba(255, 64, 0, 0.7);
} }
h3 { h3 {
border: 1px solid #99f; border: 1px solid #494;
border-left: 5px solid #99f; border-left: 5px solid #494;
padding: 3px 5px 3px 5px; padding: 5px 6px;
margin: 12px 0 10px 0; margin: 12px 0 10px 0;
border-radius: 0 4px 4px 0; border-radius: 0 4px 4px 0;
-moz-border-radius: 0 4px 4px 0; -moz-border-radius: 0 4px 4px 0;
-khtml-border-radius: 0 4px 4px 0; -khtml-border-radius: 0 4px 4px 0;
background: #002; background: #000 url(images/camotile.png);
background: #000 url('images/header.png') center center ;
text-transform: uppercase;
text-shadow: 0px 0px 2px #010;
} }
h4 { h4 {
border-bottom: 1px; border-bottom: 1px;
border-bottom-style: solid; border-bottom-style: solid;
border-bottom-color: #99f; border-bottom-color: #494;
padding: 0 0 10px 0; padding: 0 0 10px 0;
margin: 5px 0 10px 0; margin: 5px 0 10px 0;
font-size: 11pt; font-size: 11pt;
@ -675,9 +691,8 @@ h4 {
button, button:visited { button, button:visited {
font: bold 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; font: bold 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
border: 1px outset #77f; border: 1px outset #191;
padding: 1px 3px; padding: 1px 3px;
background: #bbf;
text-decoration: none; text-decoration: none;
border-radius: 4px; border-radius: 4px;
-moz-border-radius: 4px; -moz-border-radius: 4px;
@ -688,26 +703,26 @@ button, button:visited {
text-align: center; text-align: center;
vertical-align: middle; vertical-align: middle;
min-width: 76px; min-width: 76px;
-moz-box-shadow: inset 0px 1px 1px 0px #55f; -moz-box-shadow: inset 0px 1px 1px 0px #494;
-khtml-box-shadow: inset 0px 1px 1px 0px #55f; -khtml-box-shadow: inset 0px 1px 1px 0px #191;
box-shadow: inset 0px 1px 1px 0px #55f; box-shadow: inset 0px 1px 1px 0px #191;
background: #003; background: #000;
color: #99f; color: #494;
} }
button:hover { button:hover {
border: 1px solid #f60; border: 1px solid #f60;
-moz-box-shadow: inset 0px 1px 1px 0px #eef; -moz-box-shadow: inset 0px 1px 1px 0px #EE9;
-khtml-box-shadow: inset 0px 1px 1px 0px #eef; -khtml-box-shadow: inset 0px 1px 1px 0px #EE9;
box-shadow: inset 0px 1px 1px 0px #eef; box-shadow: inset 0px 1px 1px 0px #EE9;
background: #001; background: #000;
color: #f60; color: #f60;
} }
button:active { button:active {
border: 1px inset #f60; border: 1px inset #f60;
background: #f60; background: #f60;
color: #fff; color: #EE9;
-moz-box-shadow: inset 0px 0px 0px 0px #f60; -moz-box-shadow: inset 0px 0px 0px 0px #f60;
-khtml-box-shadow: inset 0px 0px 0px 0px #f60; -khtml-box-shadow: inset 0px 0px 0px 0px #f60;
box-shadow: inset 0px 0px 0px 0px #f60; box-shadow: inset 0px 0px 0px 0px #f60;
@ -720,9 +735,9 @@ button:active {
} }
.langbox { .langbox {
margin: 2px 2px 2px 5px; margin: 17px 2px 2px 5px;
padding: 7px 10px 5px 10px; padding: 7px 10px 5px 10px;
color: #eef; color: #EE9;
font-size: 7pt; font-size: 7pt;
width: 220px; width: 220px;
text-align: right; text-align: right;
@ -730,11 +745,21 @@ button:active {
vertical-align: middle; vertical-align: middle;
} }
.langbox img {
opacity: 0.7;
-moz-box-shadow: 0 0 1px #000;
}
.langbox img:hover {
opacity: 1;
-moz-box-shadow: 0 0 1px #f60;
}
hr { hr {
color: #99f; color: #494;
background: #99f; background: #494;
height: 1px; height: 1px;
border: 0px solid #99f; border: 0px solid #494;
margin: 10px 0; margin: 10px 0;
} }
@ -748,12 +773,12 @@ sidebarlogo {
} }
input { input {
border: 1px outset #55f; border: 1px outset #5f5;
-moz-box-shadow: inset 0px 1px 1px 0px #55f; -moz-box-shadow: inset 0px 1px 1px 0px #373;
-khtml-box-shadow: inset 0px 1px 1px 0px #55f; -khtml-box-shadow: inset 0px 1px 1px 0px #373;
box-shadow: inset 0px 1px 1px 0px #55f; box-shadow: inset 0px 1px 1px 0px #373;
background: #003; background: #000;
color: #99f; color: #494;
margin: 5px; margin: 5px;
font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
padding: 1px 2px; padding: 1px 2px;
@ -765,16 +790,16 @@ input {
} }
input:hover { input:hover {
background: #001; background: #000;
color: #f60; color: #f60;
border: 1px solid #f60; border: 1px solid #f60;
-moz-box-shadow: inset 0px 1px 1px 0px #eef; -moz-box-shadow: inset 0px 1px 1px 0px #9e9;
-khtml-box-shadow: inset 0px 1px 1px 0px #eef; -khtml-box-shadow: inset 0px 1px 1px 0px #9e9;
box-shadow: inset 0px 1px 1px 0px #eef; box-shadow: inset 0px 1px 1px 0px #9e9;
} }
input:active { input:active {
background: #002; background: #000;
color: #f30; color: #f30;
border: 1px solid #f30; border: 1px solid #f30;
} }
@ -782,16 +807,16 @@ input:active {
input:active { input:active {
border: 1px inset #f60; border: 1px inset #f60;
background: #f60; background: #f60;
color: #fff; color: #EE9;
} }
input[type=text] { input[type=text] {
background: #002; background: #000;
color: #eef; color: #EE9;
margin: 5px 10px; margin: 5px 10px;
padding: 4px 2px; padding: 4px 2px;
font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
border: 1px solid #bbf; border: 1px solid #494 !important;
text-decoration: none; text-decoration: none;
border-radius: 4px; border-radius: 4px;
-moz-border-radius: 4px; -moz-border-radius: 4px;
@ -802,7 +827,7 @@ input[type=text] {
} }
input[type=text]:active, input[type=text]:hover { input[type=text]:active, input[type=text]:hover {
background: #001; background: #000;
} }
fieldset { fieldset {
@ -811,10 +836,10 @@ position: relative;
} }
select { select {
background: #002; background: #000;
color: #eef; color: #EE9;
margin: 5px 10px; margin: 5px 10px;
border: 1px solid #bbf; border: 1px solid #494;
border-radius: 4px; border-radius: 4px;
-moz-border-radius: 4px; -moz-border-radius: 4px;
-khtml-border-radius: 4px; -khtml-border-radius: 4px;
@ -824,8 +849,8 @@ select {
} }
textarea { textarea {
background: #001; background: #000;
color: #eef; color: #EE9;
padding: 5px; padding: 5px;
margin: 10px; margin: 10px;
border-radius: 4px; border-radius: 4px;
@ -835,7 +860,7 @@ textarea {
min-height: 100px; min-height: 100px;
min-width: 97%; min-width: 97%;
text-align: left; text-align: left;
border: 1px solid #99f; border: 1px solid #494;
} }
form {} form {}
@ -849,39 +874,37 @@ form {}
border-radius: 4px; border-radius: 4px;
-moz-border-radius: 4px; -moz-border-radius: 4px;
-khtml-border-radius: 4px; -khtml-border-radius: 4px;
border: 1px solid #001; border: 1px solid #000;
display: none; display: none;
} }
.statusnotes { .statusnotes {
font-style: italic; font-style: italic;
font-size: 8pt; font-size: 8pt;
color: #eef; color: #EE9;
text-align: center; text-align: center;
border: 1px solid #99f !important; border: 1px solid #494 !important;
/* border-top: 0px !important;*/ /* border-top: 0px !important;*/
margin: -3px 0 5px 0; margin: -3px 0 5px 0;
padding: 7px; padding: 7px;
background: #004; background: #010;
-moz-box-shadow: inset 0px 0px 0px 1px #009; -moz-box-shadow: inset 0px 0px 0px 1px #090;
-khtml-box-shadow: inset 0px 0px 0px 1px #009; -khtml-box-shadow: inset 0px 0px 0px 1px #090;
box-shadow: inset 0px 0px 0px 1px #009; box-shadow: inset 0px 0px 0px 1px #090;
/* background: #000 url('images/header.png') repeat-x center center !important;*/
} }
div.joblog { div.joblog {
margin: 15px 0 15px 0; /* margin: 15px 0 15px 0;
padding: 5px 20px 10px 20px !important; padding: 5px 20px 10px 20px !important;
border: 1px solid #99f; border: 1px solid #494;
background-color: #004; background-color: #000;
background: url("images/darkbluebg.png"); background: #000; url("images/camotile.png");*/
color: #dfd; /* color: #dfd;*/
border-radius: 4px; border-radius: 4px 4px 0 0;
-moz-border-radius: 4px; -moz-border-radius: 4px 4px 0 0;
-khtml-border-radius: 4px; -khtml-border-radius: 4px 4px 0 0;
text-align: justify !important; text-align: justify !important;
-moz-box-shadow: inset 0px 0px 1px 0px #eef;
-khtml-box-shadow: inset 0px 0px 1px 0px #eef;
box-shadow: inset 0px 0px 1px 0px #eef;
overflow-x: scroll; /* Opera fix */ overflow-x: scroll; /* Opera fix */
} }
@ -953,14 +976,14 @@ position: relative;
} }
.cells { .cells {
border: 1px inset #005; border: 1px inset #494;
border-left: 1px outset #002; border-left: 1px outset #494;
} }
.tablefooter tr, .tablefooter td { .tablefooter tr, .tablefooter td {
background: #004 url('images/tabletitledark.png') repeat-x !important; background: #000 url('images/header.png') repeat-x center center !important;
border-top: 1px solid #99f; border-top: 1px solid #494;
border-bottom: 1px solid #99f !important; border-bottom: 1px solid #494 !important;
font-size: 7pt; font-size: 7pt;
line-height: 110%; line-height: 110%;
} }

View File

@ -1,9 +1,11 @@
/* I2P Console theme: "Camo" by dr|z3d. Aka "dark". As in ops. */
body { body {
margin: 0px; margin: 0px;
padding: 0px; padding: 0px;
text-align: center; text-align: center;
font-family: "Lucida Sans Unicode", Verdana, Helvetica, sans-serif; font-family: "Lucida Sans Unicode", Verdana, Helvetica, sans-serif;
background-color: #001; background: #010 url('images/camotile.png') center bottom;
color: #000000; color: #000000;
font-size: 9pt; font-size: 9pt;
/* we've avoided Tantek Hacks so far, /* we've avoided Tantek Hacks so far,
@ -39,14 +41,14 @@ h4 {
font-size: 14px; font-size: 14px;
font-weight: bold !important; font-weight: bold !important;
text-align: center; text-align: center;
border: 1px solid #99f; border: 1px solid #494;
margin: 5px 0 15px 0; margin: 5px 0 15px 0;
padding: 5px 10px; padding: 5px 10px;
background: #004 url(images/tabletitledark.png) repeat-x; background: #000 url('images/header.png') center center repeat-x ;
text-transform: uppercase; text-transform: uppercase;
text-shadow: 0px 0px 2px rgba(255, 255, 255, 0.9); text-shadow: 0px 0px 2px rgba(0, 0, 0, 0.9);
letter-spacing: 0.08em; letter-spacing: 0.08em;
-moz-box-shadow: inset 0px 0px 4px 0px #009; -moz-box-shadow: inset 0px 0px 4px 0px #090;
-moz-border-radius: 4px; -moz-border-radius: 4px;
-khtml-border-radius: 4px; -khtml-border-radius: 4px;
border-radius: 4px; border-radius: 4px;
@ -73,7 +75,7 @@ button {
} }
textarea { textarea {
border: 1px solid #9999ff; border: 1px solid #494;
} }
br { br {
@ -121,21 +123,21 @@ hr {
clear: both; clear: both;
height: 1px; height: 1px;
margin: 3px 0px 3px 0px; margin: 3px 0px 3px 0px;
border-bottom: 1px solid #99f; border-bottom: 1px solid #494;
} }
.subdivider { .subdivider {
border-bottom: 1px solid #99f; border-bottom: 1px solid #494;
padding: 5px 0px 0px 0px; padding: 5px 0px 0px 0px;
} }
.freetext { .freetext {
width: 150px; width: 150px;
height : 22px; height : 22px;
border: 1px solid #9999ff; border: 1px solid #494;
padding: 2px; padding: 2px;
margin: 4px 0 2px 4px; margin: 4px 0 2px 4px;
background-color: #002; background-color: #020;
font: bold 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; font: bold 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
} }
@ -147,8 +149,8 @@ hr {
max-height: 24px; max-height: 24px;
font-size: 9pt; font-size: 9pt;
font-weight: bold; font-weight: bold;
background-color: #b4c8ff; background-color: #000;
color: black; color: #9f9 !important;
border: 1px outset #ddddc0; border: 1px outset #ddddc0;
text-align: center; text-align: center;
white-space: nowrap; white-space: nowrap;
@ -159,18 +161,25 @@ hr {
background: url(images/tabletitlelight.png) repeat: x; background: url(images/tabletitlelight.png) repeat: x;
vertical-align: middle; vertical-align: middle;
text-decoration: none; text-decoration: none;
border: 1px outset #5f5;
-moz-box-shadow: inset 0px 1px 1px 0px #373;
-khtml-box-shadow: inset 0px 1px 1px 0px #373;
box-shadow: inset 0px 1px 1px 0px #373;
} }
.control:link { .control:link {
color: #001; color: #9f9;
text-decoration: none; text-decoration: none;
} }
.control:hover { .control:hover {
border: 1px solid #eeeeff; border: 1px solid #f60;
background-color: #003; background-color: #000;
color: #ff6600 !important; color: #f60 !important;
text-decoration: none; text-decoration: none;
-moz-box-shadow: inset 0px 1px 1px 0px #fff;
-khtml-box-shadow: inset 0px 1px 1px 0px #fff;
box-shadow: inset 0px 1px 1px 0px #fff;
} }
.control:active { .control:active {
@ -181,7 +190,7 @@ hr {
} }
.control:visited { .control:visited {
color: #001; color: #010;
text-decoration: none; text-decoration: none;
} }
@ -192,12 +201,12 @@ hr {
text-align: left; text-align: left;
font-size: 9pt; font-size: 9pt;
color: white; color: white;
background-color: #002; background-color: #020;
background: url(images/darkbluebg.png); background: #000; /*url(images/camotile2.png);*/
-moz-border-radius: 4px; -moz-border-radius: 4px;
-khtml-border-radius: 4px; -khtml-border-radius: 4px;
border-radius: 4px; border-radius: 4px;
border: 1px solid #99f; border: 1px solid #494;
padding: 10px 20px; padding: 10px 20px;
} }
@ -235,15 +244,15 @@ hr {
} }
#globalOperationsPanel { #globalOperationsPanel {
background-color: #003; background-color: #030;
border: 1px solid #99f; border: 1px solid #494;
background: url(images/darkbluebg.png); -moz-box-shadow: inset 0px 0px 0px 1px #932;
-moz-box-shadow: inset 0px 0px 0px 1px #f00;
padding: 5px 20px 11px 10px !important; padding: 5px 20px 11px 10px !important;
background: #000; /*url(images/camotile2.png);*/
} }
#globalOperationsPanel .control { #globalOperationsPanel .control {
width: 100px; width: 120px;
} }
.header { .header {
@ -254,12 +263,12 @@ hr {
} }
a:link{ a:link{
color: #99f; color: #494;
text-decoration: none; text-decoration: none;
} }
a:visited{ a:visited{
color: #7bb; color: #7b7;
text-decoration: none; text-decoration: none;
} }
@ -274,12 +283,12 @@ a:active{
} }
input { input {
background-color: #002; background-color: #020;
color: #eef; color: #eef;
margin: 0 2px 0 2px; margin: 0 2px 0 2px;
font-family: "Lucida Sans Unicode", Verdana, Tahoma, Helvetica, sans-serif; font-family: "Lucida Sans Unicode", Verdana, Tahoma, Helvetica, sans-serif;
font-weight: bold; font-weight: bold;
border: 1px solid #99f; border: 1px solid #494;
/* /*
padding: 0px 2px 1px 2px; padding: 0px 2px 1px 2px;
*/ */
@ -292,17 +301,17 @@ input hover {
margin: 0 2px 0 2px; margin: 0 2px 0 2px;
font-family: "Lucida Sans Unicode", Verdana, Tahoma, Helvetica, sans-serif; font-family: "Lucida Sans Unicode", Verdana, Tahoma, Helvetica, sans-serif;
font-weight: bold; font-weight: bold;
border: 1px solid #99f; border: 1px solid #494;
padding: 2px; padding: 2px;
text-decoration: none; text-decoration: none;
} }
select { select {
background-color: #001; background-color: #020;
color: #eef; color: #eef;
margin: 6px 2px 0 2px; margin: 6px 2px 0 2px;
font-family: "Lucida Sans Unicode", Verdana, Tahoma, Helvetica, sans-serif; font-family: "Lucida Sans Unicode", Verdana, Tahoma, Helvetica, sans-serif;
border: 1px solid #99f; border: 1px solid #494;
padding: 2px 2px 2px 4px; padding: 2px 2px 2px 4px;
max-height: 24px; max-height: 24px;
} }

View File

@ -1,5 +1,6 @@
/* I2P Tunnel Edit Page /* I2P Console theme: "Camo" by dr|z3d. Aka "dark". As in ops. */
*/ /* I2P Tunnel Edit Page */
#tunnelEditPage input { #tunnelEditPage input {
width: 458px; width: 458px;
} }
@ -82,8 +83,9 @@
height: 100px; height: 100px;
padding: 4px; padding: 4px;
margin: 0 0 3px 0; margin: 0 0 3px 0;
background-color: #000088; background-color: #040;
color: #fff; /* background: #000 url("images/helitile.png")no-repeat scroll right top;*/
color: #ee9;
font-family: "Lucida Console", "Andale Mono", "Courier New", Courier, mono; font-family: "Lucida Console", "Andale Mono", "Courier New", Courier, mono;
border: 1px inset #002; border: 1px inset #002;
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 917 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 227 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

View File

@ -1,4 +1,4 @@
/* Not yet complete. Subject to flux and change. dr|z3d - 07.25.09 */ /* I2P Console Theme "Corporat" by dr|z3d. Aka "light". As in beer.*/
body { body {
margin: 15px 0 0 10px; margin: 15px 0 0 10px;
@ -714,11 +714,11 @@ button:active{
} }
.langbox { .langbox {
margin: 4px 2px 4px 5px; margin: 4px 10px 4px 5px;
padding: 5px 5px; padding: 5px 5px;
color: #001; color: #001;
font-size: 7pt; font-size: 7pt;
width: 220px; width: 260px;
text-align: right; text-align: right;
float: right; float: right;
valign: middle; valign: middle;

View File

@ -738,10 +738,10 @@ p {
} }
.langbox { .langbox {
margin: 17px -20px 0px 5px; margin: 17px -30px 0px 5px;
color: #eef; color: #eef;
font-size: 7pt; font-size: 7pt;
width: 220px; width: 280px;
text-align: center; text-align: center;
float: right; float: right;
valign: middle; valign: middle;

View File

@ -19,10 +19,12 @@ import java.util.GregorianCalendar;
import java.util.HashSet; import java.util.HashSet;
import java.util.Iterator; import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Properties; import java.util.Properties;
import java.util.Set; import java.util.Set;
import java.util.TimeZone; import java.util.TimeZone;
import java.util.TreeSet; import java.util.TreeSet;
import java.util.concurrent.ConcurrentHashMap;
import net.i2p.CoreVersion; import net.i2p.CoreVersion;
import net.i2p.crypto.DHSessionKeyBuilder; import net.i2p.crypto.DHSessionKeyBuilder;
@ -57,7 +59,7 @@ import net.i2p.util.SimpleTimer;
public class Router { public class Router {
private Log _log; private Log _log;
private RouterContext _context; private RouterContext _context;
private final Properties _config; private final Map<String, String> _config;
/** full path */ /** full path */
private String _configFilename; private String _configFilename;
private RouterInfo _routerInfo; private RouterInfo _routerInfo;
@ -120,7 +122,7 @@ public class Router {
public Router(String configFilename) { this(configFilename, null); } public Router(String configFilename) { this(configFilename, null); }
public Router(String configFilename, Properties envProps) { public Router(String configFilename, Properties envProps) {
_gracefulExitCode = -1; _gracefulExitCode = -1;
_config = new Properties(); _config = new ConcurrentHashMap();
if (configFilename == null) { if (configFilename == null) {
if (envProps != null) { if (envProps != null) {
@ -168,15 +170,9 @@ public class Router {
readConfig(); readConfig();
if (envProps == null) { if (envProps == null)
envProps = _config; envProps = new Properties();
} else { envProps.putAll(_config);
for (Iterator iter = _config.keySet().iterator(); iter.hasNext(); ) {
String k = (String)iter.next();
String v = _config.getProperty(k);
envProps.setProperty(k, v);
}
}
// This doesn't work, guess it has to be in the static block above? // This doesn't work, guess it has to be in the static block above?
// if (Boolean.valueOf(envProps.getProperty("router.disableIPv6")).booleanValue()) // if (Boolean.valueOf(envProps.getProperty("router.disableIPv6")).booleanValue())
@ -203,6 +199,15 @@ public class Router {
System.exit(-1); System.exit(-1);
} }
if (_config.get("router.firstVersion") == null) {
// These may be useful someday. First added in 0.8.2
_config.put("router.firstVersion", RouterVersion.VERSION);
String now = Long.toString(System.currentTimeMillis());
_config.put("router.firstInstalled", now);
_config.put("router.updateLastInstalled", now);
saveConfig();
}
// This is here so that we can get the directory location from the context // This is here so that we can get the directory location from the context
// for the zip file and the base location to unzip to. // for the zip file and the base location to unzip to.
// If it does an update, it never returns. // If it does an update, it never returns.
@ -276,30 +281,20 @@ public class Router {
public void setConfigFilename(String filename) { _configFilename = filename; } public void setConfigFilename(String filename) { _configFilename = filename; }
public String getConfigSetting(String name) { public String getConfigSetting(String name) {
synchronized (_config) { return _config.get(name);
return _config.getProperty(name);
}
} }
public void setConfigSetting(String name, String value) { public void setConfigSetting(String name, String value) {
synchronized (_config) { _config.put(name, value);
_config.setProperty(name, value);
}
} }
public void removeConfigSetting(String name) { public void removeConfigSetting(String name) {
synchronized (_config) {
_config.remove(name); _config.remove(name);
}
} }
public Set getConfigSettings() { public Set getConfigSettings() {
synchronized (_config) {
return new HashSet(_config.keySet()); return new HashSet(_config.keySet());
}
} }
public Properties getConfigMap() { public Properties getConfigMap() {
Properties rv = new Properties(); Properties rv = new Properties();
synchronized (_config) { rv.putAll(_config);
rv.putAll(_config);
}
return rv; return rv;
} }
@ -368,14 +363,19 @@ public class Router {
_context.jobQueue().addJob(new StartupJob(_context)); _context.jobQueue().addJob(new StartupJob(_context));
} }
public void readConfig() { /**
* This updates the config with all settings found in the file.
* It does not clear the config first, so settings not found in
* the file will remain in the config.
*
* This is synchronized with saveConfig()
*/
public synchronized void readConfig() {
String f = getConfigFilename(); String f = getConfigFilename();
Properties config = getConfig(_context, f); Properties config = getConfig(_context, f);
for (Iterator iter = config.keySet().iterator(); iter.hasNext(); ) { // to avoid compiler errror
String name = (String)iter.next(); Map foo = _config;
String val = config.getProperty(name); foo.putAll(config);
setConfigSetting(name, val);
}
} }
/** this does not use ctx.getConfigDir(), must provide a full path in filename */ /** this does not use ctx.getConfigDir(), must provide a full path in filename */
@ -979,7 +979,7 @@ public class Router {
*/ */
public void shutdownGracefully(int exitCode) { public void shutdownGracefully(int exitCode) {
_gracefulExitCode = exitCode; _gracefulExitCode = exitCode;
_config.setProperty(PROP_SHUTDOWN_IN_PROGRESS, "true"); _config.put(PROP_SHUTDOWN_IN_PROGRESS, "true");
synchronized (_gracefulShutdownDetector) { synchronized (_gracefulShutdownDetector) {
_gracefulShutdownDetector.notifyAll(); _gracefulShutdownDetector.notifyAll();
} }
@ -1001,7 +1001,7 @@ public class Router {
*/ */
public int scheduledGracefulExitCode() { return _gracefulExitCode; } public int scheduledGracefulExitCode() { return _gracefulExitCode; }
public boolean gracefulShutdownInProgress() { public boolean gracefulShutdownInProgress() {
return (null != _config.getProperty(PROP_SHUTDOWN_IN_PROGRESS)); return (null != _config.get(PROP_SHUTDOWN_IN_PROGRESS));
} }
/** How long until the graceful shutdown will kill us? */ /** How long until the graceful shutdown will kill us? */
public long getShutdownTimeRemaining() { public long getShutdownTimeRemaining() {
@ -1024,7 +1024,7 @@ public class Router {
private class GracefulShutdown implements Runnable { private class GracefulShutdown implements Runnable {
public void run() { public void run() {
while (true) { while (true) {
boolean shutdown = (null != _config.getProperty(PROP_SHUTDOWN_IN_PROGRESS)); boolean shutdown = (null != _config.get(PROP_SHUTDOWN_IN_PROGRESS));
if (shutdown) { if (shutdown) {
if (_gracefulExitCode == EXIT_HARD || _gracefulExitCode == EXIT_HARD_RESTART || if (_gracefulExitCode == EXIT_HARD || _gracefulExitCode == EXIT_HARD_RESTART ||
_context.tunnelManager().getParticipatingCount() <= 0) { _context.tunnelManager().getParticipatingCount() <= 0) {
@ -1068,26 +1068,24 @@ public class Router {
* this does escape the \r or \n that are unescaped in DataHelper.loadProps(). * this does escape the \r or \n that are unescaped in DataHelper.loadProps().
* Note that the escaping of \r or \n was probably a mistake and should be taken out. * Note that the escaping of \r or \n was probably a mistake and should be taken out.
* *
* FIXME Synchronize!! * Synchronized with file read in getConfig()
*/ */
public boolean saveConfig() { public synchronized boolean saveConfig() {
FileOutputStream fos = null; FileOutputStream fos = null;
try { try {
fos = new SecureFileOutputStream(_configFilename); fos = new SecureFileOutputStream(_configFilename);
StringBuilder buf = new StringBuilder(8*1024); StringBuilder buf = new StringBuilder(8*1024);
buf.append("# NOTE: This I2P config file must use UTF-8 encoding\n"); buf.append("# NOTE: This I2P config file must use UTF-8 encoding\n");
synchronized (_config) { TreeSet ordered = new TreeSet(_config.keySet());
TreeSet ordered = new TreeSet(_config.keySet()); for (Iterator iter = ordered.iterator() ; iter.hasNext(); ) {
for (Iterator iter = ordered.iterator() ; iter.hasNext(); ) { String key = (String)iter.next();
String key = (String)iter.next(); String val = _config.get(key);
String val = _config.getProperty(key);
// Escape line breaks before saving. // Escape line breaks before saving.
// Remember: "\" needs escaping both for regex and string. // Remember: "\" needs escaping both for regex and string.
// NOOO - see comments in DataHelper // NOOO - see comments in DataHelper
//val = val.replaceAll("\\r","\\\\r"); //val = val.replaceAll("\\r","\\\\r");
//val = val.replaceAll("\\n","\\\\n"); //val = val.replaceAll("\\n","\\\\n");
buf.append(key).append('=').append(val).append('\n'); buf.append(key).append('=').append(val).append('\n');
}
} }
fos.write(buf.toString().getBytes("UTF-8")); fos.write(buf.toString().getBytes("UTF-8"));
} catch (IOException ioe) { } catch (IOException ioe) {
@ -1183,6 +1181,9 @@ public class Router {
} }
} }
if (ok) { if (ok) {
// This may be useful someday. First added in 0.8.2
_config.put("router.updateLastInstalled", "" + System.currentTimeMillis());
saveConfig();
boolean deleted = updateFile.delete(); boolean deleted = updateFile.delete();
if (!deleted) { if (!deleted) {
System.out.println("ERROR: Unable to delete the update file!"); System.out.println("ERROR: Unable to delete the update file!");

View File

@ -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 = 4; public final static long BUILD = 6;
/** for example "-test" */ /** for example "-test" */
public final static String EXTRA = ""; public final static String EXTRA = "";

View File

@ -33,21 +33,24 @@ import net.i2p.util.Log;
* *
* The NTCP transport sends individual I2NP messages AES/256/CBC encrypted with * The NTCP transport sends individual I2NP messages AES/256/CBC encrypted with
* a simple checksum. The unencrypted message is encoded as follows: * a simple checksum. The unencrypted message is encoded as follows:
*<pre>
* +-------+-------+--//--+---//----+-------+-------+-------+-------+ * +-------+-------+--//--+---//----+-------+-------+-------+-------+
* | sizeof(data) | data | padding | adler checksum of sz+data+pad | * | sizeof(data) | data | padding | adler checksum of sz+data+pad |
* +-------+-------+--//--+---//----+-------+-------+-------+-------+ * +-------+-------+--//--+---//----+-------+-------+-------+-------+
*</pre>
* That message is then encrypted with the DH/2048 negotiated session key * That message is then encrypted with the DH/2048 negotiated session key
* (station to station authenticated per the EstablishState class) using the * (station to station authenticated per the EstablishState class) using the
* last 16 bytes of the previous encrypted message as the IV. * last 16 bytes of the previous encrypted message as the IV.
* *
* One special case is a metadata message where the sizeof(data) is 0. In * One special case is a metadata message where the sizeof(data) is 0. In
* that case, the unencrypted message is encoded as: * that case, the unencrypted message is encoded as:
*<pre>
* +-------+-------+-------+-------+-------+-------+-------+-------+ * +-------+-------+-------+-------+-------+-------+-------+-------+
* | 0 | timestamp in seconds | uninterpreted * | 0 | timestamp in seconds | uninterpreted
* +-------+-------+-------+-------+-------+-------+-------+-------+ * +-------+-------+-------+-------+-------+-------+-------+-------+
* uninterpreted | adler checksum of sz+data+pad | * uninterpreted | adler checksum of sz+data+pad |
* +-------+-------+-------+-------+-------+-------+-------+-------+ * +-------+-------+-------+-------+-------+-------+-------+-------+
* *</pre>
* *
*/ */
public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {