From 8b5c0a2db112f2944b9f64591a412910e3a2d934 Mon Sep 17 00:00:00 2001 From: sponge Date: Wed, 24 Nov 2010 14:31:54 +0000 Subject: [PATCH 01/19] 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. --- .../src/net/i2p/router/web/PluginStarter.java | 31 +++++++++++++++++-- history.txt | 6 ++++ .../src/net/i2p/router/RouterVersion.java | 2 +- 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java b/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java index 6958b350e..c44b34f39 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java @@ -50,6 +50,7 @@ public class PluginStarter implements Runnable { private static Map pluginThreadGroups = new ConcurrentHashMap(); // one thread group per plugin (map key=plugin name) private static Map> pluginJobs = new ConcurrentHashMap>(); private static Map _clCache = new ConcurrentHashMap(); + private static Map> pluginWars = new ConcurrentHashMap>(); public PluginStarter(RouterContext ctx) { _context = ctx; @@ -125,6 +126,8 @@ public class PluginStarter implements Runnable { File webappDir = new File(consoleDir, "webapps"); String fileNames[] = webappDir.list(RouterConsoleRunner.WarFilenameFilter.instance()); if (fileNames != null) { + if(!pluginWars.containsKey(appName)) + pluginWars.put(appName, new ConcurrentHashSet()); for (int i = 0; i < fileNames.length; i++) { try { String warName = fileNames[i].substring(0, fileNames[i].lastIndexOf(".war")); @@ -139,6 +142,7 @@ public class PluginStarter implements Runnable { //log.error("Starting webapp: " + warName); String path = new File(webappDir, fileNames[i]).getCanonicalPath(); WebAppStarter.startWebApp(ctx, server, warName, path); + pluginWars.get(appName).add(warName); } } catch (IOException 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 Server server = WebAppStarter.getConsoleServer(); if (server != null) { + /* File consoleDir = new File(pluginDir, "console"); Properties props = RouterConsoleRunner.webAppProperties(consoleDir.getAbsolutePath()); File webappDir = new File(consoleDir, "webapps"); @@ -228,6 +233,13 @@ public class PluginStarter implements Runnable { WebAppStarter.stopWebApp(server, warName); } } + */ + Iterator wars = pluginWars.get(appName).iterator(); + while (wars.hasNext()) { + String warName = wars.next(); + WebAppStarter.stopWebApp(server, warName); + } + pluginWars.get(appName).clear(); } // remove summary bar link @@ -487,10 +499,25 @@ public class PluginStarter implements Runnable { isJobRunning = true; break; } + boolean isWarRunning = false; + if(pluginWars.containsKey(pluginName)) { + Iterator it = pluginWars.get(pluginName).iterator(); + while(it.hasNext() && !isWarRunning) { + String warName = it.next(); + if(WebAppStarter.isWebAppRunning(warName)) { + isWarRunning = true; + } + } + } 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; + log.debug("plugin name = <" + pluginName + ">; threads running? " + isClientThreadRunning(pluginName) + "; webapp runing? " + isWarRunning + "; jobs running? " + 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; + // } /** diff --git a/history.txt b/history.txt index 398b6ca0c..8fe1f6c0d 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,9 @@ +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 * Addressbook: Fix rename error on Windows (tkt 323 - thanks RN!) * build.xml: Cleanup, fix distclean error in older ants. diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index f6e6df3a5..4e28a2c8d 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 4; + public final static long BUILD = 5; /** for example "-test" */ public final static String EXTRA = ""; From 1b59135b4a74c33daab9ac72e0ebbbad1ee0fa93 Mon Sep 17 00:00:00 2001 From: zzz Date: Wed, 24 Nov 2010 14:53:24 +0000 Subject: [PATCH 02/19] javadoc, and comment out a test method --- core/java/src/net/i2p/data/Base64.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core/java/src/net/i2p/data/Base64.java b/core/java/src/net/i2p/data/Base64.java index b5e03b03c..fe730af6b 100644 --- a/core/java/src/net/i2p/data/Base64.java +++ b/core/java/src/net/i2p/data/Base64.java @@ -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, -, ~ + * @return the decoded data, null on error */ public static byte[] decode(String s) { return safeDecode(s, false); @@ -234,6 +236,7 @@ public class Base64 { System.out.println("or : Base64 test"); } +/******* private static void test() { String orig = "you smell"; String encoded = Base64.encode(orig.getBytes()); @@ -255,6 +258,7 @@ public class Base64 { else throw new RuntimeException("D(E([all bytes])) != [all bytes]!!!"); } +*******/ /* ******** E N C O D I N G M E T H O D S ******** */ From ffee32535e17638addbfc5462c0e014666773f11 Mon Sep 17 00:00:00 2001 From: zzz Date: Wed, 24 Nov 2010 14:53:41 +0000 Subject: [PATCH 03/19] add more info about trac --- apps/routerconsole/jsp/logs.jsp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/apps/routerconsole/jsp/logs.jsp b/apps/routerconsole/jsp/logs.jsp index 75f052e9b..019564bbe 100644 --- a/apps/routerconsole/jsp/logs.jsp +++ b/apps/routerconsole/jsp/logs.jsp @@ -10,7 +10,11 @@

<%=intl._("I2P Router Logs")%>

<%=intl._("I2P Version & Running Environment")%>

-

<%=intl._("Please report bugs on trac.i2p2.i2p or trac.i2p2.de.")%> +

+<% /* note to translators - both parameters are URLs */ +%><%=intl._("Please report bugs on {0} or {1}.", + "trac.i2p2.i2p", + "trac.i2p2.de")%> <%=intl._("You may use the username \"guest\" and password \"guest\" if you do not wish to register.")%>

<%=intl._("Please include this information in bug reports")%>:

From 4dfac0846b353141152f664dbe93755e7c1bd7cc Mon Sep 17 00:00:00 2001 From: zzz Date: Wed, 24 Nov 2010 14:55:16 +0000 Subject: [PATCH 04/19] add pt, move readme_br to _pt --- .../java/src/net/i2p/router/web/ConfigUIHelper.java | 7 ++++--- .../resources/readme/{readme_br.html => readme_pt.html} | 0 2 files changed, 4 insertions(+), 3 deletions(-) rename installer/resources/readme/{readme_br.html => readme_pt.html} (100%) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java index fbb9bad4f..845bb66a0 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java @@ -46,10 +46,11 @@ public class ConfigUIHelper extends HelperBase { return rv; } - private static final String langs[] = {"de", "en", "es", "fr", "nl", "ru", "sv", "zh"}; - private static final String flags[] = {"de", "us", "es", "fr", "nl", "ru", "se", "cn"}; + private static final String langs[] = {"de", "en", "es", "fr", "nl", "pt", "ru", "sv", "zh"}; + 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"), - _x("Dutch"), _x("Russian"), _x("Swedish"), _x("Chinese")}; + _x("Dutch"), _x("Portuguese"), _x("Russian"), + _x("Swedish"), _x("Chinese")}; /** todo sort by translated string */ public String getLangSettings() { diff --git a/installer/resources/readme/readme_br.html b/installer/resources/readme/readme_pt.html similarity index 100% rename from installer/resources/readme/readme_br.html rename to installer/resources/readme/readme_pt.html From 5f3834d3983a64c5139f183b955cb795a88f3781 Mon Sep 17 00:00:00 2001 From: sponge Date: Wed, 24 Nov 2010 14:55:53 +0000 Subject: [PATCH 05/19] Slackware, fix rc.i2p, bad logic. --- Slackware/i2p-base/rc.i2p_def | 2 +- history.txt | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/Slackware/i2p-base/rc.i2p_def b/Slackware/i2p-base/rc.i2p_def index 075e9e847..c231922e5 100644 --- a/Slackware/i2p-base/rc.i2p_def +++ b/Slackware/i2p-base/rc.i2p_def @@ -4,7 +4,7 @@ i2p_start() { # 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 - if [ ! $? -eq 0 ] ; then { + if [ $? -eq 0 ] ; then { # I2p is already running, so tell the user. echo "I2P is already running..." i2p_status diff --git a/history.txt b/history.txt index 8fe1f6c0d..00b97e989 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,6 @@ +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 From 18a90516b345121b46ba447989a0718fd1ba8c2b Mon Sep 17 00:00:00 2001 From: zzz Date: Wed, 24 Nov 2010 14:56:07 +0000 Subject: [PATCH 06/19] javadoc --- .../src/net/i2p/router/transport/ntcp/NTCPConnection.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java index 4041f3dad..b161909c8 100644 --- a/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java +++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java @@ -33,21 +33,24 @@ import net.i2p.util.Log; * * The NTCP transport sends individual I2NP messages AES/256/CBC encrypted with * a simple checksum. The unencrypted message is encoded as follows: + *

  *  +-------+-------+--//--+---//----+-------+-------+-------+-------+
  *  | sizeof(data)  | data | padding | adler checksum of sz+data+pad |
  *  +-------+-------+--//--+---//----+-------+-------+-------+-------+
+ *
* That message is then encrypted with the DH/2048 negotiated session key * (station to station authenticated per the EstablishState class) using the * 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 * that case, the unencrypted message is encoded as: + *
  *  +-------+-------+-------+-------+-------+-------+-------+-------+
  *  |       0       |      timestamp in seconds     | uninterpreted             
  *  +-------+-------+-------+-------+-------+-------+-------+-------+
  *          uninterpreted           | adler checksum of sz+data+pad |
  *  +-------+-------+-------+-------+-------+-------+-------+-------+
- * 
+ *
* */ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener { From 55db8bf3f604421b2a000147adbf1e71bde47bd3 Mon Sep 17 00:00:00 2001 From: zzz Date: Wed, 24 Nov 2010 14:56:58 +0000 Subject: [PATCH 07/19] save p param across posts --- .../src/org/klomp/snark/web/I2PSnarkServlet.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java index b9f06c877..30139aa69 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -163,7 +163,7 @@ public class I2PSnarkServlet extends Default { String peerParam = req.getParameter("p"); String peerString; - if (peerParam == null) { + if (peerParam == null || !_manager.util().connected()) { peerString = ""; } else { peerString = "?p=" + peerParam; @@ -248,6 +248,9 @@ public class I2PSnarkServlet extends Default { out.write(uri); out.write("\" method=\"POST\">\n"); out.write("\n"); + // don't lose peer setting + if (peerParam != null) + out.write("\n"); } out.write(TABLE_HEADER); out.write("\n"); out.write("\n"); out.write("\n"); + // don't lose peer setting + String peerParam = req.getParameter("p"); + if (peerParam != null) + out.write("\n"); out.write("
"); out.write(""); out.write(_("Add Torrent")); @@ -1036,6 +1043,10 @@ public class I2PSnarkServlet extends Default { out.write("
\n"); out.write("\n"); out.write("\n"); + // don't lose peer setting + String peerParam = req.getParameter("p"); + if (peerParam != null) + out.write("\n"); out.write(""); out.write(""); out.write(_("Create Torrent")); From 868f5b1c38de7444629a59ff6ab3f11735c51f44 Mon Sep 17 00:00:00 2001 From: zzz Date: Wed, 24 Nov 2010 14:58:40 +0000 Subject: [PATCH 08/19] remove dup log --- .../i2p/router/web/ConfigTunnelsHandler.java | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHandler.java index 68f730e96..c43cb1eb5 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHandler.java @@ -14,7 +14,6 @@ import net.i2p.util.Log; * */ public class ConfigTunnelsHandler extends FormHandler { - private Log configTunnel_log; private Map _settings; private boolean _shouldSave; @@ -44,11 +43,10 @@ public class ConfigTunnelsHandler extends FormHandler { * */ private void saveChanges() { - configTunnel_log = _context.logManager().getLog(ConfigTunnelsHandler.class); boolean saveRequired = false; - if (configTunnel_log.shouldLog(Log.DEBUG)) - configTunnel_log.debug("Saving changes, with props = " + _settings + "."); + if (_log.shouldLog(Log.DEBUG)) + _log.debug("Saving changes, with props = " + _settings + "."); int updated = 0; int index = 0; @@ -111,16 +109,16 @@ public class ConfigTunnelsHandler extends FormHandler { } if ("exploratory".equals(poolName)) { - if (configTunnel_log.shouldLog(Log.DEBUG)) { - configTunnel_log.debug("Inbound exploratory settings: " + in); - configTunnel_log.debug("Outbound exploratory settings: " + out); + if (_log.shouldLog(Log.DEBUG)) { + _log.debug("Inbound exploratory settings: " + in); + _log.debug("Outbound exploratory settings: " + out); } _context.tunnelManager().setInboundSettings(in); _context.tunnelManager().setOutboundSettings(out); } else { - if (configTunnel_log.shouldLog(Log.DEBUG)) { - configTunnel_log.debug("Inbound settings for " + client.toBase64() + ": " + in); - configTunnel_log.debug("Outbound settings for " + client.toBase64() + ": " + out); + if (_log.shouldLog(Log.DEBUG)) { + _log.debug("Inbound settings for " + client.toBase64() + ": " + in); + _log.debug("Outbound settings for " + client.toBase64() + ": " + out); } _context.tunnelManager().setInboundSettings(client, in); _context.tunnelManager().setOutboundSettings(client, out); From af519732c46dc44dba68afe8495159c96a7c3732 Mon Sep 17 00:00:00 2001 From: zzz Date: Wed, 24 Nov 2010 14:59:27 +0000 Subject: [PATCH 09/19] save some info we might need later --- router/java/src/net/i2p/router/Router.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/router/java/src/net/i2p/router/Router.java b/router/java/src/net/i2p/router/Router.java index bfcbe83a6..8f1cf83b7 100644 --- a/router/java/src/net/i2p/router/Router.java +++ b/router/java/src/net/i2p/router/Router.java @@ -203,6 +203,15 @@ public class Router { System.exit(-1); } + if (_config.getProperty("router.firstVersion") == null) { + // These may be useful someday. First added in 0.8.2 + _config.setProperty("router.firstVersion", RouterVersion.VERSION); + String now = Long.toString(System.currentTimeMillis()); + _config.setProperty("router.firstInstalled", now); + _config.setProperty("router.updateLastInstalled", now); + saveConfig(); + } + // 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. // If it does an update, it never returns. @@ -1183,6 +1192,9 @@ public class Router { } } if (ok) { + // This may be useful someday. First added in 0.8.2 + _config.setProperty("router.updateLastInstalled", "" + System.currentTimeMillis()); + saveConfig(); boolean deleted = updateFile.delete(); if (!deleted) { System.out.println("ERROR: Unable to delete the update file!"); From 90490cb65d59e08e9e079fe9cf30a18eda8b4662 Mon Sep 17 00:00:00 2001 From: zzz Date: Wed, 24 Nov 2010 15:01:14 +0000 Subject: [PATCH 10/19] cleanup; limit concurrent renderings to conserve memory --- .../net/i2p/router/web/StatSummarizer.java | 87 +++++++++++++++---- 1 file changed, 68 insertions(+), 19 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/StatSummarizer.java b/apps/routerconsole/java/src/net/i2p/router/web/StatSummarizer.java index 72c93330e..f1306a2c1 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/StatSummarizer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/StatSummarizer.java @@ -6,6 +6,7 @@ import java.io.OutputStream; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; +import java.util.concurrent.Semaphore; import net.i2p.router.RouterContext; import net.i2p.stat.Rate; @@ -20,17 +21,20 @@ import org.jrobin.graph.RrdGraphDef; * */ public class StatSummarizer implements Runnable { - private RouterContext _context; - private Log _log; + private final RouterContext _context; + private final Log _log; /** list of SummaryListener instances */ - private List _listeners; + private final List _listeners; private static StatSummarizer _instance; + private static final int MAX_CONCURRENT_PNG = 3; + private final Semaphore _sem; public StatSummarizer() { _context = (RouterContext)RouterContext.listContexts().get(0); // fuck it, only summarize one per jvm _log = _context.logManager().getLog(getClass()); _listeners = new ArrayList(16); _instance = this; + _sem = new Semaphore(MAX_CONCURRENT_PNG, true); } public static StatSummarizer instance() { return _instance; } @@ -44,7 +48,7 @@ public class StatSummarizer implements Runnable { } /** list of SummaryListener instances */ - List getListeners() { return _listeners; } + List getListeners() { return _listeners; } private static final String DEFAULT_DATABASES = "bw.sendRate.60000" + ",bw.recvRate.60000" + @@ -77,31 +81,32 @@ public class StatSummarizer implements Runnable { ( (spec != null) && (oldSpecs != null) && (oldSpecs.equals(spec))) ) return oldSpecs; - List old = parseSpecs(oldSpecs); - List newSpecs = parseSpecs(spec); + List old = parseSpecs(oldSpecs); + List newSpecs = parseSpecs(spec); // remove old ones - for (int i = 0; i < old.size(); i++) { - Rate r = (Rate)old.get(i); + for (Rate r : old) { if (!newSpecs.contains(r)) removeDb(r); } // add new ones StringBuilder buf = new StringBuilder(); - for (int i = 0; i < newSpecs.size(); i++) { - Rate r = (Rate)newSpecs.get(i); + boolean comma = false; + for (Rate r : newSpecs) { if (!old.contains(r)) addDb(r); - buf.append(r.getRateStat().getName()).append(".").append(r.getPeriod()); - if (i + 1 < newSpecs.size()) + if (comma) buf.append(','); + else + comma = true; + buf.append(r.getRateStat().getName()).append(".").append(r.getPeriod()); } return buf.toString(); } private void removeDb(Rate r) { for (int i = 0; i < _listeners.size(); i++) { - SummaryListener lsnr = (SummaryListener)_listeners.get(i); + SummaryListener lsnr = _listeners.get(i); if (lsnr.getRate().equals(r)) { _listeners.remove(i); lsnr.stopListening(); @@ -115,16 +120,40 @@ public class StatSummarizer implements Runnable { lsnr.startListening(); //System.out.println("Start listening for " + r.getRateStat().getName() + ": " + r.getPeriod()); } + public boolean renderPng(Rate rate, OutputStream out) throws IOException { 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) width = GraphHelper.MAX_X; if (height > GraphHelper.MAX_Y) height = GraphHelper.MAX_Y; for (int i = 0; i < _listeners.size(); i++) { - SummaryListener lsnr = (SummaryListener)_listeners.get(i); + SummaryListener lsnr = _listeners.get(i); if (lsnr.getRate().equals(rate)) { lsnr.renderPng(out, width, height, hideLegend, hideGrid, hideTitle, showEvents, periodCount, showCredit); return true; @@ -132,13 +161,15 @@ public class StatSummarizer implements Runnable { } return false; } + public boolean renderPng(OutputStream out, String templateFilename) throws IOException { SummaryRenderer.render(_context, out, templateFilename); return true; } + public boolean getXML(Rate rate, OutputStream out) throws IOException { for (int i = 0; i < _listeners.size(); i++) { - SummaryListener lsnr = (SummaryListener)_listeners.get(i); + SummaryListener lsnr = _listeners.get(i); if (lsnr.getRate().equals(rate)) { lsnr.getData().exportXml(out); out.write(("\n").getBytes()); @@ -152,8 +183,26 @@ public class StatSummarizer implements Runnable { /** * This does the two-data bandwidth graph only. * 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; if (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 * @return list of Rate objects */ - private List parseSpecs(String specs) { + private List parseSpecs(String specs) { StringTokenizer tok = new StringTokenizer(specs, ","); - List rv = new ArrayList(); + List rv = new ArrayList(); while (tok.hasMoreTokens()) { String spec = tok.nextToken(); int split = spec.lastIndexOf('.'); From 0b59af65516252113821834fac73a38e18797d19 Mon Sep 17 00:00:00 2001 From: zzz Date: Wed, 24 Nov 2010 15:04:52 +0000 Subject: [PATCH 11/19] * i2psnark: - Prevent dup requests during end game (ticket 331 - thanks sponge and Oct!) --- .../java/src/org/klomp/snark/PeerState.java | 51 ++++++++++++++----- 1 file changed, 39 insertions(+), 12 deletions(-) diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerState.java b/apps/i2psnark/java/src/org/klomp/snark/PeerState.java index 8ba5c8969..d649b8227 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/PeerState.java +++ b/apps/i2psnark/java/src/org/klomp/snark/PeerState.java @@ -261,11 +261,16 @@ class PeerState implements DataLoader // This is used to flag that we have to back up from the firstOutstandingRequest // 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. + * + * 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) { @@ -273,11 +278,15 @@ class PeerState implements DataLoader downloaded += 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? if (getFirstOutstandingRequest(req.piece) == -1) { + // warning - may block here for a while if (listener.gotPiece(peer, req.piece, req.bs)) { if (_log.shouldLog(Log.DEBUG)) @@ -288,9 +297,15 @@ class PeerState implements DataLoader if (_log.shouldLog(Log.WARN)) _log.warn("Got BAD " + req.piece + " from " + peer); // XXX ARGH What now !?! + // FIXME Why would we set downloaded to 0? downloaded = 0; } } + + // ok done with this one + synchronized(this) { + pendingRequest = null; + } } 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 - * 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 * lost. */ Request getOutstandingRequest(int piece, int begin, int length) { if (_log.shouldLog(Log.DEBUG)) - _log.debug("getChunk(" - + piece + "," + begin + "," + length + ") " + _log.debug("got start of Chunk(" + + piece + "," + begin + "," + length + ") from " + peer); int r = getFirstOutstandingRequest(piece); @@ -351,6 +367,9 @@ class PeerState implements DataLoader downloaded = 0; // XXX - punishment? return null; } + + // note that this request is being read + pendingRequest = req; // Report missing requests. if (r != 0) @@ -374,13 +393,12 @@ class PeerState implements DataLoader // Request more if necessary to keep the pipeline filled. addRequest(); - pendingRequest = req; return req; } // get longest partial piece - Request getPartialRequest() + synchronized Request getPartialRequest() { Request req = null; for (int i = 0; i < outstandingRequests.size(); i++) { @@ -401,10 +419,13 @@ class PeerState implements DataLoader return req; } - // return array of pieces terminated by -1 - // remove most duplicates - // but still could be some duplicates, not guaranteed - int[] getRequestedPieces() + /** + * return array of pieces terminated by -1 + * remove most duplicates + * 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[] arr = new int[size+2]; @@ -514,6 +535,8 @@ class PeerState implements DataLoader * @since 0.8.1 */ synchronized boolean isRequesting(int piece) { + if (pendingRequest != null && pendingRequest.piece == piece) + return true; for (Request req : outstandingRequests) { if (req.piece == piece) return true; @@ -616,6 +639,10 @@ class PeerState implements DataLoader 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); if (nextPiece != -1 && (lastRequest == null || lastRequest.piece != nextPiece)) { From a8b602bc54e02f1b1839f0d5f1e5798805a0d732 Mon Sep 17 00:00:00 2001 From: zzz Date: Wed, 24 Nov 2010 15:06:49 +0000 Subject: [PATCH 12/19] * SimpleDataStructure: Fix problem in fromBase64() that manifested itself as a configtunnels.jsp bug --- .../src/net/i2p/data/SimpleDataStructure.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/core/java/src/net/i2p/data/SimpleDataStructure.java b/core/java/src/net/i2p/data/SimpleDataStructure.java index 16a2ec88e..96c1585c5 100644 --- a/core/java/src/net/i2p/data/SimpleDataStructure.java +++ b/core/java/src/net/i2p/data/SimpleDataStructure.java @@ -82,10 +82,20 @@ public abstract class SimpleDataStructure extends DataStructureImpl { return Base64.encode(_data); } + /** + * Sets the data. + * @throws DataFormatException if decoded data is not the legal number of bytes or on decoding error + */ @Override public void fromBase64(String data) throws DataFormatException { 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 */ @@ -106,7 +116,7 @@ public abstract class SimpleDataStructure extends DataStructureImpl { /** * 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 * @throws DataFormatException if null or wrong length */ @@ -114,7 +124,8 @@ public abstract class SimpleDataStructure extends DataStructureImpl { public void fromByteArray(byte data[]) throws DataFormatException { if (data == null) throw new DataFormatException("Null data passed in"); if (data.length != _length) throw new DataFormatException("Bad data length"); - _data = data; + // call setData() instead of _data = data in case overridden + setData(data); } @Override From 8228365d4b4882bb4e3cc1d2582f8682313c4fd4 Mon Sep 17 00:00:00 2001 From: zzz Date: Wed, 24 Nov 2010 16:40:13 +0000 Subject: [PATCH 13/19] * Router: - Remove global lock on accessing config - Add global lock on reading/writing config file --- router/java/src/net/i2p/router/Router.java | 83 ++++++++++------------ 1 file changed, 36 insertions(+), 47 deletions(-) diff --git a/router/java/src/net/i2p/router/Router.java b/router/java/src/net/i2p/router/Router.java index 8f1cf83b7..eede0c768 100644 --- a/router/java/src/net/i2p/router/Router.java +++ b/router/java/src/net/i2p/router/Router.java @@ -19,10 +19,12 @@ import java.util.GregorianCalendar; import java.util.HashSet; import java.util.Iterator; import java.util.List; +import java.util.Map; import java.util.Properties; import java.util.Set; import java.util.TimeZone; import java.util.TreeSet; +import java.util.concurrent.ConcurrentHashMap; import net.i2p.CoreVersion; import net.i2p.crypto.DHSessionKeyBuilder; @@ -57,7 +59,7 @@ import net.i2p.util.SimpleTimer; public class Router { private Log _log; private RouterContext _context; - private final Properties _config; + private final Map _config; /** full path */ private String _configFilename; private RouterInfo _routerInfo; @@ -120,7 +122,7 @@ public class Router { public Router(String configFilename) { this(configFilename, null); } public Router(String configFilename, Properties envProps) { _gracefulExitCode = -1; - _config = new Properties(); + _config = new ConcurrentHashMap(); if (configFilename == null) { if (envProps != null) { @@ -168,15 +170,9 @@ public class Router { readConfig(); - if (envProps == null) { - envProps = _config; - } else { - for (Iterator iter = _config.keySet().iterator(); iter.hasNext(); ) { - String k = (String)iter.next(); - String v = _config.getProperty(k); - envProps.setProperty(k, v); - } - } + if (envProps == null) + envProps = new Properties(); + envProps.putAll(_config); // This doesn't work, guess it has to be in the static block above? // if (Boolean.valueOf(envProps.getProperty("router.disableIPv6")).booleanValue()) @@ -203,12 +199,12 @@ public class Router { System.exit(-1); } - if (_config.getProperty("router.firstVersion") == null) { + if (_config.get("router.firstVersion") == null) { // These may be useful someday. First added in 0.8.2 - _config.setProperty("router.firstVersion", RouterVersion.VERSION); + _config.put("router.firstVersion", RouterVersion.VERSION); String now = Long.toString(System.currentTimeMillis()); - _config.setProperty("router.firstInstalled", now); - _config.setProperty("router.updateLastInstalled", now); + _config.put("router.firstInstalled", now); + _config.put("router.updateLastInstalled", now); saveConfig(); } @@ -285,30 +281,20 @@ public class Router { public void setConfigFilename(String filename) { _configFilename = filename; } public String getConfigSetting(String name) { - synchronized (_config) { - return _config.getProperty(name); - } + return _config.get(name); } public void setConfigSetting(String name, String value) { - synchronized (_config) { - _config.setProperty(name, value); - } + _config.put(name, value); } public void removeConfigSetting(String name) { - synchronized (_config) { _config.remove(name); - } } public Set getConfigSettings() { - synchronized (_config) { return new HashSet(_config.keySet()); - } } public Properties getConfigMap() { Properties rv = new Properties(); - synchronized (_config) { - rv.putAll(_config); - } + rv.putAll(_config); return rv; } @@ -377,14 +363,19 @@ public class Router { _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(); Properties config = getConfig(_context, f); - for (Iterator iter = config.keySet().iterator(); iter.hasNext(); ) { - String name = (String)iter.next(); - String val = config.getProperty(name); - setConfigSetting(name, val); - } + // to avoid compiler errror + Map foo = _config; + foo.putAll(config); } /** this does not use ctx.getConfigDir(), must provide a full path in filename */ @@ -988,7 +979,7 @@ public class Router { */ public void shutdownGracefully(int exitCode) { _gracefulExitCode = exitCode; - _config.setProperty(PROP_SHUTDOWN_IN_PROGRESS, "true"); + _config.put(PROP_SHUTDOWN_IN_PROGRESS, "true"); synchronized (_gracefulShutdownDetector) { _gracefulShutdownDetector.notifyAll(); } @@ -1010,7 +1001,7 @@ public class Router { */ public int scheduledGracefulExitCode() { return _gracefulExitCode; } 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? */ public long getShutdownTimeRemaining() { @@ -1033,7 +1024,7 @@ public class Router { private class GracefulShutdown implements Runnable { public void run() { while (true) { - boolean shutdown = (null != _config.getProperty(PROP_SHUTDOWN_IN_PROGRESS)); + boolean shutdown = (null != _config.get(PROP_SHUTDOWN_IN_PROGRESS)); if (shutdown) { if (_gracefulExitCode == EXIT_HARD || _gracefulExitCode == EXIT_HARD_RESTART || _context.tunnelManager().getParticipatingCount() <= 0) { @@ -1077,26 +1068,24 @@ public class Router { * 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. * - * FIXME Synchronize!! + * Synchronized with file read in getConfig() */ - public boolean saveConfig() { + public synchronized boolean saveConfig() { FileOutputStream fos = null; try { fos = new SecureFileOutputStream(_configFilename); StringBuilder buf = new StringBuilder(8*1024); buf.append("# NOTE: This I2P config file must use UTF-8 encoding\n"); - synchronized (_config) { - TreeSet ordered = new TreeSet(_config.keySet()); - for (Iterator iter = ordered.iterator() ; iter.hasNext(); ) { - String key = (String)iter.next(); - String val = _config.getProperty(key); + TreeSet ordered = new TreeSet(_config.keySet()); + for (Iterator iter = ordered.iterator() ; iter.hasNext(); ) { + String key = (String)iter.next(); + String val = _config.get(key); // Escape line breaks before saving. // Remember: "\" needs escaping both for regex and string. // NOOO - see comments in DataHelper //val = val.replaceAll("\\r","\\\\r"); //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")); } catch (IOException ioe) { @@ -1193,7 +1182,7 @@ public class Router { } if (ok) { // This may be useful someday. First added in 0.8.2 - _config.setProperty("router.updateLastInstalled", "" + System.currentTimeMillis()); + _config.put("router.updateLastInstalled", "" + System.currentTimeMillis()); saveConfig(); boolean deleted = updateFile.delete(); if (!deleted) { From d5b079faa8013ccbca8f1b68ad33cf0622b0faed Mon Sep 17 00:00:00 2001 From: zzz Date: Wed, 24 Nov 2010 16:41:19 +0000 Subject: [PATCH 14/19] Message cleanup --- .../src/org/klomp/snark/SnarkManager.java | 21 ++++++++++++++----- .../org/klomp/snark/web/I2PSnarkServlet.java | 5 +++-- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java index 0545b9f55..41d0f0ec2 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java +++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java @@ -533,9 +533,9 @@ public class SnarkManager implements Snark.CompleteListener { File f = new File(filename); if (!dontAutoStart && shouldAutoStart()) { torrent.startTorrent(); - addMessage(_("Torrent added and started: \"{0}\"", f.getName())); + addMessage(_("Torrent added and started: \"{0}\"", torrent.storage.getBaseName())); } 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?) ////_util. } + String name; + if (torrent.storage != null) { + name = torrent.storage.getBaseName(); + } else { + name = sfile.getName(); + } if (!wasStopped) - addMessage(_("Torrent stopped: \"{0}\"", sfile.getName())); + addMessage(_("Torrent stopped: \"{0}\"", name)); } return torrent; } @@ -756,9 +762,14 @@ public class SnarkManager implements Snark.CompleteListener { if (torrent != null) { File torrentFile = new File(filename); torrentFile.delete(); - if (torrent.storage != null) + String name; + if (torrent.storage != null) { removeTorrentStatus(torrent.storage.getMetaInfo()); - addMessage(_("Torrent removed: \"{0}\"", torrentFile.getName())); + name = torrent.storage.getBaseName(); + } else { + name = torrentFile.getName(); + } + addMessage(_("Torrent removed: \"{0}\"", name)); } } diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java index 30139aa69..f49178b0f 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -438,11 +438,12 @@ public class I2PSnarkServlet extends Default { if (torrent != null) { byte infoHash[] = Base64.decode(torrent); if ( (infoHash != null) && (infoHash.length == 20) ) { // valid sha1 - for (Iterator iter = _manager.listTorrentFiles().iterator(); iter.hasNext(); ) { - String name = (String)iter.next(); + for (String name : _manager.listTorrentFiles()) { Snark snark = _manager.getTorrent(name); if ( (snark != null) && (DataHelper.eq(infoHash, snark.meta.getInfoHash())) ) { snark.startTorrent(); + if (snark.storage != null) + name = snark.storage.getBaseName(); _manager.addMessage(_("Starting up torrent {0}", name)); break; } From 9053a86eb02ad87d7e830a488b846f278a4e28fb Mon Sep 17 00:00:00 2001 From: zzz Date: Wed, 24 Nov 2010 16:45:28 +0000 Subject: [PATCH 15/19] br->pt --- installer/resources/readme/readme.html | 2 +- installer/resources/readme/readme_de.html | 2 +- installer/resources/readme/readme_es.html | 2 +- installer/resources/readme/readme_fr.html | 2 +- installer/resources/readme/readme_nl.html | 2 +- installer/resources/readme/readme_pt.html | 2 +- installer/resources/readme/readme_ru.html | 2 +- installer/resources/readme/readme_sv.html | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/installer/resources/readme/readme.html b/installer/resources/readme/readme.html index 9e1f5ed1d..a1f881f13 100644 --- a/installer/resources/readme/readme.html +++ b/installer/resources/readme/readme.html @@ -6,7 +6,7 @@ Deutsch Français Español - Português + Português Nederlands Русский Svenska
diff --git a/installer/resources/readme/readme_de.html b/installer/resources/readme/readme_de.html index b4188c9b1..1b3ba8e1a 100644 --- a/installer/resources/readme/readme_de.html +++ b/installer/resources/readme/readme_de.html @@ -6,7 +6,7 @@ Deutsch Français Español - Português + Português Nederlands Русский Svenska diff --git a/installer/resources/readme/readme_es.html b/installer/resources/readme/readme_es.html index 188e46a1b..b389867c4 100644 --- a/installer/resources/readme/readme_es.html +++ b/installer/resources/readme/readme_es.html @@ -6,7 +6,7 @@ Deutsch Français Español - Português + Português Nederlands Русский Svenska
diff --git a/installer/resources/readme/readme_fr.html b/installer/resources/readme/readme_fr.html index 5deef6444..077479b3e 100644 --- a/installer/resources/readme/readme_fr.html +++ b/installer/resources/readme/readme_fr.html @@ -6,7 +6,7 @@ Deutsch Français Español - Português + Português Nederlands Русский Svenska
diff --git a/installer/resources/readme/readme_nl.html b/installer/resources/readme/readme_nl.html index cdb19a47b..bd5938ef2 100644 --- a/installer/resources/readme/readme_nl.html +++ b/installer/resources/readme/readme_nl.html @@ -6,7 +6,7 @@ Deutsch Français Español - Português + Português Nederlands Русский Svenska diff --git a/installer/resources/readme/readme_pt.html b/installer/resources/readme/readme_pt.html index 09117e133..90382e17a 100644 --- a/installer/resources/readme/readme_pt.html +++ b/installer/resources/readme/readme_pt.html @@ -6,7 +6,7 @@ Deutsch Français Español - Português + Português Nederlands Русский Svenska diff --git a/installer/resources/readme/readme_ru.html b/installer/resources/readme/readme_ru.html index afaabf8c2..712af2348 100644 --- a/installer/resources/readme/readme_ru.html +++ b/installer/resources/readme/readme_ru.html @@ -5,7 +5,7 @@ Deutsch Français Español - Português + Português Nederlands Русский Svenska diff --git a/installer/resources/readme/readme_sv.html b/installer/resources/readme/readme_sv.html index f7856d9a3..e5c3b9ecd 100644 --- a/installer/resources/readme/readme_sv.html +++ b/installer/resources/readme/readme_sv.html @@ -6,7 +6,7 @@ Deutsch Français Español - Português + Português Nederlands Русский Svenska From 838da762f8fd8530e825079c7c9439cbcb3ea2ed Mon Sep 17 00:00:00 2001 From: zzz Date: Wed, 24 Nov 2010 16:47:50 +0000 Subject: [PATCH 16/19] -6 --- history.txt | 17 +++++++++++++++++ .../java/src/net/i2p/router/RouterVersion.java | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/history.txt b/history.txt index 00b97e989..b9ff2738b 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,20 @@ +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. diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 4e28a2c8d..c10128fe6 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 5; + public final static long BUILD = 6; /** for example "-test" */ public final static String EXTRA = ""; From 58da5d7942a884664f8d445bd6c8d4892b8863c4 Mon Sep 17 00:00:00 2001 From: HungryHobo Date: Wed, 24 Nov 2010 17:45:13 +0000 Subject: [PATCH 17/19] * Don't use bash explicitly * Don't put the signer's name into the SignWith field, use the email address instead to avoid problems with spaces --- debian/makerepo.sh | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/debian/makerepo.sh b/debian/makerepo.sh index ad845f31d..4f1078627 100755 --- a/debian/makerepo.sh +++ b/debian/makerepo.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/sh # 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. @@ -9,9 +9,7 @@ DIR=./repo CONFDIR=conf CONFFILE=${CONFDIR}/distributions -SIGNER=`parsechangelog --file changelog | grep Maintainer | cut -d: -f2` -SIGNER=${SIGNER//^ /} -SIGNER=`echo ${SIGNER} | cut -d\ -f1` +SIGNER=`parsechangelog --file changelog | grep Maintainer | 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 Key ID: ${KEYID} From ef92123e005b403eb0b886cf3d541eda62972530 Mon Sep 17 00:00:00 2001 From: HungryHobo Date: Wed, 24 Nov 2010 17:46:23 +0000 Subject: [PATCH 18/19] 0.8.1-6 --- debian/changelog | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/debian/changelog b/debian/changelog index 1e92507d8..110bae03b 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,12 @@ +i2p (0.8.1-4) all; urgency=low + * I2P 0.8.1-6 + * Closes: #448638 + -- Hungry Hobo Mon, 24 Nov 2010 17:14:57 +0000 + +i2p (0.8.1-3) all; urgency=low + * I2P 0.8.1-3 + -- Hungry Hobo Mon, 21 Nov 2010 17:14:57 +0000 + i2p (0.8.1) all; urgency=low * Speedups * Bugfixes From e7272fce539024aac23f52e3aa43160520399048 Mon Sep 17 00:00:00 2001 From: z3d Date: Thu, 25 Nov 2010 13:40:54 +0000 Subject: [PATCH 19/19] Console themes: Overhaul of classic and dark; fix langbox glitch on homepage. --- .../themes/console/classic/console.css | 245 +++++----- .../themes/console/classic/console_big.css | 7 +- .../themes/console/classic/images/titlebg.png | Bin 0 -> 3249 bytes .../resources/themes/console/dark/console.css | 417 +++++++++--------- .../resources/themes/console/dark/default.css | 73 +-- .../themes/console/dark/i2ptunnel.css | 10 +- .../themes/console/dark/images/bg2.png | Bin 0 -> 75600 bytes .../themes/console/dark/images/camotile.png | Bin 0 -> 3443 bytes .../themes/console/dark/images/camotile2.png | Bin 0 -> 9725 bytes .../themes/console/dark/images/darkbluebg.png | Bin 1083 -> 0 bytes .../console/dark/images/darkbluetile.png | Bin 1680 -> 0 bytes .../console/dark/images/darkerbluetile.png | Bin 1196 -> 0 bytes .../themes/console/dark/images/h1bg.png | Bin 1272 -> 0 bytes .../themes/console/dark/images/header.png | Bin 0 -> 203 bytes .../themes/console/dark/images/i2plogo.png | Bin 6507 -> 12533 bytes .../console/dark/images/lightbluetile.png | Bin 1059 -> 0 bytes .../console/dark/images/tabletitledark.png | Bin 917 -> 0 bytes .../console/dark/images/tabletitlelight.png | Bin 227 -> 0 bytes .../themes/console/dark/images/tile.png | Bin 0 -> 4564 bytes .../themes/console/dark/images/titletile.png | Bin 2181 -> 0 bytes .../themes/console/light/console.css | 6 +- .../themes/console/midnight/console.css | 4 +- 22 files changed, 419 insertions(+), 343 deletions(-) create mode 100644 installer/resources/themes/console/classic/images/titlebg.png create mode 100644 installer/resources/themes/console/dark/images/bg2.png create mode 100644 installer/resources/themes/console/dark/images/camotile.png create mode 100644 installer/resources/themes/console/dark/images/camotile2.png delete mode 100644 installer/resources/themes/console/dark/images/darkbluebg.png delete mode 100644 installer/resources/themes/console/dark/images/darkbluetile.png delete mode 100644 installer/resources/themes/console/dark/images/darkerbluetile.png delete mode 100644 installer/resources/themes/console/dark/images/h1bg.png create mode 100644 installer/resources/themes/console/dark/images/header.png delete mode 100644 installer/resources/themes/console/dark/images/lightbluetile.png delete mode 100644 installer/resources/themes/console/dark/images/tabletitledark.png delete mode 100644 installer/resources/themes/console/dark/images/tabletitlelight.png create mode 100644 installer/resources/themes/console/dark/images/tile.png delete mode 100644 installer/resources/themes/console/dark/images/titletile.png diff --git a/installer/resources/themes/console/classic/console.css b/installer/resources/themes/console/classic/console.css index 5da45d2af..d4944face 100644 --- a/installer/resources/themes/console/classic/console.css +++ b/installer/resources/themes/console/classic/console.css @@ -1,11 +1,10 @@ -/* I2P Theme: Classic */ -/* Description: Classic theme, loosely based on duck's original */ -/* Optimized for less capable browsers and system specifications */ +/* I2P Theme: Classic (aka corporat) */ +/* I2P Description: Light blue "classic" I2P theme; optimized for less capable browsers and system specifications. */ /* Author: dr|z3d */ body { - margin: 2px 0 0 2px; + margin: 5px 3px 5px 6px; padding: 0; text-align: left; background: #bbf; @@ -28,6 +27,8 @@ pre { padding-top: 10px; } +/* Sidepanel for proxy errors */ + div.logo { float: left; position-relative: top 20px ; @@ -37,9 +38,7 @@ div.logo { text-align: center; border: 5px solid #ddf; background-color: #eef; - -moz-border-radius: 15px; -moz-box-shadow: inset 0px 0px 0px 2px #99f; - -khtml-border-radius: 15px; -khtml-box-shadow: inset 0px 0px 0px 2px #99f; } @@ -65,6 +64,8 @@ div.logo a:hover { color: #900; } +/* HTTP Proxy warning Main box */ + div.warning { margin: 20px 20px 10px 260px; padding: 0px 20px 20px 75px; @@ -75,9 +76,7 @@ div.warning { background-image:url("../images/itoopie_sm.png"); background-position: 12px center; background-repeat:no-repeat; - -moz-border-radius: 15px; -moz-box-shadow: inset 0px 0px 0px 2px #f60; - -kthml-border-radius: 15px; -khtml-box-shadow: inset 0px 0px 0px 2px #f60; } @@ -92,7 +91,7 @@ div.warning a:visited{ div.warning a:hover{ 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{ @@ -107,25 +106,32 @@ div.warning hr { margin: 5px 0; } +div.warning h3 { + border: 0; + border-bottom: 5px solid #fb7; + padding-bottom: 10px; + background: #ffd; + padding-left: 0; +} + /* console error messages */ div.sorry { padding: 20px; background: #ddf; - margin: -2px 1px 0 195px; - border: 5px solid #bbf; + margin: -1px 1px 0 200px; + border: 1px solid #89f; text-align: justify; - -moz-box-shadow: inset 0px 0px 0px 1px #d00; word-wrap: break-word; font-weight: bold; color: #001; } div.sorry hr { - color: #001; - background: #001; + color: #89f; + background: #89f; height: 1px; - border: 1px solid #001; + border: 0px solid #89f; margin: 10px 0; } @@ -135,9 +141,11 @@ div.toolbar { display: none !important; } +/* Side panel */ + div.routersummaryouter { float: left; - width: 200px; + width: 193px; margin: 0; padding: 0; border: 0; @@ -146,16 +154,16 @@ div.routersummaryouter { div.routersummary { background: #ddf; - width: 185px; + width: 193px; color: inherit; margin: 0; padding: 10px 1px 7px 1px; text-align: center !important; - border: 5px solid #bbf; - font-size: 9pt; + border: 1px solid #89f; + border-bottom: 1px solid #89f; + border-right: 1px solid #89f; word-wrap: break-word; - font: 9pt/125%; - -moz-box-shadow: inset 0px 0px 0px 1px #99f; + font: 9pt/125% !important; } div.routersummary input[type=text] { @@ -163,45 +171,49 @@ div.routersummary input[type=text] { } div.routersummary hr { - color: #eef; - background: #eef; - height: 2px; - border-bottom: 1px solid #eef; - margin: 8px 1px 7px 1px; - -moz-box-shadow: inset 0px 1px 1px 1px #99f; + color: #89f; + background: #89f; + height: 0px; + border-bottom: 1px solid #89f; + margin: 8px -1px 7px -1px; } div.routersummary h3 { border: 0px solid #f00; font-size: 9.5pt; letter-spacing: 0.05em; - margin: -7px 1px -7px 1px; + margin: -7px 0px -8px 0px; padding: 1px 0; background: #c5d5fb; text-transform: uppercase; } div.routersummary h4 { - border: 0px solid #f00; + border: 0; border-bottom: 0 !important; font-size: 8.5pt; letter-spacing: 0.05em; - margin: -7px 1px -7px 1px !important; - padding: 1px 3px; + margin: -7px 0px -8px 0px !important; + padding: 3px 0; background: #c1d1f7; text-transform: capitalize; text-decoration: none !important; color: #2b2; + line-height: 90%; +} + +div.routersummary h3 a, div.routersummary h4 a { + text-decoration: none; } div.routersummary table { border: 0; text-align: center !important; - margin: -5px 4px -5px 3px; - width: 180px !important; + margin: -5px 0px -5px 0px; + width: 193px !important; overflow: hidden; font-size: 8pt; - padding: 0 -10px; + padding: 0 -12px; background-image: none !important; background-color: transparent !important; } @@ -212,20 +224,47 @@ div.routersummary tr { border: 0 !important; } +div.tunnels table { + margin: 0 -7px !important; + width: 193px; +} + div.tunnels table{ - margin: 0 !important; + margin: -2px 0px -4px 0px !important; + text-align: center !important; + width: 190px; } .tunnels tr { 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 { margin-top: -6px !important; margin-bottom: -4px !important; } +div.routersummary form:last-child { + padding-top: 3px !important; + margin-bottom: -10px !important; +} + div.refresh { margin-top: 10px !important; margin-bottom: 10px !important; @@ -251,21 +290,17 @@ div.routersummary td { border: 0 !important; } -div.warning h3 { - border-bottom: 5px solid #fb7; - padding-bottom: 10px; -} - div.main { - margin: 0px 0px 0px 195px; + margin: 0px 1px 0px 200px; padding: 15px 15px 10px 15px; background: #eef; - border: 5px solid #bbf; + border: 1px solid #89f; + border-bottom: 1px solid #89f; + border-right: 1px solid #89f; border-top: 0; text-align: left; color: #001; - min-width: 570px; - -moz-box-shadow: inset 0px 0px 0px 1px #99f; + min-width: 500px; } div.main ul { @@ -295,7 +330,7 @@ div.main textarea { div.main h2 { margin-top: 20px; - margin-bottom: -5px; + margin-bottom: 0px; } div.welcome { @@ -325,17 +360,18 @@ div.wideload p !important { } div.news { - margin: -5px 0px 0 195px; + margin: -1px 1px 0 200px; padding: -10px 0px 8px 0px; background: #ffffc0; - border: 5px solid #bbf; + border: 1px solid #89f; + border-bottom: 1px solid #89f; + border-right: 1px solid #89f; text-align: right; color: #770; - min-width: 600px; + min-width: 500px; padding-bottom: 8px; padding-left: 10px; padding-right: 10px; - -moz-box-shadow: inset 0px 0px 0px 1px #99f; font-size: 7pt; } @@ -387,16 +423,19 @@ div.news hr { color: #cc7; background: #cc7; height: 1px; - border: 0px solid #cccc77; - margin: 20px 0 2px 0; + border: 0px solid #cc7; + margin: 20px 0 0 0; } div.confignav { - padding: 12px 0 15px 0; - background: #cfc; - margin: -20px -20px 0 -20px; - border: 5px solid #bbf; - -moz-box-shadow: inset 0px 0px 0px 1px #99f; + padding: 10px 0 11px 0; + background: #ddf; + margin: -16px -16px 0 -16px; + border: 1px solid #89f; + font-size: 9.5pt; +} + +div.confignav a { } div.configure { @@ -411,7 +450,7 @@ div.configure hr { div.configure table { font-size: 9pt; font-weight: bold; - border: 1px solid #bbf; + border: 1px solid #89f; } div.configure tr, div.configure td { @@ -419,7 +458,6 @@ div.configure tr, div.configure td { } div.configure tr { - -moz-box-shadow: inset 0px 0px 1px 0px #bbf; } div.configure li:first-child, div.main li:first-child { @@ -442,14 +480,13 @@ div.configure h2:first-child { div.messages { padding: 0px 10px; background: #fff; - border: 5px solid #bbf; + border: 1px solid #89f; border-right: 0; - margin: -5px -15px 10px -20px; + margin: -1px -15px 10px -16px; text-align: center; font-size: 9pt; font-weight: bold; color: #474; - -moz-box-shadow: inset 0px 0px 0px 1px #99f; } div.messages li, div.messages ul { @@ -469,32 +506,42 @@ h1 { font-size: 18pt; text-shadow: 0px 0px 1px rgba(0, 0, 32, 0.7); text-align: center; - border: 5px solid #bbf; - padding: 13px 10px 12px 10px; - margin: 0 0px 0 195px; + border: 1px solid #89f; + border-bottom: 1px solid #89f; + border-right: 1px solid #89f; + padding: 16px 10px 16px 10px; + margin: 0 1px 0 200px; line-height: 93%; text-transform: uppercase; letter-spacing: 0.3em; background: #fff; - min-width: 600px; - -moz-box-shadow: inset 0px 0px 0px 1px #99f; + min-width: 500px; } h2 { font-size: 14pt; - padding: 0px 10px 10px 10px; - border-bottom: 3px solid #aaf; - border-top: 0px solid #aaf; + padding: 10px; + border: 1px solid #89f; 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 { font-size: 12pt; - padding: 0 10px 10px 10px; - border-bottom: 3px solid #aaf; - border-top: 0px solid #aaf; + padding: 5px 10px; + border: 1px solid #89f; letter-spacing: 0.04em; margin-bottom: 10px; + background: #fff; +} + +h2, h3 { + background-image: url("images/titlebg.png"); + background-repeat: no-repeat; + background-position: right center; } .proxyfooter{ @@ -504,7 +551,7 @@ h3 { table { border-collapse: collapse; - border: 1px solid #bbf; + border: 1px solid #89f; margin: 0 0 5px 0; cell-padding: 1px; font-size: 7.5pt; @@ -513,11 +560,11 @@ table { } table hr { - padding: 0px 0; - color: #bbf; - background: #bbf; - border: 0px solid #bbf; - margin: 0px -5px; + padding: 0; + color: #89f; + background: #89f; + border: 0px solid #89f; + margin: -5px -5px -10px -5px !important; height: 1px; } @@ -525,11 +572,15 @@ table tt { font-size: 7.5pt; } +table code { + font-size: 120%; +} + th { background-color: #fff; padding: 8px 2px; text-align: center; - border-bottom: 1px solid #bbf; + border-bottom: 1px solid #89f; } tt { @@ -553,10 +604,10 @@ tr:nth-child(odd) { } hr { - color: #aaf; - background: #aaf; - height: 3px; - border: 0px solid #aaf; + color: #89f; + background: #89f; + height: 2px; + border: 0px solid #89f; margin: 3px 0; } @@ -655,10 +706,10 @@ p { } .langbox { - margin: 10px -20px 0px 5px; + margin: 18px -20px 0px 5px; color: #001; font-size: 7pt; - width: 220px; + width: 280px; text-align: center; float: right; valign: middle; @@ -695,6 +746,7 @@ a:hover{ color: #f60; text-decoration: underline; font-weight: bold; + text-shadow: 0px 0px 1px rgba(255, 96, 0, 0.7); } a:active{ @@ -713,9 +765,9 @@ tt { font-weight: bold; color: darkgreen; } - + .tablefooter { - border: 1px solid #bbf; + border: 1px solid #a8f; } .tablefooter tr, .tablefooter td { @@ -725,7 +777,7 @@ tt { line-height: 150%; word-wrap: nowrap; padding: 8px 1px; - border-top: 2px solid #bbf; + border-top: 2px solid #89f; } .tidylist { @@ -735,14 +787,9 @@ tt { } div.graphspanel { - padding: 15px 5px 20px 5px; - margin: -20px; - background: #ddf url('images/lightbluetile.png'); - -moz-border-radius: 4px; - -khtml-border-radius: 4px; - border-radius: 4px; - border: 5px solid #bbf; - -moz-box-shadow: inset 0px 0px 1px 0px #002; + padding: 10px 5px 20px 5px; + margin: -16px -16px -11px -16px; + border: 1px solid #89f; text-align: center !important; } @@ -756,7 +803,7 @@ div.graphspanel img { } div.graphspanel img:hover { - border: 1px solid #003; + border: 1px solid #89f; padding: 2px; margin: 6px; text-align: center !important; @@ -777,4 +824,4 @@ div.graphspanel form:last-child { div.graphspanel h3 { text-align: left; margin: 10px 20px 10px 20px; -} +} \ No newline at end of file diff --git a/installer/resources/themes/console/classic/console_big.css b/installer/resources/themes/console/classic/console_big.css index e1f56c69e..a5b221a9d 100644 --- a/installer/resources/themes/console/classic/console_big.css +++ b/installer/resources/themes/console/classic/console_big.css @@ -1,5 +1,5 @@ /* 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 */ @@ -20,8 +20,6 @@ div.routersummary h4 { div.routersummary table { font-size: 9pt; - margin: -5px 0px -5px -1px; - width: 188px !important; } div.routersummary table a:link, div.routersummary table a:visited { @@ -33,9 +31,6 @@ div.tunnels a { } div.tunnels table { - width: 186px !important; - text-align: center; - margin: -4px 1px !important; } div.tunnels td:first-child, div.tunnels td:last-child { diff --git a/installer/resources/themes/console/classic/images/titlebg.png b/installer/resources/themes/console/classic/images/titlebg.png new file mode 100644 index 0000000000000000000000000000000000000000..b524e04e24a7085356d89ba7d3cdb685b2c93ec7 GIT binary patch literal 3249 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 literal 0 HcmV?d00001 diff --git a/installer/resources/themes/console/dark/console.css b/installer/resources/themes/console/dark/console.css index 7f961ace3..4fd5fa09e 100644 --- a/installer/resources/themes/console/dark/console.css +++ b/installer/resources/themes/console/dark/console.css @@ -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 { margin: 20px 5px 0 15px; padding: 0; text-align: center; - background: #002; - color: #FFF; + background: #010 url('images/camotile.png') center bottom; + color: #EE9; font: 9pt/130% "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; + } .hide { @@ -22,20 +23,20 @@ pre { overflow-x: scroll; text-align: left; font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; - color: #fff; + color: #EE9; } div.logo { float: left; padding: 10px; text-align: center; - font-color: #fff; + font-color: #EE9; margin: 0 20px 0 20px; - border: 1px solid #99f; + border: 1px solid #494; -moz-border-radius: 4px; -khtml-border-radius: 4px; border-radius: 4px; - background: #003 url('images/darkbluebg.png'); + background: #030 url('images/darkbluebg.png'); width: 175px; -moz-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; padding: 10px; font-weight: bold; - background: #eef; - border: 1px solid #002; + background: #000; + border: 1px solid #000; display: none; } @@ -59,7 +60,7 @@ div.toolbar a:link { border-radius: 4px; -moz-border-radius: 4px; -khtml-border-radius: 4px; - color: #002; + color: #000; } div.toolbar a:visited { @@ -68,7 +69,7 @@ div.toolbar a:visited { div.toolbar a:hover, button:hover{ border: 1px solid #f60; - background: #003; + background: #030; color: #f60; } @@ -91,19 +92,20 @@ div.routersummary { width: 175px; padding: 10px; text-align: center; - border: 1px solid #99f; - background: #003; - background: url(images/darkbluebg.png); - color: #eef; + border: 1px solid #494; + background: #000; + background: #000 url(images/camotile2.png); + color: #EE9; font-size: 8pt; clear: left;/* fixes a bug in Opera */ -moz-border-radius: 4px; -khtml-border-radius: 4px; border-radius: 4px; float: left; - -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; +/* -moz-box-shadow: inset 0px 0px 0px 0px #EE9; + -khtml-box-shadow: inset 0px 0px 1px 0px #EE9; + box-shadow: inset 0px 0px 1px 0px #EE9;*/ + -moz-box-shadow: 0 1px 5px #000; } div.routersummary input[type=text] { @@ -114,27 +116,26 @@ div.routersummary input[type=text] { } div.routersummary hr { - color: #99f; - background: #99f; + color: #494; + background: #494; height: 2px; - border-bottom: 1px solid #99f; + border-bottom: 1px solid #494; 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 { border: 0; font-size: 9.5pt; letter-spacing: 0.04em; - margin: -7px -9px -8px -9px; + margin: -7px -10px -8px -10px; padding: 2px 0 3px 0 !important; - background: #007; text-transform: uppercase; -moz-border-radius: 0; -khtml-border-radius: 0; border-radius: 0; - background: #007; - background-image: -moz-linear-gradient(top, bottom, from(#007), to(#005), color-stop(7%, #007), color-stop(100%, #005)); + background: #000 url('images/header.png') center center ; + background-image: -moz-linear-gradient(top, bottom, from(#005), to(#030), color-stop(7%, #000), color-stop(100%, #005)); } div.routersummary h4 { @@ -144,19 +145,19 @@ div.routersummary h4 { letter-spacing: 0.02em; margin: -7px -9px -10px -9px !important; padding: 2px 3px 5px 3px; - background: #005; + background: #000; text-transform: capitalize; text-decoration: none !important; 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%; } div.routersummary table { border: 0; text-align: center !important; - margin: -5px -4px -5px -5px !important; - width: 185px !important; + margin: -5px -7px -5px -7px !important; + width: 188px !important; overflow: hidden; font-size: 8pt; padding: 0 -10px; @@ -189,7 +190,8 @@ div.refresh { } 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 { @@ -210,28 +212,39 @@ div routersummary hr:last-child { div.tunnels { padding-top: 3px !important; - margin-left: -2px; + margin-left: -4px; text-align: center; } div.tunnels table { - margin: -3px 0 !important; + margin: -5px 0 -5px -2px !important; } div.tunnels td { - padding: 1px 2px 1px 2px; + padding: 1px 0px 1px 0px; } + div.tunnels td:first-child { 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 { margin: 5px 20px 10px 240px; padding: 5px 25px 20px 75px; background: #005; - border: 1px solid #99f; + border: 1px solid #494; text-align: left; - color: #fff; + color: #EE9; -moz-border-radius: 4px; -khtml-border-radius: 4px; border-radius: 4px; @@ -250,8 +263,8 @@ div.warning { div.sorry { margin: 15px 15px 10px 220px; padding: 20px 20px 20px 75px; - background: #005; - border: 1px solid #99f; + background: #020; + border: 1px solid #494; -moz-border-radius: 4px; -khtml-border-radius: 4px; border-radius: 4px; @@ -262,65 +275,74 @@ div.sorry { -moz-box-shadow: inset 0px 0px 0px 1px #d00; word-wrap: break-word; font-weight: bold; - color: #eef; + color: #EE9; } div.sorry hr { - color: #eef; - background: #eef; + color: #EE9; + background: #EE9; height: 1px; - border: 1px solid #eef; + border: 1px solid #EE9; margin: 10px 0; } div.main { - margin: 0px 0px 20px 195px; - padding: 0 15px 15px 25px; - background: #002; + margin: 15px 15px 20px 220px; + padding: 0 15px 15px 15px; text-align: left; - color: #eef; + color: #EE9; width: auto; /* 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 { - background: #002; - color: #fff; + background: #000; + color: #EE9; font: 8pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; } div.news { margin: 15px 15px 15px 220px; padding: 5px 30px 10px 30px; - border: 1px solid #99f; - background: #004; - background-image: -moz-linear-gradient(top, bottom, from(#003), to(#005), color-stop(30%, #003), color-stop(100%, #001)); -/* background: #003 url("images/darkbluetile.png");*/ - color: #aaf; + border: 1px solid #494; + background: #000; +/* background-image: -moz-linear-gradient(top, bottom, from(#030), to(#005), color-stop(30%, #030), color-stop(100%, #000));///*/ + background: #000 url("images/bg2.png")no-repeat scroll bottom right; + color: #7b7; border-radius: 4px; -moz-border-radius: 4px; -khtml-border-radius: 4px; font-size: 7.5pt; text-align: right; - -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; +/* -moz-box-shadow: inset 0px 0px 0px 0px #EE9; + -khtml-box-shadow: inset 0px 0px 1px 0px #EE9; + box-shadow: inset 0px 0px 1px 0px #EE9;*/ + -moz-box-shadow: 0 1px 5px #000; + min-width: 590px; } div.news li { text-align: justify; 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; vertical-align: middle; word-wrap: break-word; - color: #99f; + color: #494; } div.news h4 { border-bottom: 1px; border-bottom-style: dotted; - border-bottom-color: #99f; + border-bottom-color: #494; padding: 0 0 0px 0; margin: 5px 0 10px 0; font-size: 10pt; @@ -337,7 +359,7 @@ div.news h4:first-child { div.news p { margin-top: -5px; font-size: 8.5pt; - color: #eef; + color: #EE9; } div.news hr { @@ -347,31 +369,25 @@ div.news hr { div.confignav { padding: 15px 10px !important; margin: 15px 0; - background: #004 url('images/darkbluebg.png'); + background: #000 url('images/header.png') center center repeat-x ; -moz-border-radius: 4px; -khtml-border-radius: 4px; border-radius: 4px; - border: 1px solid #99f; + border: 1px solid #494; font-size: 9.5pt !important; font-weight: bold !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 { - padding: 5px 15px 0 15px; +/* padding: 5px 15px 0 15px; margin: 10px 0px; - background: #005; -moz-border-radius: 4px; -khtml-border-radius: 4px; border-radius: 4px; - border: 1px solid #99f; - background: #003 url(images/darkbluebg.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; + border: 1px solid #494; */ + background: #000;/* url(images/camotile2.png);*/ } div.messages { @@ -380,11 +396,8 @@ div.messages { -moz-border-radius: 4px; -khtml-border-radius: 4px; border-radius: 4px; - border: 1px solid #99f; - background: #008 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; + border: 1px solid #494; + background: #000;/* url('images/lightbluetile.png');*/ font-weight: bold; font-size: 9pt; color: #ddf; @@ -408,20 +421,20 @@ div.messages li { } div.graphspanel { - padding: 10px 15px 0 15px; - margin: 15px 0px; - background: #005; + padding: 0; + margin: 15px 0px -15px 0; -moz-border-radius: 4px; -khtml-border-radius: 4px; border-radius: 4px; - border: 1px solid #99f; - background: #003 url(images/darkbluebg.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; +/* border: 1px solid #494;*/ + background: #000;/* url(images/camotile.png);*/ text-align: center; } +div.widepanel h3 { + text-align: left !important; +} + div.graphspanel form { text-align: left; padding: 0 15px 0px 15px; @@ -432,23 +445,21 @@ div.graphspanel hr { } div.graphspanel img { - border: 1px solid #001; + border: 1px solid #494; padding: 3px; margin: 5px; text-align: center !important; - background: #002; - -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; + background: #000; + opacity: 0.8; } div.graphspanel img:hover { - border: 1px solid #001; + border: 1px solid #000; padding: 3px; margin: 5px; text-align: center !important; - background: #002; + background: #000; -moz-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; @@ -458,18 +469,18 @@ div.graphspanel img:hover { table { border-collapse: collapse; width: 100%; - border: 1px solid #99f; + border: 1px solid #494; cell-padding: 1px; font-size: 7pt; - background: #003; + background: #030; margin: 1px 0; } table hr { padding: 0px 0; - color: #99f; - background: #99f; - border: 0px solid #99f; + color: #494; + background: #494; + border: 0px solid #494; margin: 0px 0px; height: 1px; display: none; @@ -477,12 +488,13 @@ table hr { th { padding: 6px 2px; - color: #eef; + color: #EE9; text-align: center; font-size: 9pt; - background: #004 url('images/tabletitledark.png') repeat-x; - border-top: 1px solid #99f; - border-bottom: 1px solid #99f !important; + background: #000; /*url('images/tabletitledark.png') repeat-x;*/ + background: #000 url('images/header.png') center center repeat-x ; + border-top: 1px solid #494; + border-bottom: 1px solid #494 !important; line-height: 110%; } @@ -491,27 +503,27 @@ tr { } tr:nth-child(even) { - background: #002 url('images/darkerbluetile.png') !important; + background: #010;/* url('images/darkerbluetile.png') !important;*/ vertical-align: middle; } tr:nth-child(odd) { - background: #003 url('images/darkbluetile.png') !important; + background: #000800;/* url('images/darkbluetile.png') !important;*/ vertical-align: middle; } /* tr:last-child { background: #004 url('images/lightbluetile.png') !important; font-weight: bold; - border: 1px solid #99f !important; + border: 1px solid #494 !important; } */ td { - padding: 6px 3px; - color: #eef; + padding: 4px 6px; + color: #EE9; vertical-align: middle; - border-top: 1px inset #006; - border-bottom: 1px outset #006; + border-top: 1px inset #494; + border-bottom: 1px outset #494; } td img { @@ -529,7 +541,7 @@ div.main li { list-style: square; margin: 2px 0px 2px 30px; padding: 1px 20px 1px 0px; - line-height: 150%; +/* line-height: 150%;*/ word-wrap: break-word; } @@ -559,18 +571,19 @@ ul { code { 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{ - color: #99f; + color: #494; text-decoration: none; font-weight: bold; word-wrap: break-word; } a:visited{ - color: #77f; + color: #7b7; text-decoration: none; font-weight: bold; word-wrap: break-word; @@ -601,7 +614,7 @@ p { h1 { text-align: left; - color: #fff; + color: #EE9; padding: 10px 15px; margin: 0 15px 10px 220px; font-size: 16pt; @@ -609,65 +622,68 @@ h1 { font-style: normal; text-transform: uppercase; letter-spacing: 0.15em; - text-shadow: 0px 0px 3px rgba(255, 255, 255, 0.8); + text-shadow: 0px 0px 2px #010; white-space: normal; - background: #002 //url('images/darkbluebg.png'); - background-image: -moz-linear-gradient(top, bottom, from(#001), to(#003), color-stop(30%, #001), color-stop(100%, #001)); - -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; - border: 1px solid #99f; + background: #000 url("images/scope.png")no-repeat scroll right top; + background: #000 url("images/bg2.png")no-repeat scroll top right; + background: #000 url('images/header.png') center center ; + background-image: -moz-linear-gradient(top, bottom, from(#000), to(#030), color-stop(30%, #000), color-stop(100%, #000)); + border: 1px solid #494; border-radius: 4px; -moz-border-radius: 4px; -khtml-border-radius: 4px; line-height: 120%; + min-width: 620px; + -moz-box-shadow: 0 1px 5px #000; } h2 { font-size: 12pt; - color: #fff; - text-shadow: 0px 0px 1px rgba(255, 255, 255, 0.5); + color: #EE9; + text-shadow: 0px 0px 2px #010; letter-spacing: 0.05em; - background: #002; // url('images/darkbluebg.png'); - background-image: -moz-linear-gradient(top, bottom, from(#001), to(#003), color-stop(30%, #001), color-stop(100%, #001)); + background: #000 url(images/camotile2.png); + 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; wordwrap: none; - border: 1px solid #99f; + border: 1px solid #494; border-radius: 4px; -moz-border-radius: 4px; -khtml-border-radius: 4px; vertical-align: middle; margin: 15px 0 12px 0 !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; + text-transform: uppercase; word-wrap: break-word; } h2 a:visited { - color: #44f; + color: #191; } h2 a:hover { 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 { - border: 1px solid #99f; - border-left: 5px solid #99f; - padding: 3px 5px 3px 5px; + border: 1px solid #494; + border-left: 5px solid #494; + padding: 5px 6px; margin: 12px 0 10px 0; border-radius: 0 4px 4px 0; -moz-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 { border-bottom: 1px; border-bottom-style: solid; - border-bottom-color: #99f; + border-bottom-color: #494; padding: 0 0 10px 0; margin: 5px 0 10px 0; font-size: 11pt; @@ -675,9 +691,8 @@ h4 { button, button:visited { 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; - background: #bbf; text-decoration: none; border-radius: 4px; -moz-border-radius: 4px; @@ -688,26 +703,26 @@ button, button:visited { text-align: center; vertical-align: middle; min-width: 76px; - -moz-box-shadow: inset 0px 1px 1px 0px #55f; - -khtml-box-shadow: inset 0px 1px 1px 0px #55f; - box-shadow: inset 0px 1px 1px 0px #55f; - background: #003; - color: #99f; + -moz-box-shadow: inset 0px 1px 1px 0px #494; + -khtml-box-shadow: inset 0px 1px 1px 0px #191; + box-shadow: inset 0px 1px 1px 0px #191; + background: #000; + color: #494; } button:hover { border: 1px solid #f60; - -moz-box-shadow: inset 0px 1px 1px 0px #eef; - -khtml-box-shadow: inset 0px 1px 1px 0px #eef; - box-shadow: inset 0px 1px 1px 0px #eef; - background: #001; + -moz-box-shadow: inset 0px 1px 1px 0px #EE9; + -khtml-box-shadow: inset 0px 1px 1px 0px #EE9; + box-shadow: inset 0px 1px 1px 0px #EE9; + background: #000; color: #f60; } button:active { border: 1px inset #f60; background: #f60; - color: #fff; + color: #EE9; -moz-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; @@ -720,9 +735,9 @@ button:active { } .langbox { - margin: 2px 2px 2px 5px; + margin: 17px 2px 2px 5px; padding: 7px 10px 5px 10px; - color: #eef; + color: #EE9; font-size: 7pt; width: 220px; text-align: right; @@ -730,11 +745,21 @@ button:active { 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 { - color: #99f; - background: #99f; + color: #494; + background: #494; height: 1px; - border: 0px solid #99f; + border: 0px solid #494; margin: 10px 0; } @@ -748,12 +773,12 @@ sidebarlogo { } input { - border: 1px outset #55f; - -moz-box-shadow: inset 0px 1px 1px 0px #55f; - -khtml-box-shadow: inset 0px 1px 1px 0px #55f; - box-shadow: inset 0px 1px 1px 0px #55f; - background: #003; - color: #99f; + 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; + background: #000; + color: #494; margin: 5px; font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif; padding: 1px 2px; @@ -765,16 +790,16 @@ input { } input:hover { - background: #001; + background: #000; color: #f60; border: 1px solid #f60; - -moz-box-shadow: inset 0px 1px 1px 0px #eef; - -khtml-box-shadow: inset 0px 1px 1px 0px #eef; - 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 #9e9; + box-shadow: inset 0px 1px 1px 0px #9e9; } input:active { - background: #002; + background: #000; color: #f30; border: 1px solid #f30; } @@ -782,16 +807,16 @@ input:active { input:active { border: 1px inset #f60; background: #f60; - color: #fff; + color: #EE9; } input[type=text] { - background: #002; - color: #eef; + background: #000; + color: #EE9; margin: 5px 10px; padding: 4px 2px; 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; border-radius: 4px; -moz-border-radius: 4px; @@ -802,7 +827,7 @@ input[type=text] { } input[type=text]:active, input[type=text]:hover { - background: #001; + background: #000; } fieldset { @@ -811,10 +836,10 @@ position: relative; } select { - background: #002; - color: #eef; + background: #000; + color: #EE9; margin: 5px 10px; - border: 1px solid #bbf; + border: 1px solid #494; border-radius: 4px; -moz-border-radius: 4px; -khtml-border-radius: 4px; @@ -824,8 +849,8 @@ select { } textarea { - background: #001; - color: #eef; + background: #000; + color: #EE9; padding: 5px; margin: 10px; border-radius: 4px; @@ -835,7 +860,7 @@ textarea { min-height: 100px; min-width: 97%; text-align: left; - border: 1px solid #99f; + border: 1px solid #494; } form {} @@ -849,39 +874,37 @@ form {} border-radius: 4px; -moz-border-radius: 4px; -khtml-border-radius: 4px; - border: 1px solid #001; + border: 1px solid #000; display: none; } .statusnotes { font-style: italic; font-size: 8pt; - color: #eef; + color: #EE9; text-align: center; - border: 1px solid #99f !important; + border: 1px solid #494 !important; /* border-top: 0px !important;*/ margin: -3px 0 5px 0; padding: 7px; - background: #004; - -moz-box-shadow: inset 0px 0px 0px 1px #009; - -khtml-box-shadow: inset 0px 0px 0px 1px #009; - box-shadow: inset 0px 0px 0px 1px #009; + background: #010; + -moz-box-shadow: inset 0px 0px 0px 1px #090; + -khtml-box-shadow: inset 0px 0px 0px 1px #090; + box-shadow: inset 0px 0px 0px 1px #090; +/* background: #000 url('images/header.png') repeat-x center center !important;*/ } div.joblog { - margin: 15px 0 15px 0; +/* margin: 15px 0 15px 0; padding: 5px 20px 10px 20px !important; - border: 1px solid #99f; - background-color: #004; - background: url("images/darkbluebg.png"); - color: #dfd; - border-radius: 4px; - -moz-border-radius: 4px; - -khtml-border-radius: 4px; + border: 1px solid #494; + background-color: #000; + background: #000; url("images/camotile.png");*/ +/* color: #dfd;*/ + border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + -khtml-border-radius: 4px 4px 0 0; 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 */ } @@ -953,14 +976,14 @@ position: relative; } .cells { - border: 1px inset #005; - border-left: 1px outset #002; + border: 1px inset #494; + border-left: 1px outset #494; } .tablefooter tr, .tablefooter td { - background: #004 url('images/tabletitledark.png') repeat-x !important; - border-top: 1px solid #99f; - border-bottom: 1px solid #99f !important; + background: #000 url('images/header.png') repeat-x center center !important; + border-top: 1px solid #494; + border-bottom: 1px solid #494 !important; font-size: 7pt; line-height: 110%; } diff --git a/installer/resources/themes/console/dark/default.css b/installer/resources/themes/console/dark/default.css index dc9ceede8..68de1b28e 100644 --- a/installer/resources/themes/console/dark/default.css +++ b/installer/resources/themes/console/dark/default.css @@ -1,9 +1,11 @@ +/* I2P Console theme: "Camo" by dr|z3d. Aka "dark". As in ops. */ + body { margin: 0px; padding: 0px; text-align: center; font-family: "Lucida Sans Unicode", Verdana, Helvetica, sans-serif; - background-color: #001; + background: #010 url('images/camotile.png') center bottom; color: #000000; font-size: 9pt; /* we've avoided Tantek Hacks so far, @@ -39,14 +41,14 @@ h4 { font-size: 14px; font-weight: bold !important; text-align: center; - border: 1px solid #99f; + border: 1px solid #494; margin: 5px 0 15px 0; 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-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; - -moz-box-shadow: inset 0px 0px 4px 0px #009; + -moz-box-shadow: inset 0px 0px 4px 0px #090; -moz-border-radius: 4px; -khtml-border-radius: 4px; border-radius: 4px; @@ -73,7 +75,7 @@ button { } textarea { - border: 1px solid #9999ff; + border: 1px solid #494; } br { @@ -121,21 +123,21 @@ hr { clear: both; height: 1px; margin: 3px 0px 3px 0px; - border-bottom: 1px solid #99f; + border-bottom: 1px solid #494; } .subdivider { - border-bottom: 1px solid #99f; + border-bottom: 1px solid #494; padding: 5px 0px 0px 0px; } .freetext { width: 150px; height : 22px; - border: 1px solid #9999ff; + border: 1px solid #494; padding: 2px; margin: 4px 0 2px 4px; - background-color: #002; + background-color: #020; font: bold 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono; } @@ -147,8 +149,8 @@ hr { max-height: 24px; font-size: 9pt; font-weight: bold; - background-color: #b4c8ff; - color: black; + background-color: #000; + color: #9f9 !important; border: 1px outset #ddddc0; text-align: center; white-space: nowrap; @@ -159,18 +161,25 @@ hr { background: url(images/tabletitlelight.png) repeat: x; vertical-align: middle; 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 { - color: #001; + color: #9f9; text-decoration: none; } .control:hover { - border: 1px solid #eeeeff; - background-color: #003; - color: #ff6600 !important; + border: 1px solid #f60; + background-color: #000; + color: #f60 !important; 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 { @@ -181,7 +190,7 @@ hr { } .control:visited { - color: #001; + color: #010; text-decoration: none; } @@ -192,12 +201,12 @@ hr { text-align: left; font-size: 9pt; color: white; - background-color: #002; - background: url(images/darkbluebg.png); + background-color: #020; + background: #000; /*url(images/camotile2.png);*/ -moz-border-radius: 4px; -khtml-border-radius: 4px; border-radius: 4px; - border: 1px solid #99f; + border: 1px solid #494; padding: 10px 20px; } @@ -235,15 +244,15 @@ hr { } #globalOperationsPanel { - background-color: #003; - border: 1px solid #99f; - background: url(images/darkbluebg.png); - -moz-box-shadow: inset 0px 0px 0px 1px #f00; + background-color: #030; + border: 1px solid #494; + -moz-box-shadow: inset 0px 0px 0px 1px #932; padding: 5px 20px 11px 10px !important; + background: #000; /*url(images/camotile2.png);*/ } #globalOperationsPanel .control { - width: 100px; + width: 120px; } .header { @@ -254,12 +263,12 @@ hr { } a:link{ - color: #99f; + color: #494; text-decoration: none; } a:visited{ - color: #7bb; + color: #7b7; text-decoration: none; } @@ -274,12 +283,12 @@ a:active{ } input { - background-color: #002; + background-color: #020; color: #eef; margin: 0 2px 0 2px; font-family: "Lucida Sans Unicode", Verdana, Tahoma, Helvetica, sans-serif; font-weight: bold; - border: 1px solid #99f; + border: 1px solid #494; /* padding: 0px 2px 1px 2px; */ @@ -292,17 +301,17 @@ input hover { margin: 0 2px 0 2px; font-family: "Lucida Sans Unicode", Verdana, Tahoma, Helvetica, sans-serif; font-weight: bold; - border: 1px solid #99f; + border: 1px solid #494; padding: 2px; text-decoration: none; } select { - background-color: #001; + background-color: #020; color: #eef; margin: 6px 2px 0 2px; font-family: "Lucida Sans Unicode", Verdana, Tahoma, Helvetica, sans-serif; - border: 1px solid #99f; + border: 1px solid #494; padding: 2px 2px 2px 4px; max-height: 24px; } diff --git a/installer/resources/themes/console/dark/i2ptunnel.css b/installer/resources/themes/console/dark/i2ptunnel.css index cc2f5d97e..d35372310 100644 --- a/installer/resources/themes/console/dark/i2ptunnel.css +++ b/installer/resources/themes/console/dark/i2ptunnel.css @@ -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 { width: 458px; } @@ -82,8 +83,9 @@ height: 100px; padding: 4px; margin: 0 0 3px 0; - background-color: #000088; - color: #fff; + background-color: #040; +/* background: #000 url("images/helitile.png")no-repeat scroll right top;*/ + color: #ee9; font-family: "Lucida Console", "Andale Mono", "Courier New", Courier, mono; border: 1px inset #002; } diff --git a/installer/resources/themes/console/dark/images/bg2.png b/installer/resources/themes/console/dark/images/bg2.png new file mode 100644 index 0000000000000000000000000000000000000000..9af9046d26f6b8e250e57e3f3cad5cc0e95e61de GIT binary patch literal 75600 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 LNkvXXu0mjfKg;OkH}&M2EM}}%y>M1MG6B0 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 diff --git a/installer/resources/themes/console/dark/images/h1bg.png b/installer/resources/themes/console/dark/images/h1bg.png deleted file mode 100644 index dd2ce33886bd43f3efb27b64860edfb2a0e91da6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1272 zcmYk*e@xVM9LMqJb(r22Co&0V(>q8#kfI_X4Cv&%ll!K^fmfv19mt__qFi{5+ZcD~ zRufcq&Ninds=_!y_fRqnX0Z31SR0z^am6M?2lvJ*gN?lUHODcXz zH9%5bkyNWB`+p_-e^zaiRN+o|bt*LsLDxprG}BlA4&B-2_x>hr{>NI$a?-iNHw2X>C#IoL4SG8{_za*IR zx>mRUmGkMJpX$#2p{Z`{-sE>RzJj*8L#W2XX=ft%5SEB%?-7M&P0+@8m7#D+CM9+p0X}Z zM4WT8Q%hI0o%!X{+gjJT<8L?GV!Nijq3PwR{!wlCLj3o+T??;Gd}7{r{;h_+V;w0? zw|pb!wEU5e8*M2^ZQmw+pv#!NG!z@k3dDS)5ldb)W~kEJPxjkvGih_2-S-l!FNET? zJEBK#RQz?gb?M`KN2{Y)V{-wc5fz#s^vo)5EjFnTIT|6}XeyQ;TA8ooUw3I{(O^xunr|GrQ-3 zQ~Kh0F87wplW8rwNlS0X@j>7AYgc@Qor`XpEc(99&OLwVJ*NjxjJI1OanMpkS@1 zi(^Q|oV$G&d6^7(oGSQeRu&3(S@@ecX*$1gvhbD*R| zztBU$vAfGn_q@llC8w30jvajyY_)pxM5E1uZ+*SGby{Mcol51mf7Tb?XaDihcI}$`njxgN@xNAocv96 literal 0 HcmV?d00001 diff --git a/installer/resources/themes/console/dark/images/i2plogo.png b/installer/resources/themes/console/dark/images/i2plogo.png index 52d1fd6c7d7e7f5ccd9c1cac26f5502a4549d007..fb343194eeb89ff2336175609a4209b9389fd668 100644 GIT binary patch literal 12533 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 LNkvXXu0mjfv@aM> literal 6507 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 RS2X|t002ovPDHLkV1kNC;u!z{ diff --git a/installer/resources/themes/console/dark/images/lightbluetile.png b/installer/resources/themes/console/dark/images/lightbluetile.png deleted file mode 100644 index f31f7cd8ed420d91d8546bb59cd3f9cd643ac2d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1059 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvEiGhJ})y~t$fE>;OkH}&M2EM}}%y>M1MG6B0 z^Hon5$B>FSZ*QH>>rIqt{kYY8WutSt#Fd9kcP3~TGPC6!xU0!_Wrd*dQaSfk&Tuan}hJmD<&X+pc-{MPr`AcoD8 zh1_2**x$eY&+o5Xc=0UpYv0tP!)2~KS|G;0)ndg_M_sDs}RL-@z^Wyp9C!wEy)YxtRS3K9;I3oT3ookVG zd29EaySL@sG0t1=0!;!f3M`5ojvP*dfH}+9vHMBtCrwMAJhk1g-)&#^ukh7&{lfjm zUk|@L{?7GP_$2j{Wku$ees*it$It$C{Yh<+?at{no_u=o_hMw^5=4j502q zbKp4wMkX2Q3T#PWB((*k1B`fYNkUY1G_t*gsyyP*Tn1H{w7_vB8e3BIpYxHgrS&!0 S$_ikvXYh3Ob6Mw<&;$T2>xsGm diff --git a/installer/resources/themes/console/dark/images/tabletitledark.png b/installer/resources/themes/console/dark/images/tabletitledark.png deleted file mode 100644 index 2616ec7a68cdbd6679c11b118b19ace0ea7a9878..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 917 zcmV;G18V$+tI8@9F98=;-a|=k4a^?B(U_EYq%;Na-r-{;=m z=H1=p+}!2c+vM8X7)$+fk}w6w>wv&XWs#<8)*u&~6huf(pd!>z5ttgOMStHG+O zz^SRfsHncDr@p49y``nRq@=u~qr0M_x}l-DprE;*pSYf$x1F7~oSe3so3)ynw3(T+ zn3%Jdm$H_Yv6Ypvl$5ZOldqDJu91Zo=sELWFh=`|$ zho**xriF#2goLDngQJ3iqk(~Ai(z4kU|@=0Ux{8`h+SQWTwI4+TZUR%g;`mJSXhKtSA$kof>l+5R8)ae zQ-D%Ze^F6?P*8qPPkl~Kd`(S!OiX)AOL|I5dPzxnNJw}`M|Va>cSS{ZL_~E%Lv%ty zbU{ILKtOUoKXE=jaXme7JUnkZJ8wEVZaFz^I5=!KH*7XGYc(}$G&E^5Gifq1XfZKo zFfe8>FJ>+-Wi2gaEG%RzD`P4uVks$MC@5hkCtxNfUnM18BqUxVBV8gQTp=M_ARt>G zA6gzBSsfi&92{618&?_{Rv8&q7#LL-7gQD&Qxz3c6ckbu6HyWpP!SPO5D-rf4^9pa zP7MuB3=B*Q3rh+LO9=@|2nb0B2S^46NCgE)1O!F{14RM?P_D5800009a7bBm000id z000id0mpBsWB>pFJ4r-ARCt`F%u5ac5DWy+QH=ZFSeh`T3nAXBoqj+;OkH}&M2EM}}%y>M1MG8=G zs;7%%NX4AwJ^y~&Gcz-v{>#my@alfNz|kWNj1HD+3s{5$L{yIKcz&$DgXMHTe}JmN zQisSDp8oHfLjU~g$yCrfTJh;@J)6pbPyaZXx&EK$7qJs&W_GPv!7TW!{#QrV{paQt zZ_|H%m+t*Pebu|gH|oXr|4To>8*y*{A!Y8K4eKkG{{MGGyH`x?#ijrMA5M1resaS^ aHinJTmXA74c0LC>kipZ{&t;ucLK6Urs$5Y3 diff --git a/installer/resources/themes/console/dark/images/tile.png b/installer/resources/themes/console/dark/images/tile.png new file mode 100644 index 0000000000000000000000000000000000000000..c8f98b265782ca33085aac87ee93d1679e5812ad GIT binary patch literal 4564 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 EZ)FP6B>(^b diff --git a/installer/resources/themes/console/light/console.css b/installer/resources/themes/console/light/console.css index 00979a190..942a7a873 100644 --- a/installer/resources/themes/console/light/console.css +++ b/installer/resources/themes/console/light/console.css @@ -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 { margin: 15px 0 0 10px; @@ -714,11 +714,11 @@ button:active{ } .langbox { - margin: 4px 2px 4px 5px; + margin: 4px 10px 4px 5px; padding: 5px 5px; color: #001; font-size: 7pt; - width: 220px; + width: 260px; text-align: right; float: right; valign: middle; diff --git a/installer/resources/themes/console/midnight/console.css b/installer/resources/themes/console/midnight/console.css index 69e633057..0c66d9589 100644 --- a/installer/resources/themes/console/midnight/console.css +++ b/installer/resources/themes/console/midnight/console.css @@ -738,10 +738,10 @@ p { } .langbox { - margin: 17px -20px 0px 5px; + margin: 17px -30px 0px 5px; color: #eef; font-size: 7pt; - width: 220px; + width: 280px; text-align: center; float: right; valign: middle;