Changeset bafdaeb


Ignore:
Timestamp:
Jan 17, 2012 3:03:07 AM (9 years ago)
Author:
str4d <str4d@…>
Branches:
master
Children:
38dba5d1
Parents:
fc292cd (diff), 47876d6 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

merge of 'a3d362477b328c80ac2cd052f635d3ddd3b39c81'

and 'c21005b174cec3b4ae419318758f1a9c2071cf64'

Files:
26 edited

Legend:

Unmodified
Added
Removed
  • apps/addressbook/build.xml

    rfc292cd rbafdaeb  
    5656                        <manifest>
    5757                                <attribute name="Main-Class" value="addressbook.Daemon"/>
     58                                <attribute name="Implementation-Version" value="${full.version}" />
    5859                                <attribute name="Build-Date" value="${build.timestamp}" />
    5960                                <attribute name="Base-Revision" value="${workspace.version}" />
     
    7475                <war basedir="${dist}/tmp" webxml="web.xml" destfile="${dist}/${war}">
    7576                        <manifest>
     77                                <attribute name="Implementation-Version" value="${full.version}" />
    7678                                <attribute name="Build-Date" value="${build.timestamp}" />
    7779                                <attribute name="Base-Revision" value="${workspace.version}" />
  • apps/i2psnark/java/build.xml

    rfc292cd rbafdaeb  
    6161                <attribute name="Main-Class" value="org.klomp.snark.Snark" />
    6262                <attribute name="Class-Path" value="i2p.jar mstreaming.jar streaming.jar" />
     63                <attribute name="Implementation-Version" value="${full.version}" />
    6364                <attribute name="Build-Date" value="${build.timestamp}" />
    6465                <attribute name="Base-Revision" value="${workspace.version}" />
     
    99100          <classes dir="./build/obj" includes="**/web/*.class" />
    100101            <manifest>
     102                <attribute name="Implementation-Version" value="${full.version}" />
    101103                <attribute name="Build-Date" value="${build.timestamp}" />
    102104                <attribute name="Base-Revision" value="${workspace.version}" />
  • apps/i2ptunnel/java/build.xml

    rfc292cd rbafdaeb  
    6363                <attribute name="Main-Class" value="net.i2p.i2ptunnel.I2PTunnel" />
    6464                <attribute name="Class-Path" value="i2p.jar mstreaming.jar" />
     65                <attribute name="Implementation-Version" value="${full.version}" />
    6566                <attribute name="Build-Date" value="${build.timestamp}" />
    6667                <attribute name="Base-Revision" value="${workspace.version}" />
     
    135136             basedir="../jsp/" excludes="web.xml, web-fragment.xml, web-out.xml, **/*.java, *.jsp">
    136137            <manifest>
     138                <attribute name="Implementation-Version" value="${full.version}" />
    137139                <attribute name="Build-Date" value="${build.timestamp}" />
    138140                <attribute name="Base-Revision" value="${workspace.version}" />
  • apps/ministreaming/java/build.xml

    rfc292cd rbafdaeb  
    5151        <jar destfile="./build/mstreaming.jar" basedir="./build/obj" includes="**/*.class" >
    5252            <manifest>
     53                <attribute name="Implementation-Version" value="${full.version}" />
    5354                <attribute name="Build-Date" value="${build.timestamp}" />
    5455                <attribute name="Base-Revision" value="${workspace.version}" />
  • apps/routerconsole/java/build.xml

    rfc292cd rbafdaeb  
    3636             <srcfilelist dir="." files="../../../router/java/build/obj/net/i2p/router/RouterVersion.class" />
    3737             <targetfilelist dir="." files="build/obj/net/i2p/router/web/NewsFetcher.class" />
     38             <targetfilelist dir="." files="build/obj/net/i2p/router/web/PluginStarter.class" />
    3839             <targetfilelist dir="." files="build/obj/net/i2p/router/web/SummaryHelper.class" />
    3940             <targetfilelist dir="." files="build/obj/net/i2p/router/web/UpdateHandler.class" />
     
    9192                <!-- DTG added in 0.8.4, not in the classpath for very old installs, before we changed wrapper.config to specify * -->
    9293                <attribute name="Class-Path" value="i2p.jar router.jar jrobin.jar desktopgui.jar" />
     94                <attribute name="Implementation-Version" value="${full.version}" />
    9395                <attribute name="Build-Date" value="${build.timestamp}" />
    9496                <attribute name="Base-Revision" value="${workspace.version}" />
     
    170172             basedir="../jsp/" excludes="web.xml, *.css, **/*.java, *.jsp, *.jsi, web-fragment.xml, web-out.xml">
    171173            <manifest>
     174                <attribute name="Implementation-Version" value="${full.version}" />
    172175                <attribute name="Build-Date" value="${build.timestamp}" />
    173176                <attribute name="Base-Revision" value="${workspace.version}" />
     
    293296    <uptodate property="precompilejsp.uptodate" targetfile="../jsp/web-out.xml">
    294297        <srcfiles dir= "../jsp" includes="**/*.jsp, *.jsi, **/*.html, *.css, susimail/susimail, web.xml"/>
     298        <!-- so the version is right on logs.jsp -->
     299        <srcfiles dir= "../../../router/java/src/net/i2p/router" includes="RouterVersion.java"/>
    295300    </uptodate>
    296301
  • apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHandler.java

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

    rfc292cd rbafdaeb  
    114114            att = new Attributes();
    115115        buf.append("<td align=\"center\">");
     116        String iv = getAtt(att, "Implementation-Version");
     117        if (iv != null)
     118            buf.append("<b>").append(iv).append("</b>");
    116119        String s = getAtt(att, "Base-Revision");
    117120        if (s != null && s.length() > 20) {
     121            if (iv != null)
     122                buf.append("<br>");
    118123            buf.append("<a href=\"http://stats.i2p/cgi-bin/viewmtn/revision/info/").append(s)
    119124               .append("\">" +
     
    121126                       "<br>" +
    122127                       "<tt>").append(s.substring(20)).append("</tt></a>");
    123         } else {
    124             s = getAtt(att, "Implementation-Version");
    125             if (s != null)
    126                 buf.append("<b>").append(s).append("</b>");
    127128        }
    128129        buf.append("</td><td>");
  • apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java

    rfc292cd rbafdaeb  
    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))
     
    96188        if ((!pluginDir.exists()) || (!pluginDir.isDirectory())) {
    97189            log.error("Cannot start nonexistent plugin: " + appName);
     190            disablePlugin(appName);
    98191            return false;
    99192        }
     
    105198            String foo = "Plugin " + appName + " requires I2P version " + minVersion + " or higher";
    106199            log.error(foo);
     200            disablePlugin(appName);
    107201            throw new Exception(foo);
    108202        }
     
    113207            String foo = "Plugin " + appName + " requires Java version " + minVersion + " or higher";
    114208            log.error(foo);
     209            disablePlugin(appName);
    115210            throw new Exception(foo);
    116211        }
     
    122217            String foo = "Plugin " + appName + " requires Jetty version " + minVersion + " or higher";
    123218            log.error(foo);
     219            disablePlugin(appName);
    124220            throw new Exception(foo);
    125221        }
     
    130226            String foo = "Plugin " + appName + " requires Jetty version " + maxVersion + " or lower";
    131227            log.error(foo);
     228            disablePlugin(appName);
    132229            throw new Exception(foo);
    133230        }
     
    335432        for (Iterator iter = props.keySet().iterator(); iter.hasNext(); ) {
    336433            String name = (String)iter.next();
    337             if (name.startsWith(PREFIX + appName))
     434            if (name.startsWith(PREFIX + appName + '.'))
    338435                iter.remove();
    339436        }
     
    372469        }
    373470        return rv;
     471    }
     472
     473    /**
     474     *  Is the plugin enabled in plugins.config?
     475     *  Default true
     476     *
     477     *  @since 0.8.13
     478     */
     479    public static boolean isPluginEnabled(String appName) {
     480        Properties props = pluginProperties();
     481        String prop = PREFIX + appName + ENABLED;
     482        return Boolean.valueOf(props.getProperty(prop, "true")).booleanValue();
     483    }
     484
     485    /**
     486     *  Disable in plugins.config
     487     *
     488     *  @since 0.8.13
     489     */
     490    public static void disablePlugin(String appName) {
     491        Properties props = pluginProperties();
     492        String prop = PREFIX + appName + ENABLED;
     493        if (Boolean.valueOf(props.getProperty(prop, "true")).booleanValue()) {
     494            props.setProperty(prop, "false");
     495            storePluginProperties(props);
     496        }
    374497    }
    375498
  • apps/routerconsole/java/src/net/i2p/router/web/PluginStopper.java

    rfc292cd rbafdaeb  
    55
    66/**
    7  *  Stop all plugins that are installed
     7 *  Stop all plugins that are installed and running
    88 *
    99 *  @since 0.7.13
     
    2222
    2323    /**
    24      *  Stop all plugins
    25      *  (whether or not they were ever started)
     24     *  Stop all running plugins
    2625     *
    2726     *  this shouldn't throw anything
    2827     */
    29     static void stopPlugins(RouterContext ctx) {
     28    private static void stopPlugins(RouterContext ctx) {
    3029        Log log = ctx.logManager().getLog(PluginStopper.class);
    3130        for (String app : getPlugins()) {
    32             try {
    33                stopPlugin(ctx, app);
    34             } catch (Throwable e) {
    35                if (log.shouldLog(Log.WARN))
    36                    log.warn("Failed to stop plugin: " + app, e);
     31            if (isPluginRunning(app, ctx)) {
     32                try {
     33                   stopPlugin(ctx, app);
     34                } catch (Throwable e) {
     35                   if (log.shouldLog(Log.WARN))
     36                       log.warn("Failed to stop plugin: " + app, e);
     37                }
    3738            }
    3839        }
  • apps/routerconsole/java/src/net/i2p/router/web/PluginUpdateChecker.java

    rfc292cd rbafdaeb  
    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) {
    105         SimpleScheduler.getInstance().addEvent(new Cleaner(msg), 60*60*1000);
     124        SimpleScheduler.getInstance().addEvent(new Cleaner(msg), 20*60*1000);
    106125    }
    107126
    108127    private class Cleaner implements SimpleTimer.TimedEvent {
    109         private String _msg;
     128        private final String _msg;
    110129        public Cleaner(String msg) {
    111130            _msg = msg;
     
    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

    rfc292cd rbafdaeb  
    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
    9999    private class Cleaner implements SimpleTimer.TimedEvent {
    100         private String _msg;
     100        private final String _msg;
    101101        public Cleaner(String msg) {
    102102            _msg = msg;
     
    287287            }
    288288
     289            boolean wasRunning = false;
    289290            File destDir = new SecureDirectory(appDir, appName);
    290291            if (destDir.exists()) {
     
    351352                }
    352353
    353                 // check if it is running first?
    354                 try {
    355                     if (!PluginStarter.stopPlugin(_context, appName)) {
    356                         // failed, ignore
     354                if (PluginStarter.isPluginRunning(appName, _context)) {
     355                    wasRunning = true;
     356                    try {
     357                        if (!PluginStarter.stopPlugin(_context, appName)) {
     358                            // failed, ignore
     359                        }
     360                    } catch (Throwable e) {
     361                        // no updateStatus() for this one
     362                        _log.error("Error stopping plugin " + appName, e);
    357363                    }
    358                 } catch (Throwable e) {
    359                     // no updateStatus() for this one
    360                     _log.error("Error stopping plugin " + appName, e);
    361364                }
    362365
     
    391394                    PluginStarter.storePluginProperties(pluginProps);
    392395                }
    393             } else {
    394                 // start everything
     396            } else if (wasRunning || PluginStarter.isPluginEnabled(appName)) {
     397                // start everything unless it was disabled and not running before
    395398                try {
    396399                    if (PluginStarter.startPlugin(_context, appName)) {
     
    412415                    _log.error("Error starting plugin " + appName, e);
    413416                }
     417            } else {
     418                statusDone("<b>" + _("Plugin {0} installed", appName) + "</b>");
    414419            }
    415420        }
  • apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java

    rfc292cd rbafdaeb  
    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

    rfc292cd rbafdaeb  
    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<% } %>
  • apps/sam/java/build.xml

    rfc292cd rbafdaeb  
    6767                <attribute name="Main-Class" value="net.i2p.sam.SAMBridge" />
    6868                <attribute name="Class-Path" value="i2p.jar mstreaming.jar streaming.jar" />
     69                <attribute name="Implementation-Version" value="${full.version}" />
    6970                <attribute name="Build-Date" value="${build.timestamp}" />
    7071                <attribute name="Base-Revision" value="${workspace.version}" />
  • apps/streaming/java/build.xml

    rfc292cd rbafdaeb  
    6464        <jar destfile="./build/streaming.jar" basedir="./build/obj" includes="**/*.class" >
    6565            <manifest>
     66                <attribute name="Implementation-Version" value="${full.version}" />
    6667                <attribute name="Build-Date" value="${build.timestamp}" />
    6768                <attribute name="Base-Revision" value="${workspace.version}" />
  • apps/susidns/src/build.xml

    rfc292cd rbafdaeb  
    9898                </fileset>
    9999            <manifest>
     100                <attribute name="Implementation-Version" value="${full.version}" />
    100101                <attribute name="Build-Date" value="${build.timestamp}" />
    101102                <attribute name="Base-Revision" value="${workspace.version}" />
  • apps/susimail/build.xml

    rfc292cd rbafdaeb  
    4646             basedir="src/" excludes="WEB-INF/web.xml LICENSE src/**/*">
    4747            <manifest>
     48                <attribute name="Implementation-Version" value="${full.version}" />
    4849                <attribute name="Build-Date" value="${build.timestamp}" />
    4950                <attribute name="Base-Revision" value="${workspace.version}" />
  • apps/systray/java/build.xml

    rfc292cd rbafdaeb  
    4545                <attribute name="Main-Class" value="net.i2p.apps.systray.SysTray" />
    4646                <attribute name="Class-Path" value="systray4j.jar" />
     47                <attribute name="Implementation-Version" value="${full.version}" />
    4748                <attribute name="Build-Date" value="${build.timestamp}" />
    4849                <attribute name="Base-Revision" value="${workspace.version}" />
  • build.xml

    rfc292cd rbafdaeb  
    183183    </target>
    184184
    185     <target name="buildProperties" depends="getMtnRev" >
     185    <target name="buildProperties" depends="getMtnRev, getReleaseNumber, getBuildNumber" >
    186186        <!-- default if not set above -->
    187187        <property name="workspace.version" value="unknown" />
     
    189189            <format property="build.timestamp" pattern="yyyy-MM-dd HH:mm:ss z" timezone="UTC" locale="en" />
    190190        </tstamp>
     191        <property name="full.version" value="${release.number}-${build.number}${build.extra}" />
     192        <echo message="Building version ${full.version} (mtn rev ${workspace.version})" />
    191193    </target>
    192194
  • core/java/build.xml

    rfc292cd rbafdaeb  
    5959        <jar destfile="./build/i2p.jar" basedir="./build/obj" includes="**/*.class" >
    6060            <manifest>
     61                <attribute name="Implementation-Version" value="${full.version}" />
    6162                <attribute name="Build-Date" value="${build.timestamp}" />
    6263                <attribute name="Base-Revision" value="${workspace.version}" />
  • history.txt

    rfc292cd rbafdaeb  
     12012-01-16 zzz
     2  * Build: Put Implementation-Version in manifests
     3  * NetDB: Hopefully fix rare NPE (ticket #589)
     4  * Plugins:
     5    - Only stop a plugin before update if it was running
     6    - Only stop a plugin at shutdown if it was running
     7    - Don't start a plugin after update if it was disabled
     8    - Disable plugin if it fails version checks at startup
     9    - Auto-update plugins after a router update
     10    - Add update-all button and more cancel buttons
     11  * Router:
     12    - Add synchronized change-and-save-config methods to avoid races
     13    - Save previous version in config so we know when we updated
     14  * Transport: Revert change from -2, put addresses back in RouterInfo
     15               when hidden, broke inbound tunnel building
     16
    1172012-01-14 zzz
    218  * i2ptunnel: Partial fix for dest formatting (ticket #581)
  • router/java/build.xml

    rfc292cd rbafdaeb  
    7373        <jar destfile="./build/router.jar" basedir="./build/obj" includes="**/*.class" >
    7474            <manifest>
     75                <attribute name="Implementation-Version" value="${full.version}" />
    7576                <attribute name="Build-Date" value="${build.timestamp}" />
    7677                <attribute name="Base-Revision" value="${workspace.version}" />
  • router/java/src/net/i2p/router/Router.java

    rfc292cd rbafdaeb  
    1616import java.io.IOException;
    1717import java.io.Writer;
     18import java.util.Collection;
    1819import java.util.Collections;
    1920import java.util.Date;
     
    242243            _config.put("router.firstInstalled", now);
    243244            _config.put("router.updateLastInstalled", now);
     245            // First added in 0.8.13
     246            _config.put("router.previousVersion", RouterVersion.VERSION);
    244247            saveConfig();
    245248        }
     
    325328            return _config.get(name);
    326329    }
     330
     331    /**
     332     *  Warning, race between here and saveConfig(),
     333     *  saveConfig(String name, String value) or saveConfig(Map toAdd, Set toRemove) is recommended.
     334     *
     335     *  @since 0.8.13
     336     */
    327337    public void setConfigSetting(String name, String value) {
    328338            _config.put(name, value);
    329339    }
     340
     341    /**
     342     *  Warning, race between here and saveConfig(),
     343     *  saveConfig(String name, String value) or saveConfig(Map toAdd, Set toRemove) is recommended.
     344     *
     345     *  @since 0.8.13
     346     */
    330347    public void removeConfigSetting(String name) {
    331348            _config.remove(name);
     
    10421059            }
    10431060        }
     1061
     1062        // Set the last version to the current version, since 0.8.13
     1063        if (!RouterVersion.VERSION.equals(_config.get("router.previousVersion"))) {
     1064            _config.put("router.previousVersion", RouterVersion.VERSION);
     1065            saveConfig();
     1066        }
     1067
    10441068        _context.removeShutdownTasks();
    10451069        try { _context.clientManager().shutdown(); } catch (Throwable t) { _log.error("Error shutting down the client manager", t); }
     
    12461270   
    12471271    /**
     1272     * Updates the current config and then saves it.
     1273     * Prevents a race in the interval between setConfigSetting() / removeConfigSetting() and saveConfig(),
     1274     * Synchronized with getConfig() / saveConfig()
     1275     *
     1276     * @param name setting to add/change/remove before saving
     1277     * @param value if non-null, updated value; if null, setting will be removed
     1278     * @return success
     1279     * @since 0.8.13
     1280     */
     1281    public synchronized boolean saveConfig(String name, String value) {
     1282        if (value != null)
     1283            _config.put(name, value);
     1284        else
     1285            _config.remove(name);
     1286        return saveConfig();
     1287    }
     1288
     1289    /**
     1290     * Updates the current config and then saves it.
     1291     * Prevents a race in the interval between setConfigSetting() / removeConfigSetting() and saveConfig(),
     1292     * Synchronized with getConfig() / saveConfig()
     1293     *
     1294     * @param toAdd settings to add/change before saving, may be null or empty
     1295     * @param toRemove settings to remove before saving, may be null or empty
     1296     * @return success
     1297     * @since 0.8.13
     1298     */
     1299    public synchronized boolean saveConfig(Map toAdd, Collection<String> toRemove) {
     1300        if (toAdd != null)
     1301            _config.putAll(toAdd);
     1302        if (toRemove != null) {
     1303            for (String s : toRemove) {
     1304                _config.remove(toRemove);
     1305            }
     1306        }
     1307        return saveConfig();
     1308    }
     1309
     1310    /**
    12481311     *  The clock shift listener.
    12491312     *  Restart the router if we should.
     
    13461409                // Moved above the extract so we don't NCDFE
    13471410                _config.put("router.updateLastInstalled", "" + System.currentTimeMillis());
     1411                // Set the last version to the current version, since 0.8.13
     1412                _config.put("router.previousVersion", RouterVersion.VERSION);
    13481413                saveConfig();
    13491414                ok = FileUtil.extractZip(updateFile, _context.getBaseDir());
  • router/java/src/net/i2p/router/RouterVersion.java

    rfc292cd rbafdaeb  
    1919    public final static String ID = "Monotone";
    2020    public final static String VERSION = CoreVersion.VERSION;
    21     public final static long BUILD = 3;
     21    public final static long BUILD = 4;
    2222
    2323    /** for example "-test" */
  • router/java/src/net/i2p/router/networkdb/kademlia/KBucketSet.java

    rfc292cd rbafdaeb  
    2626 */
    2727class KBucketSet {
    28     private Log _log;
    29     private I2PAppContext _context;
    30     private LocalHash _us;
    31     private KBucket _buckets[];
     28    private final Log _log;
     29    private final I2PAppContext _context;
     30    private final LocalHash _us;
     31    private final KBucket _buckets[];
    3232    private volatile int _size;
    3333   
     
    4242        _context = context;
    4343        _log = context.logManager().getLog(KBucketSet.class);
    44         createBuckets();
     44        _buckets = createBuckets();
    4545        context.statManager().createRateStat("netDb.KBSGetAllTime", "Time to add all Hashes to the Collector", "NetworkDatabase", new long[] { 60*60*1000 });
    4646    }
     
    133133    public KBucket getBucket(int bucket) { return _buckets[bucket]; }
    134134   
    135     protected void createBuckets() {
    136         _buckets = new KBucket[NUM_BUCKETS];
     135    protected KBucket[] createBuckets() {
     136        KBucket[] buckets = new KBucket[NUM_BUCKETS];
    137137        for (int i = 0; i < NUM_BUCKETS-1; i++) {
    138             _buckets[i] = createBucket(i*BASE, (i+1)*BASE);
    139         }
    140         _buckets[NUM_BUCKETS-1] = createBucket(BASE*(NUM_BUCKETS-1), BASE*(NUM_BUCKETS) + 1);
     138            buckets[i] = createBucket(i*BASE, (i+1)*BASE);
     139        }
     140        buckets[NUM_BUCKETS-1] = createBucket(BASE*(NUM_BUCKETS-1), BASE*(NUM_BUCKETS) + 1);
     141        return buckets;
    141142    }
    142143   
  • router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java

    rfc292cd rbafdaeb  
    180180    @Override
    181181    public Set<RouterAddress> createAddresses() {
    182         if (_context.router().isHidden())
    183             return Collections.EMPTY_SET;
     182        // No, don't do this, it makes it almost impossible to build inbound tunnels
     183        //if (_context.router().isHidden())
     184        //    return Collections.EMPTY_SET;
    184185        Map<String, RouterAddress> addresses = null;
    185186        boolean newCreated = false;
Note: See TracChangeset for help on using the changeset viewer.