Changeset fea3bb6


Ignore:
Timestamp:
Oct 19, 2012 8:26:08 PM (7 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
58fd2dd
Parents:
4f936f9
Message:
  • Save available unsigned version across restarts
  • Fix status display after downloaded
  • Don't display update buttons unless HTTP proxy is up
  • Pass the manager down thru the constructors
Location:
apps/routerconsole/java/src/net/i2p/router
Files:
15 edited

Legend:

Unmodified
Added
Removed
  • apps/routerconsole/java/src/net/i2p/router/update/ConsoleUpdateManager.java

    r4f936f9 rfea3bb6  
    66import java.net.URISyntaxException;
    77import java.text.DecimalFormat;
    8 import java.text.SimpleDateFormat;
    98import java.util.ArrayList;
    109import java.util.Collection;
     
    7877    private static final long STATUS_CLEAN_TIME = 20*60*1000;
    7978    private static final long TASK_CLEANER_TIME = 15*60*1000;
     79    private static final String PROP_UNSIGNED_AVAILABLE = "router.updateUnsignedAvailable";
    8080
    8181    public ConsoleUpdateManager(RouterContext ctx) {
     
    100100        notifyInstalled(ROUTER_SIGNED, "", RouterVersion.VERSION);
    101101        // hack to init from the current news file... do this before we register Updaters
    102         (new NewsFetcher(_context, Collections.EMPTY_LIST)).checkForUpdates();
     102        (new NewsFetcher(_context, this, Collections.EMPTY_LIST)).checkForUpdates();
    103103        for (String plugin : PluginStarter.getPlugins()) {
    104104            Properties props = PluginStarter.pluginProperties(_context, plugin);
     
    109109
    110110        _context.registerUpdateManager(this);
    111         DummyHandler dh = new DummyHandler(_context);
     111        DummyHandler dh = new DummyHandler(_context, this);
    112112        register((Checker)dh, TYPE_DUMMY, HTTP, 0);
    113113        register((Updater)dh, TYPE_DUMMY, HTTP, 0);
    114114        // register news before router, so we don't fire off an update
    115115        // right at instantiation if the news is already indicating a new version
    116         Checker c = new NewsHandler(_context);
     116        Checker c = new NewsHandler(_context, this);
    117117        register(c, NEWS, HTTP, 0);
    118118        register(c, ROUTER_SIGNED, HTTP, 0);  // news is an update checker for the router
    119         Updater u = new UpdateHandler(_context);
     119        Updater u = new UpdateHandler(_context, this);
    120120        register(u, ROUTER_SIGNED, HTTP, 0);
    121         UnsignedUpdateHandler uuh = new UnsignedUpdateHandler(_context);
     121        UnsignedUpdateHandler uuh = new UnsignedUpdateHandler(_context, this);
    122122        register((Checker)uuh, ROUTER_UNSIGNED, HTTP, 0);
    123123        register((Updater)uuh, ROUTER_UNSIGNED, HTTP, 0);
    124         PluginUpdateHandler puh = new PluginUpdateHandler(_context);
     124        String newVersion = _context.getProperty(PROP_UNSIGNED_AVAILABLE);
     125        if (newVersion != null) {
     126            List<URI> updateSources = uuh.getUpdateSources();
     127            if (uuh != null) {
     128                VersionAvailable newVA = new VersionAvailable(newVersion, "", HTTP, updateSources);
     129                _available.put(new UpdateItem(ROUTER_UNSIGNED, ""), newVA);
     130            }
     131        }
     132        PluginUpdateHandler puh = new PluginUpdateHandler(_context, this);
    125133        register((Checker)puh, PLUGIN, HTTP, 0);
    126134        register((Checker)puh, PLUGIN_INSTALL, HTTP, 0);
    127135        register((Updater)puh, PLUGIN_INSTALL, HTTP, 0);
    128         new NewsTimerTask(_context);
     136        new NewsTimerTask(_context, this);
    129137        _context.simpleScheduler().addPeriodicEvent(new TaskCleaner(), TASK_CLEANER_TIME);
    130138    }
     
    606614                break;
    607615
     616            case ROUTER_UNSIGNED:
     617                // save across restarts
     618                _context.router().saveConfig(PROP_UNSIGNED_AVAILABLE, newVersion);
     619                // fall through
     620
    608621            case ROUTER_SIGNED:
    609622            case ROUTER_SIGNED_PACK200:
    610             case ROUTER_UNSIGNED:
    611623                if (shouldInstall() &&
    612624                    !(isUpdateInProgress(ROUTER_SIGNED) ||
     
    759771            case ROUTER_UNSIGNED:
    760772                rv = handleUnsignedFile(task.getURI(), actualVersion, file);
    761                 if (rv)
     773                if (rv) {
     774                    _context.router().saveConfig(PROP_UNSIGNED_AVAILABLE, null);
    762775                    notifyDownloaded(task.getType(), task.getID(), actualVersion);
     776                }
    763777                break;
    764778
     
    888902
    889903    /**
     904     *
    890905     *  @return success
    891906     */
     
    912927            } else {
    913928                _log.log(Log.CRIT, "Update was VERIFIED, will be installed at next restart");
    914                 StringBuilder buf = new StringBuilder(64);
    915                 buf.append("<b>").append(_("Update downloaded")).append("<br>");
    916                 if (_context.hasWrapper())
    917                     buf.append(_("Click Restart to install"));
    918                 else
    919                     buf.append(_("Click Shutdown and restart to install"));
    920                 if (up.newVersion() != null)
    921                     buf.append(' ').append(_("Version {0}", up.newVersion()));
    922                 buf.append("</b>");
    923                 updateStatus(buf.toString());
     929                // SummaryHelper will display restart info separately
     930                updateStatus("");
    924931            }
    925932        } else {
     
    964971            } else {
    965972                _log.log(Log.CRIT, "Update was downloaded, will be installed at next restart");
    966                 StringBuilder buf = new StringBuilder(64);
    967                 buf.append("<b>").append(_("Update downloaded")).append("</b><br>");
    968                 if (_context.hasWrapper())
    969                     buf.append(_("Click Restart to install"));
    970                 else
    971                     buf.append(_("Click Shutdown and restart to install"));
    972                 String ver = (new SimpleDateFormat("dd-MMM HH:mm")).format(new Date(modtime)) + " UTC";
    973                 buf.append(' ').append(_("Version {0}", ver));
    974                 updateStatus(buf.toString());
     973                // SummaryHelper will display restart info separately
     974                updateStatus("");
    975975            }
    976976        } else {
     
    10001000
    10011001    /** translate a string */
    1002     private String _(String s) {
     1002    public String _(String s) {
    10031003        return Messages.getString(s, _context);
    10041004    }
     
    10071007     *  translate a string with a parameter
    10081008     */
    1009     private String _(String s, Object o) {
     1009    public String _(String s, Object o) {
    10101010        return Messages.getString(s, o, _context);
    10111011    }
  • apps/routerconsole/java/src/net/i2p/router/update/DummyHandler.java

    r4f936f9 rfea3bb6  
    1515class DummyHandler implements Checker, Updater {
    1616    private final RouterContext _context;
     17    private final ConsoleUpdateManager _mgr;
    1718   
    18     public DummyHandler(RouterContext ctx) {
     19    public DummyHandler(RouterContext ctx, ConsoleUpdateManager mgr) {
    1920        _context = ctx;
     21        _mgr = mgr;
    2022    }
    2123
     
    2729        if (type != UpdateType.TYPE_DUMMY)
    2830            return null;
    29          return new DummyRunner(_context, maxTime);
     31         return new DummyRunner(_context, _mgr, maxTime);
    3032    }
    3133
     
    3739        if (type != UpdateType.TYPE_DUMMY)
    3840            return null;
    39          return new DummyRunner(_context, maxTime);
     41         return new DummyRunner(_context, _mgr, maxTime);
    4042    }
    4143
     
    4648        private final long _delay;
    4749
    48         public DummyRunner(RouterContext ctx, long maxTime) {
    49             super(ctx, Collections.EMPTY_LIST);
     50        public DummyRunner(RouterContext ctx, ConsoleUpdateManager mgr, long maxTime) {
     51            super(ctx, mgr, Collections.EMPTY_LIST);
    5052            _delay = maxTime;
    5153        }
     
    5961                Thread.sleep(_delay);
    6062            } catch (InterruptedException ie) {}
    61             UpdateManager mgr = _context.updateManager();
    62             if (mgr != null) {
    63                 mgr.notifyCheckComplete(this, false, false);
    64                 mgr.notifyTaskFailed(this, "dummy", null);
    65             }
     63            _mgr.notifyCheckComplete(this, false, false);
     64            _mgr.notifyTaskFailed(this, "dummy", null);
    6665        }
    6766    }
  • apps/routerconsole/java/src/net/i2p/router/update/NewsFetcher.java

    r4f936f9 rfea3bb6  
    4444    private static final String TEMP_NEWS_FILE = "news.xml.temp";
    4545   
    46     public NewsFetcher(RouterContext ctx, List<URI> uris) {
    47         super(ctx, uris);
     46    public NewsFetcher(RouterContext ctx, ConsoleUpdateManager mgr, List<URI> uris) {
     47        super(ctx, mgr, uris);
    4848        _newsFile = new File(ctx.getRouterDir(), NewsHelper.NEWS_FILE);
    4949        _tempFile = new File(ctx.getTempDir(), "tmp-" + ctx.random().nextLong() + TEMP_NEWS_FILE);
  • apps/routerconsole/java/src/net/i2p/router/update/NewsHandler.java

    r4f936f9 rfea3bb6  
    2525    private static final String BACKUP_NEWS_URL = "http://www.i2p2.i2p/_static/news/news.xml";
    2626
    27     public NewsHandler(RouterContext ctx) {
    28         super(ctx);
     27    public NewsHandler(RouterContext ctx, ConsoleUpdateManager mgr) {
     28        super(ctx, mgr);
    2929    }
    3030
     
    4646            updateSources.add(new URI(BACKUP_NEWS_URL));
    4747        } catch (URISyntaxException use) {}
    48         UpdateRunner update = new NewsFetcher(_context, updateSources);
     48        UpdateRunner update = new NewsFetcher(_context, _mgr, updateSources);
    4949        update.start();
    5050        return update;
  • apps/routerconsole/java/src/net/i2p/router/update/NewsTimerTask.java

    r4f936f9 rfea3bb6  
    4444    private static final long RUN_DELAY = 10*60*1000;
    4545
    46     public NewsTimerTask(RouterContext ctx) {
     46    public NewsTimerTask(RouterContext ctx, ConsoleUpdateManager mgr) {
    4747        _context = ctx;
    4848        _log = ctx.logManager().getLog(NewsTimerTask.class);
    49         _mgr = (ConsoleUpdateManager) _context.updateManager();
     49        _mgr = mgr;
    5050        ctx.simpleScheduler().addPeriodicEvent(this,
    5151                                             INITIAL_DELAY + _context.random().nextLong(INITIAL_DELAY),
  • apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateChecker.java

    r4f936f9 rfea3bb6  
    3535    private final String _oldVersion;
    3636
    37     public PluginUpdateChecker(RouterContext ctx, List<URI> uris, String appName, String oldVersion ) {
    38         super(ctx, uris);
     37    public PluginUpdateChecker(RouterContext ctx, ConsoleUpdateManager mgr,
     38                               List<URI> uris, String appName, String oldVersion ) {
     39        super(ctx, mgr, uris);
    3940        _baos = new ByteArrayOutputStream(TrustedUpdate.HEADER_BYTES);
    4041        if (!uris.isEmpty())
  • apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateHandler.java

    r4f936f9 rfea3bb6  
    3737class PluginUpdateHandler implements Checker, Updater {
    3838    private final RouterContext _context;
     39    private final ConsoleUpdateManager _mgr;
    3940
    40     public PluginUpdateHandler(RouterContext ctx) {
     41    public PluginUpdateHandler(RouterContext ctx, ConsoleUpdateManager mgr) {
    4142        _context = ctx;
     43        _mgr = mgr;
    4244    }
    4345   
     
    6567        }
    6668
    67         UpdateRunner update = new PluginUpdateChecker(_context, updateSources, appName, oldVersion);
     69        UpdateRunner update = new PluginUpdateChecker(_context, _mgr, updateSources, appName, oldVersion);
    6870        update.start();
    6971        return update;
     
    8587        }
    8688
    87         UpdateRunner update = new PluginUpdateRunner(_context, updateSources, appName, oldVersion);
     89        UpdateRunner update = new PluginUpdateRunner(_context, _mgr, updateSources, appName, oldVersion);
     90        // set status before thread to ensure UI feedback
     91        _mgr.notifyProgress(update, "<b>" + _mgr._("Updating") + "</b>");
    8892        update.start();
    8993        return update;
  • apps/routerconsole/java/src/net/i2p/router/update/PluginUpdateRunner.java

    r4f936f9 rfea3bb6  
    5454    public static final String PLUGIN_DIR = PluginStarter.PLUGIN_DIR;
    5555
    56     public PluginUpdateRunner(RouterContext ctx, List<URI> uris, String appName, String oldVersion ) {
    57         super(ctx, uris);
     56    public PluginUpdateRunner(RouterContext ctx, ConsoleUpdateManager mgr, List<URI> uris,
     57                              String appName, String oldVersion ) {
     58        super(ctx, mgr, uris);
    5859        if (uris.isEmpty())
    5960            _uri = null;
  • apps/routerconsole/java/src/net/i2p/router/update/UnsignedUpdateChecker.java

    r4f936f9 rfea3bb6  
    2828    protected static final String SIGNED_UPDATE_FILE = "i2pupdate.sud";
    2929
    30     public UnsignedUpdateChecker(RouterContext ctx, List<URI> uris, long lastUpdateTime) {
    31         super(ctx, uris);
     30    public UnsignedUpdateChecker(RouterContext ctx, ConsoleUpdateManager mgr,
     31                                 List<URI> uris, long lastUpdateTime) {
     32        super(ctx, mgr, uris);
    3233        _ms = lastUpdateTime;
    3334    }
  • apps/routerconsole/java/src/net/i2p/router/update/UnsignedUpdateHandler.java

    r4f936f9 rfea3bb6  
    3232class UnsignedUpdateHandler implements Checker, Updater {
    3333    private final RouterContext _context;
     34    private final ConsoleUpdateManager _mgr;
    3435
    35     public UnsignedUpdateHandler(RouterContext ctx) {
     36    public UnsignedUpdateHandler(RouterContext ctx, ConsoleUpdateManager mgr) {
    3637        _context = ctx;
     38        _mgr = mgr;
     39    }
     40
     41    /**
     42     *  @return null if none
     43     *  @since 0.9.4
     44     */
     45    public List<URI> getUpdateSources() {
     46        String url = _context.getProperty(ConfigUpdateHandler.PROP_ZIP_URL);
     47        if (url == null)
     48            return null;
     49
     50        try {
     51            return Collections.singletonList(new URI(url));
     52        } catch (URISyntaxException use) {
     53            return null;
     54        }
    3755    }
    3856
     
    4664            return null;
    4765
    48         String url = _context.getProperty(ConfigUpdateHandler.PROP_ZIP_URL);
    49         if (url == null)
     66        List<URI> updateSources = getUpdateSources();
     67        if (updateSources == null)
    5068            return null;
    51 
    52         List<URI> updateSources;
    53         try {
    54             updateSources = Collections.singletonList(new URI(url));
    55         } catch (URISyntaxException use) {
    56             return null;
    57         }
    5869
    5970        long ms = _context.getProperty(NewsHelper.PROP_LAST_UPDATE_TIME, 0L);
     
    6677        }
    6778
    68         UpdateRunner update = new UnsignedUpdateChecker(_context, updateSources, ms);
     79        UpdateRunner update = new UnsignedUpdateChecker(_context, _mgr, updateSources, ms);
    6980        update.start();
    7081        return update;
     
    8495        if (type != ROUTER_UNSIGNED || method != HTTP || updateSources.isEmpty())
    8596            return null;
    86         UpdateRunner update = new UnsignedUpdateRunner(_context, updateSources);
     97        UpdateRunner update = new UnsignedUpdateRunner(_context, _mgr, updateSources);
     98        // set status before thread to ensure UI feedback
     99        _mgr.notifyProgress(update, "<b>" + _mgr._("Updating") + "</b>");
    87100        update.start();
    88101        return update;
  • apps/routerconsole/java/src/net/i2p/router/update/UnsignedUpdateRunner.java

    r4f936f9 rfea3bb6  
    2525class UnsignedUpdateRunner extends UpdateRunner {
    2626
    27     public UnsignedUpdateRunner(RouterContext ctx, List<URI> uris) {
    28         super(ctx, uris);
     27    public UnsignedUpdateRunner(RouterContext ctx, ConsoleUpdateManager mgr, List<URI> uris) {
     28        super(ctx, mgr, uris);
    2929        if (!uris.isEmpty())
    3030            _currentURI = uris.get(0);
     
    4040        protected void update() {
    4141            String zipURL = _currentURI.toString();
    42             updateStatus("<b>" + _("Updating") + "</b>");
    4342            if (_log.shouldLog(Log.DEBUG))
    4443                _log.debug("Starting unsigned update URL: " + zipURL);
  • apps/routerconsole/java/src/net/i2p/router/update/UpdateHandler.java

    r4f936f9 rfea3bb6  
    3939class UpdateHandler implements Updater {
    4040    protected final RouterContext _context;
     41    protected final ConsoleUpdateManager _mgr;
    4142   
    42     public UpdateHandler(RouterContext ctx) {
     43    public UpdateHandler(RouterContext ctx, ConsoleUpdateManager mgr) {
    4344        _context = ctx;
     45        _mgr = mgr;
    4446    }
    4547   
     
    5759            method != UpdateMethod.HTTP || updateSources.isEmpty())
    5860            return null;
    59         UpdateRunner update = new UpdateRunner(_context, updateSources);
     61        UpdateRunner update = new UpdateRunner(_context, _mgr, updateSources);
     62        // set status before thread to ensure UI feedback
     63        _mgr.notifyProgress(update, "<b>" + _mgr._("Updating") + "</b>");
    6064        update.start();
    6165        return update;
  • apps/routerconsole/java/src/net/i2p/router/update/UpdateRunner.java

    r4f936f9 rfea3bb6  
    5050    protected static final long NOPROXY_INACTIVITY_TIMEOUT = 60*1000;
    5151
    52     public UpdateRunner(RouterContext ctx, List<URI> uris) {
     52    public UpdateRunner(RouterContext ctx, ConsoleUpdateManager mgr, List<URI> uris) {
    5353        super("Update Runner");
    5454        setDaemon(true);
    5555        _context = ctx;
    5656        _log = ctx.logManager().getLog(getClass());
    57         _mgr = (ConsoleUpdateManager) ctx.updateManager();
     57        _mgr = mgr;
    5858        _urls = uris;
    5959        _updateFile = (new File(ctx.getTempDir(), "update" + ctx.random().nextInt() + ".tmp")).getAbsolutePath();
     
    227227    /** translate a string */
    228228    protected String _(String s) {
    229         return Messages.getString(s, _context);
     229        return _mgr._(s);
    230230    }
    231231
     
    234234     */
    235235    protected String _(String s, Object o) {
    236         return Messages.getString(s, o, _context);
     236        return _mgr._(s, o);
    237237    }
    238238}
  • apps/routerconsole/java/src/net/i2p/router/web/NewsHelper.java

    r4f936f9 rfea3bb6  
    5151
    5252    /**
     53     *  Will be false if already downloaded
    5354     *  @since 0.9.4 moved from NewsFetcher
    5455     */
     
    6061
    6162    /**
     63     *  Available version, will be null if already downloaded
    6264     *  @return null if none
    6365     *  @since 0.9.4 moved from NewsFetcher
     
    7072
    7173    /**
     74     *  Already downloaded but not installed version
     75     *  @return null if none
     76     *  @since 0.9.4
     77     */
     78    public static String updateVersionDownloaded() {
     79        ConsoleUpdateManager mgr = ConsoleUpdateManager.getInstance();
     80        if (mgr == null) return null;
     81        return mgr.getUpdateDownloaded(ROUTER_SIGNED);
     82    }
     83
     84    /**
     85     *  Will be false if already downloaded
    7286     *  @since 0.9.4 moved from NewsFetcher
    7387     */
     
    8599        ConsoleUpdateManager mgr = ConsoleUpdateManager.getInstance();
    86100        if (mgr == null) return null;
    87         String ver = mgr.getUpdateAvailable(ROUTER_UNSIGNED);
     101        return formatUnsignedVersion(mgr.getUpdateAvailable(ROUTER_UNSIGNED));
     102    }
     103
     104    /**
     105     *  Already downloaded but not installed version
     106     *  @return null if none
     107     *  @since 0.9.4
     108     */
     109    public static String unsignedVersionDownloaded() {
     110        ConsoleUpdateManager mgr = ConsoleUpdateManager.getInstance();
     111        if (mgr == null) return null;
     112        return formatUnsignedVersion(mgr.getUpdateDownloaded(ROUTER_UNSIGNED));
     113    }
     114
     115    /**
     116     *  Convert long date stamp to
     117     *  '07-Jul 21:09 UTC' with month name in the system locale
     118     *  @return null if ver = null
     119     *  @since 0.9.4 moved from NewsFetcher
     120     */
     121    private static String formatUnsignedVersion(String ver) {
    88122        if (ver != null) {
    89123            try {
    90124                long modtime = Long.parseLong(ver);
    91                 // '07-Jul 21:09 UTC' with month name in the system locale
    92125                return (new SimpleDateFormat("dd-MMM HH:mm")).format(new Date(modtime)) + " UTC";
    93126            } catch (NumberFormatException nfe) {}
  • apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java

    r4f936f9 rfea3bb6  
    2828import net.i2p.stat.Rate;
    2929import net.i2p.stat.RateStat;
     30import net.i2p.util.PortMapper;
    3031
    3132/**
     
    628629********/
    629630
    630     public boolean updateAvailable() {
     631    private boolean updateAvailable() {
    631632        return NewsHelper.isUpdateAvailable();
    632633    }
    633634
    634     public boolean unsignedUpdateAvailable() {
     635    private boolean unsignedUpdateAvailable() {
    635636        return NewsHelper.isUnsignedUpdateAvailable();
    636637    }
    637638
    638     public String getUpdateVersion() {
     639    private String getUpdateVersion() {
    639640        return NewsHelper.updateVersion();
    640641    }
    641642
    642     public String getUnsignedUpdateVersion() {
     643    private String getUnsignedUpdateVersion() {
    643644        return NewsHelper.unsignedUpdateVersion();
    644645    }
     
    655656            buf.append("<h4>").append(status).append("</h4>\n");
    656657        }
    657         if (updateAvailable() || unsignedUpdateAvailable()) {
    658             if (NewsHelper.isUpdateInProgress()) {
    659                 // nothing
    660             } else if(
    661                       // isDone() is always false for now, see UpdateHandler
    662                       // ((!update.isDone()) &&
    663                       getAction() == null &&
    664                       getUpdateNonce() == null &&
    665                       ConfigRestartBean.getRestartTimeRemaining() > 12*60*1000) {
     658        String dver = NewsHelper.updateVersionDownloaded();
     659        if (dver == null)
     660            dver = NewsHelper.unsignedVersionDownloaded();
     661        if (dver != null &&
     662            !NewsHelper.isUpdateInProgress() &&
     663            !_context.router().gracefulShutdownInProgress()) {
     664            buf.append("<h4><b>").append(_("Update downloaded")).append("<br>");
     665            if (_context.hasWrapper())
     666                buf.append(_("Click Restart to install"));
     667            else
     668                buf.append(_("Click Shutdown and restart to install"));
     669            buf.append(' ').append(_("Version {0}", dver));
     670            buf.append("</b></h4>");
     671        }
     672        if ((updateAvailable() || unsignedUpdateAvailable()) &&
     673            !NewsHelper.isUpdateInProgress() &&
     674            !_context.router().gracefulShutdownInProgress() &&
     675            _context.portMapper().getPort(PortMapper.SVC_HTTP_PROXY) > 0 &&  // assume using proxy for now
     676            getAction() == null &&
     677            getUpdateNonce() == null) {
    666678                long nonce = _context.random().nextLong();
    667679                String prev = System.getProperty("net.i2p.router.web.UpdateHandler.nonce");
     
    687699                }
    688700                buf.append("</form>\n");
    689             }
    690701        }
    691702        return buf.toString();
Note: See TracChangeset for help on using the changeset viewer.