forked from I2P_Developers/i2p.i2p
propagate from branch 'i2p.i2p' (head f33e0980fd48ba4acda12d2079f2a4834a710ae4)
to branch 'i2p.i2p.zzz.jetty7' (head bd1a64f7262ad5bbea3529675f1f055b9ad257a8)
This commit is contained in:
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
|
@ -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,
|
||||
|
@ -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");
|
||||
}
|
||||
****/
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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) + "%";
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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");
|
||||
}
|
||||
|
Reference in New Issue
Block a user