package freenet.node.simulator;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import freenet.crypt.RandomSource;
import freenet.node.Node;
import freenet.node.NodeInitException;
import freenet.node.NodeStarter;
import freenet.support.Executor;
import freenet.support.Logger;
import freenet.support.PooledExecutor;
import freenet.support.TimeUtil;
import freenet.support.Logger.LogLevel;
import freenet.support.LoggerHook.InvalidThresholdException;
import freenet.support.io.FileUtil;
public class BootstrapSeedTest {
public static int EXIT_NO_SEEDNODES = 257;
public static int EXIT_FAILED_TARGET = 258;
public static int EXIT_THREW_SOMETHING = 259;
public static int DARKNET_PORT = 5006;
public static int OPENNET_PORT = 5007;
/**
* @param args
* @throws InvalidThresholdException
* @throws NodeInitException
* @throws InterruptedException
* @throws IOException
*/
public static void main(String[] args) throws InvalidThresholdException, NodeInitException, InterruptedException, IOException {
Node node = null;
try {
String ipOverride = null;
if(args.length > 0)
ipOverride = args[0];
File dir = new File("bootstrap-test");
FileUtil.removeAll(dir);
RandomSource random = NodeStarter.globalTestInit(dir.getPath(), false, LogLevel.ERROR, "", false);
File seednodes = new File("seednodes.fref");
if(!seednodes.exists() || seednodes.length() == 0 || !seednodes.canRead()) {
System.err.println("Unable to read seednodes.fref, it doesn't exist, or is empty");
System.exit(EXIT_NO_SEEDNODES);
}
File innerDir = new File(dir, Integer.toString(DARKNET_PORT));
innerDir.mkdir();
FileInputStream fis = new FileInputStream(seednodes);
FileUtil.writeTo(fis, new File(innerDir, "seednodes.fref"));
fis.close();
// Create one node
Executor executor = new PooledExecutor();
node = NodeStarter.createTestNode(DARKNET_PORT, OPENNET_PORT, "bootstrap-test", false, Node.DEFAULT_MAX_HTL, 0, random, executor, 1000, 5*1024*1024, true, true, true, true, true, true, true, 12*1024, false, true, false, false, ipOverride);
//NodeCrypto.DISABLE_GROUP_STRIP = true;
//Logger.setupStdoutLogging(LogLevel.MINOR, "freenet:NORMAL,freenet.node.NodeDispatcher:MINOR,freenet.node.FNPPacketMangler:MINOR");
Logger.getChain().setThreshold(LogLevel.ERROR); // kill logging
long startTime = System.currentTimeMillis();
// Start it
node.start(true);
// Wait until we have 10 connected nodes...
int seconds = 0;
int targetPeers = node.getOpennet().getAnnouncementThreshold();
while(seconds < 600) {
Thread.sleep(1000);
int seeds = node.peers.countSeednodes();
int seedConns = node.peers.getConnectedSeedServerPeersVector(null).size();
int opennetPeers = node.peers.countValidPeers();
int opennetConns = node.peers.countConnectedOpennetPeers();
System.err.println(""+seconds+" : seeds: "+seeds+", connected: "+seedConns
+" opennet: peers: "+opennetPeers+", connected: "+opennetConns);
seconds++;
if(opennetConns >= targetPeers) {
long timeTaken = System.currentTimeMillis()-startTime;
System.out.println("Completed bootstrap ("+targetPeers+" peers) in "+timeTaken+"ms ("+TimeUtil.formatTime(timeTaken)+")");
node.park();
System.exit(0);
}
}
System.err.println("Failed to reach target peers count "+targetPeers+" in 5 minutes.");
node.park();
System.exit(EXIT_FAILED_TARGET);
} catch (Throwable t) {
System.err.println("CAUGHT: "+t);
t.printStackTrace();
try {
if(node != null)
node.park();
} catch (Throwable t1) {}
System.exit(EXIT_THREW_SOMETHING);
}
}
}