Changeset fc6f4ec


Ignore:
Timestamp:
Jan 15, 2012 9:15:08 PM (9 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
0cee758
Parents:
9acabfb
Message:
  • Plugins:
    • Auto-update plugins after a router update
    • Add update-all button
Location:
apps/routerconsole
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHandler.java

    r9acabfb rfc6f4ec  
    5252        if (_action.equals(_("Install Plugin"))) {
    5353            installPlugin();
     54            return;
     55        }
     56        if (_action.equals(_("Update All Installed Plugins"))) {
     57            updateAllPlugins();
    5458            return;
    5559        }
     
    320324        }
    321325        installPlugin(url);
     326    }
     327
     328    /** @since 0.8.13 */
     329    private void updateAllPlugins() {
     330        addFormNotice(_("Updating all plugins"));
     331        PluginStarter.updateAll(_context);
     332        // So that update() will post a status to the summary bar before we reload
     333        try {
     334           Thread.sleep(1000);
     335        } catch (InterruptedException ie) {}
    322336    }
    323337
  • apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java

    r9acabfb rfc6f4ec  
    2323import net.i2p.router.Job;
    2424import net.i2p.router.RouterContext;
     25import net.i2p.router.RouterVersion;
    2526import net.i2p.router.startup.ClientAppConfig;
    2627import net.i2p.router.startup.LoadClientAppsJob;
    2728import net.i2p.util.ConcurrentHashSet;
    2829import net.i2p.util.FileUtil;
     30import net.i2p.util.I2PAppThread;
    2931import net.i2p.util.Log;
    3032import net.i2p.util.Translate;
     
    6466
    6567    public void run() {
     68        if (_context.getBooleanPropertyDefaultTrue("plugins.autoUpdate") &&
     69            (!Boolean.valueOf(System.getProperty(UpdateHandler.PROP_UPDATE_IN_PROGRESS)).booleanValue()) &&
     70            (!RouterVersion.VERSION.equals(_context.getProperty("router.previousVersion"))))
     71            updateAll(_context, true);
    6672        startPlugins(_context);
     73    }
     74
     75    /**
     76     *  threaded
     77     *  @since 0.8.13
     78     */
     79    static void updateAll(RouterContext ctx) {
     80        Thread t = new I2PAppThread(new PluginUpdater(ctx), "PluginUpdater", true);
     81        t.start();
     82    }
     83
     84    /**
     85     *  thread
     86     *  @since 0.8.13
     87     */
     88    private static class PluginUpdater implements Runnable {
     89        private final RouterContext _ctx;
     90
     91        public PluginUpdater(RouterContext ctx) {
     92            _ctx = ctx;
     93        }
     94
     95        public void run() {
     96            updateAll(_ctx, false);
     97        }
     98    }
     99
     100    /**
     101     *  inline
     102     *  @since 0.8.13
     103     */
     104    private static void updateAll(RouterContext ctx, boolean delay) {
     105        List<String> plugins = getPlugins();
     106        Map<String, String> toUpdate = new HashMap();
     107        for (String appName : plugins) {
     108            Properties props = pluginProperties(ctx, appName);
     109            String url = props.getProperty("updateURL");
     110            if (url != null)
     111                toUpdate.put(appName, url);
     112        }
     113        if (toUpdate.isEmpty())
     114            return;
     115        PluginUpdateChecker puc = PluginUpdateChecker.getInstance(ctx);
     116        if (puc.isRunning())
     117            return;
     118
     119        if (delay) {
     120            // wait for proxy
     121            System.setProperty(UpdateHandler.PROP_UPDATE_IN_PROGRESS, "true");
     122            puc.setAppStatus(Messages.getString("Checking for plugin updates", ctx));
     123            try {
     124                Thread.sleep(3*60*1000);
     125            } catch (InterruptedException ie) {}
     126            System.setProperty(UpdateHandler.PROP_UPDATE_IN_PROGRESS, "false");
     127        }
     128
     129        Log log = ctx.logManager().getLog(PluginStarter.class);
     130        for (Map.Entry<String, String> entry : toUpdate.entrySet()) {
     131            String appName = entry.getKey();
     132            if (log.shouldLog(Log.WARN))
     133                log.warn("Checking for update plugin: " + appName);
     134            puc.update(appName);
     135            do {
     136                try {
     137                    Thread.sleep(5*1000);
     138                } catch (InterruptedException ie) {}
     139            } while (puc.isRunning());
     140            if (!puc.isNewerAvailable()) {
     141                if (log.shouldLog(Log.WARN))
     142                    log.warn("No update available for plugin: " + appName);
     143                continue;
     144            }
     145            PluginUpdateHandler puh = PluginUpdateHandler.getInstance(ctx);
     146            String url = entry.getValue();
     147            if (log.shouldLog(Log.WARN))
     148                log.warn("Updating plugin: " + appName);
     149            puh.update(url);
     150            do {
     151                try {
     152                    Thread.sleep(5*1000);
     153                } catch (InterruptedException ie) {}
     154            } while (puh.isRunning());
     155        }
    67156    }
    68157
     
    76165                if (Boolean.valueOf(props.getProperty(name)).booleanValue()) {
    77166                    String app = name.substring(PREFIX.length(), name.lastIndexOf(ENABLED));
     167                    // plugins could have been started after update
     168                    if (isPluginRunning(app, ctx))
     169                        continue;
    78170                    try {
    79171                        if (!startPlugin(ctx, app))
  • apps/routerconsole/java/src/net/i2p/router/web/PluginUpdateChecker.java

    r9acabfb rfc6f4ec  
    3737    private String _oldVersion;
    3838    private String _xpi2pURL;
     39    private volatile boolean _isNewerAvailable;
    3940
    4041    private static PluginUpdateChecker _instance;
     
    5051    }
    5152   
    52     /** check all plugins */
     53    /**
     54     *  check all plugins
     55     *  @deprecated not finished
     56     */
    5357    public void update() {
    5458        Thread t = new I2PAppThread(new AllCheckerRunner(), "AllAppChecker", true);
     
    5660    }
    5761
     62    /**
     63     *  check all plugins
     64     *  @deprecated not finished
     65     */
    5866    public class AllCheckerRunner implements Runnable {
    5967        public void run() {
     
    8694            _appName = appName;
    8795            _oldVersion = oldVersion;
     96            _isNewerAvailable = false;
    8897            System.setProperty(PROP_UPDATE_IN_PROGRESS, "true");
    8998            I2PAppThread update = new I2PAppThread(_pluginUpdateCheckerRunner, "AppChecker", true);
     
    92101    }
    93102   
     103    /** @since 0.8.13 */
     104    public void setAppStatus(String status) {
     105        updateStatus(status);
     106    }
     107
    94108    public boolean isRunning() {
    95109        return _pluginUpdateCheckerRunner != null && _pluginUpdateCheckerRunner.isRunning();
     
    102116    }
    103117   
     118    /** @since 0.8.13 */
     119    public boolean isNewerAvailable() {
     120        return _isNewerAvailable;
     121    }
     122
    104123    private void scheduleStatusClean(String msg) {
    105124        SimpleScheduler.getInstance().addEvent(new Cleaner(msg), 60*60*1000);
     
    127146        @Override
    128147        protected void update() {
     148            _isNewerAvailable = false;
    129149            updateStatus("<b>" + _("Checking for update of plugin {0}", _appName) + "</b>");
    130150            // use the same settings as for updater
     
    143163        }
    144164       
     165        public boolean isNewerAvailable() {
     166            return _isNewerAvailable;
     167        }
     168
    145169        @Override
    146170        public void bytesTransferred(long alreadyTransferred, int currentWrite, long bytesTransferred, long bytesRemaining, String url) {
     
    152176            boolean newer = (new VersionComparator()).compare(newVersion, _oldVersion) > 0;
    153177            String msg;
    154             if (newer)
     178            if (newer) {
    155179                msg = "<b>" + _("New plugin version {0} is available", newVersion) + "</b>";
    156             else
     180                _isNewerAvailable = true;
     181            } else {
    157182                msg = "<b>" + _("No new version is available for plugin {0}", _appName) + "</b>";
     183            }
    158184            updateStatus(msg);
    159185            scheduleStatusClean(msg);
  • apps/routerconsole/java/src/net/i2p/router/web/PluginUpdateHandler.java

    r9acabfb rfc6f4ec  
    9494   
    9595    private void scheduleStatusClean(String msg) {
    96         SimpleScheduler.getInstance().addEvent(new Cleaner(msg), 60*60*1000);
     96        SimpleScheduler.getInstance().addEvent(new Cleaner(msg), 20*60*1000);
    9797    }
    9898
  • apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java

    r9acabfb rfc6f4ec  
    128128   
    129129    public class UpdateRunner implements Runnable, EepGet.StatusListener {
    130         protected boolean _isRunning;
     130        protected volatile boolean _isRunning;
    131131        protected boolean done;
    132132        protected EepGet _get;
  • apps/routerconsole/jsp/configclients.jsp

    r9acabfb rfc6f4ec  
    104104 <p><i><%=intl._("All changes require restart to take effect.")%></i>
    105105 </p><hr><div class="formaction">
     106 <input type="submit" class="cancel" name="foo" value="<%=intl._("Cancel")%>" />
    106107 <input type="submit" name="action" class="accept" value="<%=intl._("Save WebApp Configuration")%>" />
    107108</div></form></div>
     
    115116 <jsp:getProperty name="clientshelper" property="form3" />
    116117<hr><div class="formaction">
     118 <input type="submit" class="cancel" name="foo" value="<%=intl._("Cancel")%>" />
    117119 <input type="submit" name="action" class="accept" value="<%=intl._("Save Plugin Configuration")%>" />
    118120</div></form></div>
     
    126128 <input type="text" size="60" name="pluginURL" >
    127129 </p><hr><div class="formaction">
     130 <input type="submit" class="cancel" name="foo" value="<%=intl._("Cancel")%>" />
    128131 <input type="submit" name="action" class="download" value="<%=intl._("Install Plugin")%>" />
     132 <input type="submit" name="action" class="reload" value="<%=intl._("Update All Installed Plugins")%>" />
    129133 </div></form></div>
    130134<% } %>
Note: See TracChangeset for help on using the changeset viewer.