Changeset 0703a29 for router


Ignore:
Timestamp:
Mar 11, 2017 3:24:23 PM (3 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
aea20a5
Parents:
072d990 (diff), db0381d (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:

propagate from branch 'i2p.i2p.zzz.jetty9' (head 80022f6ef552acd1382d45103969aa7c17b1d794)

to branch 'i2p.i2p' (head 3b4b418ae8be95d52228fc7c325fc52e0223e4fe)

Location:
router/java/src/net/i2p/router/startup
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • router/java/src/net/i2p/router/startup/MigrateJetty.java

    r072d990 r0703a29  
    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";
    45     private static final String JETTY_TEMPLATE_DIR = "eepsite-jetty7";
     58    private static final String BACKUP_SUFFIX_8 = ".jetty8";
     59    private static final String JETTY_TEMPLATE_DIR = "eepsite-jetty9";
    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 9 " + 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 9
     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/
     
    142200                System.err.println("WARNING: Migrated clients config file " + cfgFile +
    143201                               " from Jetty 5/6 " + OLD_CLASS + '/' + OLD_CLASS_6 +
    144                                " to Jetty 7 " + NEW_CLASS);
    145             }
    146         }
    147     }
    148 
    149     /** do we have Jetty 7? */
     202                               " to Jetty 9 " + NEW_CLASS);
     203            }
     204        }
     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 9,
     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        if (xmlFile.getName().equals("jetty-jmx.xml")) {
     219            // This is lazy but nobody's using jmx, not worth the trouble
     220            System.err.println("ERROR: Migration  of " + xmlFile +
     221                               " file is not supported. Copy new file from $I2P/eepsite-jetty9/jetty-jmx.xml");
     222            return false;
     223        }
     224        // we don't re-migrate from the template, we just add the
     225        // necessary args for the QueuedThreadPool constructor in-place
     226        // and fixup the renamed set call
     227        boolean modified = false;
     228        File eepsite = xmlFile.getParentFile();
     229        File newFile = new File(eepsite, xmlFile.getName() + System.currentTimeMillis() + ".tmp");
     230        FileInputStream in = null;
     231        PrintWriter out = null;
     232        try {
     233            in = new FileInputStream(xmlFile);
     234            out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new SecureFileOutputStream(newFile), "UTF-8")));
     235            String s;
     236            boolean foundQTP = false;
     237            boolean foundSTP = false;
     238            boolean foundETP = false;
     239            boolean foundSCC = false;
     240            boolean foundHC = false;
     241            boolean foundSSCC = false;
     242            while ((s = DataHelper.readLine(in)) != null) {
     243                // readLine() doesn't strip \r
     244                if (s.endsWith("\r"))
     245                    s = s.substring(0, s.length() - 1);
     246                if (s.contains("Modified by I2P migration script for Jetty 9.") ||
     247                    s.contains("This configuration supports Jetty 9.") ||
     248                    s.contains("http://www.eclipse.org/jetty/configure_9_0.dtd")) {
     249                    if (!modified)
     250                        break;
     251                    // else we've modified it twice?
     252                } else if (s.contains("org.eclipse.jetty.util.thread.QueuedThreadPool")) {
     253                    foundQTP = true;
     254                } else if (foundQTP) {
     255                    if (!(s.contains("Modified by") || s.contains("<Arg type=\"int\">"))) {
     256                        out.println("        <!-- Modified by I2P migration script for Jetty 9. Do not remove this line -->");
     257                        out.println("        <Arg type=\"int\">20</Arg>     <!-- maxThreads, overridden below -->");
     258                        out.println("        <Arg type=\"int\">3</Arg>      <!-- minThreads, overridden below -->");
     259                        out.println("        <Arg type=\"int\">60000</Arg>  <!-- maxIdleTimeMs, overridden below -->");
     260                        modified = true;
     261                    }
     262                    foundQTP = false;
     263                }
     264                if (s.contains("<Set name=\"maxIdleTimeMs\">")) {
     265                    // <Set name="maxIdleTimeMs">60000</Set>
     266                    s = s.replace("<Set name=\"maxIdleTimeMs\">", "<Set name=\"idleTimeout\">");
     267                    modified = true;
     268                } else if (s.contains("<Set name=\"ThreadPool\">")) {
     269                    // <Set name="ThreadPool">, must be changed to constructor arg
     270                    out.println("    <!-- Modified by I2P migration script for Jetty 9. Do not remove this line -->");
     271                    s = s.replace("<Set name=\"ThreadPool\">", "<Arg>");
     272                    foundSTP = true;
     273                    modified = true;
     274                } else if (foundSTP && !foundETP && s.contains("</Set>") && !s.contains("<Set")) {
     275                    // </Set> (close of <Set name="ThreadPool">)
     276                    // All the lines above have <Set>...</Set> on the same line, if they don't, this will break.
     277                    s = s.replace("</Set>", "</Arg>");
     278                    foundETP = true;
     279                } else if (s.contains("org.eclipse.jetty.server.nio.SelectChannelConnector")) {
     280                    s = s.replace("org.eclipse.jetty.server.nio.SelectChannelConnector", "org.eclipse.jetty.server.ServerConnector");
     281                    out.println("          <!-- Modified by I2P migration script for Jetty 9. Do not remove this line -->");
     282                    out.println(s);
     283                    out.println("            <Arg><Ref id=\"Server\" /></Arg>");
     284                    out.println("            <Arg type=\"int\">1</Arg>     <!-- number of acceptors -->");
     285                    out.println("            <Arg type=\"int\">0</Arg>     <!-- default number of selectors -->");
     286                    out.println("            <Arg>");
     287                    out.println("              <Array type=\"org.eclipse.jetty.server.ConnectionFactory\">    <!-- varargs so we need an array -->");
     288                    out.println("                <Item>");
     289                    out.println("                  <New class=\"org.eclipse.jetty.server.HttpConnectionFactory\">");
     290                    out.println("                    <Arg>");
     291                    out.println("                      <New class=\"org.eclipse.jetty.server.HttpConfiguration\">");
     292                    out.println("                        <Set name=\"sendServerVersion\">false</Set>");
     293                    out.println("                        <Set name=\"sendDateHeader\">true</Set>");
     294                    out.println("                      </New>");
     295                    out.println("                    </Arg>");
     296                    out.println("                  </New>");
     297                    out.println("                </Item>");
     298                    out.println("              </Array>");
     299                    out.println("            </Arg>");
     300                    modified = true;
     301                    continue;
     302             // SSL starts here
     303                } else if (s.contains("org.eclipse.jetty.http.ssl.SslContextFactory")) {
     304                    s = s.replace("org.eclipse.jetty.http.ssl.SslContextFactory", "org.eclipse.jetty.util.ssl.SslContextFactory");
     305                    out.println("  <!-- Modified by I2P migration script for Jetty 9. Do not remove this line -->");
     306                    out.println(s);
     307                    // don't try to migrate from below, just generate a new list
     308                    out.println("    <Set name=\"ExcludeCipherSuites\">");
     309                    out.println("      <Array type=\"java.lang.String\">");
     310                    for (String ss : I2PSSLSocketFactory.EXCLUDE_CIPHERS) {
     311                        out.println("        <Item>" + ss + "</Item>");
     312                    }
     313                    out.println("      </Array>");
     314                    out.println("    </Set>");
     315                    out.println("    <Set name=\"ExcludeProtocols\">");
     316                    out.println("      <Array type=\"java.lang.String\">");
     317                    for (String ss : I2PSSLSocketFactory.EXCLUDE_PROTOCOLS) {
     318                        out.println("        <Item>" + ss + "</Item>");
     319                    }
     320                    out.println("      </Array>");
     321                    out.println("    </Set>");
     322                    modified = true;
     323                    continue;
     324                } else if (s.contains("org.eclipse.jetty.server.ssl.SslSelectChannelConnector")) {
     325                    s = s.replace("org.eclipse.jetty.server.ssl.SslSelectChannelConnector", "org.eclipse.jetty.server.ServerConnector");
     326                    out.println("      <!-- Modified by I2P migration script for Jetty 9. Do not remove this line -->");
     327                    out.println(s);
     328                    out.println("        <Arg><Ref id=\"Server\" /></Arg>");
     329                    out.println("        <Arg type=\"int\">1</Arg>     <!-- number of acceptors -->");
     330                    out.println("        <Arg type=\"int\">0</Arg>     <!-- default number of selectors -->");
     331                    out.println("        <Arg>");
     332                    out.println("           <Array type=\"org.eclipse.jetty.server.ConnectionFactory\">    <!-- varargs so we need an array -->");
     333                    out.println("              <Item>");
     334                    out.println("                <New class=\"org.eclipse.jetty.server.SslConnectionFactory\">");
     335                    out.println("                  <Arg><Ref id=\"sslContextFactory\" /></Arg>");
     336                    out.println("                  <Arg>http/1.1</Arg>");
     337                    out.println("                </New>");
     338                    out.println("              </Item>");
     339                    out.println("              <Item>");
     340                    out.println("                <New class=\"org.eclipse.jetty.server.HttpConnectionFactory\">");
     341                    out.println("                  <Arg>");
     342                    out.println("                    <New class=\"org.eclipse.jetty.server.HttpConfiguration\">");
     343                    out.println("                      <Set name=\"sendServerVersion\">false</Set>");
     344                    out.println("                      <Set name=\"sendDateHeader\">true</Set>");
     345                    out.println("                    </New>");
     346                    out.println("                  </Arg>");
     347                    out.println("                </New>");
     348                    out.println("              </Item>");
     349                    out.println("            </Array>");
     350                    out.println("        </Arg>");
     351                    foundSSCC = true;
     352                    modified = true;
     353                    continue;
     354                } else if (foundSSCC && s.contains("<Set name=\"ExcludeCipherSuites\">")) {
     355                    // delete the old ExcludeCipherSuites in this section
     356                    do {
     357                        s = DataHelper.readLine(in);
     358                    } while(s != null && !s.contains("</Set>"));
     359                    modified = true;
     360                    continue;
     361                } else if (foundSSCC &&
     362                           s.contains("<Ref id=\"sslContextFactory\"")) {
     363                    // delete old one in this section, replaced above
     364                    modified = true;
     365                    continue;
     366                } else if (s.contains("<Set name=\"KeyStore\">")) {
     367                    s = s.replace("<Set name=\"KeyStore\">", "<Set name=\"KeyStorePath\">");
     368                    modified = true;
     369                } else if (s.contains("<Set name=\"TrustStore\">")) {
     370                    s = s.replace("<Set name=\"TrustStore\">", "<Set name=\"TrustStorePath\">");
     371                    modified = true;
     372             // SSL ends here
     373                } else if (s.contains("class=\"org.eclipse.jetty.deploy.providers.ContextProvider\">")) {
     374                    // WebAppProvider now also does what ContextProvider used to do
     375                    out.println("        <!-- Modified by I2P migration script for Jetty 9. Do not remove this line -->");
     376                    s = s.replace("class=\"org.eclipse.jetty.deploy.providers.ContextProvider\">", "class=\"org.eclipse.jetty.deploy.providers.WebAppProvider\">");
     377                    modified = true;
     378                } else if (s.contains("<Set name=\"maxIdleTime\">")) {
     379                    s = s.replace("<Set name=\"maxIdleTime\">", "<Set name=\"idleTimeout\">");
     380                    modified = true;
     381                } else if (s.contains("<Set name=\"gracefulShutdown\">")) {
     382                    s = s.replace("<Set name=\"gracefulShutdown\">", "<Set name=\"stopTimeout\">");
     383                    modified = true;
     384                } else if (s.contains("org.eclipse.jetty.server.HttpConfiguration")) {
     385                    foundHC = true;
     386                } else if (!foundHC &&
     387                           (s.contains("<Set name=\"sendServerVersion\">") ||
     388                            s.contains("<Set name=\"sendDateHeader\">"))) {
     389                    // old ones for Server, not in HTTPConfiguration section, delete
     390                    modified = true;
     391                    continue;
     392                } else if (s.contains("<Set name=\"Acceptors\">") ||
     393                           s.contains("<Set name=\"acceptors\">") ||
     394                           s.contains("<Set name=\"statsOn\">") ||
     395                           s.contains("<Set name=\"confidentialPort\">") ||
     396                           s.contains("<Set name=\"lowResourcesConnections\">") ||
     397                           s.contains("<Set name=\"lowResourcesMaxIdleTime\">") ||
     398                           s.contains("<Set name=\"useDirectBuffers\">")) {
     399                    // delete
     400                    modified = true;
     401                    continue;
     402                }
     403                out.println(s);
     404            }
     405        } catch (IOException ioe) {
     406            if (in != null) {
     407                System.err.println("FAILED migration of " + xmlFile + ": " + ioe);
     408            }
     409            return false;
     410        } finally {
     411            if (in != null) try { in.close(); } catch (IOException ioe) {}
     412            if (out != null) out.close();
     413        }
     414        if (modified) {
     415            return FileUtil.rename(newFile, xmlFile);
     416        } else {
     417            newFile.delete();
     418            return true;
     419        }
     420    }
     421
     422
     423    /** do we have Jetty 7/8/9? */
    150424    private static boolean hasLatestJetty() {
    151425        if (!_wasChecked) {
     
    165439     */
    166440    private static boolean backupFile(File from) {
     441        return backupFile(from, BACKUP_SUFFIX);
     442    }
     443
     444    /**
     445     *  Backup a file with given suffix
     446     *  @return success
     447     *  @since Jetty 9
     448     */
     449    private static boolean backupFile(File from, String suffix) {
    167450        if (!from.exists())
    168451            return true;
    169         File to = new File(from.getAbsolutePath() + BACKUP_SUFFIX);
     452        File to = new File(from.getAbsolutePath() + suffix);
    170453        if (to.exists())
    171454            to = new File(to.getAbsolutePath() + "." + System.currentTimeMillis());
  • router/java/src/net/i2p/router/startup/WorkingDir.java

    r072d990 r0703a29  
    328328            if (in != null) {
    329329                System.err.println("FAILED copy " + oldFile + ": " + ioe);
    330                 return false;
    331330            }
    332331            return false;
     
    366365            if (in != null) {
    367366                System.err.println("FAILED copy " + oldFile + ": " + ioe);
    368                 return false;
    369367            }
    370368            return false;
Note: See TracChangeset for help on using the changeset viewer.