Changeset d3abbe8


Ignore:
Timestamp:
Mar 1, 2017 4:42:57 PM (3 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
b72085bc
Parents:
3631efa
Message:

Fix eepsite jetty.xml and jetty-ssl.xml files
Migration script for eepsite jetty.xml and jetty-ssl.xml files
Add exclude protocols

Files:
3 edited

Legend:

Unmodified
Added
Removed
  • installer/resources/eepsite/jetty-ssl.xml

    r3631efa rd3abbe8  
    176176<Configure id="Server" class="org.eclipse.jetty.server.Server">
    177177
    178   <!-- if NIO is not available, use org.eclipse.jetty.server.ssl.SslSocketConnector -->
    179  
    180   <New id="sslContextFactory" class="org.eclipse.jetty.http.ssl.SslContextFactory">
    181     <Set name="KeyStore">./eepsite/etc/keystore.ks</Set>
     178  <New id="sslContextFactory" class="org.eclipse.jetty.util.ssl.SslContextFactory">
     179    <Set name="KeyStorePath">./eepsite/etc/keystore.ks</Set>
    182180    <Set name="KeyStorePassword">changeit</Set>
    183181    <Set name="KeyManagerPassword">myKeyPassword</Set>
    184     <Set name="TrustStore">./eepsite/etc/keystore.ks</Set>
     182    <Set name="TrustStorePath">./eepsite/etc/keystore.ks</Set>
    185183    <Set name="TrustStorePassword">changeit</Set>
     184    <Set name="ExcludeCipherSuites">
     185      <Array type="java.lang.String">
     186        <Item>SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA</Item>
     187        <Item>SSL_DH_anon_EXPORT_WITH_RC4_40_MD5</Item>
     188        <Item>SSL_DH_anon_WITH_3DES_EDE_CBC_SHA</Item>
     189        <Item>SSL_DH_anon_WITH_DES_CBC_SHA</Item>
     190        <Item>SSL_DH_anon_WITH_RC4_128_MD5</Item>
     191        <Item>SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA</Item>
     192        <Item>SSL_DHE_DSS_WITH_DES_CBC_SHA</Item>
     193        <Item>SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA</Item>
     194        <Item>SSL_DHE_RSA_WITH_DES_CBC_SHA</Item>
     195        <Item>SSL_RSA_EXPORT_WITH_DES40_CBC_SHA</Item>
     196        <Item>SSL_RSA_EXPORT_WITH_RC4_40_MD5</Item>
     197        <Item>SSL_RSA_WITH_DES_CBC_SHA</Item>
     198        <Item>SSL_RSA_WITH_NULL_MD5</Item>
     199        <Item>SSL_RSA_WITH_NULL_SHA</Item>
     200        <Item>TLS_DH_anon_WITH_AES_128_CBC_SHA</Item>
     201        <Item>TLS_DH_anon_WITH_AES_128_CBC_SHA256</Item>
     202        <Item>TLS_DH_anon_WITH_AES_128_GCM_SHA256</Item>
     203        <Item>TLS_DH_anon_WITH_AES_256_CBC_SHA</Item>
     204        <Item>TLS_DH_anon_WITH_AES_256_CBC_SHA256</Item>
     205        <Item>TLS_DH_anon_WITH_AES_256_GCM_SHA384</Item>
     206        <Item>TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA</Item>
     207        <Item>TLS_ECDH_anon_WITH_AES_128_CBC_SHA</Item>
     208        <Item>TLS_ECDH_anon_WITH_AES_256_CBC_SHA</Item>
     209        <Item>TLS_ECDH_anon_WITH_NULL_SHA</Item>
     210        <Item>TLS_ECDH_anon_WITH_RC4_128_SHA</Item>
     211        <Item>TLS_ECDH_ECDSA_WITH_NULL_SHA</Item>
     212        <Item>TLS_ECDHE_ECDSA_WITH_NULL_SHA</Item>
     213        <Item>TLS_ECDHE_RSA_WITH_NULL_SHA</Item>
     214        <Item>TLS_ECDH_RSA_WITH_NULL_SHA</Item>
     215        <Item>TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5</Item>
     216        <Item>TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA</Item>
     217        <Item>TLS_KRB5_EXPORT_WITH_RC4_40_MD5</Item>
     218        <Item>TLS_KRB5_EXPORT_WITH_RC4_40_SHA</Item>
     219        <Item>TLS_KRB5_WITH_3DES_EDE_CBC_MD5</Item>
     220        <Item>TLS_KRB5_WITH_3DES_EDE_CBC_SHA</Item>
     221        <Item>TLS_KRB5_WITH_DES_CBC_MD5</Item>
     222        <Item>TLS_KRB5_WITH_DES_CBC_SHA</Item>
     223        <Item>TLS_KRB5_WITH_RC4_128_MD5</Item>
     224        <Item>TLS_KRB5_WITH_RC4_128_SHA</Item>
     225        <Item>TLS_RSA_WITH_NULL_SHA256</Item>
     226        <Item>SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA</Item>
     227        <Item>SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA</Item>
     228        <Item>SSL_RSA_WITH_3DES_EDE_CBC_SHA</Item>
     229        <Item>SSL_RSA_WITH_RC4_128_MD5</Item>
     230        <Item>SSL_RSA_WITH_RC4_128_SHA</Item>
     231        <Item>TLS_ECDH_ECDSA_WITH_RC4_128_SHA</Item>
     232        <Item>TLS_ECDH_RSA_WITH_RC4_128_SHA</Item>
     233        <Item>TLS_ECDHE_ECDSA_WITH_RC4_128_SHA</Item>
     234        <Item>TLS_ECDHE_RSA_WITH_RC4_128_SHA</Item>
     235        <Item>TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA</Item>
     236        <Item>TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA</Item>
     237        <Item>TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA</Item>
     238        <Item>TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA</Item>
     239        <Item>TLS_DHE_DSS_WITH_AES_128_CBC_SHA</Item>
     240        <!-- Please keep this list in sync with the one in I2PSSLSocketFactory -->
     241      </Array>
     242    </Set>
     243    <Set name="ExcludeProtocols">
     244      <Array type="java.lang.String">
     245        <Item>SSLv2Hello</Item>
     246        <Item>SSLv3</Item>
     247      </Array>
     248    </Set>
    186249  </New>
    187250
    188251  <Call name="addConnector">
    189252    <Arg>
    190       <New class="org.eclipse.jetty.server.ssl.SslSelectChannelConnector">
    191         <Arg><Ref id="sslContextFactory" /></Arg>
     253      <New class="org.eclipse.jetty.server.ServerConnector">
     254        <Arg><Ref id="Server" /></Arg>
     255        <Arg type="int">1</Arg>     <!-- number of acceptors -->
     256        <Arg type="int">0</Arg>     <!-- default number of selectors -->
     257        <Arg>
     258           <Array type="org.eclipse.jetty.server.ConnectionFactory">    <!-- varargs so we need an array -->
     259              <Item>
     260                <New class="org.eclipse.jetty.server.SslConnectionFactory">
     261                  <Arg><Ref id="sslContextFactory" /></Arg>
     262                  <Arg>http/1.1</Arg>
     263                </New>
     264              </Item>
     265              <Item>
     266                <New class="org.eclipse.jetty.server.HttpConnectionFactory">
     267                  <Arg>
     268                    <New class="org.eclipse.jetty.server.HttpConfiguration">
     269                      <Set name="sendServerVersion">false</Set>
     270                      <Set name="sendDateHeader">true</Set>
     271                    </New>
     272                  </Arg>
     273                </New>
     274              </Item>
     275            </Array>
     276        </Arg>
    192277        <Set name="host">127.0.0.1</Set>
    193278        <Set name="port">7668</Set>
    194         <Set name="maxIdleTime">600000</Set>
    195         <Set name="useDirectBuffers">false</Set>
    196         <Set name="acceptors">1</Set>
    197         <Set name="statsOn">false</Set>
    198         <Set name="lowResourcesConnections">5000</Set>
    199         <Set name="lowResourcesMaxIdleTime">5000</Set>
    200         <Set name="ExcludeCipherSuites">
    201           <Array type="java.lang.String">
    202             <Item>SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA</Item>
    203             <Item>SSL_DH_anon_EXPORT_WITH_RC4_40_MD5</Item>
    204             <Item>SSL_DH_anon_WITH_3DES_EDE_CBC_SHA</Item>
    205             <Item>SSL_DH_anon_WITH_DES_CBC_SHA</Item>
    206             <Item>SSL_DH_anon_WITH_RC4_128_MD5</Item>
    207             <Item>SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA</Item>
    208             <Item>SSL_DHE_DSS_WITH_DES_CBC_SHA</Item>
    209             <Item>SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA</Item>
    210             <Item>SSL_DHE_RSA_WITH_DES_CBC_SHA</Item>
    211             <Item>SSL_RSA_EXPORT_WITH_DES40_CBC_SHA</Item>
    212             <Item>SSL_RSA_EXPORT_WITH_RC4_40_MD5</Item>
    213             <Item>SSL_RSA_WITH_DES_CBC_SHA</Item>
    214             <Item>SSL_RSA_WITH_NULL_MD5</Item>
    215             <Item>SSL_RSA_WITH_NULL_SHA</Item>
    216             <Item>TLS_DH_anon_WITH_AES_128_CBC_SHA</Item>
    217             <Item>TLS_DH_anon_WITH_AES_128_CBC_SHA256</Item>
    218             <Item>TLS_DH_anon_WITH_AES_128_GCM_SHA256</Item>
    219             <Item>TLS_DH_anon_WITH_AES_256_CBC_SHA</Item>
    220             <Item>TLS_DH_anon_WITH_AES_256_CBC_SHA256</Item>
    221             <Item>TLS_DH_anon_WITH_AES_256_GCM_SHA384</Item>
    222             <Item>TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA</Item>
    223             <Item>TLS_ECDH_anon_WITH_AES_128_CBC_SHA</Item>
    224             <Item>TLS_ECDH_anon_WITH_AES_256_CBC_SHA</Item>
    225             <Item>TLS_ECDH_anon_WITH_NULL_SHA</Item>
    226             <Item>TLS_ECDH_anon_WITH_RC4_128_SHA</Item>
    227             <Item>TLS_ECDH_ECDSA_WITH_NULL_SHA</Item>
    228             <Item>TLS_ECDHE_ECDSA_WITH_NULL_SHA</Item>
    229             <Item>TLS_ECDHE_RSA_WITH_NULL_SHA</Item>
    230             <Item>TLS_ECDH_RSA_WITH_NULL_SHA</Item>
    231             <Item>TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5</Item>
    232             <Item>TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA</Item>
    233             <Item>TLS_KRB5_EXPORT_WITH_RC4_40_MD5</Item>
    234             <Item>TLS_KRB5_EXPORT_WITH_RC4_40_SHA</Item>
    235             <Item>TLS_KRB5_WITH_3DES_EDE_CBC_MD5</Item>
    236             <Item>TLS_KRB5_WITH_3DES_EDE_CBC_SHA</Item>
    237             <Item>TLS_KRB5_WITH_DES_CBC_MD5</Item>
    238             <Item>TLS_KRB5_WITH_DES_CBC_SHA</Item>
    239             <Item>TLS_KRB5_WITH_RC4_128_MD5</Item>
    240             <Item>TLS_KRB5_WITH_RC4_128_SHA</Item>
    241             <Item>TLS_RSA_WITH_NULL_SHA256</Item>
    242             <Item>SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA</Item>
    243             <Item>SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA</Item>
    244             <Item>SSL_RSA_WITH_3DES_EDE_CBC_SHA</Item>
    245             <Item>SSL_RSA_WITH_RC4_128_MD5</Item>
    246             <Item>SSL_RSA_WITH_RC4_128_SHA</Item>
    247             <Item>TLS_ECDH_ECDSA_WITH_RC4_128_SHA</Item>
    248             <Item>TLS_ECDH_RSA_WITH_RC4_128_SHA</Item>
    249             <Item>TLS_ECDHE_ECDSA_WITH_RC4_128_SHA</Item>
    250             <Item>TLS_ECDHE_RSA_WITH_RC4_128_SHA</Item>
    251             <Item>TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA</Item>
    252             <Item>TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA</Item>
    253             <Item>TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA</Item>
    254             <Item>TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA</Item>
    255             <Item>TLS_DHE_DSS_WITH_AES_128_CBC_SHA</Item>
    256             <!-- Please keep this list in sync with the one in I2PSSLSocketFactory -->
    257           </Array>
    258         </Set>
     279        <Set name="idleTimeout">600000</Set>
    259280      </New>
    260281    </Arg>
  • installer/resources/eepsite/jetty.xml

    r3631efa rd3abbe8  
    1313<!--   * docroot: Change the ResourceBase in the contexts/base-context.xml file -->
    1414<!--           to serve files from a different location.                       -->
    15 <!--   * threads: Raise maximumPoolSize in the ThreadPool section              -->
     15<!--   * threads: Raise maxThreads in the ThreadPool section                   -->
    1616<!--           if you have a high-traffic site and get a lot of warnings.      -->
    1717<!--   * Uncomment the addWebApplications section to use to enable             -->
     
    1919<!--   * Uncomment the line to allow Jetty to follow symlinks                  -->
    2020<!--                                                                           -->
    21 <!-- I2P uses Jetty 7. If you need web server features not found               -->
    22 <!-- in Jetty 7, you may install and run Jetty 7 or 8 in a different JVM       -->
     21<!-- I2P uses Jetty 9. If you need web server features not found               -->
     22<!-- in Jetty 9, you may install and run Jetty 7 or 8 in a different JVM       -->
    2323<!-- or run any other web server such as Apache. If you do run another web     -->
    24 <!-- server instead, be sure and disable the Jetty 6 server for your           -->
     24<!-- server instead, be sure and disable the Jetty 9 server for your           -->
    2525<!-- eepsite on http://127.0.0.1:7657/configclients.jsp .                      -->
    2626<!--                                                                           -->
     
    4242<!-- ========================================================================= -->
    4343
    44 <!-- =============================================================== -->
    45 <!-- Configure the Jetty Server                                      -->
    46 <!--                                                                 -->
    47 <!-- Documentation of this file format can be found at:              -->
    48 <!-- http://docs.codehaus.org/display/JETTY/jetty.xml                -->
    49 <!--                                                                 -->
    50 <!-- =============================================================== -->
     44<!-- ========================================================================= -->
     45<!-- Configure the Jetty Server                                                -->
     46<!--                                                                           -->
     47<!-- Documentation of this file format can be found at:                        -->
     48<!-- http://www.eclipse.org/jetty/documentation/current/jetty-xml-config.html  -->
     49<!--                                                                           -->
     50<!-- ========================================================================= -->
    5151
    5252
     
    5656    <!-- Server Thread Pool                                          -->
    5757    <!-- =========================================================== -->
    58     <Set name="ThreadPool">
     58    <Arg>
    5959
    6060      <!-- PICK ONE -->
     
    7272       -->
    7373      <New class="org.eclipse.jetty.util.thread.QueuedThreadPool">
     74        <Arg type="int">20</Arg>     <!-- maxThreads, overridden below -->
     75        <Arg type="int">3</Arg>      <!-- minThreads, overridden below -->
     76        <Arg type="int">60000</Arg>  <!-- maxIdleTimeMs, overridden below -->
    7477        <Arg>
    7578           <New class="java.util.concurrent.LinkedBlockingQueue">
     
    7982        <Set name="minThreads">3</Set>
    8083        <Set name="maxThreads">20</Set>
    81         <Set name="maxIdleTimeMs">60000</Set>
     84        <Set name="idleTimeout">60000</Set>
    8285        <Set name="daemon">true</Set>
    8386        <Set name="name">Eepsite Jetty</Set>
    8487      </New>
    85 
    86       <!-- Optional Java 5 bounded threadpool with job queue
    87            Requests above the max will be rejected and logged.
    88            High-traffic sites should increase maximumPoolSize.
    89 
    90            Args are:
    91              corePoolSize (should be at least 3)
    92              maximumPoolSize
    93              keepAliveTime (milliseconds)
    94              timeout (TimeUnit)
    95              queue (BlockingQueue)
    96 
    97            Not recommended.
    98            ref:
    99            http://trac.i2p2.i2p/ticket/1395
    100            http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/ThreadPoolExecutor.html
    101        -->
    102      <!--
    103       <New class="org.eclipse.jetty.util.thread.ExecutorThreadPool">
    104         <Arg type="int">3</Arg>
    105         <Arg type="int">20</Arg>
    106         <Arg type="long">60000</Arg>
    107         <Arg>
    108             <Call class="java.util.concurrent.TimeUnit" name="valueOf" >
    109                 <Arg>MILLISECONDS</Arg>
    110             </Call>
    111         </Arg>
    112         <Arg>
    113             <New class="java.util.concurrent.SynchronousQueue" />
    114         </Arg>
    115       </New>
    116      -->
    117     </Set>
     88    </Arg>
    11889
    11990
     
    134105    <Call name="addConnector">
    135106      <Arg>
    136           <New class="org.eclipse.jetty.server.nio.SelectChannelConnector">
     107          <New class="org.eclipse.jetty.server.ServerConnector">
     108            <Arg><Ref id="Server" /></Arg>
     109            <Arg type="int">1</Arg>     <!-- number of acceptors -->
     110            <Arg type="int">0</Arg>     <!-- default number of selectors -->
     111            <Arg>
     112              <Array type="org.eclipse.jetty.server.ConnectionFactory">    <!-- varargs so we need an array -->
     113                <Item>
     114                  <New class="org.eclipse.jetty.server.HttpConnectionFactory">
     115                    <Arg>
     116                      <New class="org.eclipse.jetty.server.HttpConfiguration">
     117                        <Set name="sendServerVersion">false</Set>
     118                        <Set name="sendDateHeader">true</Set>
     119                      </New>
     120                    </Arg>
     121                  </New>
     122                </Item>
     123              </Array>
     124            </Arg>
    137125            <Set name="host">127.0.0.1</Set>
    138126            <Set name="port">7658</Set>
    139             <Set name="maxIdleTime">600000</Set>
    140             <Set name="Acceptors">1</Set>
    141             <Set name="statsOn">false</Set>
    142             <Set name="lowResourcesConnections">5000</Set>
    143             <Set name="lowResourcesMaxIdleTime">5000</Set>
    144             <Set name="useDirectBuffers">false</Set>
     127            <Set name="idleTimeout">600000</Set>
    145128          </New>
    146129      </Arg>
    147130    </Call>
    148 
    149     <!-- Recommended to use this connector on Java 5, as
    150          Jetty 6 and Java 5 NIO don't play well together.
    151     -->
    152     <!--
    153     <Call name="addConnector">
    154       <Arg>
    155           <New class="org.eclipse.jetty.server.bio.SocketConnector">
    156             <Set name="host">127.0.0.1</Set>
    157             <Set name="port">7658</Set>
    158             <Set name="maxIdleTime">600000</Set>
    159             <Set name="Acceptors">1</Set>
    160             <Set name="statsOn">false</Set>
    161           </New>
    162       </Arg>
    163     </Call>
    164     -->
    165131
    166132    <!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -->
     
    243209      <Call name="addAppProvider">
    244210        <Arg>
    245           <New class="org.eclipse.jetty.deploy.providers.ContextProvider">
     211          <New class="org.eclipse.jetty.deploy.providers.WebAppProvider">
    246212            <Set name="monitoredDirName">./eepsite/contexts</Set>
    247213            <Set name="scanInterval">120</Set>
     
    333299    <!-- =========================================================== -->
    334300    <Set name="stopAtShutdown">true</Set>
    335     <Set name="sendServerVersion">false</Set>
    336     <Set name="sendDateHeader">true</Set>
    337     <Set name="gracefulShutdown">1000</Set>
     301    <Set name="stopTimeout">1000</Set>
    338302
    339303</Configure>
  • router/java/src/net/i2p/router/startup/MigrateJetty.java

    r3631efa rd3abbe8  
    77
    88import java.io.File;
     9import java.io.BufferedWriter;
     10import java.io.File;
     11import java.io.FileInputStream;
     12import java.io.OutputStreamWriter;
     13import java.io.IOException;
     14import java.io.PrintWriter;
    915import java.util.List;
    1016
     17import net.i2p.data.DataHelper;
    1118import net.i2p.router.RouterContext;
     19import net.i2p.util.FileUtil;
     20import net.i2p.util.I2PSSLSocketFactory;
     21import net.i2p.util.SecureFileOutputStream;
     22import net.i2p.util.VersionComparator;
    1223
    1324/**
    1425 *  Migrate the clients.config and jetty.xml files
    15  *  from Jetty 5/6 to Jetty 7.
     26 *  from Jetty 5/6 to Jetty 7/8.
     27 *  Also migrate jetty.xml from Jetty 7/8 to Jetty 9.
    1628 *
    1729 *  For each client for class org.mortbay.jetty.Server:
     
    3042 *  Saves new clients.config.
    3143 *
    32  *  Does NOT preserve port number, thread counts, etc.
     44 *  Does NOT preserve port number, thread counts, etc. in the migration to 7/8.
     45 *  DOES preserve everything in the migration to 9.
    3346 *
    3447 *  @since Jetty 6
     
    4356    private static final String TEST_CLASS = "org.eclipse.jetty.server.Server";
    4457    private static final String BACKUP_SUFFIX = ".jetty6";
     58    private static final String BACKUP_SUFFIX_8 = ".jetty8";
    4559    private static final String JETTY_TEMPLATE_DIR = "eepsite-jetty7";
    4660    private static final String JETTY_TEMPLATE_PKGDIR = "eepsite";
    4761    private static final String BASE_CONTEXT = "contexts/base-context.xml";
    4862    private static final String CGI_CONTEXT = "contexts/cgi-context.xml";
     63    private static final String PROP_JETTY9_MIGRATED = "router.startup.jetty9.migrated";
    4964   
    5065    /**
     
    5368     */
    5469    public static void migrate(RouterContext ctx, List<ClientAppConfig> apps) {
     70        if (ctx.getBooleanProperty(PROP_JETTY9_MIGRATED))
     71            return;
     72        String installed = ctx.getProperty("router.firstVersion");
     73        if (installed != null && VersionComparator.comp(installed, "0.9.30") >= 0) {
     74            ctx.router().saveConfig(PROP_JETTY9_MIGRATED, "true");
     75            return;
     76        }
    5577        boolean shouldSave = false;
     78        boolean jetty9success = false;
    5679        for (int i = 0; i < apps.size(); i++) {
    5780            ClientAppConfig app = apps.get(i);
    58             if (!(app.className.equals(OLD_CLASS) || app.className.equals(OLD_CLASS_6)))
    59                 continue;
    60             String client = "client application " + i + " [" + app.clientName +
    61                             "] from Jetty 5/6 " + app.className +
    62                             " to Jetty 7 " + NEW_CLASS;
     81            String client;
     82            String backupSuffix;
     83            if (app.className.equals(NEW_CLASS)) {
     84                client = "client application " + i + " [" + app.clientName +
     85                         "] from Jetty 7/8 to Jetty 9";
     86                backupSuffix = BACKUP_SUFFIX_8;
     87            } else if (app.className.equals(OLD_CLASS) || app.className.equals(OLD_CLASS_6)) {
     88                client = "client application " + i + " [" + app.clientName +
     89                         "] from Jetty 5/6 " + app.className +
     90                         " to Jetty 7 " + NEW_CLASS;
     91                backupSuffix = BACKUP_SUFFIX;
     92            } else {
     93                continue;
     94            }
    6395            if (!hasLatestJetty()) {
    6496                System.err.println("WARNING: Jetty 7 unavailable, cannot migrate " + client);
     
    81113            }
    82114            File eepsite = xmlFile.getParentFile();
    83             boolean ok = backupFile(xmlFile);
     115            boolean ok = backupFile(xmlFile, backupSuffix);
    84116            if (!ok) {
    85117                System.err.println("WARNING: Failed to backup up XML file " + xmlFile +
     
    87119                continue;
    88120            }
     121            if (app.className.equals(NEW_CLASS)) {
     122                // Do the migration of 8 to 9, handle additional command-line xml files too
     123                for (int j = 0; j < args.length; j++) {
     124                    if (j > 0) {
     125                        // probably jetty-ssl.xml
     126                        xmlFile = new File(args[j]);
     127                        ok = backupFile(xmlFile, backupSuffix);
     128                        if (!ok) {
     129                            System.err.println("WARNING: Failed to backup up XML file " + xmlFile +
     130                                               ", cannot migrate " + client);
     131                            continue;
     132                        }
     133                    }
     134                    boolean ok9 = migrateToJetty9(xmlFile);
     135                    if (ok9) {
     136                        System.err.println("WARNING: Migrated " + client + ".\n" +
     137                                           "Check the " + xmlFile.getName() + " file in " + eepsite + ".\n" +
     138                                           "Your old " + xmlFile.getName() + " file was backed up to " + xmlFile.getAbsolutePath() + BACKUP_SUFFIX_8);
     139                        jetty9success = true;
     140                    }
     141                }
     142                continue;
     143            }
     144
     145            // Below here is migration of 5/6 to 7/8
     146
    89147            File baseEep = new File(ctx.getBaseDir(), JETTY_TEMPLATE_DIR);
    90148            // in packages, or perhaps on an uninstall/reinstall, the files are in eepsite/
     
    145203            }
    146204        }
    147     }
     205        if (jetty9success)
     206            ctx.router().saveConfig(PROP_JETTY9_MIGRATED, "true");
     207    }
     208
     209    /**
     210     *  Migrate a jetty.xml file to Jetty 9.
     211     *  Unlike above, where we just migrate the new install file over for Jetty 7/8,
     212     *  here we modify the xml file in-place to preserve settings where possible.
     213     *
     214     *  @return success
     215     *  @since Jetty 9
     216     */
     217    private static boolean migrateToJetty9(File xmlFile) {
     218        // we don't re-migrate from the template, we just add the
     219        // necessary args for the QueuedThreadPool constructor in-place
     220        // and fixup the renamed set call
     221        boolean modified = false;
     222        File eepsite = xmlFile.getParentFile();
     223        File newFile = new File(eepsite, xmlFile.getName() + System.currentTimeMillis() + ".tmp");
     224        FileInputStream in = null;
     225        PrintWriter out = null;
     226        try {
     227            in = new FileInputStream(xmlFile);
     228            out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new SecureFileOutputStream(newFile), "UTF-8")));
     229            String s;
     230            boolean foundQTP = false;
     231            boolean foundSTP = false;
     232            boolean foundETP = false;
     233            boolean foundSCC = false;
     234            boolean foundHC = false;
     235            boolean foundSSCC = false;
     236            while ((s = DataHelper.readLine(in)) != null) {
     237                // readLine() doesn't strip \r
     238                if (s.endsWith("\r"))
     239                    s = s.substring(0, s.length() - 1);
     240                if (s.contains("org.eclipse.jetty.util.thread.QueuedThreadPool")) {
     241                    foundQTP = true;
     242                } else if (foundQTP) {
     243                    if (!(s.contains("Modified by") || s.contains("<Arg type=\"int\">"))) {
     244                        out.println("        <!-- Modified by I2P migration script for Jetty 9. Do not remove this line -->");
     245                        out.println("        <Arg type=\"int\">20</Arg>     <!-- maxThreads, overridden below -->");
     246                        out.println("        <Arg type=\"int\">3</Arg>      <!-- minThreads, overridden below -->");
     247                        out.println("        <Arg type=\"int\">60000</Arg>  <!-- maxIdleTimeMs, overridden below -->");
     248                        modified = true;
     249                    }
     250                    foundQTP = false;
     251                }
     252                if (s.contains("<Set name=\"maxIdleTimeMs\">")) {
     253                    // <Set name="maxIdleTimeMs">60000</Set>
     254                    s = s.replace("<Set name=\"maxIdleTimeMs\">", "<Set name=\"idleTimeout\">");
     255                    modified = true;
     256                } else if (s.contains("<Set name=\"ThreadPool\">")) {
     257                    // <Set name="ThreadPool">, must be changed to constructor arg
     258                    out.println("    <!-- Modified by I2P migration script for Jetty 9. Do not remove this line -->");
     259                    s = s.replace("<Set name=\"ThreadPool\">", "<Arg>");
     260                    foundSTP = true;
     261                    modified = true;
     262                } else if (foundSTP && !foundETP && s.contains("</Set>") && !s.contains("<Set")) {
     263                    // </Set> (close of <Set name="ThreadPool">)
     264                    // All the lines above have <Set>...</Set> on the same line, if they don't, this will break.
     265                    s = s.replace("</Set>", "</Arg>");
     266                    foundETP = true;
     267                } else if (s.contains("org.eclipse.jetty.server.nio.SelectChannelConnector")) {
     268                    s = s.replace("org.eclipse.jetty.server.nio.SelectChannelConnector", "org.eclipse.jetty.server.ServerConnector");
     269                    out.println("          <!-- Modified by I2P migration script for Jetty 9. Do not remove this line -->");
     270                    out.println(s);
     271                    out.println("            <Arg><Ref id=\"Server\" /></Arg>");
     272                    out.println("            <Arg type=\"int\">1</Arg>     <!-- number of acceptors -->");
     273                    out.println("            <Arg type=\"int\">0</Arg>     <!-- default number of selectors -->");
     274                    out.println("            <Arg>");
     275                    out.println("              <Array type=\"org.eclipse.jetty.server.ConnectionFactory\">    <!-- varargs so we need an array -->");
     276                    out.println("                <Item>");
     277                    out.println("                  <New class=\"org.eclipse.jetty.server.HttpConnectionFactory\">");
     278                    out.println("                    <Arg>");
     279                    out.println("                      <New class=\"org.eclipse.jetty.server.HttpConfiguration\">");
     280                    out.println("                        <Set name=\"sendServerVersion\">false</Set>");
     281                    out.println("                        <Set name=\"sendDateHeader\">true</Set>");
     282                    out.println("                      </New>");
     283                    out.println("                    </Arg>");
     284                    out.println("                  </New>");
     285                    out.println("                </Item>");
     286                    out.println("              </Array>");
     287                    out.println("            </Arg>");
     288                    modified = true;
     289                    continue;
     290             // SSL starts here
     291                } else if (s.contains("org.eclipse.jetty.http.ssl.SslContextFactory")) {
     292                    s = s.replace("org.eclipse.jetty.http.ssl.SslContextFactory", "org.eclipse.jetty.util.ssl.SslContextFactory");
     293                    out.println("  <!-- Modified by I2P migration script for Jetty 9. Do not remove this line -->");
     294                    out.println(s);
     295                    // don't try to migrate from below, just generate a new list
     296                    out.println("    <Set name=\"ExcludeCipherSuites\">");
     297                    out.println("      <Array type=\"java.lang.String\">");
     298                    for (String ss : I2PSSLSocketFactory.EXCLUDE_CIPHERS) {
     299                        out.println("        <Item>" + ss + "</Item>");
     300                    }
     301                    out.println("      </Array>");
     302                    out.println("    </Set>");
     303                    out.println("    <Set name=\"ExcludeProtocols\">");
     304                    out.println("      <Array type=\"java.lang.String\">");
     305                    for (String ss : I2PSSLSocketFactory.EXCLUDE_PROTOCOLS) {
     306                        out.println("        <Item>" + ss + "</Item>");
     307                    }
     308                    out.println("      </Array>");
     309                    out.println("    </Set>");
     310                    modified = true;
     311                    continue;
     312                } else if (s.contains("org.eclipse.jetty.server.ssl.SslSelectChannelConnector")) {
     313                    s = s.replace("org.eclipse.jetty.server.ssl.SslSelectChannelConnector", "org.eclipse.jetty.server.ServerConnector");
     314                    out.println("      <!-- Modified by I2P migration script for Jetty 9. Do not remove this line -->");
     315                    out.println(s);
     316                    out.println("        <Arg><Ref id=\"Server\" /></Arg>");
     317                    out.println("        <Arg type=\"int\">1</Arg>     <!-- number of acceptors -->");
     318                    out.println("        <Arg type=\"int\">0</Arg>     <!-- default number of selectors -->");
     319                    out.println("        <Arg>");
     320                    out.println("           <Array type=\"org.eclipse.jetty.server.ConnectionFactory\">    <!-- varargs so we need an array -->");
     321                    out.println("              <Item>");
     322                    out.println("                <New class=\"org.eclipse.jetty.server.SslConnectionFactory\">");
     323                    out.println("                  <Arg><Ref id=\"sslContextFactory\" /></Arg>");
     324                    out.println("                  <Arg>http/1.1</Arg>");
     325                    out.println("                </New>");
     326                    out.println("              </Item>");
     327                    out.println("              <Item>");
     328                    out.println("                <New class=\"org.eclipse.jetty.server.HttpConnectionFactory\">");
     329                    out.println("                  <Arg>");
     330                    out.println("                    <New class=\"org.eclipse.jetty.server.HttpConfiguration\">");
     331                    out.println("                      <Set name=\"sendServerVersion\">false</Set>");
     332                    out.println("                      <Set name=\"sendDateHeader\">true</Set>");
     333                    out.println("                    </New>");
     334                    out.println("                  </Arg>");
     335                    out.println("                </New>");
     336                    out.println("              </Item>");
     337                    out.println("            </Array>");
     338                    out.println("        </Arg>");
     339                    foundSSCC = true;
     340                    modified = true;
     341                    continue;
     342                } else if (foundSSCC && s.contains("<Set name=\"ExcludeCipherSuites\">")) {
     343                    // delete the old ExcludeCipherSuites in this section
     344                    do {
     345                        s = DataHelper.readLine(in);
     346                    } while(s != null && !s.contains("</Set>"));
     347                    modified = true;
     348                    continue;
     349                } else if (foundSSCC &&
     350                           s.contains("<Ref id=\"sslContextFactory\"")) {
     351                    // delete old one in this section, replaced above
     352                    modified = true;
     353                    continue;
     354                } else if (s.contains("<Set name=\"KeyStore\">")) {
     355                    s = s.replace("<Set name=\"KeyStore\">", "<Set name=\"KeyStorePath\">");
     356                    modified = true;
     357                } else if (s.contains("<Set name=\"TrustStore\">")) {
     358                    s = s.replace("<Set name=\"TrustStore\">", "<Set name=\"TrustStorePath\">");
     359                    modified = true;
     360             // SSL ends here
     361                } else if (s.contains("class=\"org.eclipse.jetty.deploy.providers.ContextProvider\">")) {
     362                    // WebAppProvider now also does what ContextProvider used to do
     363                    out.println("        <!-- Modified by I2P migration script for Jetty 9. Do not remove this line -->");
     364                    s = s.replace("class=\"org.eclipse.jetty.deploy.providers.ContextProvider\">", "class=\"org.eclipse.jetty.deploy.providers.WebAppProvider\">");
     365                    modified = true;
     366                } else if (s.contains("<Set name=\"maxIdleTime\">")) {
     367                    s = s.replace("<Set name=\"maxIdleTime\">", "<Set name=\"idleTimeout\">");
     368                    modified = true;
     369                } else if (s.contains("<Set name=\"gracefulShutdown\">")) {
     370                    s = s.replace("<Set name=\"gracefulShutdown\">", "<Set name=\"stopTimeout\">");
     371                    modified = true;
     372                } else if (s.contains("org.eclipse.jetty.server.HttpConfiguration")) {
     373                    foundHC = true;
     374                } else if (!foundHC &&
     375                           (s.contains("<Set name=\"sendServerVersion\">") ||
     376                            s.contains("<Set name=\"sendDateHeader\">"))) {
     377                    // old ones for Server, not in HTTPConfiguration section, delete
     378                    modified = true;
     379                    continue;
     380                } else if (s.contains("<Set name=\"Acceptors\">") ||
     381                           s.contains("<Set name=\"acceptors\">") ||
     382                           s.contains("<Set name=\"statsOn\">") ||
     383                           s.contains("<Set name=\"confidentialPort\">") ||
     384                           s.contains("<Set name=\"lowResourcesConnections\">") ||
     385                           s.contains("<Set name=\"lowResourcesMaxIdleTime\">") ||
     386                           s.contains("<Set name=\"useDirectBuffers\">")) {
     387                    // delete
     388                    modified = true;
     389                    continue;
     390                }
     391                out.println(s);
     392            }
     393        } catch (IOException ioe) {
     394            if (in != null) {
     395                System.err.println("FAILED migration of " + xmlFile + ": " + ioe);
     396            }
     397            return false;
     398        } finally {
     399            if (in != null) try { in.close(); } catch (IOException ioe) {}
     400            if (out != null) out.close();
     401        }
     402        if (modified) {
     403            return FileUtil.rename(newFile, xmlFile);
     404        } else {
     405            newFile.delete();
     406            return true;
     407        }
     408    }
     409
    148410
    149411    /** do we have Jetty 7? */
     
    165427     */
    166428    private static boolean backupFile(File from) {
     429        return backupFile(from, BACKUP_SUFFIX);
     430    }
     431
     432    /**
     433     *  Backup a file with given suffix
     434     *  @return success
     435     *  @since Jetty 9
     436     */
     437    private static boolean backupFile(File from, String suffix) {
    167438        if (!from.exists())
    168439            return true;
    169         File to = new File(from.getAbsolutePath() + BACKUP_SUFFIX);
     440        File to = new File(from.getAbsolutePath() + suffix);
    170441        if (to.exists())
    171442            to = new File(to.getAbsolutePath() + "." + System.currentTimeMillis());
Note: See TracChangeset for help on using the changeset viewer.