merge of '60987f4b854cedf353de8adef7747f79ca24b941'
and '8760d93a324f2eb837d218bc3b7450c80bb83b70'
@ -4,7 +4,7 @@
|
|||||||
i2p_start() {
|
i2p_start() {
|
||||||
# Check if router is up first!
|
# Check if router is up first!
|
||||||
/bin/su - -c "( export PATH=\"$PATH:/usr/lib/java/bin:/usr/lib/java/jre/bin\"; directory status )" > /dev/null
|
/bin/su - -c "( export PATH=\"$PATH:/usr/lib/java/bin:/usr/lib/java/jre/bin\"; directory status )" > /dev/null
|
||||||
if [ ! $? -eq 0 ] ; then {
|
if [ $? -eq 0 ] ; then {
|
||||||
# I2p is already running, so tell the user.
|
# I2p is already running, so tell the user.
|
||||||
echo "I2P is already running..."
|
echo "I2P is already running..."
|
||||||
i2p_status
|
i2p_status
|
||||||
|
@ -261,11 +261,16 @@ class PeerState implements DataLoader
|
|||||||
|
|
||||||
// This is used to flag that we have to back up from the firstOutstandingRequest
|
// This is used to flag that we have to back up from the firstOutstandingRequest
|
||||||
// when calculating how far we've gotten
|
// when calculating how far we've gotten
|
||||||
Request pendingRequest = null;
|
private Request pendingRequest;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when a partial piece request has been handled by
|
* Called when a full chunk (i.e. a piece message) has been received by
|
||||||
* PeerConnectionIn.
|
* PeerConnectionIn.
|
||||||
|
*
|
||||||
|
* This may block quite a while if it is the last chunk for a piece,
|
||||||
|
* as it calls the listener, who stores the piece and then calls
|
||||||
|
* havePiece for every peer on the torrent (including us).
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
void pieceMessage(Request req)
|
void pieceMessage(Request req)
|
||||||
{
|
{
|
||||||
@ -273,11 +278,15 @@ class PeerState implements DataLoader
|
|||||||
downloaded += size;
|
downloaded += size;
|
||||||
listener.downloaded(peer, size);
|
listener.downloaded(peer, size);
|
||||||
|
|
||||||
pendingRequest = null;
|
if (_log.shouldLog(Log.DEBUG))
|
||||||
|
_log.debug("got end of Chunk("
|
||||||
|
+ req.piece + "," + req.off + "," + req.len + ") from "
|
||||||
|
+ peer);
|
||||||
|
|
||||||
// Last chunk needed for this piece?
|
// Last chunk needed for this piece?
|
||||||
if (getFirstOutstandingRequest(req.piece) == -1)
|
if (getFirstOutstandingRequest(req.piece) == -1)
|
||||||
{
|
{
|
||||||
|
// warning - may block here for a while
|
||||||
if (listener.gotPiece(peer, req.piece, req.bs))
|
if (listener.gotPiece(peer, req.piece, req.bs))
|
||||||
{
|
{
|
||||||
if (_log.shouldLog(Log.DEBUG))
|
if (_log.shouldLog(Log.DEBUG))
|
||||||
@ -288,9 +297,15 @@ class PeerState implements DataLoader
|
|||||||
if (_log.shouldLog(Log.WARN))
|
if (_log.shouldLog(Log.WARN))
|
||||||
_log.warn("Got BAD " + req.piece + " from " + peer);
|
_log.warn("Got BAD " + req.piece + " from " + peer);
|
||||||
// XXX ARGH What now !?!
|
// XXX ARGH What now !?!
|
||||||
|
// FIXME Why would we set downloaded to 0?
|
||||||
downloaded = 0;
|
downloaded = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ok done with this one
|
||||||
|
synchronized(this) {
|
||||||
|
pendingRequest = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
synchronized private int getFirstOutstandingRequest(int piece)
|
synchronized private int getFirstOutstandingRequest(int piece)
|
||||||
@ -303,15 +318,16 @@ class PeerState implements DataLoader
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when a piece message is being processed by the incoming
|
* Called when a piece message is being processed by the incoming
|
||||||
* connection. Returns null when there was no such request. It also
|
* connection. That is, when the header of the piece message was received.
|
||||||
|
* Returns null when there was no such request. It also
|
||||||
* requeues/sends requests when it thinks that they must have been
|
* requeues/sends requests when it thinks that they must have been
|
||||||
* lost.
|
* lost.
|
||||||
*/
|
*/
|
||||||
Request getOutstandingRequest(int piece, int begin, int length)
|
Request getOutstandingRequest(int piece, int begin, int length)
|
||||||
{
|
{
|
||||||
if (_log.shouldLog(Log.DEBUG))
|
if (_log.shouldLog(Log.DEBUG))
|
||||||
_log.debug("getChunk("
|
_log.debug("got start of Chunk("
|
||||||
+ piece + "," + begin + "," + length + ") "
|
+ piece + "," + begin + "," + length + ") from "
|
||||||
+ peer);
|
+ peer);
|
||||||
|
|
||||||
int r = getFirstOutstandingRequest(piece);
|
int r = getFirstOutstandingRequest(piece);
|
||||||
@ -351,6 +367,9 @@ class PeerState implements DataLoader
|
|||||||
downloaded = 0; // XXX - punishment?
|
downloaded = 0; // XXX - punishment?
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// note that this request is being read
|
||||||
|
pendingRequest = req;
|
||||||
|
|
||||||
// Report missing requests.
|
// Report missing requests.
|
||||||
if (r != 0)
|
if (r != 0)
|
||||||
@ -374,13 +393,12 @@ class PeerState implements DataLoader
|
|||||||
// Request more if necessary to keep the pipeline filled.
|
// Request more if necessary to keep the pipeline filled.
|
||||||
addRequest();
|
addRequest();
|
||||||
|
|
||||||
pendingRequest = req;
|
|
||||||
return req;
|
return req;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// get longest partial piece
|
// get longest partial piece
|
||||||
Request getPartialRequest()
|
synchronized Request getPartialRequest()
|
||||||
{
|
{
|
||||||
Request req = null;
|
Request req = null;
|
||||||
for (int i = 0; i < outstandingRequests.size(); i++) {
|
for (int i = 0; i < outstandingRequests.size(); i++) {
|
||||||
@ -401,10 +419,13 @@ class PeerState implements DataLoader
|
|||||||
return req;
|
return req;
|
||||||
}
|
}
|
||||||
|
|
||||||
// return array of pieces terminated by -1
|
/**
|
||||||
// remove most duplicates
|
* return array of pieces terminated by -1
|
||||||
// but still could be some duplicates, not guaranteed
|
* remove most duplicates
|
||||||
int[] getRequestedPieces()
|
* but still could be some duplicates, not guaranteed
|
||||||
|
* TODO rework this Java-style to return a Set or a List
|
||||||
|
*/
|
||||||
|
synchronized int[] getRequestedPieces()
|
||||||
{
|
{
|
||||||
int size = outstandingRequests.size();
|
int size = outstandingRequests.size();
|
||||||
int[] arr = new int[size+2];
|
int[] arr = new int[size+2];
|
||||||
@ -514,6 +535,8 @@ class PeerState implements DataLoader
|
|||||||
* @since 0.8.1
|
* @since 0.8.1
|
||||||
*/
|
*/
|
||||||
synchronized boolean isRequesting(int piece) {
|
synchronized boolean isRequesting(int piece) {
|
||||||
|
if (pendingRequest != null && pendingRequest.piece == piece)
|
||||||
|
return true;
|
||||||
for (Request req : outstandingRequests) {
|
for (Request req : outstandingRequests) {
|
||||||
if (req.piece == piece)
|
if (req.piece == piece)
|
||||||
return true;
|
return true;
|
||||||
@ -616,6 +639,10 @@ class PeerState implements DataLoader
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Note that in addition to the bitfield, PeerCoordinator uses
|
||||||
|
// its request tracking and isRequesting() to determine
|
||||||
|
// what piece to give us next.
|
||||||
int nextPiece = listener.wantPiece(peer, bitfield);
|
int nextPiece = listener.wantPiece(peer, bitfield);
|
||||||
if (nextPiece != -1
|
if (nextPiece != -1
|
||||||
&& (lastRequest == null || lastRequest.piece != nextPiece)) {
|
&& (lastRequest == null || lastRequest.piece != nextPiece)) {
|
||||||
|
@ -533,9 +533,9 @@ public class SnarkManager implements Snark.CompleteListener {
|
|||||||
File f = new File(filename);
|
File f = new File(filename);
|
||||||
if (!dontAutoStart && shouldAutoStart()) {
|
if (!dontAutoStart && shouldAutoStart()) {
|
||||||
torrent.startTorrent();
|
torrent.startTorrent();
|
||||||
addMessage(_("Torrent added and started: \"{0}\"", f.getName()));
|
addMessage(_("Torrent added and started: \"{0}\"", torrent.storage.getBaseName()));
|
||||||
} else {
|
} else {
|
||||||
addMessage(_("Torrent added: \"{0}\"", f.getName()));
|
addMessage(_("Torrent added: \"{0}\"", torrent.storage.getBaseName()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -742,8 +742,14 @@ public class SnarkManager implements Snark.CompleteListener {
|
|||||||
// I2PServerSocket.accept() call properly?)
|
// I2PServerSocket.accept() call properly?)
|
||||||
////_util.
|
////_util.
|
||||||
}
|
}
|
||||||
|
String name;
|
||||||
|
if (torrent.storage != null) {
|
||||||
|
name = torrent.storage.getBaseName();
|
||||||
|
} else {
|
||||||
|
name = sfile.getName();
|
||||||
|
}
|
||||||
if (!wasStopped)
|
if (!wasStopped)
|
||||||
addMessage(_("Torrent stopped: \"{0}\"", sfile.getName()));
|
addMessage(_("Torrent stopped: \"{0}\"", name));
|
||||||
}
|
}
|
||||||
return torrent;
|
return torrent;
|
||||||
}
|
}
|
||||||
@ -756,9 +762,14 @@ public class SnarkManager implements Snark.CompleteListener {
|
|||||||
if (torrent != null) {
|
if (torrent != null) {
|
||||||
File torrentFile = new File(filename);
|
File torrentFile = new File(filename);
|
||||||
torrentFile.delete();
|
torrentFile.delete();
|
||||||
if (torrent.storage != null)
|
String name;
|
||||||
|
if (torrent.storage != null) {
|
||||||
removeTorrentStatus(torrent.storage.getMetaInfo());
|
removeTorrentStatus(torrent.storage.getMetaInfo());
|
||||||
addMessage(_("Torrent removed: \"{0}\"", torrentFile.getName()));
|
name = torrent.storage.getBaseName();
|
||||||
|
} else {
|
||||||
|
name = torrentFile.getName();
|
||||||
|
}
|
||||||
|
addMessage(_("Torrent removed: \"{0}\"", name));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -163,7 +163,7 @@ public class I2PSnarkServlet extends Default {
|
|||||||
|
|
||||||
String peerParam = req.getParameter("p");
|
String peerParam = req.getParameter("p");
|
||||||
String peerString;
|
String peerString;
|
||||||
if (peerParam == null) {
|
if (peerParam == null || !_manager.util().connected()) {
|
||||||
peerString = "";
|
peerString = "";
|
||||||
} else {
|
} else {
|
||||||
peerString = "?p=" + peerParam;
|
peerString = "?p=" + peerParam;
|
||||||
@ -248,6 +248,9 @@ public class I2PSnarkServlet extends Default {
|
|||||||
out.write(uri);
|
out.write(uri);
|
||||||
out.write("\" method=\"POST\">\n");
|
out.write("\" method=\"POST\">\n");
|
||||||
out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" >\n");
|
out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" >\n");
|
||||||
|
// don't lose peer setting
|
||||||
|
if (peerParam != null)
|
||||||
|
out.write("<input type=\"hidden\" name=\"p\" value=\"" + peerParam + "\" >\n");
|
||||||
}
|
}
|
||||||
out.write(TABLE_HEADER);
|
out.write(TABLE_HEADER);
|
||||||
out.write("<img border=\"0\" src=\"/themes/snark/ubergine/images/status.png\"");
|
out.write("<img border=\"0\" src=\"/themes/snark/ubergine/images/status.png\"");
|
||||||
@ -435,11 +438,12 @@ public class I2PSnarkServlet extends Default {
|
|||||||
if (torrent != null) {
|
if (torrent != null) {
|
||||||
byte infoHash[] = Base64.decode(torrent);
|
byte infoHash[] = Base64.decode(torrent);
|
||||||
if ( (infoHash != null) && (infoHash.length == 20) ) { // valid sha1
|
if ( (infoHash != null) && (infoHash.length == 20) ) { // valid sha1
|
||||||
for (Iterator iter = _manager.listTorrentFiles().iterator(); iter.hasNext(); ) {
|
for (String name : _manager.listTorrentFiles()) {
|
||||||
String name = (String)iter.next();
|
|
||||||
Snark snark = _manager.getTorrent(name);
|
Snark snark = _manager.getTorrent(name);
|
||||||
if ( (snark != null) && (DataHelper.eq(infoHash, snark.meta.getInfoHash())) ) {
|
if ( (snark != null) && (DataHelper.eq(infoHash, snark.meta.getInfoHash())) ) {
|
||||||
snark.startTorrent();
|
snark.startTorrent();
|
||||||
|
if (snark.storage != null)
|
||||||
|
name = snark.storage.getBaseName();
|
||||||
_manager.addMessage(_("Starting up torrent {0}", name));
|
_manager.addMessage(_("Starting up torrent {0}", name));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -1001,6 +1005,10 @@ public class I2PSnarkServlet extends Default {
|
|||||||
out.write("<form action=\"" + uri + "\" method=\"POST\">\n");
|
out.write("<form action=\"" + uri + "\" method=\"POST\">\n");
|
||||||
out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" >\n");
|
out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" >\n");
|
||||||
out.write("<input type=\"hidden\" name=\"action\" value=\"Add\" >\n");
|
out.write("<input type=\"hidden\" name=\"action\" value=\"Add\" >\n");
|
||||||
|
// don't lose peer setting
|
||||||
|
String peerParam = req.getParameter("p");
|
||||||
|
if (peerParam != null)
|
||||||
|
out.write("<input type=\"hidden\" name=\"p\" value=\"" + peerParam + "\" >\n");
|
||||||
out.write("<div class=\"addtorrentsection\"><span class=\"snarkConfigTitle\">");
|
out.write("<div class=\"addtorrentsection\"><span class=\"snarkConfigTitle\">");
|
||||||
out.write("<img border=\"0\" src=\"/themes/snark/ubergine/images/add.png\">");
|
out.write("<img border=\"0\" src=\"/themes/snark/ubergine/images/add.png\">");
|
||||||
out.write(_("Add Torrent"));
|
out.write(_("Add Torrent"));
|
||||||
@ -1036,6 +1044,10 @@ public class I2PSnarkServlet extends Default {
|
|||||||
out.write("<form action=\"" + uri + "\" method=\"POST\">\n");
|
out.write("<form action=\"" + uri + "\" method=\"POST\">\n");
|
||||||
out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" >\n");
|
out.write("<input type=\"hidden\" name=\"nonce\" value=\"" + _nonce + "\" >\n");
|
||||||
out.write("<input type=\"hidden\" name=\"action\" value=\"Create\" >\n");
|
out.write("<input type=\"hidden\" name=\"action\" value=\"Create\" >\n");
|
||||||
|
// don't lose peer setting
|
||||||
|
String peerParam = req.getParameter("p");
|
||||||
|
if (peerParam != null)
|
||||||
|
out.write("<input type=\"hidden\" name=\"p\" value=\"" + peerParam + "\" >\n");
|
||||||
out.write("<span class=\"snarkConfigTitle\">");
|
out.write("<span class=\"snarkConfigTitle\">");
|
||||||
out.write("<img border=\"0\" src=\"/themes/snark/ubergine/images/create.png\">");
|
out.write("<img border=\"0\" src=\"/themes/snark/ubergine/images/create.png\">");
|
||||||
out.write(_("Create Torrent"));
|
out.write(_("Create Torrent"));
|
||||||
|
@ -14,7 +14,6 @@ import net.i2p.util.Log;
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class ConfigTunnelsHandler extends FormHandler {
|
public class ConfigTunnelsHandler extends FormHandler {
|
||||||
private Log configTunnel_log;
|
|
||||||
private Map _settings;
|
private Map _settings;
|
||||||
private boolean _shouldSave;
|
private boolean _shouldSave;
|
||||||
|
|
||||||
@ -44,11 +43,10 @@ public class ConfigTunnelsHandler extends FormHandler {
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
private void saveChanges() {
|
private void saveChanges() {
|
||||||
configTunnel_log = _context.logManager().getLog(ConfigTunnelsHandler.class);
|
|
||||||
boolean saveRequired = false;
|
boolean saveRequired = false;
|
||||||
|
|
||||||
if (configTunnel_log.shouldLog(Log.DEBUG))
|
if (_log.shouldLog(Log.DEBUG))
|
||||||
configTunnel_log.debug("Saving changes, with props = " + _settings + ".");
|
_log.debug("Saving changes, with props = " + _settings + ".");
|
||||||
|
|
||||||
int updated = 0;
|
int updated = 0;
|
||||||
int index = 0;
|
int index = 0;
|
||||||
@ -111,16 +109,16 @@ public class ConfigTunnelsHandler extends FormHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ("exploratory".equals(poolName)) {
|
if ("exploratory".equals(poolName)) {
|
||||||
if (configTunnel_log.shouldLog(Log.DEBUG)) {
|
if (_log.shouldLog(Log.DEBUG)) {
|
||||||
configTunnel_log.debug("Inbound exploratory settings: " + in);
|
_log.debug("Inbound exploratory settings: " + in);
|
||||||
configTunnel_log.debug("Outbound exploratory settings: " + out);
|
_log.debug("Outbound exploratory settings: " + out);
|
||||||
}
|
}
|
||||||
_context.tunnelManager().setInboundSettings(in);
|
_context.tunnelManager().setInboundSettings(in);
|
||||||
_context.tunnelManager().setOutboundSettings(out);
|
_context.tunnelManager().setOutboundSettings(out);
|
||||||
} else {
|
} else {
|
||||||
if (configTunnel_log.shouldLog(Log.DEBUG)) {
|
if (_log.shouldLog(Log.DEBUG)) {
|
||||||
configTunnel_log.debug("Inbound settings for " + client.toBase64() + ": " + in);
|
_log.debug("Inbound settings for " + client.toBase64() + ": " + in);
|
||||||
configTunnel_log.debug("Outbound settings for " + client.toBase64() + ": " + out);
|
_log.debug("Outbound settings for " + client.toBase64() + ": " + out);
|
||||||
}
|
}
|
||||||
_context.tunnelManager().setInboundSettings(client, in);
|
_context.tunnelManager().setInboundSettings(client, in);
|
||||||
_context.tunnelManager().setOutboundSettings(client, out);
|
_context.tunnelManager().setOutboundSettings(client, out);
|
||||||
|
@ -46,10 +46,11 @@ public class ConfigUIHelper extends HelperBase {
|
|||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static final String langs[] = {"de", "en", "es", "fr", "nl", "ru", "sv", "zh"};
|
private static final String langs[] = {"de", "en", "es", "fr", "nl", "pt", "ru", "sv", "zh"};
|
||||||
private static final String flags[] = {"de", "us", "es", "fr", "nl", "ru", "se", "cn"};
|
private static final String flags[] = {"de", "us", "es", "fr", "nl", "pt", "ru", "se", "cn"};
|
||||||
private static final String xlangs[] = {_x("German"), _x("English"), _x("Spanish"),_x("French"),
|
private static final String xlangs[] = {_x("German"), _x("English"), _x("Spanish"),_x("French"),
|
||||||
_x("Dutch"), _x("Russian"), _x("Swedish"), _x("Chinese")};
|
_x("Dutch"), _x("Portuguese"), _x("Russian"),
|
||||||
|
_x("Swedish"), _x("Chinese")};
|
||||||
|
|
||||||
/** todo sort by translated string */
|
/** todo sort by translated string */
|
||||||
public String getLangSettings() {
|
public String getLangSettings() {
|
||||||
|
@ -50,6 +50,7 @@ public class PluginStarter implements Runnable {
|
|||||||
private static Map<String, ThreadGroup> pluginThreadGroups = new ConcurrentHashMap<String, ThreadGroup>(); // one thread group per plugin (map key=plugin name)
|
private static Map<String, ThreadGroup> pluginThreadGroups = new ConcurrentHashMap<String, ThreadGroup>(); // one thread group per plugin (map key=plugin name)
|
||||||
private static Map<String, Collection<Job>> pluginJobs = new ConcurrentHashMap<String, Collection<Job>>();
|
private static Map<String, Collection<Job>> pluginJobs = new ConcurrentHashMap<String, Collection<Job>>();
|
||||||
private static Map<String, ClassLoader> _clCache = new ConcurrentHashMap();
|
private static Map<String, ClassLoader> _clCache = new ConcurrentHashMap();
|
||||||
|
private static Map<String, Collection<String>> pluginWars = new ConcurrentHashMap<String, Collection<String>>();
|
||||||
|
|
||||||
public PluginStarter(RouterContext ctx) {
|
public PluginStarter(RouterContext ctx) {
|
||||||
_context = ctx;
|
_context = ctx;
|
||||||
@ -125,6 +126,8 @@ public class PluginStarter implements Runnable {
|
|||||||
File webappDir = new File(consoleDir, "webapps");
|
File webappDir = new File(consoleDir, "webapps");
|
||||||
String fileNames[] = webappDir.list(RouterConsoleRunner.WarFilenameFilter.instance());
|
String fileNames[] = webappDir.list(RouterConsoleRunner.WarFilenameFilter.instance());
|
||||||
if (fileNames != null) {
|
if (fileNames != null) {
|
||||||
|
if(!pluginWars.containsKey(appName))
|
||||||
|
pluginWars.put(appName, new ConcurrentHashSet<String>());
|
||||||
for (int i = 0; i < fileNames.length; i++) {
|
for (int i = 0; i < fileNames.length; i++) {
|
||||||
try {
|
try {
|
||||||
String warName = fileNames[i].substring(0, fileNames[i].lastIndexOf(".war"));
|
String warName = fileNames[i].substring(0, fileNames[i].lastIndexOf(".war"));
|
||||||
@ -139,6 +142,7 @@ public class PluginStarter implements Runnable {
|
|||||||
//log.error("Starting webapp: " + warName);
|
//log.error("Starting webapp: " + warName);
|
||||||
String path = new File(webappDir, fileNames[i]).getCanonicalPath();
|
String path = new File(webappDir, fileNames[i]).getCanonicalPath();
|
||||||
WebAppStarter.startWebApp(ctx, server, warName, path);
|
WebAppStarter.startWebApp(ctx, server, warName, path);
|
||||||
|
pluginWars.get(appName).add(warName);
|
||||||
}
|
}
|
||||||
} catch (IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
log.error("Error resolving '" + fileNames[i] + "' in '" + webappDir, ioe);
|
log.error("Error resolving '" + fileNames[i] + "' in '" + webappDir, ioe);
|
||||||
@ -215,6 +219,7 @@ public class PluginStarter implements Runnable {
|
|||||||
// stop console webapps in console/webapps
|
// stop console webapps in console/webapps
|
||||||
Server server = WebAppStarter.getConsoleServer();
|
Server server = WebAppStarter.getConsoleServer();
|
||||||
if (server != null) {
|
if (server != null) {
|
||||||
|
/*
|
||||||
File consoleDir = new File(pluginDir, "console");
|
File consoleDir = new File(pluginDir, "console");
|
||||||
Properties props = RouterConsoleRunner.webAppProperties(consoleDir.getAbsolutePath());
|
Properties props = RouterConsoleRunner.webAppProperties(consoleDir.getAbsolutePath());
|
||||||
File webappDir = new File(consoleDir, "webapps");
|
File webappDir = new File(consoleDir, "webapps");
|
||||||
@ -228,6 +233,13 @@ public class PluginStarter implements Runnable {
|
|||||||
WebAppStarter.stopWebApp(server, warName);
|
WebAppStarter.stopWebApp(server, warName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
Iterator <String> wars = pluginWars.get(appName).iterator();
|
||||||
|
while (wars.hasNext()) {
|
||||||
|
String warName = wars.next();
|
||||||
|
WebAppStarter.stopWebApp(server, warName);
|
||||||
|
}
|
||||||
|
pluginWars.get(appName).clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
// remove summary bar link
|
// remove summary bar link
|
||||||
@ -487,10 +499,25 @@ public class PluginStarter implements Runnable {
|
|||||||
isJobRunning = true;
|
isJobRunning = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
boolean isWarRunning = false;
|
||||||
|
if(pluginWars.containsKey(pluginName)) {
|
||||||
|
Iterator <String> it = pluginWars.get(pluginName).iterator();
|
||||||
|
while(it.hasNext() && !isWarRunning) {
|
||||||
|
String warName = it.next();
|
||||||
|
if(WebAppStarter.isWebAppRunning(warName)) {
|
||||||
|
isWarRunning = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (log.shouldLog(Log.DEBUG))
|
if (log.shouldLog(Log.DEBUG))
|
||||||
log.debug("plugin name = <" + pluginName + ">; threads running? " + isClientThreadRunning(pluginName) + "; webapp runing? " + WebAppStarter.isWebAppRunning(pluginName) + "; jobs running? " + isJobRunning);
|
log.debug("plugin name = <" + pluginName + ">; threads running? " + isClientThreadRunning(pluginName) + "; webapp runing? " + isWarRunning + "; jobs running? " + isJobRunning);
|
||||||
return isClientThreadRunning(pluginName) || WebAppStarter.isWebAppRunning(pluginName) || isJobRunning;
|
return isClientThreadRunning(pluginName) || isWarRunning || isJobRunning;
|
||||||
|
//
|
||||||
|
//if (log.shouldLog(Log.DEBUG))
|
||||||
|
// log.debug("plugin name = <" + pluginName + ">; threads running? " + isClientThreadRunning(pluginName) + "; webapp runing? " + WebAppStarter.isWebAppRunning(pluginName) + "; jobs running? " + isJobRunning);
|
||||||
|
//return isClientThreadRunning(pluginName) || WebAppStarter.isWebAppRunning(pluginName) || isJobRunning;
|
||||||
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -6,6 +6,7 @@ import java.io.OutputStream;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.StringTokenizer;
|
import java.util.StringTokenizer;
|
||||||
|
import java.util.concurrent.Semaphore;
|
||||||
|
|
||||||
import net.i2p.router.RouterContext;
|
import net.i2p.router.RouterContext;
|
||||||
import net.i2p.stat.Rate;
|
import net.i2p.stat.Rate;
|
||||||
@ -20,17 +21,20 @@ import org.jrobin.graph.RrdGraphDef;
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class StatSummarizer implements Runnable {
|
public class StatSummarizer implements Runnable {
|
||||||
private RouterContext _context;
|
private final RouterContext _context;
|
||||||
private Log _log;
|
private final Log _log;
|
||||||
/** list of SummaryListener instances */
|
/** list of SummaryListener instances */
|
||||||
private List _listeners;
|
private final List<SummaryListener> _listeners;
|
||||||
private static StatSummarizer _instance;
|
private static StatSummarizer _instance;
|
||||||
|
private static final int MAX_CONCURRENT_PNG = 3;
|
||||||
|
private final Semaphore _sem;
|
||||||
|
|
||||||
public StatSummarizer() {
|
public StatSummarizer() {
|
||||||
_context = (RouterContext)RouterContext.listContexts().get(0); // fuck it, only summarize one per jvm
|
_context = (RouterContext)RouterContext.listContexts().get(0); // fuck it, only summarize one per jvm
|
||||||
_log = _context.logManager().getLog(getClass());
|
_log = _context.logManager().getLog(getClass());
|
||||||
_listeners = new ArrayList(16);
|
_listeners = new ArrayList(16);
|
||||||
_instance = this;
|
_instance = this;
|
||||||
|
_sem = new Semaphore(MAX_CONCURRENT_PNG, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static StatSummarizer instance() { return _instance; }
|
public static StatSummarizer instance() { return _instance; }
|
||||||
@ -44,7 +48,7 @@ public class StatSummarizer implements Runnable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/** list of SummaryListener instances */
|
/** list of SummaryListener instances */
|
||||||
List getListeners() { return _listeners; }
|
List<SummaryListener> getListeners() { return _listeners; }
|
||||||
|
|
||||||
private static final String DEFAULT_DATABASES = "bw.sendRate.60000" +
|
private static final String DEFAULT_DATABASES = "bw.sendRate.60000" +
|
||||||
",bw.recvRate.60000" +
|
",bw.recvRate.60000" +
|
||||||
@ -77,31 +81,32 @@ public class StatSummarizer implements Runnable {
|
|||||||
( (spec != null) && (oldSpecs != null) && (oldSpecs.equals(spec))) )
|
( (spec != null) && (oldSpecs != null) && (oldSpecs.equals(spec))) )
|
||||||
return oldSpecs;
|
return oldSpecs;
|
||||||
|
|
||||||
List old = parseSpecs(oldSpecs);
|
List<Rate> old = parseSpecs(oldSpecs);
|
||||||
List newSpecs = parseSpecs(spec);
|
List<Rate> newSpecs = parseSpecs(spec);
|
||||||
|
|
||||||
// remove old ones
|
// remove old ones
|
||||||
for (int i = 0; i < old.size(); i++) {
|
for (Rate r : old) {
|
||||||
Rate r = (Rate)old.get(i);
|
|
||||||
if (!newSpecs.contains(r))
|
if (!newSpecs.contains(r))
|
||||||
removeDb(r);
|
removeDb(r);
|
||||||
}
|
}
|
||||||
// add new ones
|
// add new ones
|
||||||
StringBuilder buf = new StringBuilder();
|
StringBuilder buf = new StringBuilder();
|
||||||
for (int i = 0; i < newSpecs.size(); i++) {
|
boolean comma = false;
|
||||||
Rate r = (Rate)newSpecs.get(i);
|
for (Rate r : newSpecs) {
|
||||||
if (!old.contains(r))
|
if (!old.contains(r))
|
||||||
addDb(r);
|
addDb(r);
|
||||||
buf.append(r.getRateStat().getName()).append(".").append(r.getPeriod());
|
if (comma)
|
||||||
if (i + 1 < newSpecs.size())
|
|
||||||
buf.append(',');
|
buf.append(',');
|
||||||
|
else
|
||||||
|
comma = true;
|
||||||
|
buf.append(r.getRateStat().getName()).append(".").append(r.getPeriod());
|
||||||
}
|
}
|
||||||
return buf.toString();
|
return buf.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void removeDb(Rate r) {
|
private void removeDb(Rate r) {
|
||||||
for (int i = 0; i < _listeners.size(); i++) {
|
for (int i = 0; i < _listeners.size(); i++) {
|
||||||
SummaryListener lsnr = (SummaryListener)_listeners.get(i);
|
SummaryListener lsnr = _listeners.get(i);
|
||||||
if (lsnr.getRate().equals(r)) {
|
if (lsnr.getRate().equals(r)) {
|
||||||
_listeners.remove(i);
|
_listeners.remove(i);
|
||||||
lsnr.stopListening();
|
lsnr.stopListening();
|
||||||
@ -115,16 +120,40 @@ public class StatSummarizer implements Runnable {
|
|||||||
lsnr.startListening();
|
lsnr.startListening();
|
||||||
//System.out.println("Start listening for " + r.getRateStat().getName() + ": " + r.getPeriod());
|
//System.out.println("Start listening for " + r.getRateStat().getName() + ": " + r.getPeriod());
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean renderPng(Rate rate, OutputStream out) throws IOException {
|
public boolean renderPng(Rate rate, OutputStream out) throws IOException {
|
||||||
return renderPng(rate, out, -1, -1, false, false, false, false, -1, true);
|
return renderPng(rate, out, -1, -1, false, false, false, false, -1, true);
|
||||||
}
|
}
|
||||||
public boolean renderPng(Rate rate, OutputStream out, int width, int height, boolean hideLegend, boolean hideGrid, boolean hideTitle, boolean showEvents, int periodCount, boolean showCredit) throws IOException {
|
|
||||||
|
/**
|
||||||
|
* This does the single data graphs.
|
||||||
|
* For the two-data bandwidth graph see renderRatePng().
|
||||||
|
* Synchronized to conserve memory.
|
||||||
|
* @return success
|
||||||
|
*/
|
||||||
|
public boolean renderPng(Rate rate, OutputStream out, int width, int height, boolean hideLegend,
|
||||||
|
boolean hideGrid, boolean hideTitle, boolean showEvents, int periodCount,
|
||||||
|
boolean showCredit) throws IOException {
|
||||||
|
try {
|
||||||
|
try {
|
||||||
|
_sem.acquire();
|
||||||
|
} catch (InterruptedException ie) {}
|
||||||
|
return locked_renderPng(rate, out, width, height, hideLegend, hideGrid, hideTitle, showEvents,
|
||||||
|
periodCount, showCredit);
|
||||||
|
} finally {
|
||||||
|
_sem.release();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean locked_renderPng(Rate rate, OutputStream out, int width, int height, boolean hideLegend,
|
||||||
|
boolean hideGrid, boolean hideTitle, boolean showEvents, int periodCount,
|
||||||
|
boolean showCredit) throws IOException {
|
||||||
if (width > GraphHelper.MAX_X)
|
if (width > GraphHelper.MAX_X)
|
||||||
width = GraphHelper.MAX_X;
|
width = GraphHelper.MAX_X;
|
||||||
if (height > GraphHelper.MAX_Y)
|
if (height > GraphHelper.MAX_Y)
|
||||||
height = GraphHelper.MAX_Y;
|
height = GraphHelper.MAX_Y;
|
||||||
for (int i = 0; i < _listeners.size(); i++) {
|
for (int i = 0; i < _listeners.size(); i++) {
|
||||||
SummaryListener lsnr = (SummaryListener)_listeners.get(i);
|
SummaryListener lsnr = _listeners.get(i);
|
||||||
if (lsnr.getRate().equals(rate)) {
|
if (lsnr.getRate().equals(rate)) {
|
||||||
lsnr.renderPng(out, width, height, hideLegend, hideGrid, hideTitle, showEvents, periodCount, showCredit);
|
lsnr.renderPng(out, width, height, hideLegend, hideGrid, hideTitle, showEvents, periodCount, showCredit);
|
||||||
return true;
|
return true;
|
||||||
@ -132,13 +161,15 @@ public class StatSummarizer implements Runnable {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean renderPng(OutputStream out, String templateFilename) throws IOException {
|
public boolean renderPng(OutputStream out, String templateFilename) throws IOException {
|
||||||
SummaryRenderer.render(_context, out, templateFilename);
|
SummaryRenderer.render(_context, out, templateFilename);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean getXML(Rate rate, OutputStream out) throws IOException {
|
public boolean getXML(Rate rate, OutputStream out) throws IOException {
|
||||||
for (int i = 0; i < _listeners.size(); i++) {
|
for (int i = 0; i < _listeners.size(); i++) {
|
||||||
SummaryListener lsnr = (SummaryListener)_listeners.get(i);
|
SummaryListener lsnr = _listeners.get(i);
|
||||||
if (lsnr.getRate().equals(rate)) {
|
if (lsnr.getRate().equals(rate)) {
|
||||||
lsnr.getData().exportXml(out);
|
lsnr.getData().exportXml(out);
|
||||||
out.write(("<!-- Rate: " + lsnr.getRate().getRateStat().getName() + " for period " + lsnr.getRate().getPeriod() + " -->\n").getBytes());
|
out.write(("<!-- Rate: " + lsnr.getRate().getRateStat().getName() + " for period " + lsnr.getRate().getPeriod() + " -->\n").getBytes());
|
||||||
@ -152,8 +183,26 @@ public class StatSummarizer implements Runnable {
|
|||||||
/**
|
/**
|
||||||
* This does the two-data bandwidth graph only.
|
* This does the two-data bandwidth graph only.
|
||||||
* For all other graphs see SummaryRenderer
|
* For all other graphs see SummaryRenderer
|
||||||
|
* Synchronized to conserve memory.
|
||||||
|
* @return success
|
||||||
*/
|
*/
|
||||||
public boolean renderRatePng(OutputStream out, int width, int height, boolean hideLegend, boolean hideGrid, boolean hideTitle, boolean showEvents, int periodCount, boolean showCredit) throws IOException {
|
public boolean renderRatePng(OutputStream out, int width, int height, boolean hideLegend,
|
||||||
|
boolean hideGrid, boolean hideTitle, boolean showEvents,
|
||||||
|
int periodCount, boolean showCredit) throws IOException {
|
||||||
|
try {
|
||||||
|
try {
|
||||||
|
_sem.acquire();
|
||||||
|
} catch (InterruptedException ie) {}
|
||||||
|
return locked_renderRatePng(out, width, height, hideLegend, hideGrid, hideTitle, showEvents,
|
||||||
|
periodCount, showCredit);
|
||||||
|
} finally {
|
||||||
|
_sem.release();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean locked_renderRatePng(OutputStream out, int width, int height, boolean hideLegend,
|
||||||
|
boolean hideGrid, boolean hideTitle, boolean showEvents,
|
||||||
|
int periodCount, boolean showCredit) throws IOException {
|
||||||
long end = _context.clock().now() - 60*1000;
|
long end = _context.clock().now() - 60*1000;
|
||||||
if (width > GraphHelper.MAX_X)
|
if (width > GraphHelper.MAX_X)
|
||||||
width = GraphHelper.MAX_X;
|
width = GraphHelper.MAX_X;
|
||||||
@ -230,9 +279,9 @@ public class StatSummarizer implements Runnable {
|
|||||||
* @param specs statName.period,statName.period,statName.period
|
* @param specs statName.period,statName.period,statName.period
|
||||||
* @return list of Rate objects
|
* @return list of Rate objects
|
||||||
*/
|
*/
|
||||||
private List parseSpecs(String specs) {
|
private List<Rate> parseSpecs(String specs) {
|
||||||
StringTokenizer tok = new StringTokenizer(specs, ",");
|
StringTokenizer tok = new StringTokenizer(specs, ",");
|
||||||
List rv = new ArrayList();
|
List<Rate> rv = new ArrayList();
|
||||||
while (tok.hasMoreTokens()) {
|
while (tok.hasMoreTokens()) {
|
||||||
String spec = tok.nextToken();
|
String spec = tok.nextToken();
|
||||||
int split = spec.lastIndexOf('.');
|
int split = spec.lastIndexOf('.');
|
||||||
|
@ -10,7 +10,11 @@
|
|||||||
<h1><%=intl._("I2P Router Logs")%></h1>
|
<h1><%=intl._("I2P Router Logs")%></h1>
|
||||||
<div class="main" id="main">
|
<div class="main" id="main">
|
||||||
<div class="joblog"><h3><%=intl._("I2P Version & Running Environment")%></h3><a name="version"> </a>
|
<div class="joblog"><h3><%=intl._("I2P Version & Running Environment")%></h3><a name="version"> </a>
|
||||||
<p><%=intl._("Please report bugs on <a href=\"http://trac.i2p2.i2p/newticket\">trac.i2p2.i2p</a> or <a href=\"http://trac.i2p2.de/newticket\">trac.i2p2.de</a>.")%>
|
<p>
|
||||||
|
<% /* note to translators - both parameters are URLs */
|
||||||
|
%><%=intl._("Please report bugs on {0} or {1}.",
|
||||||
|
"<a href=\"http://trac.i2p2.i2p/newticket\">trac.i2p2.i2p</a>",
|
||||||
|
"<a href=\"http://trac.i2p2.de/newticket\">trac.i2p2.de</a>")%>
|
||||||
<%=intl._("You may use the username \"guest\" and password \"guest\" if you do not wish to register.")%>
|
<%=intl._("You may use the username \"guest\" and password \"guest\" if you do not wish to register.")%>
|
||||||
<p><i><%=intl._("Please include this information in bug reports")%>:</i>
|
<p><i><%=intl._("Please include this information in bug reports")%>:</i>
|
||||||
<p>
|
<p>
|
||||||
|
@ -80,7 +80,9 @@ public class Base64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Decodes data from Base64 notation.
|
||||||
* @param s Base 64 encoded string using the I2P alphabet A-Z, a-z, 0-9, -, ~
|
* @param s Base 64 encoded string using the I2P alphabet A-Z, a-z, 0-9, -, ~
|
||||||
|
* @return the decoded data, null on error
|
||||||
*/
|
*/
|
||||||
public static byte[] decode(String s) {
|
public static byte[] decode(String s) {
|
||||||
return safeDecode(s, false);
|
return safeDecode(s, false);
|
||||||
@ -234,6 +236,7 @@ public class Base64 {
|
|||||||
System.out.println("or : Base64 test");
|
System.out.println("or : Base64 test");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*******
|
||||||
private static void test() {
|
private static void test() {
|
||||||
String orig = "you smell";
|
String orig = "you smell";
|
||||||
String encoded = Base64.encode(orig.getBytes());
|
String encoded = Base64.encode(orig.getBytes());
|
||||||
@ -255,6 +258,7 @@ public class Base64 {
|
|||||||
else
|
else
|
||||||
throw new RuntimeException("D(E([all bytes])) != [all bytes]!!!");
|
throw new RuntimeException("D(E([all bytes])) != [all bytes]!!!");
|
||||||
}
|
}
|
||||||
|
*******/
|
||||||
|
|
||||||
/* ******** E N C O D I N G M E T H O D S ******** */
|
/* ******** E N C O D I N G M E T H O D S ******** */
|
||||||
|
|
||||||
|
@ -82,10 +82,20 @@ public abstract class SimpleDataStructure extends DataStructureImpl {
|
|||||||
return Base64.encode(_data);
|
return Base64.encode(_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the data.
|
||||||
|
* @throws DataFormatException if decoded data is not the legal number of bytes or on decoding error
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void fromBase64(String data) throws DataFormatException {
|
public void fromBase64(String data) throws DataFormatException {
|
||||||
if (data == null) throw new DataFormatException("Null data passed in");
|
if (data == null) throw new DataFormatException("Null data passed in");
|
||||||
_data = Base64.decode(data);
|
byte[] d = Base64.decode(data);
|
||||||
|
if (d == null)
|
||||||
|
throw new DataFormatException("Bad Base64 encoded data");
|
||||||
|
if (d.length != _length)
|
||||||
|
throw new DataFormatException("Bad decoded data length, expected " + _length + " got " + d.length);
|
||||||
|
// call setData() instead of _data = data in case overridden
|
||||||
|
setData(d);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return the SHA256 hash of the byte array, or null if the data is null */
|
/** @return the SHA256 hash of the byte array, or null if the data is null */
|
||||||
@ -106,7 +116,7 @@ public abstract class SimpleDataStructure extends DataStructureImpl {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Overridden for efficiency.
|
* Overridden for efficiency.
|
||||||
* Does the same thing as getData() but null not allowed.
|
* Does the same thing as setData() but null not allowed.
|
||||||
* @param data non-null
|
* @param data non-null
|
||||||
* @throws DataFormatException if null or wrong length
|
* @throws DataFormatException if null or wrong length
|
||||||
*/
|
*/
|
||||||
@ -114,7 +124,8 @@ public abstract class SimpleDataStructure extends DataStructureImpl {
|
|||||||
public void fromByteArray(byte data[]) throws DataFormatException {
|
public void fromByteArray(byte data[]) throws DataFormatException {
|
||||||
if (data == null) throw new DataFormatException("Null data passed in");
|
if (data == null) throw new DataFormatException("Null data passed in");
|
||||||
if (data.length != _length) throw new DataFormatException("Bad data length");
|
if (data.length != _length) throw new DataFormatException("Bad data length");
|
||||||
_data = data;
|
// call setData() instead of _data = data in case overridden
|
||||||
|
setData(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
9
debian/changelog
vendored
@ -1,3 +1,12 @@
|
|||||||
|
i2p (0.8.1-4) all; urgency=low
|
||||||
|
* I2P 0.8.1-6
|
||||||
|
* Closes: #448638
|
||||||
|
-- Hungry Hobo <HungryHobo@i2pmail.org> Mon, 24 Nov 2010 17:14:57 +0000
|
||||||
|
|
||||||
|
i2p (0.8.1-3) all; urgency=low
|
||||||
|
* I2P 0.8.1-3
|
||||||
|
-- Hungry Hobo <HungryHobo@i2pmail.org> Mon, 21 Nov 2010 17:14:57 +0000
|
||||||
|
|
||||||
i2p (0.8.1) all; urgency=low
|
i2p (0.8.1) all; urgency=low
|
||||||
* Speedups
|
* Speedups
|
||||||
* Bugfixes
|
* Bugfixes
|
||||||
|
6
debian/makerepo.sh
vendored
@ -1,4 +1,4 @@
|
|||||||
#!/bin/bash
|
#!/bin/sh
|
||||||
# This script creates a Debian repository in ${DIR} using the reprepro tool.
|
# This script creates a Debian repository in ${DIR} using the reprepro tool.
|
||||||
# The packages are signed with the key referenced in the newest changelog entry.
|
# The packages are signed with the key referenced in the newest changelog entry.
|
||||||
|
|
||||||
@ -9,9 +9,7 @@ DIR=./repo
|
|||||||
CONFDIR=conf
|
CONFDIR=conf
|
||||||
CONFFILE=${CONFDIR}/distributions
|
CONFFILE=${CONFDIR}/distributions
|
||||||
|
|
||||||
SIGNER=`parsechangelog --file changelog | grep Maintainer | cut -d: -f2`
|
SIGNER=`parsechangelog --file changelog | grep Maintainer | cut -d\< -f2 | cut -d\> -f1`
|
||||||
SIGNER=${SIGNER//^ /}
|
|
||||||
SIGNER=`echo ${SIGNER} | cut -d\ -f1`
|
|
||||||
KEYID=`gpg --list-keys "${SIGNER}" | cut -d: -f2 | grep -w pub | cut -d/ -f2 | cut -d\ -f1`
|
KEYID=`gpg --list-keys "${SIGNER}" | cut -d: -f2 | grep -w pub | cut -d/ -f2 | cut -d\ -f1`
|
||||||
echo Using signing key: ${SIGNER}
|
echo Using signing key: ${SIGNER}
|
||||||
echo Key ID: ${KEYID}
|
echo Key ID: ${KEYID}
|
||||||
|
26
history.txt
@ -1,3 +1,29 @@
|
|||||||
|
2010-11-24 zzz
|
||||||
|
* configui: Add .pt
|
||||||
|
* configtunnels: Log cleanup
|
||||||
|
* graphs: Synch to conserve memory; cleanup
|
||||||
|
* i2psnark:
|
||||||
|
- Prevent dup requests during end game
|
||||||
|
(ticket 331 - thanks sponge and Oct!)
|
||||||
|
- POST parameter tweaks
|
||||||
|
- Message cleanup
|
||||||
|
* logs: Add trac login hint
|
||||||
|
* Router:
|
||||||
|
- Save some info to config file when installing or updating
|
||||||
|
- Remove global lock on accessing config
|
||||||
|
- Add global lock on reading/writing config file
|
||||||
|
* SimpleDataStructure: Fix problem in fromBase64() that
|
||||||
|
manifested itself as a configtunnels.jsp bug
|
||||||
|
|
||||||
|
2010-11-24 sponge
|
||||||
|
* Slackware, fix rc.i2p, bad logic.
|
||||||
|
|
||||||
|
2010-11-24 sponge
|
||||||
|
* Plugin: ticket 104 Fix webapp isRunning to check ALL webapps.
|
||||||
|
The only defecency is that if one is running, that it considers the
|
||||||
|
entire pliugin to be running. I'm not sure if that is a good thing
|
||||||
|
or a bad thing, but the other code checks threads that way.
|
||||||
|
|
||||||
2010-11-22 zzz
|
2010-11-22 zzz
|
||||||
* Addressbook: Fix rename error on Windows (tkt 323 - thanks RN!)
|
* Addressbook: Fix rename error on Windows (tkt 323 - thanks RN!)
|
||||||
* build.xml: Cleanup, fix distclean error in older ants.
|
* build.xml: Cleanup, fix distclean error in older ants.
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
<a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a>
|
<a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a>
|
||||||
<a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a>
|
<a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a>
|
||||||
<a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Español" alt="Español"></a>
|
<a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Español" alt="Español"></a>
|
||||||
<a href="/index.jsp?lang=br"><img src="/flags.jsp?c=br" title="Português" alt="Português"></a>
|
<a href="/index.jsp?lang=pt"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a>
|
||||||
<a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a>
|
<a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a>
|
||||||
<a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a>
|
<a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a>
|
||||||
<a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div>
|
<a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div>
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
<a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a>
|
<a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a>
|
||||||
<a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a>
|
<a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a>
|
||||||
<a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Español" alt="Español"></a>
|
<a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Español" alt="Español"></a>
|
||||||
<a href="/index.jsp?lang=br"><img src="/flags.jsp?c=br" title="Português" alt="Português"></a>
|
<a href="/index.jsp?lang=pt"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a>
|
||||||
<a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a>
|
<a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a>
|
||||||
<a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a>
|
<a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a>
|
||||||
<a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a>
|
<a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a>
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
<a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a>
|
<a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a>
|
||||||
<a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a>
|
<a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a>
|
||||||
<a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Español" alt="Español"></a>
|
<a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Español" alt="Español"></a>
|
||||||
<a href="/index.jsp?lang=br"><img src="/flags.jsp?c=br" title="Português" alt="Português"></a>
|
<a href="/index.jsp?lang=pt"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a>
|
||||||
<a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a>
|
<a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a>
|
||||||
<a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a>
|
<a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a>
|
||||||
<a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div>
|
<a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div>
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
<a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a>
|
<a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a>
|
||||||
<a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a>
|
<a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a>
|
||||||
<a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Español" alt="Español"></a>
|
<a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Español" alt="Español"></a>
|
||||||
<a href="/index.jsp?lang=br"><img src="/flags.jsp?c=br" title="Português" alt="Português"></a>
|
<a href="/index.jsp?lang=pt"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a>
|
||||||
<a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a>
|
<a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a>
|
||||||
<a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a>
|
<a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a>
|
||||||
<a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div>
|
<a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div>
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
<a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a>
|
<a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a>
|
||||||
<a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a>
|
<a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a>
|
||||||
<a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Español" alt="Español"></a>
|
<a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Español" alt="Español"></a>
|
||||||
<a href="/index.jsp?lang=br"><img src="/flags.jsp?c=br" title="Português" alt="Português"></a>
|
<a href="/index.jsp?lang=pt"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a>
|
||||||
<a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a>
|
<a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a>
|
||||||
<a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a>
|
<a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a>
|
||||||
<a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div>
|
<a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div>
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
<a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a>
|
<a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a>
|
||||||
<a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a>
|
<a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a>
|
||||||
<a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Español" alt="Español"></a>
|
<a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Español" alt="Español"></a>
|
||||||
<a href="/index.jsp?lang=br"><img src="/flags.jsp?c=br" title="Português" alt="Português"></a>
|
<a href="/index.jsp?lang=pt"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a>
|
||||||
<a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a>
|
<a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a>
|
||||||
<a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a>
|
<a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a>
|
||||||
<a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div>
|
<a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div>
|
@ -5,7 +5,7 @@
|
|||||||
<a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a>
|
<a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a>
|
||||||
<a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a>
|
<a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a>
|
||||||
<a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Español" alt="Español"></a>
|
<a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Español" alt="Español"></a>
|
||||||
<a href="/index.jsp?lang=br"><img src="/flags.jsp?c=br" title="Português" alt="Português"></a>
|
<a href="/index.jsp?lang=pt"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a>
|
||||||
<a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a>
|
<a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a>
|
||||||
<a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a>
|
<a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a>
|
||||||
<a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div>
|
<a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div>
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
<a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a>
|
<a href="/index.jsp?lang=de"><img src="/flags.jsp?c=de" title="Deutsch" alt="Deutsch"></a>
|
||||||
<a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a>
|
<a href="/index.jsp?lang=fr"><img src="/flags.jsp?c=fr" title="Français" alt="Français"></a>
|
||||||
<a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Español" alt="Español"></a>
|
<a href="/index.jsp?lang=es"><img src="/flags.jsp?c=es" title="Español" alt="Español"></a>
|
||||||
<a href="/index.jsp?lang=br"><img src="/flags.jsp?c=br" title="Português" alt="Português"></a>
|
<a href="/index.jsp?lang=pt"><img src="/flags.jsp?c=pt" title="Português" alt="Português"></a>
|
||||||
<a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a>
|
<a href="/index.jsp?lang=nl"><img src="/flags.jsp?c=nl" title="Nederlands" alt="Nederlands"></a>
|
||||||
<a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a>
|
<a href="/index.jsp?lang=ru"><img src="/flags.jsp?c=ru" title="Русский" alt="Русский"></a>
|
||||||
<a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div>
|
<a href="/index.jsp?lang=sv"><img src="/flags.jsp?c=se" title="Svenska" alt="Svenska"></a></div>
|
||||||
|
@ -1,11 +1,10 @@
|
|||||||
/* I2P Theme: Classic */
|
/* I2P Theme: Classic (aka corporat) */
|
||||||
/* Description: Classic theme, loosely based on duck's original */
|
/* I2P Description: Light blue "classic" I2P theme; optimized for less capable browsers and system specifications. */
|
||||||
/* Optimized for less capable browsers and system specifications */
|
|
||||||
/* Author: dr|z3d */
|
/* Author: dr|z3d */
|
||||||
|
|
||||||
|
|
||||||
body {
|
body {
|
||||||
margin: 2px 0 0 2px;
|
margin: 5px 3px 5px 6px;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
background: #bbf;
|
background: #bbf;
|
||||||
@ -28,6 +27,8 @@ pre {
|
|||||||
padding-top: 10px;
|
padding-top: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Sidepanel for proxy errors */
|
||||||
|
|
||||||
div.logo {
|
div.logo {
|
||||||
float: left;
|
float: left;
|
||||||
position-relative: top 20px ;
|
position-relative: top 20px ;
|
||||||
@ -37,9 +38,7 @@ div.logo {
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
border: 5px solid #ddf;
|
border: 5px solid #ddf;
|
||||||
background-color: #eef;
|
background-color: #eef;
|
||||||
-moz-border-radius: 15px;
|
|
||||||
-moz-box-shadow: inset 0px 0px 0px 2px #99f;
|
-moz-box-shadow: inset 0px 0px 0px 2px #99f;
|
||||||
-khtml-border-radius: 15px;
|
|
||||||
-khtml-box-shadow: inset 0px 0px 0px 2px #99f;
|
-khtml-box-shadow: inset 0px 0px 0px 2px #99f;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -65,6 +64,8 @@ div.logo a:hover {
|
|||||||
color: #900;
|
color: #900;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* HTTP Proxy warning Main box */
|
||||||
|
|
||||||
div.warning {
|
div.warning {
|
||||||
margin: 20px 20px 10px 260px;
|
margin: 20px 20px 10px 260px;
|
||||||
padding: 0px 20px 20px 75px;
|
padding: 0px 20px 20px 75px;
|
||||||
@ -75,9 +76,7 @@ div.warning {
|
|||||||
background-image:url("../images/itoopie_sm.png");
|
background-image:url("../images/itoopie_sm.png");
|
||||||
background-position: 12px center;
|
background-position: 12px center;
|
||||||
background-repeat:no-repeat;
|
background-repeat:no-repeat;
|
||||||
-moz-border-radius: 15px;
|
|
||||||
-moz-box-shadow: inset 0px 0px 0px 2px #f60;
|
-moz-box-shadow: inset 0px 0px 0px 2px #f60;
|
||||||
-kthml-border-radius: 15px;
|
|
||||||
-khtml-box-shadow: inset 0px 0px 0px 2px #f60;
|
-khtml-box-shadow: inset 0px 0px 0px 2px #f60;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -92,7 +91,7 @@ div.warning a:visited{
|
|||||||
|
|
||||||
div.warning a:hover{
|
div.warning a:hover{
|
||||||
color: #d30;
|
color: #d30;
|
||||||
text-shadow: 0px 0px 1px rgba(255, 96, 0, 0.7);
|
text-shadow: 0px 0px 1px rgba(255, 96, 0, 0.7);
|
||||||
}
|
}
|
||||||
|
|
||||||
div.warning a:active{
|
div.warning a:active{
|
||||||
@ -107,25 +106,32 @@ div.warning hr {
|
|||||||
margin: 5px 0;
|
margin: 5px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
div.warning h3 {
|
||||||
|
border: 0;
|
||||||
|
border-bottom: 5px solid #fb7;
|
||||||
|
padding-bottom: 10px;
|
||||||
|
background: #ffd;
|
||||||
|
padding-left: 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* console error messages */
|
/* console error messages */
|
||||||
|
|
||||||
div.sorry {
|
div.sorry {
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
background: #ddf;
|
background: #ddf;
|
||||||
margin: -2px 1px 0 195px;
|
margin: -1px 1px 0 200px;
|
||||||
border: 5px solid #bbf;
|
border: 1px solid #89f;
|
||||||
text-align: justify;
|
text-align: justify;
|
||||||
-moz-box-shadow: inset 0px 0px 0px 1px #d00;
|
|
||||||
word-wrap: break-word;
|
word-wrap: break-word;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: #001;
|
color: #001;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.sorry hr {
|
div.sorry hr {
|
||||||
color: #001;
|
color: #89f;
|
||||||
background: #001;
|
background: #89f;
|
||||||
height: 1px;
|
height: 1px;
|
||||||
border: 1px solid #001;
|
border: 0px solid #89f;
|
||||||
margin: 10px 0;
|
margin: 10px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -135,9 +141,11 @@ div.toolbar {
|
|||||||
display: none !important;
|
display: none !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Side panel */
|
||||||
|
|
||||||
div.routersummaryouter {
|
div.routersummaryouter {
|
||||||
float: left;
|
float: left;
|
||||||
width: 200px;
|
width: 193px;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
border: 0;
|
border: 0;
|
||||||
@ -146,16 +154,16 @@ div.routersummaryouter {
|
|||||||
|
|
||||||
div.routersummary {
|
div.routersummary {
|
||||||
background: #ddf;
|
background: #ddf;
|
||||||
width: 185px;
|
width: 193px;
|
||||||
color: inherit;
|
color: inherit;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 10px 1px 7px 1px;
|
padding: 10px 1px 7px 1px;
|
||||||
text-align: center !important;
|
text-align: center !important;
|
||||||
border: 5px solid #bbf;
|
border: 1px solid #89f;
|
||||||
font-size: 9pt;
|
border-bottom: 1px solid #89f;
|
||||||
|
border-right: 1px solid #89f;
|
||||||
word-wrap: break-word;
|
word-wrap: break-word;
|
||||||
font: 9pt/125%;
|
font: 9pt/125% !important;
|
||||||
-moz-box-shadow: inset 0px 0px 0px 1px #99f;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
div.routersummary input[type=text] {
|
div.routersummary input[type=text] {
|
||||||
@ -163,45 +171,49 @@ div.routersummary input[type=text] {
|
|||||||
}
|
}
|
||||||
|
|
||||||
div.routersummary hr {
|
div.routersummary hr {
|
||||||
color: #eef;
|
color: #89f;
|
||||||
background: #eef;
|
background: #89f;
|
||||||
height: 2px;
|
height: 0px;
|
||||||
border-bottom: 1px solid #eef;
|
border-bottom: 1px solid #89f;
|
||||||
margin: 8px 1px 7px 1px;
|
margin: 8px -1px 7px -1px;
|
||||||
-moz-box-shadow: inset 0px 1px 1px 1px #99f;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
div.routersummary h3 {
|
div.routersummary h3 {
|
||||||
border: 0px solid #f00;
|
border: 0px solid #f00;
|
||||||
font-size: 9.5pt;
|
font-size: 9.5pt;
|
||||||
letter-spacing: 0.05em;
|
letter-spacing: 0.05em;
|
||||||
margin: -7px 1px -7px 1px;
|
margin: -7px 0px -8px 0px;
|
||||||
padding: 1px 0;
|
padding: 1px 0;
|
||||||
background: #c5d5fb;
|
background: #c5d5fb;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.routersummary h4 {
|
div.routersummary h4 {
|
||||||
border: 0px solid #f00;
|
border: 0;
|
||||||
border-bottom: 0 !important;
|
border-bottom: 0 !important;
|
||||||
font-size: 8.5pt;
|
font-size: 8.5pt;
|
||||||
letter-spacing: 0.05em;
|
letter-spacing: 0.05em;
|
||||||
margin: -7px 1px -7px 1px !important;
|
margin: -7px 0px -8px 0px !important;
|
||||||
padding: 1px 3px;
|
padding: 3px 0;
|
||||||
background: #c1d1f7;
|
background: #c1d1f7;
|
||||||
text-transform: capitalize;
|
text-transform: capitalize;
|
||||||
text-decoration: none !important;
|
text-decoration: none !important;
|
||||||
color: #2b2;
|
color: #2b2;
|
||||||
|
line-height: 90%;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.routersummary h3 a, div.routersummary h4 a {
|
||||||
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.routersummary table {
|
div.routersummary table {
|
||||||
border: 0;
|
border: 0;
|
||||||
text-align: center !important;
|
text-align: center !important;
|
||||||
margin: -5px 4px -5px 3px;
|
margin: -5px 0px -5px 0px;
|
||||||
width: 180px !important;
|
width: 193px !important;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
font-size: 8pt;
|
font-size: 8pt;
|
||||||
padding: 0 -10px;
|
padding: 0 -12px;
|
||||||
background-image: none !important;
|
background-image: none !important;
|
||||||
background-color: transparent !important;
|
background-color: transparent !important;
|
||||||
}
|
}
|
||||||
@ -212,20 +224,47 @@ div.routersummary tr {
|
|||||||
border: 0 !important;
|
border: 0 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
div.tunnels table {
|
||||||
|
margin: 0 -7px !important;
|
||||||
|
width: 193px;
|
||||||
|
}
|
||||||
|
|
||||||
div.tunnels table{
|
div.tunnels table{
|
||||||
margin: 0 !important;
|
margin: -2px 0px -4px 0px !important;
|
||||||
|
text-align: center !important;
|
||||||
|
width: 190px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tunnels tr {
|
.tunnels tr {
|
||||||
padding: 2px 0 !important;
|
padding: 2px 0 !important;
|
||||||
margin-left: -7px !important;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.tunnels a {
|
||||||
|
text-transform: capitalize;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tunnels td:first-child {
|
||||||
|
width: 16px !important;
|
||||||
|
padding-right: 0px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tunnels td:last-child {
|
||||||
|
width: 12px;
|
||||||
|
text-align: right;
|
||||||
|
margin-right: -2px;
|
||||||
|
}
|
||||||
|
|
||||||
div.routersummary form {
|
div.routersummary form {
|
||||||
margin-top: -6px !important;
|
margin-top: -6px !important;
|
||||||
margin-bottom: -4px !important;
|
margin-bottom: -4px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
div.routersummary form:last-child {
|
||||||
|
padding-top: 3px !important;
|
||||||
|
margin-bottom: -10px !important;
|
||||||
|
}
|
||||||
|
|
||||||
div.refresh {
|
div.refresh {
|
||||||
margin-top: 10px !important;
|
margin-top: 10px !important;
|
||||||
margin-bottom: 10px !important;
|
margin-bottom: 10px !important;
|
||||||
@ -251,21 +290,17 @@ div.routersummary td {
|
|||||||
border: 0 !important;
|
border: 0 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.warning h3 {
|
|
||||||
border-bottom: 5px solid #fb7;
|
|
||||||
padding-bottom: 10px;
|
|
||||||
}
|
|
||||||
|
|
||||||
div.main {
|
div.main {
|
||||||
margin: 0px 0px 0px 195px;
|
margin: 0px 1px 0px 200px;
|
||||||
padding: 15px 15px 10px 15px;
|
padding: 15px 15px 10px 15px;
|
||||||
background: #eef;
|
background: #eef;
|
||||||
border: 5px solid #bbf;
|
border: 1px solid #89f;
|
||||||
|
border-bottom: 1px solid #89f;
|
||||||
|
border-right: 1px solid #89f;
|
||||||
border-top: 0;
|
border-top: 0;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
color: #001;
|
color: #001;
|
||||||
min-width: 570px;
|
min-width: 500px;
|
||||||
-moz-box-shadow: inset 0px 0px 0px 1px #99f;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
div.main ul {
|
div.main ul {
|
||||||
@ -295,7 +330,7 @@ div.main textarea {
|
|||||||
|
|
||||||
div.main h2 {
|
div.main h2 {
|
||||||
margin-top: 20px;
|
margin-top: 20px;
|
||||||
margin-bottom: -5px;
|
margin-bottom: 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.welcome {
|
div.welcome {
|
||||||
@ -325,17 +360,18 @@ div.wideload p !important {
|
|||||||
}
|
}
|
||||||
|
|
||||||
div.news {
|
div.news {
|
||||||
margin: -5px 0px 0 195px;
|
margin: -1px 1px 0 200px;
|
||||||
padding: -10px 0px 8px 0px;
|
padding: -10px 0px 8px 0px;
|
||||||
background: #ffffc0;
|
background: #ffffc0;
|
||||||
border: 5px solid #bbf;
|
border: 1px solid #89f;
|
||||||
|
border-bottom: 1px solid #89f;
|
||||||
|
border-right: 1px solid #89f;
|
||||||
text-align: right;
|
text-align: right;
|
||||||
color: #770;
|
color: #770;
|
||||||
min-width: 600px;
|
min-width: 500px;
|
||||||
padding-bottom: 8px;
|
padding-bottom: 8px;
|
||||||
padding-left: 10px;
|
padding-left: 10px;
|
||||||
padding-right: 10px;
|
padding-right: 10px;
|
||||||
-moz-box-shadow: inset 0px 0px 0px 1px #99f;
|
|
||||||
font-size: 7pt;
|
font-size: 7pt;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -387,16 +423,19 @@ div.news hr {
|
|||||||
color: #cc7;
|
color: #cc7;
|
||||||
background: #cc7;
|
background: #cc7;
|
||||||
height: 1px;
|
height: 1px;
|
||||||
border: 0px solid #cccc77;
|
border: 0px solid #cc7;
|
||||||
margin: 20px 0 2px 0;
|
margin: 20px 0 0 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.confignav {
|
div.confignav {
|
||||||
padding: 12px 0 15px 0;
|
padding: 10px 0 11px 0;
|
||||||
background: #cfc;
|
background: #ddf;
|
||||||
margin: -20px -20px 0 -20px;
|
margin: -16px -16px 0 -16px;
|
||||||
border: 5px solid #bbf;
|
border: 1px solid #89f;
|
||||||
-moz-box-shadow: inset 0px 0px 0px 1px #99f;
|
font-size: 9.5pt;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.confignav a {
|
||||||
}
|
}
|
||||||
|
|
||||||
div.configure {
|
div.configure {
|
||||||
@ -411,7 +450,7 @@ div.configure hr {
|
|||||||
div.configure table {
|
div.configure table {
|
||||||
font-size: 9pt;
|
font-size: 9pt;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
border: 1px solid #bbf;
|
border: 1px solid #89f;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.configure tr, div.configure td {
|
div.configure tr, div.configure td {
|
||||||
@ -419,7 +458,6 @@ div.configure tr, div.configure td {
|
|||||||
}
|
}
|
||||||
|
|
||||||
div.configure tr {
|
div.configure tr {
|
||||||
-moz-box-shadow: inset 0px 0px 1px 0px #bbf;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
div.configure li:first-child, div.main li:first-child {
|
div.configure li:first-child, div.main li:first-child {
|
||||||
@ -442,14 +480,13 @@ div.configure h2:first-child {
|
|||||||
div.messages {
|
div.messages {
|
||||||
padding: 0px 10px;
|
padding: 0px 10px;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
border: 5px solid #bbf;
|
border: 1px solid #89f;
|
||||||
border-right: 0;
|
border-right: 0;
|
||||||
margin: -5px -15px 10px -20px;
|
margin: -1px -15px 10px -16px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
font-size: 9pt;
|
font-size: 9pt;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: #474;
|
color: #474;
|
||||||
-moz-box-shadow: inset 0px 0px 0px 1px #99f;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
div.messages li, div.messages ul {
|
div.messages li, div.messages ul {
|
||||||
@ -469,32 +506,42 @@ h1 {
|
|||||||
font-size: 18pt;
|
font-size: 18pt;
|
||||||
text-shadow: 0px 0px 1px rgba(0, 0, 32, 0.7);
|
text-shadow: 0px 0px 1px rgba(0, 0, 32, 0.7);
|
||||||
text-align: center;
|
text-align: center;
|
||||||
border: 5px solid #bbf;
|
border: 1px solid #89f;
|
||||||
padding: 13px 10px 12px 10px;
|
border-bottom: 1px solid #89f;
|
||||||
margin: 0 0px 0 195px;
|
border-right: 1px solid #89f;
|
||||||
|
padding: 16px 10px 16px 10px;
|
||||||
|
margin: 0 1px 0 200px;
|
||||||
line-height: 93%;
|
line-height: 93%;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
letter-spacing: 0.3em;
|
letter-spacing: 0.3em;
|
||||||
background: #fff;
|
background: #fff;
|
||||||
min-width: 600px;
|
min-width: 500px;
|
||||||
-moz-box-shadow: inset 0px 0px 0px 1px #99f;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
font-size: 14pt;
|
font-size: 14pt;
|
||||||
padding: 0px 10px 10px 10px;
|
padding: 10px;
|
||||||
border-bottom: 3px solid #aaf;
|
border: 1px solid #89f;
|
||||||
border-top: 0px solid #aaf;
|
|
||||||
letter-spacing: 0.04em;
|
letter-spacing: 0.04em;
|
||||||
|
font-variant: small-caps;
|
||||||
|
text-transform: capitalize;
|
||||||
|
background: #fff;
|
||||||
|
text-shadow: 0px 0px 1px rgba(0, 0, 32, 0.7);
|
||||||
}
|
}
|
||||||
|
|
||||||
h3 {
|
h3 {
|
||||||
font-size: 12pt;
|
font-size: 12pt;
|
||||||
padding: 0 10px 10px 10px;
|
padding: 5px 10px;
|
||||||
border-bottom: 3px solid #aaf;
|
border: 1px solid #89f;
|
||||||
border-top: 0px solid #aaf;
|
|
||||||
letter-spacing: 0.04em;
|
letter-spacing: 0.04em;
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
|
background: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
h2, h3 {
|
||||||
|
background-image: url("images/titlebg.png");
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: right center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.proxyfooter{
|
.proxyfooter{
|
||||||
@ -504,7 +551,7 @@ h3 {
|
|||||||
|
|
||||||
table {
|
table {
|
||||||
border-collapse: collapse;
|
border-collapse: collapse;
|
||||||
border: 1px solid #bbf;
|
border: 1px solid #89f;
|
||||||
margin: 0 0 5px 0;
|
margin: 0 0 5px 0;
|
||||||
cell-padding: 1px;
|
cell-padding: 1px;
|
||||||
font-size: 7.5pt;
|
font-size: 7.5pt;
|
||||||
@ -513,11 +560,11 @@ table {
|
|||||||
}
|
}
|
||||||
|
|
||||||
table hr {
|
table hr {
|
||||||
padding: 0px 0;
|
padding: 0;
|
||||||
color: #bbf;
|
color: #89f;
|
||||||
background: #bbf;
|
background: #89f;
|
||||||
border: 0px solid #bbf;
|
border: 0px solid #89f;
|
||||||
margin: 0px -5px;
|
margin: -5px -5px -10px -5px !important;
|
||||||
height: 1px;
|
height: 1px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -525,11 +572,15 @@ table tt {
|
|||||||
font-size: 7.5pt;
|
font-size: 7.5pt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
table code {
|
||||||
|
font-size: 120%;
|
||||||
|
}
|
||||||
|
|
||||||
th {
|
th {
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
padding: 8px 2px;
|
padding: 8px 2px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
border-bottom: 1px solid #bbf;
|
border-bottom: 1px solid #89f;
|
||||||
}
|
}
|
||||||
|
|
||||||
tt {
|
tt {
|
||||||
@ -553,10 +604,10 @@ tr:nth-child(odd) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
hr {
|
hr {
|
||||||
color: #aaf;
|
color: #89f;
|
||||||
background: #aaf;
|
background: #89f;
|
||||||
height: 3px;
|
height: 2px;
|
||||||
border: 0px solid #aaf;
|
border: 0px solid #89f;
|
||||||
margin: 3px 0;
|
margin: 3px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -655,10 +706,10 @@ p {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.langbox {
|
.langbox {
|
||||||
margin: 10px -20px 0px 5px;
|
margin: 18px -20px 0px 5px;
|
||||||
color: #001;
|
color: #001;
|
||||||
font-size: 7pt;
|
font-size: 7pt;
|
||||||
width: 220px;
|
width: 280px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
float: right;
|
float: right;
|
||||||
valign: middle;
|
valign: middle;
|
||||||
@ -695,6 +746,7 @@ a:hover{
|
|||||||
color: #f60;
|
color: #f60;
|
||||||
text-decoration: underline;
|
text-decoration: underline;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
|
text-shadow: 0px 0px 1px rgba(255, 96, 0, 0.7);
|
||||||
}
|
}
|
||||||
|
|
||||||
a:active{
|
a:active{
|
||||||
@ -713,9 +765,9 @@ tt {
|
|||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: darkgreen;
|
color: darkgreen;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tablefooter {
|
.tablefooter {
|
||||||
border: 1px solid #bbf;
|
border: 1px solid #a8f;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tablefooter tr, .tablefooter td {
|
.tablefooter tr, .tablefooter td {
|
||||||
@ -725,7 +777,7 @@ tt {
|
|||||||
line-height: 150%;
|
line-height: 150%;
|
||||||
word-wrap: nowrap;
|
word-wrap: nowrap;
|
||||||
padding: 8px 1px;
|
padding: 8px 1px;
|
||||||
border-top: 2px solid #bbf;
|
border-top: 2px solid #89f;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tidylist {
|
.tidylist {
|
||||||
@ -735,14 +787,9 @@ tt {
|
|||||||
}
|
}
|
||||||
|
|
||||||
div.graphspanel {
|
div.graphspanel {
|
||||||
padding: 15px 5px 20px 5px;
|
padding: 10px 5px 20px 5px;
|
||||||
margin: -20px;
|
margin: -16px -16px -11px -16px;
|
||||||
background: #ddf url('images/lightbluetile.png');
|
border: 1px solid #89f;
|
||||||
-moz-border-radius: 4px;
|
|
||||||
-khtml-border-radius: 4px;
|
|
||||||
border-radius: 4px;
|
|
||||||
border: 5px solid #bbf;
|
|
||||||
-moz-box-shadow: inset 0px 0px 1px 0px #002;
|
|
||||||
text-align: center !important;
|
text-align: center !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -756,7 +803,7 @@ div.graphspanel img {
|
|||||||
}
|
}
|
||||||
|
|
||||||
div.graphspanel img:hover {
|
div.graphspanel img:hover {
|
||||||
border: 1px solid #003;
|
border: 1px solid #89f;
|
||||||
padding: 2px;
|
padding: 2px;
|
||||||
margin: 6px;
|
margin: 6px;
|
||||||
text-align: center !important;
|
text-align: center !important;
|
||||||
@ -777,4 +824,4 @@ div.graphspanel form:last-child {
|
|||||||
div.graphspanel h3 {
|
div.graphspanel h3 {
|
||||||
text-align: left;
|
text-align: left;
|
||||||
margin: 10px 20px 10px 20px;
|
margin: 10px 20px 10px 20px;
|
||||||
}
|
}
|
@ -1,5 +1,5 @@
|
|||||||
/* I2P Theme: I2P Classic Theme Override */
|
/* I2P Theme: I2P Classic Theme Override */
|
||||||
/* Description: Larger fontsize override for console to accomodate foreign charactersets */
|
/* I2P Description: Larger fontsize override for console to accomodate foreign charactersets */
|
||||||
/* Author: Dr|Z3d */
|
/* Author: Dr|Z3d */
|
||||||
|
|
||||||
|
|
||||||
@ -20,8 +20,6 @@ div.routersummary h4 {
|
|||||||
|
|
||||||
div.routersummary table {
|
div.routersummary table {
|
||||||
font-size: 9pt;
|
font-size: 9pt;
|
||||||
margin: -5px 0px -5px -1px;
|
|
||||||
width: 188px !important;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
div.routersummary table a:link, div.routersummary table a:visited {
|
div.routersummary table a:link, div.routersummary table a:visited {
|
||||||
@ -33,9 +31,6 @@ div.tunnels a {
|
|||||||
}
|
}
|
||||||
|
|
||||||
div.tunnels table {
|
div.tunnels table {
|
||||||
width: 186px !important;
|
|
||||||
text-align: center;
|
|
||||||
margin: -4px 1px !important;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
div.tunnels td:first-child, div.tunnels td:last-child {
|
div.tunnels td:first-child, div.tunnels td:last-child {
|
||||||
|
BIN
installer/resources/themes/console/classic/images/titlebg.png
Normal file
After Width: | Height: | Size: 3.2 KiB |
@ -1,12 +1,13 @@
|
|||||||
/* Not yet complete. Subject to flux and change. dr|z3d - 07.25.09 */
|
/* I2P Console theme: "Camo" by dr|z3d. Aka "dark". As in ops. */
|
||||||
|
|
||||||
body {
|
body {
|
||||||
margin: 20px 5px 0 15px;
|
margin: 20px 5px 0 15px;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
background: #002;
|
background: #010 url('images/camotile.png') center bottom;
|
||||||
color: #FFF;
|
color: #EE9;
|
||||||
font: 9pt/130% "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
|
font: 9pt/130% "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.hide {
|
.hide {
|
||||||
@ -22,20 +23,20 @@ pre {
|
|||||||
overflow-x: scroll;
|
overflow-x: scroll;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
|
font: 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
|
||||||
color: #fff;
|
color: #EE9;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.logo {
|
div.logo {
|
||||||
float: left;
|
float: left;
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
font-color: #fff;
|
font-color: #EE9;
|
||||||
margin: 0 20px 0 20px;
|
margin: 0 20px 0 20px;
|
||||||
border: 1px solid #99f;
|
border: 1px solid #494;
|
||||||
-moz-border-radius: 4px;
|
-moz-border-radius: 4px;
|
||||||
-khtml-border-radius: 4px;
|
-khtml-border-radius: 4px;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
background: #003 url('images/darkbluebg.png');
|
background: #030 url('images/darkbluebg.png');
|
||||||
width: 175px;
|
width: 175px;
|
||||||
-moz-box-shadow: inset 0px 0px 1px 0px #009;
|
-moz-box-shadow: inset 0px 0px 1px 0px #009;
|
||||||
-khtml-box-shadow: inset 0px 0px 1px 0px #009;
|
-khtml-box-shadow: inset 0px 0px 1px 0px #009;
|
||||||
@ -46,8 +47,8 @@ div.toolbar {
|
|||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
background: #eef;
|
background: #000;
|
||||||
border: 1px solid #002;
|
border: 1px solid #000;
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -59,7 +60,7 @@ div.toolbar a:link {
|
|||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
-moz-border-radius: 4px;
|
-moz-border-radius: 4px;
|
||||||
-khtml-border-radius: 4px;
|
-khtml-border-radius: 4px;
|
||||||
color: #002;
|
color: #000;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.toolbar a:visited {
|
div.toolbar a:visited {
|
||||||
@ -68,7 +69,7 @@ div.toolbar a:visited {
|
|||||||
|
|
||||||
div.toolbar a:hover, button:hover{
|
div.toolbar a:hover, button:hover{
|
||||||
border: 1px solid #f60;
|
border: 1px solid #f60;
|
||||||
background: #003;
|
background: #030;
|
||||||
color: #f60;
|
color: #f60;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -91,19 +92,20 @@ div.routersummary {
|
|||||||
width: 175px;
|
width: 175px;
|
||||||
padding: 10px;
|
padding: 10px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
border: 1px solid #99f;
|
border: 1px solid #494;
|
||||||
background: #003;
|
background: #000;
|
||||||
background: url(images/darkbluebg.png);
|
background: #000 url(images/camotile2.png);
|
||||||
color: #eef;
|
color: #EE9;
|
||||||
font-size: 8pt;
|
font-size: 8pt;
|
||||||
clear: left;/* fixes a bug in Opera */
|
clear: left;/* fixes a bug in Opera */
|
||||||
-moz-border-radius: 4px;
|
-moz-border-radius: 4px;
|
||||||
-khtml-border-radius: 4px;
|
-khtml-border-radius: 4px;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
float: left;
|
float: left;
|
||||||
-moz-box-shadow: inset 0px 0px 1px 0px #eef;
|
/* -moz-box-shadow: inset 0px 0px 0px 0px #EE9;
|
||||||
-khtml-box-shadow: inset 0px 0px 1px 0px #eef;
|
-khtml-box-shadow: inset 0px 0px 1px 0px #EE9;
|
||||||
box-shadow: inset 0px 0px 1px 0px #eef;
|
box-shadow: inset 0px 0px 1px 0px #EE9;*/
|
||||||
|
-moz-box-shadow: 0 1px 5px #000;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.routersummary input[type=text] {
|
div.routersummary input[type=text] {
|
||||||
@ -114,27 +116,26 @@ div.routersummary input[type=text] {
|
|||||||
}
|
}
|
||||||
|
|
||||||
div.routersummary hr {
|
div.routersummary hr {
|
||||||
color: #99f;
|
color: #494;
|
||||||
background: #99f;
|
background: #494;
|
||||||
height: 2px;
|
height: 2px;
|
||||||
border-bottom: 1px solid #99f;
|
border-bottom: 1px solid #494;
|
||||||
margin: 8px -10px 7px -10px;
|
margin: 8px -10px 7px -10px;
|
||||||
-moz-box-shadow: inset 0px 1px 1px 1px #001;
|
-moz-box-shadow: inset 0px 1px 1px 1px #000;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.routersummary h3 {
|
div.routersummary h3 {
|
||||||
border: 0;
|
border: 0;
|
||||||
font-size: 9.5pt;
|
font-size: 9.5pt;
|
||||||
letter-spacing: 0.04em;
|
letter-spacing: 0.04em;
|
||||||
margin: -7px -9px -8px -9px;
|
margin: -7px -10px -8px -10px;
|
||||||
padding: 2px 0 3px 0 !important;
|
padding: 2px 0 3px 0 !important;
|
||||||
background: #007;
|
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
-moz-border-radius: 0;
|
-moz-border-radius: 0;
|
||||||
-khtml-border-radius: 0;
|
-khtml-border-radius: 0;
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
background: #007;
|
background: #000 url('images/header.png') center center ;
|
||||||
background-image: -moz-linear-gradient(top, bottom, from(#007), to(#005), color-stop(7%, #007), color-stop(100%, #005));
|
background-image: -moz-linear-gradient(top, bottom, from(#005), to(#030), color-stop(7%, #000), color-stop(100%, #005));
|
||||||
}
|
}
|
||||||
|
|
||||||
div.routersummary h4 {
|
div.routersummary h4 {
|
||||||
@ -144,19 +145,19 @@ div.routersummary h4 {
|
|||||||
letter-spacing: 0.02em;
|
letter-spacing: 0.02em;
|
||||||
margin: -7px -9px -10px -9px !important;
|
margin: -7px -9px -10px -9px !important;
|
||||||
padding: 2px 3px 5px 3px;
|
padding: 2px 3px 5px 3px;
|
||||||
background: #005;
|
background: #000;
|
||||||
text-transform: capitalize;
|
text-transform: capitalize;
|
||||||
text-decoration: none !important;
|
text-decoration: none !important;
|
||||||
color: #2b2;
|
color: #2b2;
|
||||||
background-image: -moz-linear-gradient(top, bottom, from(#001), to(#005), color-stop(10%, #005), color-stop(100%, #004));
|
background-image: -moz-linear-gradient(top, bottom, from(#000), to(#005), color-stop(10%, #005), color-stop(100%, #004));
|
||||||
line-height: 100%;
|
line-height: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.routersummary table {
|
div.routersummary table {
|
||||||
border: 0;
|
border: 0;
|
||||||
text-align: center !important;
|
text-align: center !important;
|
||||||
margin: -5px -4px -5px -5px !important;
|
margin: -5px -7px -5px -7px !important;
|
||||||
width: 185px !important;
|
width: 188px !important;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
font-size: 8pt;
|
font-size: 8pt;
|
||||||
padding: 0 -10px;
|
padding: 0 -10px;
|
||||||
@ -189,7 +190,8 @@ div.refresh {
|
|||||||
}
|
}
|
||||||
|
|
||||||
div.routersummary a:link, div.routersummary a:visited {
|
div.routersummary a:link, div.routersummary a:visited {
|
||||||
text-shadow: 0px 0px 1px rgba(192, 192, 255, 0.5);
|
text-shadow: 1px 1px 1px rgba(0, 16, 0, 0.8);
|
||||||
|
text-shadow: 0px 0px 2px #010 !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.routersummary a:hover {
|
div.routersummary a:hover {
|
||||||
@ -210,28 +212,39 @@ div routersummary hr:last-child {
|
|||||||
|
|
||||||
div.tunnels {
|
div.tunnels {
|
||||||
padding-top: 3px !important;
|
padding-top: 3px !important;
|
||||||
margin-left: -2px;
|
margin-left: -4px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.tunnels table {
|
div.tunnels table {
|
||||||
margin: -3px 0 !important;
|
margin: -5px 0 -5px -2px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.tunnels td {
|
div.tunnels td {
|
||||||
padding: 1px 2px 1px 2px;
|
padding: 1px 0px 1px 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.tunnels td:first-child {
|
div.tunnels td:first-child {
|
||||||
width: 16px;
|
width: 16px;
|
||||||
|
text-align: left;
|
||||||
|
padding-right: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.tunnels td:last-child {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
div.tunnels tr {
|
||||||
|
/* border: 1px solid #494 !important;*/
|
||||||
}
|
}
|
||||||
|
|
||||||
div.warning {
|
div.warning {
|
||||||
margin: 5px 20px 10px 240px;
|
margin: 5px 20px 10px 240px;
|
||||||
padding: 5px 25px 20px 75px;
|
padding: 5px 25px 20px 75px;
|
||||||
background: #005;
|
background: #005;
|
||||||
border: 1px solid #99f;
|
border: 1px solid #494;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
color: #fff;
|
color: #EE9;
|
||||||
-moz-border-radius: 4px;
|
-moz-border-radius: 4px;
|
||||||
-khtml-border-radius: 4px;
|
-khtml-border-radius: 4px;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
@ -250,8 +263,8 @@ div.warning {
|
|||||||
div.sorry {
|
div.sorry {
|
||||||
margin: 15px 15px 10px 220px;
|
margin: 15px 15px 10px 220px;
|
||||||
padding: 20px 20px 20px 75px;
|
padding: 20px 20px 20px 75px;
|
||||||
background: #005;
|
background: #020;
|
||||||
border: 1px solid #99f;
|
border: 1px solid #494;
|
||||||
-moz-border-radius: 4px;
|
-moz-border-radius: 4px;
|
||||||
-khtml-border-radius: 4px;
|
-khtml-border-radius: 4px;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
@ -262,65 +275,74 @@ div.sorry {
|
|||||||
-moz-box-shadow: inset 0px 0px 0px 1px #d00;
|
-moz-box-shadow: inset 0px 0px 0px 1px #d00;
|
||||||
word-wrap: break-word;
|
word-wrap: break-word;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
color: #eef;
|
color: #EE9;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.sorry hr {
|
div.sorry hr {
|
||||||
color: #eef;
|
color: #EE9;
|
||||||
background: #eef;
|
background: #EE9;
|
||||||
height: 1px;
|
height: 1px;
|
||||||
border: 1px solid #eef;
|
border: 1px solid #EE9;
|
||||||
margin: 10px 0;
|
margin: 10px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.main {
|
div.main {
|
||||||
margin: 0px 0px 20px 195px;
|
margin: 15px 15px 20px 220px;
|
||||||
padding: 0 15px 15px 25px;
|
padding: 0 15px 15px 15px;
|
||||||
background: #002;
|
|
||||||
text-align: left;
|
text-align: left;
|
||||||
color: #eef;
|
color: #EE9;
|
||||||
width: auto;
|
width: auto;
|
||||||
/* overflow-x: scroll; */
|
/* overflow-x: scroll; */
|
||||||
|
border: 1px solid #494;
|
||||||
|
-moz-border-radius: 4px;
|
||||||
|
-khtml-border-radius: 4px;
|
||||||
|
border-radius: 4px;
|
||||||
|
background: #000;/* url(images/camotile2.png);*/
|
||||||
|
min-width: 620px;
|
||||||
|
-moz-box-shadow: 0 1px 5px #000;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.main textarea {
|
div.main textarea {
|
||||||
background: #002;
|
background: #000;
|
||||||
color: #fff;
|
color: #EE9;
|
||||||
font: 8pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
|
font: 8pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.news {
|
div.news {
|
||||||
margin: 15px 15px 15px 220px;
|
margin: 15px 15px 15px 220px;
|
||||||
padding: 5px 30px 10px 30px;
|
padding: 5px 30px 10px 30px;
|
||||||
border: 1px solid #99f;
|
border: 1px solid #494;
|
||||||
background: #004;
|
background: #000;
|
||||||
background-image: -moz-linear-gradient(top, bottom, from(#003), to(#005), color-stop(30%, #003), color-stop(100%, #001));
|
/* background-image: -moz-linear-gradient(top, bottom, from(#030), to(#005), color-stop(30%, #030), color-stop(100%, #000));///*/
|
||||||
/* background: #003 url("images/darkbluetile.png");*/
|
background: #000 url("images/bg2.png")no-repeat scroll bottom right;
|
||||||
color: #aaf;
|
color: #7b7;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
-moz-border-radius: 4px;
|
-moz-border-radius: 4px;
|
||||||
-khtml-border-radius: 4px;
|
-khtml-border-radius: 4px;
|
||||||
font-size: 7.5pt;
|
font-size: 7.5pt;
|
||||||
text-align: right;
|
text-align: right;
|
||||||
-moz-box-shadow: inset 0px 0px 1px 0px #eef;
|
/* -moz-box-shadow: inset 0px 0px 0px 0px #EE9;
|
||||||
-khtml-box-shadow: inset 0px 0px 1px 0px #eef;
|
-khtml-box-shadow: inset 0px 0px 1px 0px #EE9;
|
||||||
box-shadow: inset 0px 0px 1px 0px #eef;
|
box-shadow: inset 0px 0px 1px 0px #EE9;*/
|
||||||
|
-moz-box-shadow: 0 1px 5px #000;
|
||||||
|
min-width: 590px;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.news li {
|
div.news li {
|
||||||
text-align: justify;
|
text-align: justify;
|
||||||
list-style: url('images/info_dark.png');
|
list-style: url('images/info_dark.png');
|
||||||
margin: 0 10px 0 20px;
|
list-style: none;
|
||||||
|
margin: 0 10px 0 0px;
|
||||||
padding: 5px 5px 5px 0;
|
padding: 5px 5px 5px 0;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
word-wrap: break-word;
|
word-wrap: break-word;
|
||||||
color: #99f;
|
color: #494;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.news h4 {
|
div.news h4 {
|
||||||
border-bottom: 1px;
|
border-bottom: 1px;
|
||||||
border-bottom-style: dotted;
|
border-bottom-style: dotted;
|
||||||
border-bottom-color: #99f;
|
border-bottom-color: #494;
|
||||||
padding: 0 0 0px 0;
|
padding: 0 0 0px 0;
|
||||||
margin: 5px 0 10px 0;
|
margin: 5px 0 10px 0;
|
||||||
font-size: 10pt;
|
font-size: 10pt;
|
||||||
@ -337,7 +359,7 @@ div.news h4:first-child {
|
|||||||
div.news p {
|
div.news p {
|
||||||
margin-top: -5px;
|
margin-top: -5px;
|
||||||
font-size: 8.5pt;
|
font-size: 8.5pt;
|
||||||
color: #eef;
|
color: #EE9;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.news hr {
|
div.news hr {
|
||||||
@ -347,31 +369,25 @@ div.news hr {
|
|||||||
div.confignav {
|
div.confignav {
|
||||||
padding: 15px 10px !important;
|
padding: 15px 10px !important;
|
||||||
margin: 15px 0;
|
margin: 15px 0;
|
||||||
background: #004 url('images/darkbluebg.png');
|
background: #000 url('images/header.png') center center repeat-x ;
|
||||||
-moz-border-radius: 4px;
|
-moz-border-radius: 4px;
|
||||||
-khtml-border-radius: 4px;
|
-khtml-border-radius: 4px;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
border: 1px solid #99f;
|
border: 1px solid #494;
|
||||||
font-size: 9.5pt !important;
|
font-size: 9.5pt !important;
|
||||||
font-weight: bold !important;
|
font-weight: bold !important;
|
||||||
line-height: 160% !important;
|
line-height: 160% !important;
|
||||||
-moz-box-shadow: inset 0px 0px 1px 0px #eef;
|
|
||||||
-khtml-box-shadow: inset 0px 0px 1px 0px #eef;
|
|
||||||
box-shadow: inset 0px 0px 1px 0px #eef;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
div.configure {
|
div.configure {
|
||||||
padding: 5px 15px 0 15px;
|
/* padding: 5px 15px 0 15px;
|
||||||
margin: 10px 0px;
|
margin: 10px 0px;
|
||||||
background: #005;
|
|
||||||
-moz-border-radius: 4px;
|
-moz-border-radius: 4px;
|
||||||
-khtml-border-radius: 4px;
|
-khtml-border-radius: 4px;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
border: 1px solid #99f;
|
border: 1px solid #494; */
|
||||||
background: #003 url(images/darkbluebg.png);
|
background: #000;/* url(images/camotile2.png);*/
|
||||||
-moz-box-shadow: inset 0px 0px 1px 0px #eef;
|
|
||||||
-khtml-box-shadow: inset 0px 0px 1px 0px #eef;
|
|
||||||
box-shadow: inset 0px 0px 1px 0px #eef;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
div.messages {
|
div.messages {
|
||||||
@ -380,11 +396,8 @@ div.messages {
|
|||||||
-moz-border-radius: 4px;
|
-moz-border-radius: 4px;
|
||||||
-khtml-border-radius: 4px;
|
-khtml-border-radius: 4px;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
border: 1px solid #99f;
|
border: 1px solid #494;
|
||||||
background: #008 url('images/lightbluetile.png');
|
background: #000;/* url('images/lightbluetile.png');*/
|
||||||
-moz-box-shadow: inset 0px 0px 1px 0px #eef;
|
|
||||||
-khtml-box-shadow: inset 0px 0px 1px 0px #eef;
|
|
||||||
box-shadow: inset 0px 0px 1px 0px #eef;
|
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
font-size: 9pt;
|
font-size: 9pt;
|
||||||
color: #ddf;
|
color: #ddf;
|
||||||
@ -408,20 +421,20 @@ div.messages li {
|
|||||||
}
|
}
|
||||||
|
|
||||||
div.graphspanel {
|
div.graphspanel {
|
||||||
padding: 10px 15px 0 15px;
|
padding: 0;
|
||||||
margin: 15px 0px;
|
margin: 15px 0px -15px 0;
|
||||||
background: #005;
|
|
||||||
-moz-border-radius: 4px;
|
-moz-border-radius: 4px;
|
||||||
-khtml-border-radius: 4px;
|
-khtml-border-radius: 4px;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
border: 1px solid #99f;
|
/* border: 1px solid #494;*/
|
||||||
background: #003 url(images/darkbluebg.png);
|
background: #000;/* url(images/camotile.png);*/
|
||||||
-moz-box-shadow: inset 0px 0px 1px 0px #eef;
|
|
||||||
-khtml-box-shadow: inset 0px 0px 1px 0px #eef;
|
|
||||||
box-shadow: inset 0px 0px 1px 0px #eef;
|
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
div.widepanel h3 {
|
||||||
|
text-align: left !important;
|
||||||
|
}
|
||||||
|
|
||||||
div.graphspanel form {
|
div.graphspanel form {
|
||||||
text-align: left;
|
text-align: left;
|
||||||
padding: 0 15px 0px 15px;
|
padding: 0 15px 0px 15px;
|
||||||
@ -432,23 +445,21 @@ div.graphspanel hr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
div.graphspanel img {
|
div.graphspanel img {
|
||||||
border: 1px solid #001;
|
border: 1px solid #494;
|
||||||
padding: 3px;
|
padding: 3px;
|
||||||
margin: 5px;
|
margin: 5px;
|
||||||
text-align: center !important;
|
text-align: center !important;
|
||||||
background: #002;
|
background: #000;
|
||||||
-moz-box-shadow: inset 0px 0px 1px 0px #eef;
|
|
||||||
-khtml-box-shadow: inset 0px 0px 1px 0px #eef;
|
|
||||||
box-shadow: inset 0px 0px 1px 0px #eef;
|
|
||||||
opacity: 0.8;
|
opacity: 0.8;
|
||||||
}
|
}
|
||||||
|
|
||||||
div.graphspanel img:hover {
|
div.graphspanel img:hover {
|
||||||
border: 1px solid #001;
|
border: 1px solid #000;
|
||||||
padding: 3px;
|
padding: 3px;
|
||||||
margin: 5px;
|
margin: 5px;
|
||||||
text-align: center !important;
|
text-align: center !important;
|
||||||
background: #002;
|
background: #000;
|
||||||
-moz-box-shadow: inset 0px 0px 1px 1px #f60;
|
-moz-box-shadow: inset 0px 0px 1px 1px #f60;
|
||||||
-khtml-box-shadow: inset 0px 0px 1px 1px #f60;
|
-khtml-box-shadow: inset 0px 0px 1px 1px #f60;
|
||||||
box-shadow: inset 0px 0px 1px 1px #f60;
|
box-shadow: inset 0px 0px 1px 1px #f60;
|
||||||
@ -458,18 +469,18 @@ div.graphspanel img:hover {
|
|||||||
table {
|
table {
|
||||||
border-collapse: collapse;
|
border-collapse: collapse;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
border: 1px solid #99f;
|
border: 1px solid #494;
|
||||||
cell-padding: 1px;
|
cell-padding: 1px;
|
||||||
font-size: 7pt;
|
font-size: 7pt;
|
||||||
background: #003;
|
background: #030;
|
||||||
margin: 1px 0;
|
margin: 1px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
table hr {
|
table hr {
|
||||||
padding: 0px 0;
|
padding: 0px 0;
|
||||||
color: #99f;
|
color: #494;
|
||||||
background: #99f;
|
background: #494;
|
||||||
border: 0px solid #99f;
|
border: 0px solid #494;
|
||||||
margin: 0px 0px;
|
margin: 0px 0px;
|
||||||
height: 1px;
|
height: 1px;
|
||||||
display: none;
|
display: none;
|
||||||
@ -477,12 +488,13 @@ table hr {
|
|||||||
|
|
||||||
th {
|
th {
|
||||||
padding: 6px 2px;
|
padding: 6px 2px;
|
||||||
color: #eef;
|
color: #EE9;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
font-size: 9pt;
|
font-size: 9pt;
|
||||||
background: #004 url('images/tabletitledark.png') repeat-x;
|
background: #000; /*url('images/tabletitledark.png') repeat-x;*/
|
||||||
border-top: 1px solid #99f;
|
background: #000 url('images/header.png') center center repeat-x ;
|
||||||
border-bottom: 1px solid #99f !important;
|
border-top: 1px solid #494;
|
||||||
|
border-bottom: 1px solid #494 !important;
|
||||||
line-height: 110%;
|
line-height: 110%;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -491,27 +503,27 @@ tr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
tr:nth-child(even) {
|
tr:nth-child(even) {
|
||||||
background: #002 url('images/darkerbluetile.png') !important;
|
background: #010;/* url('images/darkerbluetile.png') !important;*/
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
}
|
}
|
||||||
|
|
||||||
tr:nth-child(odd) {
|
tr:nth-child(odd) {
|
||||||
background: #003 url('images/darkbluetile.png') !important;
|
background: #000800;/* url('images/darkbluetile.png') !important;*/
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
tr:last-child {
|
tr:last-child {
|
||||||
background: #004 url('images/lightbluetile.png') !important;
|
background: #004 url('images/lightbluetile.png') !important;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
border: 1px solid #99f !important;
|
border: 1px solid #494 !important;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
td {
|
td {
|
||||||
padding: 6px 3px;
|
padding: 4px 6px;
|
||||||
color: #eef;
|
color: #EE9;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
border-top: 1px inset #006;
|
border-top: 1px inset #494;
|
||||||
border-bottom: 1px outset #006;
|
border-bottom: 1px outset #494;
|
||||||
}
|
}
|
||||||
|
|
||||||
td img {
|
td img {
|
||||||
@ -529,7 +541,7 @@ div.main li {
|
|||||||
list-style: square;
|
list-style: square;
|
||||||
margin: 2px 0px 2px 30px;
|
margin: 2px 0px 2px 30px;
|
||||||
padding: 1px 20px 1px 0px;
|
padding: 1px 20px 1px 0px;
|
||||||
line-height: 150%;
|
/* line-height: 150%;*/
|
||||||
word-wrap: break-word;
|
word-wrap: break-word;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -559,18 +571,19 @@ ul {
|
|||||||
|
|
||||||
code {
|
code {
|
||||||
text-align: left;
|
text-align: left;
|
||||||
font: 8pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
|
font: 8.5pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
|
||||||
|
color: #dd0;
|
||||||
}
|
}
|
||||||
|
|
||||||
a:link, h2 a:link{
|
a:link, h2 a:link{
|
||||||
color: #99f;
|
color: #494;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
word-wrap: break-word;
|
word-wrap: break-word;
|
||||||
}
|
}
|
||||||
|
|
||||||
a:visited{
|
a:visited{
|
||||||
color: #77f;
|
color: #7b7;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
word-wrap: break-word;
|
word-wrap: break-word;
|
||||||
@ -601,7 +614,7 @@ p {
|
|||||||
|
|
||||||
h1 {
|
h1 {
|
||||||
text-align: left;
|
text-align: left;
|
||||||
color: #fff;
|
color: #EE9;
|
||||||
padding: 10px 15px;
|
padding: 10px 15px;
|
||||||
margin: 0 15px 10px 220px;
|
margin: 0 15px 10px 220px;
|
||||||
font-size: 16pt;
|
font-size: 16pt;
|
||||||
@ -609,65 +622,68 @@ h1 {
|
|||||||
font-style: normal;
|
font-style: normal;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
letter-spacing: 0.15em;
|
letter-spacing: 0.15em;
|
||||||
text-shadow: 0px 0px 3px rgba(255, 255, 255, 0.8);
|
text-shadow: 0px 0px 2px #010;
|
||||||
white-space: normal;
|
white-space: normal;
|
||||||
background: #002 //url('images/darkbluebg.png');
|
background: #000 url("images/scope.png")no-repeat scroll right top;
|
||||||
background-image: -moz-linear-gradient(top, bottom, from(#001), to(#003), color-stop(30%, #001), color-stop(100%, #001));
|
background: #000 url("images/bg2.png")no-repeat scroll top right;
|
||||||
-moz-box-shadow: inset 0px 0px 1px 0px #eef;
|
background: #000 url('images/header.png') center center ;
|
||||||
-khtml-box-shadow: inset 0px 0px 1px 0px #eef;
|
background-image: -moz-linear-gradient(top, bottom, from(#000), to(#030), color-stop(30%, #000), color-stop(100%, #000));
|
||||||
box-shadow: inset 0px 0px 1px 0px #eef;
|
border: 1px solid #494;
|
||||||
border: 1px solid #99f;
|
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
-moz-border-radius: 4px;
|
-moz-border-radius: 4px;
|
||||||
-khtml-border-radius: 4px;
|
-khtml-border-radius: 4px;
|
||||||
line-height: 120%;
|
line-height: 120%;
|
||||||
|
min-width: 620px;
|
||||||
|
-moz-box-shadow: 0 1px 5px #000;
|
||||||
}
|
}
|
||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
font-size: 12pt;
|
font-size: 12pt;
|
||||||
color: #fff;
|
color: #EE9;
|
||||||
text-shadow: 0px 0px 1px rgba(255, 255, 255, 0.5);
|
text-shadow: 0px 0px 2px #010;
|
||||||
letter-spacing: 0.05em;
|
letter-spacing: 0.05em;
|
||||||
background: #002; // url('images/darkbluebg.png');
|
background: #000 url(images/camotile2.png);
|
||||||
background-image: -moz-linear-gradient(top, bottom, from(#001), to(#003), color-stop(30%, #001), color-stop(100%, #001));
|
background-image: -moz-linear-gradient(top, bottom, from(#000), to(#030), color-stop(30%, #000), color-stop(100%, #000));
|
||||||
|
background: #000 url('images/header.png') center center ;
|
||||||
padding: 5px 10px 8px 10px;
|
padding: 5px 10px 8px 10px;
|
||||||
wordwrap: none;
|
wordwrap: none;
|
||||||
border: 1px solid #99f;
|
border: 1px solid #494;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
-moz-border-radius: 4px;
|
-moz-border-radius: 4px;
|
||||||
-khtml-border-radius: 4px;
|
-khtml-border-radius: 4px;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
margin: 15px 0 12px 0 !important;
|
margin: 15px 0 12px 0 !important;
|
||||||
-moz-box-shadow: inset 0px 0px 1px 0px #eef;
|
text-transform: uppercase;
|
||||||
-khtml-box-shadow: inset 0px 0px 1px 0px #eef;
|
|
||||||
box-shadow: inset 0px 0px 1px 0px #eef;
|
|
||||||
word-wrap: break-word;
|
word-wrap: break-word;
|
||||||
}
|
}
|
||||||
|
|
||||||
h2 a:visited {
|
h2 a:visited {
|
||||||
color: #44f;
|
color: #191;
|
||||||
}
|
}
|
||||||
|
|
||||||
h2 a:hover {
|
h2 a:hover {
|
||||||
color: #f60;
|
color: #f60;
|
||||||
text-shadow: 0px 0px 1px rgba(255, 255, 72, 0.9);
|
text-shadow: 0px 0px 1px rgba(255, 64, 0, 0.7);
|
||||||
}
|
}
|
||||||
|
|
||||||
h3 {
|
h3 {
|
||||||
border: 1px solid #99f;
|
border: 1px solid #494;
|
||||||
border-left: 5px solid #99f;
|
border-left: 5px solid #494;
|
||||||
padding: 3px 5px 3px 5px;
|
padding: 5px 6px;
|
||||||
margin: 12px 0 10px 0;
|
margin: 12px 0 10px 0;
|
||||||
border-radius: 0 4px 4px 0;
|
border-radius: 0 4px 4px 0;
|
||||||
-moz-border-radius: 0 4px 4px 0;
|
-moz-border-radius: 0 4px 4px 0;
|
||||||
-khtml-border-radius: 0 4px 4px 0;
|
-khtml-border-radius: 0 4px 4px 0;
|
||||||
background: #002;
|
background: #000 url(images/camotile.png);
|
||||||
|
background: #000 url('images/header.png') center center ;
|
||||||
|
text-transform: uppercase;
|
||||||
|
text-shadow: 0px 0px 2px #010;
|
||||||
}
|
}
|
||||||
|
|
||||||
h4 {
|
h4 {
|
||||||
border-bottom: 1px;
|
border-bottom: 1px;
|
||||||
border-bottom-style: solid;
|
border-bottom-style: solid;
|
||||||
border-bottom-color: #99f;
|
border-bottom-color: #494;
|
||||||
padding: 0 0 10px 0;
|
padding: 0 0 10px 0;
|
||||||
margin: 5px 0 10px 0;
|
margin: 5px 0 10px 0;
|
||||||
font-size: 11pt;
|
font-size: 11pt;
|
||||||
@ -675,9 +691,8 @@ h4 {
|
|||||||
|
|
||||||
button, button:visited {
|
button, button:visited {
|
||||||
font: bold 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
|
font: bold 9pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
|
||||||
border: 1px outset #77f;
|
border: 1px outset #191;
|
||||||
padding: 1px 3px;
|
padding: 1px 3px;
|
||||||
background: #bbf;
|
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
-moz-border-radius: 4px;
|
-moz-border-radius: 4px;
|
||||||
@ -688,26 +703,26 @@ button, button:visited {
|
|||||||
text-align: center;
|
text-align: center;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
min-width: 76px;
|
min-width: 76px;
|
||||||
-moz-box-shadow: inset 0px 1px 1px 0px #55f;
|
-moz-box-shadow: inset 0px 1px 1px 0px #494;
|
||||||
-khtml-box-shadow: inset 0px 1px 1px 0px #55f;
|
-khtml-box-shadow: inset 0px 1px 1px 0px #191;
|
||||||
box-shadow: inset 0px 1px 1px 0px #55f;
|
box-shadow: inset 0px 1px 1px 0px #191;
|
||||||
background: #003;
|
background: #000;
|
||||||
color: #99f;
|
color: #494;
|
||||||
}
|
}
|
||||||
|
|
||||||
button:hover {
|
button:hover {
|
||||||
border: 1px solid #f60;
|
border: 1px solid #f60;
|
||||||
-moz-box-shadow: inset 0px 1px 1px 0px #eef;
|
-moz-box-shadow: inset 0px 1px 1px 0px #EE9;
|
||||||
-khtml-box-shadow: inset 0px 1px 1px 0px #eef;
|
-khtml-box-shadow: inset 0px 1px 1px 0px #EE9;
|
||||||
box-shadow: inset 0px 1px 1px 0px #eef;
|
box-shadow: inset 0px 1px 1px 0px #EE9;
|
||||||
background: #001;
|
background: #000;
|
||||||
color: #f60;
|
color: #f60;
|
||||||
}
|
}
|
||||||
|
|
||||||
button:active {
|
button:active {
|
||||||
border: 1px inset #f60;
|
border: 1px inset #f60;
|
||||||
background: #f60;
|
background: #f60;
|
||||||
color: #fff;
|
color: #EE9;
|
||||||
-moz-box-shadow: inset 0px 0px 0px 0px #f60;
|
-moz-box-shadow: inset 0px 0px 0px 0px #f60;
|
||||||
-khtml-box-shadow: inset 0px 0px 0px 0px #f60;
|
-khtml-box-shadow: inset 0px 0px 0px 0px #f60;
|
||||||
box-shadow: inset 0px 0px 0px 0px #f60;
|
box-shadow: inset 0px 0px 0px 0px #f60;
|
||||||
@ -720,9 +735,9 @@ button:active {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.langbox {
|
.langbox {
|
||||||
margin: 2px 2px 2px 5px;
|
margin: 17px 2px 2px 5px;
|
||||||
padding: 7px 10px 5px 10px;
|
padding: 7px 10px 5px 10px;
|
||||||
color: #eef;
|
color: #EE9;
|
||||||
font-size: 7pt;
|
font-size: 7pt;
|
||||||
width: 220px;
|
width: 220px;
|
||||||
text-align: right;
|
text-align: right;
|
||||||
@ -730,11 +745,21 @@ button:active {
|
|||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.langbox img {
|
||||||
|
opacity: 0.7;
|
||||||
|
-moz-box-shadow: 0 0 1px #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
.langbox img:hover {
|
||||||
|
opacity: 1;
|
||||||
|
-moz-box-shadow: 0 0 1px #f60;
|
||||||
|
}
|
||||||
|
|
||||||
hr {
|
hr {
|
||||||
color: #99f;
|
color: #494;
|
||||||
background: #99f;
|
background: #494;
|
||||||
height: 1px;
|
height: 1px;
|
||||||
border: 0px solid #99f;
|
border: 0px solid #494;
|
||||||
margin: 10px 0;
|
margin: 10px 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -748,12 +773,12 @@ sidebarlogo {
|
|||||||
}
|
}
|
||||||
|
|
||||||
input {
|
input {
|
||||||
border: 1px outset #55f;
|
border: 1px outset #5f5;
|
||||||
-moz-box-shadow: inset 0px 1px 1px 0px #55f;
|
-moz-box-shadow: inset 0px 1px 1px 0px #373;
|
||||||
-khtml-box-shadow: inset 0px 1px 1px 0px #55f;
|
-khtml-box-shadow: inset 0px 1px 1px 0px #373;
|
||||||
box-shadow: inset 0px 1px 1px 0px #55f;
|
box-shadow: inset 0px 1px 1px 0px #373;
|
||||||
background: #003;
|
background: #000;
|
||||||
color: #99f;
|
color: #494;
|
||||||
margin: 5px;
|
margin: 5px;
|
||||||
font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
|
font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
|
||||||
padding: 1px 2px;
|
padding: 1px 2px;
|
||||||
@ -765,16 +790,16 @@ input {
|
|||||||
}
|
}
|
||||||
|
|
||||||
input:hover {
|
input:hover {
|
||||||
background: #001;
|
background: #000;
|
||||||
color: #f60;
|
color: #f60;
|
||||||
border: 1px solid #f60;
|
border: 1px solid #f60;
|
||||||
-moz-box-shadow: inset 0px 1px 1px 0px #eef;
|
-moz-box-shadow: inset 0px 1px 1px 0px #9e9;
|
||||||
-khtml-box-shadow: inset 0px 1px 1px 0px #eef;
|
-khtml-box-shadow: inset 0px 1px 1px 0px #9e9;
|
||||||
box-shadow: inset 0px 1px 1px 0px #eef;
|
box-shadow: inset 0px 1px 1px 0px #9e9;
|
||||||
}
|
}
|
||||||
|
|
||||||
input:active {
|
input:active {
|
||||||
background: #002;
|
background: #000;
|
||||||
color: #f30;
|
color: #f30;
|
||||||
border: 1px solid #f30;
|
border: 1px solid #f30;
|
||||||
}
|
}
|
||||||
@ -782,16 +807,16 @@ input:active {
|
|||||||
input:active {
|
input:active {
|
||||||
border: 1px inset #f60;
|
border: 1px inset #f60;
|
||||||
background: #f60;
|
background: #f60;
|
||||||
color: #fff;
|
color: #EE9;
|
||||||
}
|
}
|
||||||
|
|
||||||
input[type=text] {
|
input[type=text] {
|
||||||
background: #002;
|
background: #000;
|
||||||
color: #eef;
|
color: #EE9;
|
||||||
margin: 5px 10px;
|
margin: 5px 10px;
|
||||||
padding: 4px 2px;
|
padding: 4px 2px;
|
||||||
font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
|
font: bold 8pt "Lucida Sans Unicode", "Bitstream Vera Sans", Verdana, Tahoma, Helvetica, sans-serif;
|
||||||
border: 1px solid #bbf;
|
border: 1px solid #494 !important;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
-moz-border-radius: 4px;
|
-moz-border-radius: 4px;
|
||||||
@ -802,7 +827,7 @@ input[type=text] {
|
|||||||
}
|
}
|
||||||
|
|
||||||
input[type=text]:active, input[type=text]:hover {
|
input[type=text]:active, input[type=text]:hover {
|
||||||
background: #001;
|
background: #000;
|
||||||
}
|
}
|
||||||
|
|
||||||
fieldset {
|
fieldset {
|
||||||
@ -811,10 +836,10 @@ position: relative;
|
|||||||
}
|
}
|
||||||
|
|
||||||
select {
|
select {
|
||||||
background: #002;
|
background: #000;
|
||||||
color: #eef;
|
color: #EE9;
|
||||||
margin: 5px 10px;
|
margin: 5px 10px;
|
||||||
border: 1px solid #bbf;
|
border: 1px solid #494;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
-moz-border-radius: 4px;
|
-moz-border-radius: 4px;
|
||||||
-khtml-border-radius: 4px;
|
-khtml-border-radius: 4px;
|
||||||
@ -824,8 +849,8 @@ select {
|
|||||||
}
|
}
|
||||||
|
|
||||||
textarea {
|
textarea {
|
||||||
background: #001;
|
background: #000;
|
||||||
color: #eef;
|
color: #EE9;
|
||||||
padding: 5px;
|
padding: 5px;
|
||||||
margin: 10px;
|
margin: 10px;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
@ -835,7 +860,7 @@ textarea {
|
|||||||
min-height: 100px;
|
min-height: 100px;
|
||||||
min-width: 97%;
|
min-width: 97%;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
border: 1px solid #99f;
|
border: 1px solid #494;
|
||||||
}
|
}
|
||||||
|
|
||||||
form {}
|
form {}
|
||||||
@ -849,39 +874,37 @@ form {}
|
|||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
-moz-border-radius: 4px;
|
-moz-border-radius: 4px;
|
||||||
-khtml-border-radius: 4px;
|
-khtml-border-radius: 4px;
|
||||||
border: 1px solid #001;
|
border: 1px solid #000;
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.statusnotes {
|
.statusnotes {
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
font-size: 8pt;
|
font-size: 8pt;
|
||||||
color: #eef;
|
color: #EE9;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
border: 1px solid #99f !important;
|
border: 1px solid #494 !important;
|
||||||
/* border-top: 0px !important;*/
|
/* border-top: 0px !important;*/
|
||||||
margin: -3px 0 5px 0;
|
margin: -3px 0 5px 0;
|
||||||
padding: 7px;
|
padding: 7px;
|
||||||
background: #004;
|
background: #010;
|
||||||
-moz-box-shadow: inset 0px 0px 0px 1px #009;
|
-moz-box-shadow: inset 0px 0px 0px 1px #090;
|
||||||
-khtml-box-shadow: inset 0px 0px 0px 1px #009;
|
-khtml-box-shadow: inset 0px 0px 0px 1px #090;
|
||||||
box-shadow: inset 0px 0px 0px 1px #009;
|
box-shadow: inset 0px 0px 0px 1px #090;
|
||||||
|
/* background: #000 url('images/header.png') repeat-x center center !important;*/
|
||||||
}
|
}
|
||||||
|
|
||||||
div.joblog {
|
div.joblog {
|
||||||
margin: 15px 0 15px 0;
|
/* margin: 15px 0 15px 0;
|
||||||
padding: 5px 20px 10px 20px !important;
|
padding: 5px 20px 10px 20px !important;
|
||||||
border: 1px solid #99f;
|
border: 1px solid #494;
|
||||||
background-color: #004;
|
background-color: #000;
|
||||||
background: url("images/darkbluebg.png");
|
background: #000; url("images/camotile.png");*/
|
||||||
color: #dfd;
|
/* color: #dfd;*/
|
||||||
border-radius: 4px;
|
border-radius: 4px 4px 0 0;
|
||||||
-moz-border-radius: 4px;
|
-moz-border-radius: 4px 4px 0 0;
|
||||||
-khtml-border-radius: 4px;
|
-khtml-border-radius: 4px 4px 0 0;
|
||||||
text-align: justify !important;
|
text-align: justify !important;
|
||||||
-moz-box-shadow: inset 0px 0px 1px 0px #eef;
|
|
||||||
-khtml-box-shadow: inset 0px 0px 1px 0px #eef;
|
|
||||||
box-shadow: inset 0px 0px 1px 0px #eef;
|
|
||||||
overflow-x: scroll; /* Opera fix */
|
overflow-x: scroll; /* Opera fix */
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -953,14 +976,14 @@ position: relative;
|
|||||||
}
|
}
|
||||||
|
|
||||||
.cells {
|
.cells {
|
||||||
border: 1px inset #005;
|
border: 1px inset #494;
|
||||||
border-left: 1px outset #002;
|
border-left: 1px outset #494;
|
||||||
}
|
}
|
||||||
|
|
||||||
.tablefooter tr, .tablefooter td {
|
.tablefooter tr, .tablefooter td {
|
||||||
background: #004 url('images/tabletitledark.png') repeat-x !important;
|
background: #000 url('images/header.png') repeat-x center center !important;
|
||||||
border-top: 1px solid #99f;
|
border-top: 1px solid #494;
|
||||||
border-bottom: 1px solid #99f !important;
|
border-bottom: 1px solid #494 !important;
|
||||||
font-size: 7pt;
|
font-size: 7pt;
|
||||||
line-height: 110%;
|
line-height: 110%;
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,11 @@
|
|||||||
|
/* I2P Console theme: "Camo" by dr|z3d. Aka "dark". As in ops. */
|
||||||
|
|
||||||
body {
|
body {
|
||||||
margin: 0px;
|
margin: 0px;
|
||||||
padding: 0px;
|
padding: 0px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
font-family: "Lucida Sans Unicode", Verdana, Helvetica, sans-serif;
|
font-family: "Lucida Sans Unicode", Verdana, Helvetica, sans-serif;
|
||||||
background-color: #001;
|
background: #010 url('images/camotile.png') center bottom;
|
||||||
color: #000000;
|
color: #000000;
|
||||||
font-size: 9pt;
|
font-size: 9pt;
|
||||||
/* we've avoided Tantek Hacks so far,
|
/* we've avoided Tantek Hacks so far,
|
||||||
@ -39,14 +41,14 @@ h4 {
|
|||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
font-weight: bold !important;
|
font-weight: bold !important;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
border: 1px solid #99f;
|
border: 1px solid #494;
|
||||||
margin: 5px 0 15px 0;
|
margin: 5px 0 15px 0;
|
||||||
padding: 5px 10px;
|
padding: 5px 10px;
|
||||||
background: #004 url(images/tabletitledark.png) repeat-x;
|
background: #000 url('images/header.png') center center repeat-x ;
|
||||||
text-transform: uppercase;
|
text-transform: uppercase;
|
||||||
text-shadow: 0px 0px 2px rgba(255, 255, 255, 0.9);
|
text-shadow: 0px 0px 2px rgba(0, 0, 0, 0.9);
|
||||||
letter-spacing: 0.08em;
|
letter-spacing: 0.08em;
|
||||||
-moz-box-shadow: inset 0px 0px 4px 0px #009;
|
-moz-box-shadow: inset 0px 0px 4px 0px #090;
|
||||||
-moz-border-radius: 4px;
|
-moz-border-radius: 4px;
|
||||||
-khtml-border-radius: 4px;
|
-khtml-border-radius: 4px;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
@ -73,7 +75,7 @@ button {
|
|||||||
}
|
}
|
||||||
|
|
||||||
textarea {
|
textarea {
|
||||||
border: 1px solid #9999ff;
|
border: 1px solid #494;
|
||||||
}
|
}
|
||||||
|
|
||||||
br {
|
br {
|
||||||
@ -121,21 +123,21 @@ hr {
|
|||||||
clear: both;
|
clear: both;
|
||||||
height: 1px;
|
height: 1px;
|
||||||
margin: 3px 0px 3px 0px;
|
margin: 3px 0px 3px 0px;
|
||||||
border-bottom: 1px solid #99f;
|
border-bottom: 1px solid #494;
|
||||||
}
|
}
|
||||||
|
|
||||||
.subdivider {
|
.subdivider {
|
||||||
border-bottom: 1px solid #99f;
|
border-bottom: 1px solid #494;
|
||||||
padding: 5px 0px 0px 0px;
|
padding: 5px 0px 0px 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.freetext {
|
.freetext {
|
||||||
width: 150px;
|
width: 150px;
|
||||||
height : 22px;
|
height : 22px;
|
||||||
border: 1px solid #9999ff;
|
border: 1px solid #494;
|
||||||
padding: 2px;
|
padding: 2px;
|
||||||
margin: 4px 0 2px 4px;
|
margin: 4px 0 2px 4px;
|
||||||
background-color: #002;
|
background-color: #020;
|
||||||
font: bold 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
|
font: bold 9pt "Lucida Console", "DejaVu Sans Mono", Courier, mono;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -147,8 +149,8 @@ hr {
|
|||||||
max-height: 24px;
|
max-height: 24px;
|
||||||
font-size: 9pt;
|
font-size: 9pt;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
background-color: #b4c8ff;
|
background-color: #000;
|
||||||
color: black;
|
color: #9f9 !important;
|
||||||
border: 1px outset #ddddc0;
|
border: 1px outset #ddddc0;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
@ -159,18 +161,25 @@ hr {
|
|||||||
background: url(images/tabletitlelight.png) repeat: x;
|
background: url(images/tabletitlelight.png) repeat: x;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
|
border: 1px outset #5f5;
|
||||||
|
-moz-box-shadow: inset 0px 1px 1px 0px #373;
|
||||||
|
-khtml-box-shadow: inset 0px 1px 1px 0px #373;
|
||||||
|
box-shadow: inset 0px 1px 1px 0px #373;
|
||||||
}
|
}
|
||||||
|
|
||||||
.control:link {
|
.control:link {
|
||||||
color: #001;
|
color: #9f9;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.control:hover {
|
.control:hover {
|
||||||
border: 1px solid #eeeeff;
|
border: 1px solid #f60;
|
||||||
background-color: #003;
|
background-color: #000;
|
||||||
color: #ff6600 !important;
|
color: #f60 !important;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
|
-moz-box-shadow: inset 0px 1px 1px 0px #fff;
|
||||||
|
-khtml-box-shadow: inset 0px 1px 1px 0px #fff;
|
||||||
|
box-shadow: inset 0px 1px 1px 0px #fff;
|
||||||
}
|
}
|
||||||
|
|
||||||
.control:active {
|
.control:active {
|
||||||
@ -181,7 +190,7 @@ hr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.control:visited {
|
.control:visited {
|
||||||
color: #001;
|
color: #010;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -192,12 +201,12 @@ hr {
|
|||||||
text-align: left;
|
text-align: left;
|
||||||
font-size: 9pt;
|
font-size: 9pt;
|
||||||
color: white;
|
color: white;
|
||||||
background-color: #002;
|
background-color: #020;
|
||||||
background: url(images/darkbluebg.png);
|
background: #000; /*url(images/camotile2.png);*/
|
||||||
-moz-border-radius: 4px;
|
-moz-border-radius: 4px;
|
||||||
-khtml-border-radius: 4px;
|
-khtml-border-radius: 4px;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
border: 1px solid #99f;
|
border: 1px solid #494;
|
||||||
padding: 10px 20px;
|
padding: 10px 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -235,15 +244,15 @@ hr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#globalOperationsPanel {
|
#globalOperationsPanel {
|
||||||
background-color: #003;
|
background-color: #030;
|
||||||
border: 1px solid #99f;
|
border: 1px solid #494;
|
||||||
background: url(images/darkbluebg.png);
|
-moz-box-shadow: inset 0px 0px 0px 1px #932;
|
||||||
-moz-box-shadow: inset 0px 0px 0px 1px #f00;
|
|
||||||
padding: 5px 20px 11px 10px !important;
|
padding: 5px 20px 11px 10px !important;
|
||||||
|
background: #000; /*url(images/camotile2.png);*/
|
||||||
}
|
}
|
||||||
|
|
||||||
#globalOperationsPanel .control {
|
#globalOperationsPanel .control {
|
||||||
width: 100px;
|
width: 120px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.header {
|
.header {
|
||||||
@ -254,12 +263,12 @@ hr {
|
|||||||
}
|
}
|
||||||
|
|
||||||
a:link{
|
a:link{
|
||||||
color: #99f;
|
color: #494;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
a:visited{
|
a:visited{
|
||||||
color: #7bb;
|
color: #7b7;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -274,12 +283,12 @@ a:active{
|
|||||||
}
|
}
|
||||||
|
|
||||||
input {
|
input {
|
||||||
background-color: #002;
|
background-color: #020;
|
||||||
color: #eef;
|
color: #eef;
|
||||||
margin: 0 2px 0 2px;
|
margin: 0 2px 0 2px;
|
||||||
font-family: "Lucida Sans Unicode", Verdana, Tahoma, Helvetica, sans-serif;
|
font-family: "Lucida Sans Unicode", Verdana, Tahoma, Helvetica, sans-serif;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
border: 1px solid #99f;
|
border: 1px solid #494;
|
||||||
/*
|
/*
|
||||||
padding: 0px 2px 1px 2px;
|
padding: 0px 2px 1px 2px;
|
||||||
*/
|
*/
|
||||||
@ -292,17 +301,17 @@ input hover {
|
|||||||
margin: 0 2px 0 2px;
|
margin: 0 2px 0 2px;
|
||||||
font-family: "Lucida Sans Unicode", Verdana, Tahoma, Helvetica, sans-serif;
|
font-family: "Lucida Sans Unicode", Verdana, Tahoma, Helvetica, sans-serif;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
border: 1px solid #99f;
|
border: 1px solid #494;
|
||||||
padding: 2px;
|
padding: 2px;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
select {
|
select {
|
||||||
background-color: #001;
|
background-color: #020;
|
||||||
color: #eef;
|
color: #eef;
|
||||||
margin: 6px 2px 0 2px;
|
margin: 6px 2px 0 2px;
|
||||||
font-family: "Lucida Sans Unicode", Verdana, Tahoma, Helvetica, sans-serif;
|
font-family: "Lucida Sans Unicode", Verdana, Tahoma, Helvetica, sans-serif;
|
||||||
border: 1px solid #99f;
|
border: 1px solid #494;
|
||||||
padding: 2px 2px 2px 4px;
|
padding: 2px 2px 2px 4px;
|
||||||
max-height: 24px;
|
max-height: 24px;
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
/* I2P Tunnel Edit Page
|
/* I2P Console theme: "Camo" by dr|z3d. Aka "dark". As in ops. */
|
||||||
*/
|
/* I2P Tunnel Edit Page */
|
||||||
|
|
||||||
#tunnelEditPage input {
|
#tunnelEditPage input {
|
||||||
width: 458px;
|
width: 458px;
|
||||||
}
|
}
|
||||||
@ -82,8 +83,9 @@
|
|||||||
height: 100px;
|
height: 100px;
|
||||||
padding: 4px;
|
padding: 4px;
|
||||||
margin: 0 0 3px 0;
|
margin: 0 0 3px 0;
|
||||||
background-color: #000088;
|
background-color: #040;
|
||||||
color: #fff;
|
/* background: #000 url("images/helitile.png")no-repeat scroll right top;*/
|
||||||
|
color: #ee9;
|
||||||
font-family: "Lucida Console", "Andale Mono", "Courier New", Courier, mono;
|
font-family: "Lucida Console", "Andale Mono", "Courier New", Courier, mono;
|
||||||
border: 1px inset #002;
|
border: 1px inset #002;
|
||||||
}
|
}
|
||||||
|
BIN
installer/resources/themes/console/dark/images/bg2.png
Normal file
After Width: | Height: | Size: 74 KiB |
BIN
installer/resources/themes/console/dark/images/camotile.png
Normal file
After Width: | Height: | Size: 3.4 KiB |
BIN
installer/resources/themes/console/dark/images/camotile2.png
Normal file
After Width: | Height: | Size: 9.5 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
BIN
installer/resources/themes/console/dark/images/header.png
Normal file
After Width: | Height: | Size: 203 B |
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 917 B |
Before Width: | Height: | Size: 227 B |
BIN
installer/resources/themes/console/dark/images/tile.png
Normal file
After Width: | Height: | Size: 4.5 KiB |
Before Width: | Height: | Size: 2.1 KiB |
@ -1,4 +1,4 @@
|
|||||||
/* Not yet complete. Subject to flux and change. dr|z3d - 07.25.09 */
|
/* I2P Console Theme "Corporat" by dr|z3d. Aka "light". As in beer.*/
|
||||||
|
|
||||||
body {
|
body {
|
||||||
margin: 15px 0 0 10px;
|
margin: 15px 0 0 10px;
|
||||||
@ -714,11 +714,11 @@ button:active{
|
|||||||
}
|
}
|
||||||
|
|
||||||
.langbox {
|
.langbox {
|
||||||
margin: 4px 2px 4px 5px;
|
margin: 4px 10px 4px 5px;
|
||||||
padding: 5px 5px;
|
padding: 5px 5px;
|
||||||
color: #001;
|
color: #001;
|
||||||
font-size: 7pt;
|
font-size: 7pt;
|
||||||
width: 220px;
|
width: 260px;
|
||||||
text-align: right;
|
text-align: right;
|
||||||
float: right;
|
float: right;
|
||||||
valign: middle;
|
valign: middle;
|
||||||
|
@ -738,10 +738,10 @@ p {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.langbox {
|
.langbox {
|
||||||
margin: 17px -20px 0px 5px;
|
margin: 17px -30px 0px 5px;
|
||||||
color: #eef;
|
color: #eef;
|
||||||
font-size: 7pt;
|
font-size: 7pt;
|
||||||
width: 220px;
|
width: 280px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
float: right;
|
float: right;
|
||||||
valign: middle;
|
valign: middle;
|
||||||
|
@ -19,10 +19,12 @@ import java.util.GregorianCalendar;
|
|||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.TimeZone;
|
import java.util.TimeZone;
|
||||||
import java.util.TreeSet;
|
import java.util.TreeSet;
|
||||||
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
|
||||||
import net.i2p.CoreVersion;
|
import net.i2p.CoreVersion;
|
||||||
import net.i2p.crypto.DHSessionKeyBuilder;
|
import net.i2p.crypto.DHSessionKeyBuilder;
|
||||||
@ -57,7 +59,7 @@ import net.i2p.util.SimpleTimer;
|
|||||||
public class Router {
|
public class Router {
|
||||||
private Log _log;
|
private Log _log;
|
||||||
private RouterContext _context;
|
private RouterContext _context;
|
||||||
private final Properties _config;
|
private final Map<String, String> _config;
|
||||||
/** full path */
|
/** full path */
|
||||||
private String _configFilename;
|
private String _configFilename;
|
||||||
private RouterInfo _routerInfo;
|
private RouterInfo _routerInfo;
|
||||||
@ -120,7 +122,7 @@ public class Router {
|
|||||||
public Router(String configFilename) { this(configFilename, null); }
|
public Router(String configFilename) { this(configFilename, null); }
|
||||||
public Router(String configFilename, Properties envProps) {
|
public Router(String configFilename, Properties envProps) {
|
||||||
_gracefulExitCode = -1;
|
_gracefulExitCode = -1;
|
||||||
_config = new Properties();
|
_config = new ConcurrentHashMap();
|
||||||
|
|
||||||
if (configFilename == null) {
|
if (configFilename == null) {
|
||||||
if (envProps != null) {
|
if (envProps != null) {
|
||||||
@ -168,15 +170,9 @@ public class Router {
|
|||||||
|
|
||||||
readConfig();
|
readConfig();
|
||||||
|
|
||||||
if (envProps == null) {
|
if (envProps == null)
|
||||||
envProps = _config;
|
envProps = new Properties();
|
||||||
} else {
|
envProps.putAll(_config);
|
||||||
for (Iterator iter = _config.keySet().iterator(); iter.hasNext(); ) {
|
|
||||||
String k = (String)iter.next();
|
|
||||||
String v = _config.getProperty(k);
|
|
||||||
envProps.setProperty(k, v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// This doesn't work, guess it has to be in the static block above?
|
// This doesn't work, guess it has to be in the static block above?
|
||||||
// if (Boolean.valueOf(envProps.getProperty("router.disableIPv6")).booleanValue())
|
// if (Boolean.valueOf(envProps.getProperty("router.disableIPv6")).booleanValue())
|
||||||
@ -203,6 +199,15 @@ public class Router {
|
|||||||
System.exit(-1);
|
System.exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (_config.get("router.firstVersion") == null) {
|
||||||
|
// These may be useful someday. First added in 0.8.2
|
||||||
|
_config.put("router.firstVersion", RouterVersion.VERSION);
|
||||||
|
String now = Long.toString(System.currentTimeMillis());
|
||||||
|
_config.put("router.firstInstalled", now);
|
||||||
|
_config.put("router.updateLastInstalled", now);
|
||||||
|
saveConfig();
|
||||||
|
}
|
||||||
|
|
||||||
// This is here so that we can get the directory location from the context
|
// This is here so that we can get the directory location from the context
|
||||||
// for the zip file and the base location to unzip to.
|
// for the zip file and the base location to unzip to.
|
||||||
// If it does an update, it never returns.
|
// If it does an update, it never returns.
|
||||||
@ -276,30 +281,20 @@ public class Router {
|
|||||||
public void setConfigFilename(String filename) { _configFilename = filename; }
|
public void setConfigFilename(String filename) { _configFilename = filename; }
|
||||||
|
|
||||||
public String getConfigSetting(String name) {
|
public String getConfigSetting(String name) {
|
||||||
synchronized (_config) {
|
return _config.get(name);
|
||||||
return _config.getProperty(name);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
public void setConfigSetting(String name, String value) {
|
public void setConfigSetting(String name, String value) {
|
||||||
synchronized (_config) {
|
_config.put(name, value);
|
||||||
_config.setProperty(name, value);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
public void removeConfigSetting(String name) {
|
public void removeConfigSetting(String name) {
|
||||||
synchronized (_config) {
|
|
||||||
_config.remove(name);
|
_config.remove(name);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
public Set getConfigSettings() {
|
public Set getConfigSettings() {
|
||||||
synchronized (_config) {
|
|
||||||
return new HashSet(_config.keySet());
|
return new HashSet(_config.keySet());
|
||||||
}
|
|
||||||
}
|
}
|
||||||
public Properties getConfigMap() {
|
public Properties getConfigMap() {
|
||||||
Properties rv = new Properties();
|
Properties rv = new Properties();
|
||||||
synchronized (_config) {
|
rv.putAll(_config);
|
||||||
rv.putAll(_config);
|
|
||||||
}
|
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -368,14 +363,19 @@ public class Router {
|
|||||||
_context.jobQueue().addJob(new StartupJob(_context));
|
_context.jobQueue().addJob(new StartupJob(_context));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void readConfig() {
|
/**
|
||||||
|
* This updates the config with all settings found in the file.
|
||||||
|
* It does not clear the config first, so settings not found in
|
||||||
|
* the file will remain in the config.
|
||||||
|
*
|
||||||
|
* This is synchronized with saveConfig()
|
||||||
|
*/
|
||||||
|
public synchronized void readConfig() {
|
||||||
String f = getConfigFilename();
|
String f = getConfigFilename();
|
||||||
Properties config = getConfig(_context, f);
|
Properties config = getConfig(_context, f);
|
||||||
for (Iterator iter = config.keySet().iterator(); iter.hasNext(); ) {
|
// to avoid compiler errror
|
||||||
String name = (String)iter.next();
|
Map foo = _config;
|
||||||
String val = config.getProperty(name);
|
foo.putAll(config);
|
||||||
setConfigSetting(name, val);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** this does not use ctx.getConfigDir(), must provide a full path in filename */
|
/** this does not use ctx.getConfigDir(), must provide a full path in filename */
|
||||||
@ -979,7 +979,7 @@ public class Router {
|
|||||||
*/
|
*/
|
||||||
public void shutdownGracefully(int exitCode) {
|
public void shutdownGracefully(int exitCode) {
|
||||||
_gracefulExitCode = exitCode;
|
_gracefulExitCode = exitCode;
|
||||||
_config.setProperty(PROP_SHUTDOWN_IN_PROGRESS, "true");
|
_config.put(PROP_SHUTDOWN_IN_PROGRESS, "true");
|
||||||
synchronized (_gracefulShutdownDetector) {
|
synchronized (_gracefulShutdownDetector) {
|
||||||
_gracefulShutdownDetector.notifyAll();
|
_gracefulShutdownDetector.notifyAll();
|
||||||
}
|
}
|
||||||
@ -1001,7 +1001,7 @@ public class Router {
|
|||||||
*/
|
*/
|
||||||
public int scheduledGracefulExitCode() { return _gracefulExitCode; }
|
public int scheduledGracefulExitCode() { return _gracefulExitCode; }
|
||||||
public boolean gracefulShutdownInProgress() {
|
public boolean gracefulShutdownInProgress() {
|
||||||
return (null != _config.getProperty(PROP_SHUTDOWN_IN_PROGRESS));
|
return (null != _config.get(PROP_SHUTDOWN_IN_PROGRESS));
|
||||||
}
|
}
|
||||||
/** How long until the graceful shutdown will kill us? */
|
/** How long until the graceful shutdown will kill us? */
|
||||||
public long getShutdownTimeRemaining() {
|
public long getShutdownTimeRemaining() {
|
||||||
@ -1024,7 +1024,7 @@ public class Router {
|
|||||||
private class GracefulShutdown implements Runnable {
|
private class GracefulShutdown implements Runnable {
|
||||||
public void run() {
|
public void run() {
|
||||||
while (true) {
|
while (true) {
|
||||||
boolean shutdown = (null != _config.getProperty(PROP_SHUTDOWN_IN_PROGRESS));
|
boolean shutdown = (null != _config.get(PROP_SHUTDOWN_IN_PROGRESS));
|
||||||
if (shutdown) {
|
if (shutdown) {
|
||||||
if (_gracefulExitCode == EXIT_HARD || _gracefulExitCode == EXIT_HARD_RESTART ||
|
if (_gracefulExitCode == EXIT_HARD || _gracefulExitCode == EXIT_HARD_RESTART ||
|
||||||
_context.tunnelManager().getParticipatingCount() <= 0) {
|
_context.tunnelManager().getParticipatingCount() <= 0) {
|
||||||
@ -1068,26 +1068,24 @@ public class Router {
|
|||||||
* this does escape the \r or \n that are unescaped in DataHelper.loadProps().
|
* this does escape the \r or \n that are unescaped in DataHelper.loadProps().
|
||||||
* Note that the escaping of \r or \n was probably a mistake and should be taken out.
|
* Note that the escaping of \r or \n was probably a mistake and should be taken out.
|
||||||
*
|
*
|
||||||
* FIXME Synchronize!!
|
* Synchronized with file read in getConfig()
|
||||||
*/
|
*/
|
||||||
public boolean saveConfig() {
|
public synchronized boolean saveConfig() {
|
||||||
FileOutputStream fos = null;
|
FileOutputStream fos = null;
|
||||||
try {
|
try {
|
||||||
fos = new SecureFileOutputStream(_configFilename);
|
fos = new SecureFileOutputStream(_configFilename);
|
||||||
StringBuilder buf = new StringBuilder(8*1024);
|
StringBuilder buf = new StringBuilder(8*1024);
|
||||||
buf.append("# NOTE: This I2P config file must use UTF-8 encoding\n");
|
buf.append("# NOTE: This I2P config file must use UTF-8 encoding\n");
|
||||||
synchronized (_config) {
|
TreeSet ordered = new TreeSet(_config.keySet());
|
||||||
TreeSet ordered = new TreeSet(_config.keySet());
|
for (Iterator iter = ordered.iterator() ; iter.hasNext(); ) {
|
||||||
for (Iterator iter = ordered.iterator() ; iter.hasNext(); ) {
|
String key = (String)iter.next();
|
||||||
String key = (String)iter.next();
|
String val = _config.get(key);
|
||||||
String val = _config.getProperty(key);
|
|
||||||
// Escape line breaks before saving.
|
// Escape line breaks before saving.
|
||||||
// Remember: "\" needs escaping both for regex and string.
|
// Remember: "\" needs escaping both for regex and string.
|
||||||
// NOOO - see comments in DataHelper
|
// NOOO - see comments in DataHelper
|
||||||
//val = val.replaceAll("\\r","\\\\r");
|
//val = val.replaceAll("\\r","\\\\r");
|
||||||
//val = val.replaceAll("\\n","\\\\n");
|
//val = val.replaceAll("\\n","\\\\n");
|
||||||
buf.append(key).append('=').append(val).append('\n');
|
buf.append(key).append('=').append(val).append('\n');
|
||||||
}
|
|
||||||
}
|
}
|
||||||
fos.write(buf.toString().getBytes("UTF-8"));
|
fos.write(buf.toString().getBytes("UTF-8"));
|
||||||
} catch (IOException ioe) {
|
} catch (IOException ioe) {
|
||||||
@ -1183,6 +1181,9 @@ public class Router {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (ok) {
|
if (ok) {
|
||||||
|
// This may be useful someday. First added in 0.8.2
|
||||||
|
_config.put("router.updateLastInstalled", "" + System.currentTimeMillis());
|
||||||
|
saveConfig();
|
||||||
boolean deleted = updateFile.delete();
|
boolean deleted = updateFile.delete();
|
||||||
if (!deleted) {
|
if (!deleted) {
|
||||||
System.out.println("ERROR: Unable to delete the update file!");
|
System.out.println("ERROR: Unable to delete the update file!");
|
||||||
|
@ -18,7 +18,7 @@ public class RouterVersion {
|
|||||||
/** deprecated */
|
/** deprecated */
|
||||||
public final static String ID = "Monotone";
|
public final static String ID = "Monotone";
|
||||||
public final static String VERSION = CoreVersion.VERSION;
|
public final static String VERSION = CoreVersion.VERSION;
|
||||||
public final static long BUILD = 4;
|
public final static long BUILD = 6;
|
||||||
|
|
||||||
/** for example "-test" */
|
/** for example "-test" */
|
||||||
public final static String EXTRA = "";
|
public final static String EXTRA = "";
|
||||||
|
@ -33,21 +33,24 @@ import net.i2p.util.Log;
|
|||||||
*
|
*
|
||||||
* The NTCP transport sends individual I2NP messages AES/256/CBC encrypted with
|
* The NTCP transport sends individual I2NP messages AES/256/CBC encrypted with
|
||||||
* a simple checksum. The unencrypted message is encoded as follows:
|
* a simple checksum. The unencrypted message is encoded as follows:
|
||||||
|
*<pre>
|
||||||
* +-------+-------+--//--+---//----+-------+-------+-------+-------+
|
* +-------+-------+--//--+---//----+-------+-------+-------+-------+
|
||||||
* | sizeof(data) | data | padding | adler checksum of sz+data+pad |
|
* | sizeof(data) | data | padding | adler checksum of sz+data+pad |
|
||||||
* +-------+-------+--//--+---//----+-------+-------+-------+-------+
|
* +-------+-------+--//--+---//----+-------+-------+-------+-------+
|
||||||
|
*</pre>
|
||||||
* That message is then encrypted with the DH/2048 negotiated session key
|
* That message is then encrypted with the DH/2048 negotiated session key
|
||||||
* (station to station authenticated per the EstablishState class) using the
|
* (station to station authenticated per the EstablishState class) using the
|
||||||
* last 16 bytes of the previous encrypted message as the IV.
|
* last 16 bytes of the previous encrypted message as the IV.
|
||||||
*
|
*
|
||||||
* One special case is a metadata message where the sizeof(data) is 0. In
|
* One special case is a metadata message where the sizeof(data) is 0. In
|
||||||
* that case, the unencrypted message is encoded as:
|
* that case, the unencrypted message is encoded as:
|
||||||
|
*<pre>
|
||||||
* +-------+-------+-------+-------+-------+-------+-------+-------+
|
* +-------+-------+-------+-------+-------+-------+-------+-------+
|
||||||
* | 0 | timestamp in seconds | uninterpreted
|
* | 0 | timestamp in seconds | uninterpreted
|
||||||
* +-------+-------+-------+-------+-------+-------+-------+-------+
|
* +-------+-------+-------+-------+-------+-------+-------+-------+
|
||||||
* uninterpreted | adler checksum of sz+data+pad |
|
* uninterpreted | adler checksum of sz+data+pad |
|
||||||
* +-------+-------+-------+-------+-------+-------+-------+-------+
|
* +-------+-------+-------+-------+-------+-------+-------+-------+
|
||||||
*
|
*</pre>
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
|
public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
|
||||||
|