diff --git a/core/build.gradle b/core/build.gradle index 5aeaf4cb..278a7980 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -2,6 +2,7 @@ apply plugin : 'application' mainClassName = 'com.muwire.core.Core' applicationDefaultJvmArgs = ['-Djava.util.logging.config.file=logging.properties'] dependencies { + compile 'net.i2p:router:0.9.40' compile 'net.i2p.client:mstreaming:0.9.40' compile 'net.i2p.client:streaming:0.9.40' diff --git a/core/src/main/groovy/com/muwire/core/Core.groovy b/core/src/main/groovy/com/muwire/core/Core.groovy index 477e2521..a26cb20d 100644 --- a/core/src/main/groovy/com/muwire/core/Core.groovy +++ b/core/src/main/groovy/com/muwire/core/Core.groovy @@ -59,6 +59,8 @@ import net.i2p.data.PrivateKey import net.i2p.data.Signature import net.i2p.data.SigningPrivateKey +import net.i2p.router.Router + @Log public class Core { @@ -81,14 +83,28 @@ public class Core { private final DirectoryWatcher directoryWatcher final FileManager fileManager + private final Router router + final AtomicBoolean shutdown = new AtomicBoolean() public Core(MuWireSettings props, File home, String myVersion) { this.home = home this.muOptions = props - log.info "Initializing I2P context" - I2PAppContext.getGlobalContext().logManager() - I2PAppContext.getGlobalContext()._logManager = new MuWireLogManager() + + if (!props.embeddedRouter) { + log.info "Initializing I2P context" + I2PAppContext.getGlobalContext().logManager() + I2PAppContext.getGlobalContext()._logManager = new MuWireLogManager() + router = null + } else { + log.info("launching embedded router") + Properties routerProps = new Properties() + props.putAt("i2p.dir.config", home.getAbsolutePath()) + router = new Router(routerProps) + router.getContext().logManager() + router.getContext()._logManager = new MuWireLogManager() + router.runRouter() + } log.info("initializing I2P socket manager") def i2pClient = new I2PClientFactory().createClient() @@ -245,6 +261,10 @@ public class Core { } public void startServices() { + if (router != null) { + while(!router.isRunning()) + Thread.sleep(100) + } hasherService.start() trustService.start() trustService.waitForLoad() @@ -272,6 +292,10 @@ public class Core { directoryWatcher.stop() log.info("shutting down connection manager") connectionManager.shutdown() + if (router != null) { + log.info("shutting down embedded router") + router.shutdown(0) + } } static main(args) { diff --git a/core/src/main/groovy/com/muwire/core/MuWireSettings.groovy b/core/src/main/groovy/com/muwire/core/MuWireSettings.groovy index b4546a48..d5081934 100644 --- a/core/src/main/groovy/com/muwire/core/MuWireSettings.groovy +++ b/core/src/main/groovy/com/muwire/core/MuWireSettings.groovy @@ -21,6 +21,7 @@ class MuWireSettings { float downloadSequentialRatio int hostClearInterval int meshExpiration + boolean embeddedRouter MuWireSettings() { this(new Properties()) @@ -39,6 +40,7 @@ class MuWireSettings { downloadSequentialRatio = Float.valueOf(props.getProperty("downloadSequentialRatio","0.8")) hostClearInterval = Integer.valueOf(props.getProperty("hostClearInterval","60")) meshExpiration = Integer.valueOf(props.getProperty("meshExpiration","60")) + embeddedRouter = Boolean.valueOf(props.getProperty("embeddedRouter","false")) watchedDirectories = new HashSet<>() if (props.containsKey("watchedDirectories")) { @@ -61,6 +63,7 @@ class MuWireSettings { props.setProperty("downloadSequentialRatio", String.valueOf(downloadSequentialRatio)) props.setProperty("hostClearInterval", String.valueOf(hostClearInterval)) props.setProperty("meshExpiration", String.valueOf(meshExpiration)) + props.setProperty("embeddedRouter", String.valueOf(embeddedRouter)) if (!watchedDirectories.isEmpty()) { String encoded = watchedDirectories.stream().