propagate from branch 'i2p.i2p' (head 6ab0f64b9f4992591ed989f8d89a859fc3ceaeaf)
to branch 'i2p.i2p.zzz.test2' (head 3e85c6cfff244d09df42d967d3a3cdf77053890d)
This commit is contained in:
@ -1,192 +0,0 @@
|
||||
package net.i2p.crypto;
|
||||
/* @(#)SHA1Test.java 1.10 2004-04-24
|
||||
* This file was freely contributed to the LimeWire project and is covered
|
||||
* by its existing GPL licence, but it may be used individually as a public
|
||||
* domain implementation of a published algorithm (see below for references).
|
||||
* It was also freely contributed to the Bitzi public domain sources.
|
||||
* @author Philippe Verdy
|
||||
*/
|
||||
|
||||
/* Sun may wish to change the following package name, if integrating this
|
||||
* class in the Sun JCE Security Provider for Java 1.5 (code-named Tiger).
|
||||
*/
|
||||
//package com.bitzi.util;
|
||||
|
||||
import java.security.MessageDigest;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
|
||||
public class SHA1Test {
|
||||
|
||||
private static final SHA1 hash = new SHA1();
|
||||
|
||||
public static void main(String args[]) {
|
||||
// http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf
|
||||
System.out.println("****************************************");
|
||||
System.out.println("* Basic FIPS PUB 180-1 test vectors... *");
|
||||
System.out.println("****************************************");
|
||||
tst(1, 1,
|
||||
"abc",
|
||||
"A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D");
|
||||
tst(1, 2,
|
||||
"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
|
||||
"84983E44 1C3BD26e BAAE4AA1 F95129E5 E54670F1");
|
||||
tst(1, 3, /* one million bytes */
|
||||
1000000, "a",
|
||||
"34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F");
|
||||
System.out.println();
|
||||
|
||||
// http://csrc.ncsl.nist.gov/cryptval/shs/SHAVS.pdf
|
||||
System.out.println("********************************************************");
|
||||
System.out.println("* SHSV Examples of the selected short messages test... *");
|
||||
System.out.println("********************************************************");
|
||||
tst(2, 2, new byte[] {/* 8 bits, i.e. 1 byte */
|
||||
(byte)0x5e},
|
||||
"5e6f80a3 4a9798ca fc6a5db9 6cc57ba4 c4db59c2");
|
||||
tst(2, 4, new byte[] {/* 128 bits, i.e. 16 bytes */
|
||||
(byte)0x9a,(byte)0x7d,(byte)0xfd,(byte)0xf1,(byte)0xec,(byte)0xea,(byte)0xd0,(byte)0x6e,
|
||||
(byte)0xd6,(byte)0x46,(byte)0xaa,(byte)0x55,(byte)0xfe,(byte)0x75,(byte)0x71,(byte)0x46},
|
||||
"82abff66 05dbe1c1 7def12a3 94fa22a8 2b544a35");
|
||||
System.out.println();
|
||||
|
||||
System.out.println("*******************************************************");
|
||||
System.out.println("* SHSV Examples of the selected long messages test... *");
|
||||
System.out.println("*******************************************************");
|
||||
tst(3, 2, new byte[] {/* 1304 bits, i.e. 163 bytes */
|
||||
(byte)0xf7,(byte)0x8f,(byte)0x92,(byte)0x14,(byte)0x1b,(byte)0xcd,(byte)0x17,(byte)0x0a,
|
||||
(byte)0xe8,(byte)0x9b,(byte)0x4f,(byte)0xba,(byte)0x15,(byte)0xa1,(byte)0xd5,(byte)0x9f,
|
||||
(byte)0x3f,(byte)0xd8,(byte)0x4d,(byte)0x22,(byte)0x3c,(byte)0x92,(byte)0x51,(byte)0xbd,
|
||||
(byte)0xac,(byte)0xbb,(byte)0xae,(byte)0x61,(byte)0xd0,(byte)0x5e,(byte)0xd1,(byte)0x15,
|
||||
(byte)0xa0,(byte)0x6a,(byte)0x7c,(byte)0xe1,(byte)0x17,(byte)0xb7,(byte)0xbe,(byte)0xea,
|
||||
(byte)0xd2,(byte)0x44,(byte)0x21,(byte)0xde,(byte)0xd9,(byte)0xc3,(byte)0x25,(byte)0x92,
|
||||
(byte)0xbd,(byte)0x57,(byte)0xed,(byte)0xea,(byte)0xe3,(byte)0x9c,(byte)0x39,(byte)0xfa,
|
||||
(byte)0x1f,(byte)0xe8,(byte)0x94,(byte)0x6a,(byte)0x84,(byte)0xd0,(byte)0xcf,(byte)0x1f,
|
||||
(byte)0x7b,(byte)0xee,(byte)0xad,(byte)0x17,(byte)0x13,(byte)0xe2,(byte)0xe0,(byte)0x95,
|
||||
(byte)0x98,(byte)0x97,(byte)0x34,(byte)0x7f,(byte)0x67,(byte)0xc8,(byte)0x0b,(byte)0x04,
|
||||
(byte)0x00,(byte)0xc2,(byte)0x09,(byte)0x81,(byte)0x5d,(byte)0x6b,(byte)0x10,(byte)0xa6,
|
||||
(byte)0x83,(byte)0x83,(byte)0x6f,(byte)0xd5,(byte)0x56,(byte)0x2a,(byte)0x56,(byte)0xca,
|
||||
(byte)0xb1,(byte)0xa2,(byte)0x8e,(byte)0x81,(byte)0xb6,(byte)0x57,(byte)0x66,(byte)0x54,
|
||||
(byte)0x63,(byte)0x1c,(byte)0xf1,(byte)0x65,(byte)0x66,(byte)0xb8,(byte)0x6e,(byte)0x3b,
|
||||
(byte)0x33,(byte)0xa1,(byte)0x08,(byte)0xb0,(byte)0x53,(byte)0x07,(byte)0xc0,(byte)0x0a,
|
||||
(byte)0xff,(byte)0x14,(byte)0xa7,(byte)0x68,(byte)0xed,(byte)0x73,(byte)0x50,(byte)0x60,
|
||||
(byte)0x6a,(byte)0x0f,(byte)0x85,(byte)0xe6,(byte)0xa9,(byte)0x1d,(byte)0x39,(byte)0x6f,
|
||||
(byte)0x5b,(byte)0x5c,(byte)0xbe,(byte)0x57,(byte)0x7f,(byte)0x9b,(byte)0x38,(byte)0x80,
|
||||
(byte)0x7c,(byte)0x7d,(byte)0x52,(byte)0x3d,(byte)0x6d,(byte)0x79,(byte)0x2f,(byte)0x6e,
|
||||
(byte)0xbc,(byte)0x24,(byte)0xa4,(byte)0xec,(byte)0xf2,(byte)0xb3,(byte)0xa4,(byte)0x27,
|
||||
(byte)0xcd,(byte)0xbb,(byte)0xfb},
|
||||
"cb0082c8 f197d260 991ba6a4 60e76e20 2bad27b3");
|
||||
System.out.println();
|
||||
|
||||
// See also http://csrc.ncsl.nist.gov/cryptval/shs/sha1-vectors.zip
|
||||
|
||||
{
|
||||
final int RETRIES = 10;
|
||||
final int ITERATIONS = 2000;
|
||||
final int BLOCKSIZE = 65536;
|
||||
byte[] input = new byte[BLOCKSIZE];
|
||||
for (int i = BLOCKSIZE; --i >= 0; )
|
||||
input[i] = (byte)i;
|
||||
long best = 0;
|
||||
for (int i = 0; i < 1000; i++) // training for stable measure
|
||||
System.currentTimeMillis();
|
||||
|
||||
for (int retry = 0; retry < RETRIES; retry++) {
|
||||
long t0 = System.currentTimeMillis();
|
||||
for (int i = ITERATIONS; --i >= 0; );
|
||||
long t1 = System.currentTimeMillis();
|
||||
for (int i = ITERATIONS; --i >= 0; )
|
||||
hash.engineUpdate(input, 0, BLOCKSIZE);
|
||||
long t2 = System.currentTimeMillis();
|
||||
long time = (t2 - t1) - (t1 - t0);
|
||||
if (retry == 0 || time < best)
|
||||
best = time;
|
||||
}
|
||||
hash.engineReset();
|
||||
double rate = 1000.0 * ITERATIONS * BLOCKSIZE / best;
|
||||
System.out.println("Our rate = " +
|
||||
(float)(rate * 8) + " bits/s = " +
|
||||
(float)(rate / (1024 * 1024)) + " Megabytes/s");
|
||||
// Java 1.5 beta-b32c, on Athlon XP 1800+:
|
||||
// with java -client: 48.21 Megabytes/s.
|
||||
// with java -server: 68.23 Megabytes/s.
|
||||
|
||||
try {
|
||||
MessageDigest md = MessageDigest.getInstance("SHA");
|
||||
for (int retry = 0; retry < RETRIES; retry++) {
|
||||
long t0 = System.currentTimeMillis();
|
||||
for (int i = ITERATIONS; --i >= 0; );
|
||||
long t1 = System.currentTimeMillis();
|
||||
for (int i = ITERATIONS; --i >= 0; )
|
||||
md.update(input, 0, BLOCKSIZE);
|
||||
long t2 = System.currentTimeMillis();
|
||||
long time = (t2 - t1) - (t1 - t0);
|
||||
if (retry == 0 || time < best)
|
||||
best = time;
|
||||
}
|
||||
md.reset();
|
||||
rate = 1000.0 * ITERATIONS * BLOCKSIZE / best;
|
||||
System.out.println("JCE rate = " +
|
||||
(float)(rate * 8) + " bits/s = " +
|
||||
(float)(rate / (1024 * 1024)) + " Megabytes/s");
|
||||
} catch (NoSuchAlgorithmException nsae) {
|
||||
System.out.println("No SHA algorithm in local JCE Security Providers");
|
||||
}
|
||||
// Java 1.5 beta-b32c, on Athlon XP 1800+:
|
||||
// with java -client: 23.20 Megabytes/s.
|
||||
// with java -server: 45.72 Megabytes/s.
|
||||
}
|
||||
}
|
||||
|
||||
private static final boolean tst(final int set, final int vector,
|
||||
final String source,
|
||||
final String expect) {
|
||||
byte[] input = new byte[source.length()];
|
||||
for (int i = 0; i < input.length; i++)
|
||||
input[i] = (byte)source.charAt(i);
|
||||
return tst(set, vector, input, expect);
|
||||
}
|
||||
|
||||
private static final boolean tst(final int set, final int vector,
|
||||
final byte[] input,
|
||||
final String expect) {
|
||||
System.out.print("Set " + set + ", vector# " + vector + ": ");
|
||||
hash.engineUpdate(input, 0, input.length);
|
||||
return tstResult(expect);
|
||||
}
|
||||
|
||||
private static final boolean tst(final int set, final int vector,
|
||||
final int times, final String source,
|
||||
final String expect) {
|
||||
byte[] input = new byte[source.length()];
|
||||
for (int i = 0; i < input.length; i++)
|
||||
input[i] = (byte)source.charAt(i);
|
||||
System.out.print("Set " + set + ", vector# " + vector + ": ");
|
||||
for (int i = 0; i < times; i++)
|
||||
hash.engineUpdate(input, 0, input.length);
|
||||
return tstResult(expect);
|
||||
}
|
||||
|
||||
private static final boolean tstResult(String expect) {
|
||||
final String result = toHex(hash.engineDigest());
|
||||
expect = expect.toUpperCase();
|
||||
if (!expect.equals(result)) {
|
||||
System.out.println("**************** WRONG ***************");
|
||||
System.out.println(" expect: " + expect);
|
||||
System.out.println(" result: " + result);
|
||||
return false;
|
||||
}
|
||||
System.out.println("OK");
|
||||
return true;
|
||||
}
|
||||
|
||||
private static final String toHex(final byte[] bytes) {
|
||||
StringBuilder buf = new StringBuilder(bytes.length * 2);
|
||||
for (int i = 0; i < bytes.length; i++) {
|
||||
if ((i & 3) == 0 && i != 0)
|
||||
buf.append(' ');
|
||||
buf.append(HEX.charAt((bytes[i] >> 4) & 0xF))
|
||||
.append(HEX.charAt( bytes[i] & 0xF));
|
||||
}
|
||||
return buf.toString();
|
||||
}
|
||||
private static final String HEX = "0123456789ABCDEF";
|
||||
}
|
@ -871,7 +871,7 @@ public class DataHelper {
|
||||
public static String formatDuration(long ms) {
|
||||
if (ms < 5 * 1000) {
|
||||
return ms + "ms";
|
||||
} else if (ms < 5 * 60 * 1000) {
|
||||
} else if (ms < 3 * 60 * 1000) {
|
||||
return (ms / 1000) + "s";
|
||||
} else if (ms < 120 * 60 * 1000) {
|
||||
return (ms / (60 * 1000)) + "m";
|
||||
|
@ -1,58 +0,0 @@
|
||||
package net.i2p.stat;
|
||||
|
||||
public class SizeTest {
|
||||
public static void main(String args[]) {
|
||||
testRateSize(100); //117KB
|
||||
testRateSize(100000); // 4.5MB
|
||||
testRateSize(440000); // 44MB
|
||||
//testFrequencySize(100); // 114KB
|
||||
//testFrequencySize(100000); // 5.3MB
|
||||
//testFrequencySize(1000000); // 52MB
|
||||
}
|
||||
|
||||
private static void testRateSize(int num) {
|
||||
Runtime.getRuntime().gc();
|
||||
Rate rate[] = new Rate[num];
|
||||
long used = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
|
||||
long usedPer = used / num;
|
||||
System.out
|
||||
.println(num + ": create array - Used: " + used + " bytes (or " + usedPer + " bytes per array entry)");
|
||||
|
||||
int i = 0;
|
||||
try {
|
||||
for (; i < num; i++)
|
||||
rate[i] = new Rate(1234);
|
||||
} catch (OutOfMemoryError oom) {
|
||||
rate = null;
|
||||
Runtime.getRuntime().gc();
|
||||
System.out.println("Ran out of memory when creating rate " + i);
|
||||
return;
|
||||
}
|
||||
Runtime.getRuntime().gc();
|
||||
long usedObjects = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
|
||||
usedPer = usedObjects / num;
|
||||
System.out.println(num + ": create objects - Used: " + usedObjects + " bytes (or " + usedPer
|
||||
+ " bytes per rate)");
|
||||
rate = null;
|
||||
Runtime.getRuntime().gc();
|
||||
}
|
||||
|
||||
private static void testFrequencySize(int num) {
|
||||
Runtime.getRuntime().gc();
|
||||
Frequency freq[] = new Frequency[num];
|
||||
long used = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
|
||||
long usedPer = used / num;
|
||||
System.out
|
||||
.println(num + ": create array - Used: " + used + " bytes (or " + usedPer + " bytes per array entry)");
|
||||
|
||||
for (int i = 0; i < num; i++)
|
||||
freq[i] = new Frequency(1234);
|
||||
Runtime.getRuntime().gc();
|
||||
long usedObjects = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
|
||||
usedPer = usedObjects / num;
|
||||
System.out.println(num + ": create objects - Used: " + usedObjects + " bytes (or " + usedPer
|
||||
+ " bytes per frequency)");
|
||||
freq = null;
|
||||
Runtime.getRuntime().gc();
|
||||
}
|
||||
}
|
@ -52,6 +52,15 @@ public class Timestamper implements Runnable {
|
||||
this(ctx, lsnr, true);
|
||||
}
|
||||
public Timestamper(I2PAppContext ctx, UpdateListener lsnr, boolean daemon) {
|
||||
// Don't bother starting a thread if we are disabled.
|
||||
// This means we no longer check every 5 minutes to see if we got enabled,
|
||||
// so the property must be set at startup.
|
||||
// We still need to be instantiated since the router calls clock().getTimestamper().waitForInitialization()
|
||||
String disabled = ctx.getProperty(PROP_DISABLED, DEFAULT_DISABLED);
|
||||
if (Boolean.valueOf(disabled).booleanValue()) {
|
||||
_initialized = true;
|
||||
return;
|
||||
}
|
||||
_context = ctx;
|
||||
_daemon = daemon;
|
||||
_initialized = false;
|
||||
|
@ -76,9 +76,10 @@ public class FileUtil {
|
||||
}
|
||||
|
||||
public static boolean extractZip(File zipfile, File targetDir) {
|
||||
ZipFile zip = null;
|
||||
try {
|
||||
byte buf[] = new byte[16*1024];
|
||||
ZipFile zip = new ZipFile(zipfile);
|
||||
zip = new ZipFile(zipfile);
|
||||
Enumeration entries = zip.entries();
|
||||
while (entries.hasMoreElements()) {
|
||||
ZipEntry entry = (ZipEntry)entries.nextElement();
|
||||
@ -124,13 +125,16 @@ public class FileUtil {
|
||||
}
|
||||
}
|
||||
}
|
||||
zip.close();
|
||||
return true;
|
||||
} catch (IOException ioe) {
|
||||
System.err.println("ERROR: Unable to extract the zip file");
|
||||
ioe.printStackTrace();
|
||||
return false;
|
||||
}
|
||||
} finally {
|
||||
if (zip != null) {
|
||||
try { zip.close(); } catch (IOException ioe) {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1,326 +0,0 @@
|
||||
package net.i2p.util;
|
||||
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.io.PrintWriter;
|
||||
import java.util.Properties;
|
||||
|
||||
import net.i2p.data.DataHelper;
|
||||
|
||||
/**
|
||||
* Get a working directory for i2p.
|
||||
*
|
||||
* For the location, first try the system property i2p.dir.config
|
||||
* Next try $HOME/.i2p on linux or %APPDATA%\I2P on Windows.
|
||||
*
|
||||
* If the dir exists, return it.
|
||||
* Otherwise, attempt to create it, and copy files from the base directory.
|
||||
* To successfully copy, the base install dir must be the system property i2p.dir.base
|
||||
* or else must be in $CWD.
|
||||
*
|
||||
* If I2P was run from the install directory in the past,
|
||||
* and migrateOldData = true, copy the
|
||||
* necessary data files (except i2psnark/) over to the new working directory.
|
||||
*
|
||||
* Otherwise, just copy over a limited number of files over.
|
||||
*
|
||||
* Do not ever copy or move the old i2psnark/ directory, as if the
|
||||
* old and new locations are on different file systems, this could
|
||||
* be quite slow.
|
||||
*
|
||||
* Modify some files while copying, see methods below.
|
||||
*
|
||||
* After migration, the router will run using the new directory.
|
||||
* The wrapper, however, must be stopped and restarted from the new script - until then,
|
||||
* it will continue to write to wrapper.log* in the old directory.
|
||||
*
|
||||
* @param whether to copy all data over from an existing install
|
||||
*/
|
||||
public class WorkingDir {
|
||||
|
||||
private final static String PROP_BASE_DIR = "i2p.dir.base";
|
||||
private final static String PROP_WORKING_DIR = "i2p.dir.config";
|
||||
private final static String WORKING_DIR_DEFAULT_WINDOWS = "I2P";
|
||||
private final static String WORKING_DIR_DEFAULT = ".i2p";
|
||||
|
||||
/**
|
||||
* Only call this once on router invocation.
|
||||
* Caller should store the return value for future reference.
|
||||
*/
|
||||
public static String getWorkingDir(Properties envProps, boolean migrateOldConfig) {
|
||||
String dir = null;
|
||||
if (envProps != null)
|
||||
dir = envProps.getProperty(PROP_WORKING_DIR);
|
||||
if (dir == null)
|
||||
dir = System.getProperty(PROP_WORKING_DIR);
|
||||
boolean isWindows = System.getProperty("os.name").startsWith("Win");
|
||||
File dirf = null;
|
||||
if (dir != null) {
|
||||
dirf = new File(dir);
|
||||
} else {
|
||||
String home = System.getProperty("user.home");
|
||||
if (isWindows) {
|
||||
String appdata = System.getenv("APPDATA");
|
||||
if (appdata != null)
|
||||
home = appdata;
|
||||
dirf = new File(home, WORKING_DIR_DEFAULT_WINDOWS);
|
||||
} else {
|
||||
dirf = new File(home, WORKING_DIR_DEFAULT);
|
||||
}
|
||||
}
|
||||
|
||||
// where we are now
|
||||
String cwd = null;
|
||||
if (envProps != null)
|
||||
cwd = envProps.getProperty(PROP_BASE_DIR);
|
||||
if (cwd == null) {
|
||||
cwd = System.getProperty(PROP_BASE_DIR);
|
||||
if (cwd == null)
|
||||
cwd = System.getProperty("user.dir");
|
||||
}
|
||||
|
||||
// Check for a hosts.txt file, if it exists then I2P is there
|
||||
File oldDirf = new File(cwd);
|
||||
File test = new File(oldDirf, "hosts.txt");
|
||||
if (!test.exists()) {
|
||||
System.err.println("ERROR - Cannot find I2P installation in " + cwd +
|
||||
" - Will probably be just a router with no apps or console at all!");
|
||||
// until we move reseeding from the console to the router, we
|
||||
// won't be able to reseed, so we are probably doomed
|
||||
return cwd;
|
||||
}
|
||||
|
||||
// apparently configured for "portable" ?
|
||||
try {
|
||||
if (oldDirf.getCanonicalPath().equals(dirf.getCanonicalPath()))
|
||||
return cwd;
|
||||
} catch (IOException ioe) {}
|
||||
|
||||
// where we want to go
|
||||
String rv = dirf.getAbsolutePath();
|
||||
if (dirf.exists()) {
|
||||
if (dirf.isDirectory())
|
||||
return rv; // all is good, we found the user directory
|
||||
System.err.println("Wanted to use " + rv + " for a working directory but it is not a directory");
|
||||
return cwd;
|
||||
}
|
||||
// Check for a router.keys file or logs dir, if either exists it's an old install,
|
||||
// and only migrate the data files if told to do so
|
||||
// (router.keys could be deleted later by a killkeys())
|
||||
test = new File(oldDirf, "router.keys");
|
||||
boolean oldInstall = test.exists();
|
||||
if (!oldInstall) {
|
||||
test = new File(oldDirf, "logs");
|
||||
oldInstall = test.exists();
|
||||
}
|
||||
// keep everything where it is, in one place...
|
||||
if (oldInstall && !migrateOldConfig)
|
||||
return cwd;
|
||||
boolean migrateOldData = false; // this is a terrible idea
|
||||
|
||||
if (!dirf.mkdir()) {
|
||||
System.err.println("Wanted to use " + rv + " for a working directory but could not create it");
|
||||
return cwd;
|
||||
}
|
||||
|
||||
// Do the copying
|
||||
if (migrateOldData)
|
||||
System.err.println("Migrating data files to new user directory " + rv);
|
||||
else
|
||||
System.err.println("Setting up new user directory " + rv);
|
||||
boolean success = migrate(MIGRATE_BASE, oldDirf, dirf);
|
||||
// this one must be after MIGRATE_BASE
|
||||
success &= migrateJettyXml(oldDirf, dirf);
|
||||
success &= migrateClientsConfig(oldDirf, dirf);
|
||||
success &= copy(new File(oldDirf, "docs/news.xml"), new File(dirf, "docs"));
|
||||
|
||||
// Report success or failure
|
||||
if (success) {
|
||||
System.err.println("Successfully copied data files to new user directory " + rv);
|
||||
return rv;
|
||||
} else {
|
||||
System.err.println("FAILED copy of some or all data files to new directory " + rv);
|
||||
System.err.println("Check logs for details");
|
||||
System.err.println("Continung to use data files in old directory " + cwd);
|
||||
return cwd;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* files and directories from the base install to copy over
|
||||
* None of these should be included in i2pupdate.zip
|
||||
*
|
||||
* The user should not delete these in the old location, leave them as templates for new users
|
||||
*/
|
||||
private static final String MIGRATE_BASE =
|
||||
// base install - dirs
|
||||
// We don't currently have a default addressbook/ in the base distribution,
|
||||
// but distros might put one in
|
||||
"addressbook,eepsite," +
|
||||
// base install - files
|
||||
// We don't currently have a default router.config or logger.config in the base distribution,
|
||||
// but distros might put one in
|
||||
"blocklist.txt,hosts.txt,i2psnark.config,i2ptunnel.config,jetty-i2psnark.xml," +
|
||||
"logger.config,router.config,systray.config";
|
||||
|
||||
private static boolean migrate(String list, File olddir, File todir) {
|
||||
boolean rv = true;
|
||||
String files[] = list.split(",");
|
||||
for (int i = 0; i < files.length; i++) {
|
||||
File from = new File(olddir, files[i]);
|
||||
if (!copy(from, todir)) {
|
||||
System.err.println("Error copying " + from.getAbsolutePath());
|
||||
rv = false;
|
||||
}
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy over the clients.config file with modifications
|
||||
*/
|
||||
private static boolean migrateClientsConfig(File olddir, File todir) {
|
||||
File oldFile = new File(olddir, "clients.config");
|
||||
File newFile = new File(todir, "clients.config");
|
||||
FileInputStream in = null;
|
||||
PrintWriter out = null;
|
||||
try {
|
||||
in = new FileInputStream(oldFile);
|
||||
out = new PrintWriter(new BufferedWriter(new FileWriter(newFile)));
|
||||
out.println("# Modified by I2P User dir migration script");
|
||||
String s = null;
|
||||
while ((s = DataHelper.readLine(in)) != null) {
|
||||
if (s.endsWith("=eepsite/jetty.xml")) {
|
||||
s = s.replace("=eepsite", '=' + todir.getAbsolutePath() + File.separatorChar + "eepsite");
|
||||
}
|
||||
out.println(s);
|
||||
}
|
||||
System.err.println("Copied clients.config with modifications");
|
||||
return true;
|
||||
} catch (IOException ioe) {
|
||||
if (in != null) {
|
||||
System.err.println("FAILED copy clients.config");
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
} finally {
|
||||
if (in != null) try { in.close(); } catch (IOException ioe) {}
|
||||
if (out != null) out.close();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy over the jetty.xml file with modifications
|
||||
* It was already copied over once in migrate(), throw that out and
|
||||
* do it again with modifications.
|
||||
*/
|
||||
private static boolean migrateJettyXml(File olddir, File todir) {
|
||||
File eepsite1 = new File(olddir, "eepsite");
|
||||
File oldFile = new File(eepsite1, "jetty.xml");
|
||||
File eepsite2 = new File(todir, "eepsite");
|
||||
File newFile = new File(eepsite2, "jetty.xml");
|
||||
FileInputStream in = null;
|
||||
PrintWriter out = null;
|
||||
try {
|
||||
in = new FileInputStream(oldFile);
|
||||
out = new PrintWriter(new BufferedWriter(new FileWriter(newFile)));
|
||||
String s = null;
|
||||
while ((s = DataHelper.readLine(in)) != null) {
|
||||
if (s.indexOf("./eepsite/") >= 0) {
|
||||
s = s.replace("./eepsite/", todir.getAbsolutePath() + File.separatorChar + "eepsite" + File.separatorChar);
|
||||
}
|
||||
out.println(s);
|
||||
}
|
||||
out.println("<!-- Modified by I2P User dir migration script -->");
|
||||
System.err.println("Copied jetty.xml with modifications");
|
||||
return true;
|
||||
} catch (IOException ioe) {
|
||||
if (in != null) {
|
||||
System.err.println("FAILED copy jetty.xml");
|
||||
return false;
|
||||
}
|
||||
return false;
|
||||
} finally {
|
||||
if (in != null) try { in.close(); } catch (IOException ioe) {}
|
||||
if (out != null) out.close();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursive copy a file or dir to a dir
|
||||
*
|
||||
* @param src file or directory, need not exist
|
||||
* @param targetDir the directory to copy to, will be created if it doesn't exist
|
||||
* @return true for success OR if src does not exist
|
||||
*/
|
||||
public static final boolean copy(File src, File targetDir) {
|
||||
if (!src.exists())
|
||||
return true;
|
||||
if (!targetDir.exists()) {
|
||||
if (!targetDir.mkdir()) {
|
||||
System.err.println("FAILED copy " + src.getPath());
|
||||
return false;
|
||||
}
|
||||
System.err.println("Created " + targetDir.getPath());
|
||||
}
|
||||
File targetFile = new File(targetDir, src.getName());
|
||||
if (!src.isDirectory())
|
||||
return copyFile(src, targetFile);
|
||||
File children[] = src.listFiles();
|
||||
if (children == null) {
|
||||
System.err.println("FAILED copy " + src.getPath());
|
||||
return false;
|
||||
}
|
||||
// make it here so even empty dirs get copied
|
||||
if (!targetFile.exists()) {
|
||||
if (!targetFile.mkdir()) {
|
||||
System.err.println("FAILED copy " + src.getPath());
|
||||
return false;
|
||||
}
|
||||
System.err.println("Created " + targetFile.getPath());
|
||||
}
|
||||
boolean rv = true;
|
||||
for (int i = 0; i < children.length; i++) {
|
||||
rv &= copy(children[i], targetFile);
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param src not a directory, must exist
|
||||
* @param dst not a directory, will be overwritten if existing
|
||||
* @return true if it was copied successfully
|
||||
*/
|
||||
public static boolean copyFile(File src, File dst) {
|
||||
if (!src.exists()) return false;
|
||||
boolean rv = true;
|
||||
|
||||
byte buf[] = new byte[4096];
|
||||
FileInputStream in = null;
|
||||
FileOutputStream out = null;
|
||||
try {
|
||||
in = new FileInputStream(src);
|
||||
out = new FileOutputStream(dst);
|
||||
|
||||
int read = 0;
|
||||
while ( (read = in.read(buf)) != -1)
|
||||
out.write(buf, 0, read);
|
||||
|
||||
System.err.println("Copied " + src.getPath());
|
||||
} catch (IOException ioe) {
|
||||
System.err.println("FAILED copy " + src.getPath());
|
||||
rv = false;
|
||||
} finally {
|
||||
if (in != null) try { in.close(); } catch (IOException ioe) {}
|
||||
if (out != null) try { out.close(); } catch (IOException ioe) {}
|
||||
}
|
||||
if (rv)
|
||||
dst.setLastModified(src.lastModified());
|
||||
return rv;
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user