propagate from branch 'i2p.i2p' (head f33e0980fd48ba4acda12d2079f2a4834a710ae4)

to branch 'i2p.i2p.zzz.jetty7' (head bd1a64f7262ad5bbea3529675f1f055b9ad257a8)
This commit is contained in:
zzz
2013-01-13 12:38:05 +00:00
356 changed files with 41754 additions and 101567 deletions

View File

@ -558,6 +558,11 @@ public class ConsoleUpdateManager implements UpdateManager {
* Call once for each type/method pair.
*/
public void register(Updater updater, UpdateType type, UpdateMethod method, int priority) {
if ((type == ROUTER_SIGNED || type == ROUTER_UNSIGNED) && NewsHelper.dontInstall(_context)) {
if (_log.shouldLog(Log.WARN))
_log.warn("Ignoring registration for " + type + ", router updates disabled");
return;
}
// DEBUG slow start for snark updates
// For 0.9.4 update, only for dev builds
// For 0.9.5 update, only for dev builds and 1% more

View File

@ -64,14 +64,6 @@ class NewsFetcher extends UpdateRunner {
return NewsHelper.dontInstall(_context);
}
private boolean shouldInstall() {
String policy = _context.getProperty(ConfigUpdateHandler.PROP_UPDATE_POLICY);
if ("notify".equals(policy) || dontInstall())
return false;
File zip = new File(_context.getRouterDir(), Router.UPDATE_FILE);
return !zip.exists();
}
@Override
public void run() {
_isRunning = true;
@ -133,6 +125,11 @@ class NewsFetcher extends UpdateRunner {
* TODO: Check minVersion, use backup URLs specified
*/
void checkForUpdates() {
// For now, don't even tell the manager about new versions if we can't install.
// If we do want the manager to know, we must hide the buttons in
// SummaryHelper.getUpdateStatus().
if (dontInstall())
return;
FileInputStream in = null;
try {
in = new FileInputStream(_newsFile);

View File

@ -2,6 +2,7 @@ package net.i2p.router.update;
import java.io.File;
import java.io.IOException;
import java.lang.IllegalArgumentException;
import java.net.URI;
import java.util.List;
import java.util.Map;
@ -37,6 +38,8 @@ import net.i2p.util.VersionComparator;
* then fetch the first 56 bytes of the URL, extract the version,
* and compare.
*
* uri list must not be empty.
*
* Moved from web/ and turned into an UpdateTask.
*
* @since 0.9.4 moved from PluginUpdateHandler
@ -55,10 +58,10 @@ class PluginUpdateRunner extends UpdateRunner {
public static final String PLUGIN_DIR = PluginStarter.PLUGIN_DIR;
public PluginUpdateRunner(RouterContext ctx, ConsoleUpdateManager mgr, List<URI> uris,
String appName, String oldVersion ) {
String appName, String oldVersion ) {
super(ctx, mgr, uris);
if (uris.isEmpty())
_uri = null;
throw new IllegalArgumentException("uri cannot be empty");
else
_uri = uris.get(0);
_xpi2pURL = _uri.toString();

View File

@ -85,6 +85,7 @@ public class ConfigClientsHelper extends HelperBase {
}
}
/** clients */
public String getForm1() {
StringBuilder buf = new StringBuilder(1024);
buf.append("<table>\n");
@ -112,6 +113,7 @@ public class ConfigClientsHelper extends HelperBase {
return buf.toString();
}
/** webapps */
public String getForm2() {
StringBuilder buf = new StringBuilder(1024);
buf.append("<table>\n");
@ -136,6 +138,7 @@ public class ConfigClientsHelper extends HelperBase {
return PluginStarter.pluginsEnabled(_context);
}
/** plugins */
public String getForm3() {
StringBuilder buf = new StringBuilder(1024);
buf.append("<table>\n");
@ -218,7 +221,11 @@ public class ConfigClientsHelper extends HelperBase {
return buf.toString();
}
/** ro trumps edit and showEditButton */
/**
* Misnamed, renders a single line in a table for a single client/webapp/plugin.
*
* ro trumps edit and showEditButton
*/
private void renderForm(StringBuilder buf, String index, String name, boolean urlify,
boolean enabled, boolean ro, String desc, boolean edit,
boolean showEditButton, boolean showUpdateButton, boolean showStopButton,

View File

@ -172,6 +172,7 @@ public class ConsolePasswordManager extends RouterPasswordManager {
return _context.router().saveConfig(toAdd, toDel);
}
/****
public static void main(String args[]) {
RouterContext ctx = (new Router()).getContext();
ConsolePasswordManager pm = new ConsolePasswordManager(ctx);
@ -210,4 +211,5 @@ public class ConsolePasswordManager extends RouterPasswordManager {
if (!pm.checkHash("type5", "user5", "pw5"))
System.out.println("Fail 11");
}
****/
}

View File

@ -12,9 +12,12 @@ import java.util.List;
import net.i2p.data.DataHelper;
import net.i2p.router.Job;
import net.i2p.router.JobStats;
import net.i2p.util.ObjectCounter;
public class JobQueueHelper extends HelperBase {
private static final int MAX_JOBS = 50;
public String getJobQueueSummary() {
try {
if (_out != null) {
@ -44,7 +47,7 @@ public class JobQueueHelper extends HelperBase {
int numRunners = _context.jobQueue().getJobs(readyJobs, timedJobs, activeJobs, justFinishedJobs);
StringBuilder buf = new StringBuilder(32*1024);
buf.append("<b><div class=\"joblog\"><h3>I2P Job Queue</h3><div class=\"wideload\">Job runners: ").append(numRunners);
buf.append("<b><div class=\"joblog\"><h3>I2P Job Queue</h3><br><div class=\"wideload\">Job runners: ").append(numRunners);
buf.append("</b><br>\n");
long now = _context.clock().now();
@ -56,6 +59,7 @@ public class JobQueueHelper extends HelperBase {
buf.append(j.toString()).append("</li>\n");
}
buf.append("</ol>\n");
buf.append("<hr><b>Just finished jobs: ").append(justFinishedJobs.size()).append("</b><ol>\n");
for (int i = 0; i < justFinishedJobs.size(); i++) {
Job j = justFinishedJobs.get(i);
@ -63,20 +67,32 @@ public class JobQueueHelper extends HelperBase {
buf.append(j.toString()).append("</li>\n");
}
buf.append("</ol>\n");
buf.append("<hr><b>Ready/waiting jobs: ").append(readyJobs.size()).append("</b><ol>\n");
ObjectCounter<String> counter = new ObjectCounter();
for (int i = 0; i < readyJobs.size(); i++) {
Job j = readyJobs.get(i);
counter.increment(j.getName());
if (i >= MAX_JOBS)
continue;
buf.append("<li>[waiting ");
buf.append(DataHelper.formatDuration2(now-j.getTiming().getStartAfter()));
buf.append("]: ");
buf.append(j.toString()).append("</li>\n");
}
buf.append("</ol>\n");
out.flush();
getJobCounts(buf, counter);
out.write(buf.toString());
buf.setLength(0);
buf.append("<hr><b>Scheduled jobs: ").append(timedJobs.size()).append("</b><ol>\n");
long prev = Long.MIN_VALUE;
for (Job j : timedJobs) {
counter.clear();
for (int i = 0; i < timedJobs.size(); i++) {
Job j = timedJobs.get(i);
counter.increment(j.getName());
if (i >= MAX_JOBS)
continue;
long time = j.getTiming().getStartAfter() - now;
buf.append("<li>").append(j.getName()).append(" in ");
buf.append(DataHelper.formatDuration2(time));
@ -88,16 +104,31 @@ public class JobQueueHelper extends HelperBase {
buf.append("</li>\n");
}
buf.append("</ol></div>\n");
getJobCounts(buf, counter);
out.write(buf.toString());
buf.setLength(0);
out.flush();
buf.append("<hr><b>Total Job Stats</b>\n");
getJobStats(buf);
out.flush();
out.write(buf.toString());
}
/** @since 0.9.5 */
private static void getJobCounts(StringBuilder buf, ObjectCounter<String> counter) {
List<String> names = new ArrayList(counter.objects());
if (names.size() < 4)
return;
buf.append("<table style=\"width: 30%; margin-left: 100px;\">\n" +
"<tr><th>Job</th><th>Queued<th>");
Collections.sort(names, new JobCountComparator(counter));
for (String name : names) {
buf.append("<tr><td>").append(name)
.append("</td><td>").append(counter.count(name))
.append("</td></tr>\n");
}
buf.append("</table>\n");
}
/**
* Render the HTML for the job stats.
* Moved from JobQueue
@ -175,4 +206,23 @@ public class JobQueueHelper extends HelperBase {
}
}
/** @since 0.9.5 */
private static class JobCountComparator implements Comparator<String> {
private final ObjectCounter<String> _counter;
public JobCountComparator(ObjectCounter<String> counter) {
_counter = counter;
}
public int compare(String l, String r) {
// reverse
int lc = _counter.count(l);
int rc = _counter.count(r);
if (lc > rc)
return -1;
if (lc < rc)
return 1;
return l.compareTo(r);
}
}
}

View File

@ -230,10 +230,12 @@ public class NewsHelper extends ContentHelper {
* @since 0.9.4 moved from NewsFetcher
*/
public static boolean dontInstall(RouterContext ctx) {
boolean disabled = ctx.getBooleanProperty(ConfigUpdateHandler.PROP_UPDATE_DISABLED);
if (disabled)
return true;
File test = new File(ctx.getBaseDir(), "history.txt");
boolean readonly = ((test.exists() && !test.canWrite()) || (!ctx.getBaseDir().canWrite()));
boolean disabled = ctx.getBooleanProperty(ConfigUpdateHandler.PROP_UPDATE_DISABLED);
return readonly || disabled;
return readonly;
}
/**

View File

@ -16,6 +16,7 @@ import net.i2p.router.peermanager.DBHistory;
import net.i2p.router.peermanager.PeerProfile;
import net.i2p.router.peermanager.ProfileOrganizer;
import net.i2p.stat.Rate;
import net.i2p.stat.RateAverages;
import net.i2p.stat.RateStat;
/**
@ -171,11 +172,12 @@ class ProfileOrganizerRenderer {
if (_context.banlist().isBanlisted(peer)) buf.append(_("Banned"));
if (prof.getIsFailing()) buf.append(' ').append(_("Failing"));
if (_context.commSystem().wasUnreachable(peer)) buf.append(' ').append(_("Unreachable"));
RateAverages ra = RateAverages.getTemp();
Rate failed = prof.getTunnelHistory().getFailedRate().getRate(30*60*1000);
long fails = failed.getCurrentEventCount() + failed.getLastEventCount();
long fails = failed.computeAverages(ra, false).getTotalEventCount();
if (fails > 0) {
Rate accepted = prof.getTunnelCreateResponseTime().getRate(30*60*1000);
long total = fails + accepted.getCurrentEventCount() + accepted.getLastEventCount();
long total = fails + accepted.computeAverages(ra, false).getTotalEventCount();
if (total / fails <= 10) // hide if < 10%
buf.append(' ').append(fails).append('/').append(total).append(' ').append(_("Test Fails"));
}
@ -218,6 +220,7 @@ class ProfileOrganizerRenderer {
buf.append("<th class=\"smallhead\">").append(_("1h Fail Rate")).append("</th>");
buf.append("<th class=\"smallhead\">").append(_("1d Fail Rate")).append("</th>");
buf.append("</tr>");
RateAverages ra = RateAverages.getTemp();
for (Iterator<PeerProfile> iter = integratedPeers.iterator(); iter.hasNext();) {
PeerProfile prof = iter.next();
Hash peer = prof.getPeer();
@ -240,9 +243,9 @@ class ProfileOrganizerRenderer {
buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(time)).append("</td>");
time = now - prof.getLastSendFailed();
buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(time)).append("</td>");
buf.append("<td align=\"right\">").append(avg(prof, 10*60*1000l)).append("</td>");
buf.append("<td align=\"right\">").append(avg(prof, 60*60*1000l)).append("</td>");
buf.append("<td align=\"right\">").append(avg(prof, 24*60*60*1000l)).append("</td>");
buf.append("<td align=\"right\">").append(avg(prof, 10*60*1000l, ra)).append("</td>");
buf.append("<td align=\"right\">").append(avg(prof, 60*60*1000l, ra)).append("</td>");
buf.append("<td align=\"right\">").append(avg(prof, 24*60*60*1000l, ra)).append("</td>");
DBHistory dbh = prof.getDBHistory();
if (dbh != null) {
time = now - dbh.getLastLookupSuccessful();
@ -253,8 +256,8 @@ class ProfileOrganizerRenderer {
buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(time)).append("</td>");
time = now - dbh.getLastStoreFailed();
buf.append("<td align=\"right\">").append(DataHelper.formatDuration2(time)).append("</td>");
buf.append("<td align=\"right\">").append(davg(dbh, 60*60*1000l)).append("</td>");
buf.append("<td align=\"right\">").append(davg(dbh, 24*60*60*1000l)).append("</td>");
buf.append("<td align=\"right\">").append(davg(dbh, 60*60*1000l, ra)).append("</td>");
buf.append("<td align=\"right\">").append(davg(dbh, 24*60*60*1000l, ra)).append("</td>");
} else {
for (int i = 0; i < 6; i++)
buf.append("<td align=\"right\">").append(_(NA));
@ -340,31 +343,30 @@ class ProfileOrganizerRenderer {
private final static String num(double num) { synchronized (_fmt) { return _fmt.format(num); } }
private final static String NA = HelperBase._x("n/a");
private String avg (PeerProfile prof, long rate) {
private String avg (PeerProfile prof, long rate, RateAverages ra) {
RateStat rs = prof.getDbResponseTime();
if (rs == null)
return _(NA);
Rate r = rs.getRate(rate);
if (r == null)
return _(NA);
long c = r.getCurrentEventCount() + r.getLastEventCount();
if (c == 0)
r.computeAverages(ra, false);
if (ra.getTotalEventCount() == 0)
return _(NA);
double d = r.getCurrentTotalValue() + r.getLastTotalValue();
return DataHelper.formatDuration2(Math.round(d/c));
return DataHelper.formatDuration2(Math.round(ra.getAverage()));
}
private String davg (DBHistory dbh, long rate) {
private String davg (DBHistory dbh, long rate, RateAverages ra) {
RateStat rs = dbh.getFailedLookupRate();
if (rs == null)
return "0%";
Rate r = rs.getRate(rate);
if (r == null)
return "0%";
long c = r.getCurrentEventCount() + r.getLastEventCount();
if (c <= 0)
r.computeAverages(ra, false);
if (ra.getTotalEventCount() <= 0)
return "0%";
double avg = 0.5 + 100 * (r.getCurrentTotalValue() + r.getLastTotalValue()) / c;
double avg = 0.5 + 100 * ra.getAverage();
return ((int) avg) + "%";
}

View File

@ -55,7 +55,7 @@ public class StatSummarizer implements Runnable {
private Thread _thread;
public StatSummarizer() {
_context = RouterContext.listContexts().get(0); // fuck it, only summarize one per jvm
_context = RouterContext.listContexts().get(0); // only summarize one per jvm
_log = _context.logManager().getLog(getClass());
_listeners = new CopyOnWriteArrayList();
_instance = this;

View File

@ -852,29 +852,29 @@ public class SummaryHelper extends HelperBase {
.append(i)
.append("\">");
if (i > 0) {
buf.append("<input type=\"image\" class=\"buttonTop\" name=\"move_")
buf.append("<button type=\"submit\" class=\"buttonTop\" name=\"action\" value=\"move_")
.append(i)
.append("_top\" alt=\"")
.append("_top\"><img alt=\"")
.append(_("Top"))
.append("\" src=\"" + imgPath + "move_top.png\">");
buf.append("<input type=\"image\" class=\"buttonUp\" name=\"move_")
.append("\" src=\"" + imgPath + "move_top.png\" /></button>");
buf.append("<button type=\"submit\" class=\"buttonUp\" name=\"action\" value=\"move_")
.append(i)
.append("_up\" alt=\"")
.append("_up\"><img alt=\"")
.append(_("Up"))
.append("\" src=\"" + imgPath + "move_up.png\">");
.append("\" src=\"" + imgPath + "move_up.png\" /></button>");
}
buf.append("</td><td align=\"left\">");
if (i < sections.size() - 1) {
buf.append("<input type=\"image\" class=\"buttonDown\" name=\"move_")
buf.append("<button type=\"submit\" class=\"buttonDown\" name=\"action\" value=\"move_")
.append(i)
.append("_down\" alt=\"")
.append("_down\"><img alt=\"")
.append(_("Down"))
.append("\" src=\"" + imgPath + "move_down.png\">");
buf.append("<input type=\"image\" class=\"buttonBottom\" name=\"move_")
.append("\" src=\"" + imgPath + "move_down.png\" /></button>");
buf.append("<button type=\"submit\" class=\"buttonBottom\" name=\"action\" value=\"move_")
.append(i)
.append("_bottom\" alt=\"")
.append("_bottom\"><img alt=\"")
.append(_("Bottom"))
.append("\" src=\"" + imgPath + "move_bottom.png\">");
.append("\" src=\"" + imgPath + "move_bottom.png\" /></button>");
}
buf.append("</td></tr>\n");
}