diff --git a/launchers/macosx/I2PLauncher/routermgmt/DetectJava.swift b/launchers/macosx/I2PLauncher/routermgmt/DetectJava.swift index 051206c004a1d398d7459e2d2f46aad361998f68..4bbacd093b4415a9a2a258a934e645e1d1524059 100644 --- a/launchers/macosx/I2PLauncher/routermgmt/DetectJava.swift +++ b/launchers/macosx/I2PLauncher/routermgmt/DetectJava.swift @@ -8,6 +8,7 @@ import Foundation + @objc class DetectJava : NSObject { static var hasJRE : Bool = false diff --git a/launchers/macosx/I2PLauncher/routermgmt/RouterManager.swift b/launchers/macosx/I2PLauncher/routermgmt/RouterManager.swift index 4776b84a377cd64c707a9a48f747ab67d28a14ec..6cb58a9f488a9a3d093cd9ab3f4d1b40a94a74f2 100644 --- a/launchers/macosx/I2PLauncher/routermgmt/RouterManager.swift +++ b/launchers/macosx/I2PLauncher/routermgmt/RouterManager.swift @@ -19,13 +19,14 @@ class RouterManager : NSObject { // MARK: - Properties - static let packedVersion : String = "0.9.37" + static let packedVersion : String = NSDEF_I2P_VERSION let eventManager = EventManager() let routerRunner = RouterRunner() var logViewStorage: NSTextStorage? var lastRouterPid : String? = nil + private var canRouterStart : Bool = false private static func handleRouterException(information:Any?) { Logger.MLog(level:1,"event! - handle router exception") @@ -93,7 +94,7 @@ class RouterManager : NSObject { routerManager.eventManager.listenTo(eventName: "router_version", action: handleRouterVersion) routerManager.eventManager.listenTo(eventName: "router_exception", action: handleRouterException) routerManager.eventManager.listenTo(eventName: "router_already_running", action: handleRouterAlreadyStarted) - routerManager.eventManager.listenTo(eventName: "router_can_start", action: routerManager.routerRunner.StartAgent) + routerManager.eventManager.listenTo(eventName: "router_can_start", action: routerManager.setLauncherReadyToStartRouter) routerManager.eventManager.listenTo(eventName: "router_can_setup", action: routerManager.routerRunner.SetupAgent) //routerManager.eventManager.listenTo(eventName: "launch_agent_running", action: routerManager.routerRunner.onLoadedAgent) @@ -151,6 +152,22 @@ class RouterManager : NSObject { return sharedRouterManager } + func setLauncherReadyToStartRouter(_ information: Any?) { + self.canRouterStart = true + if (Preferences.shared().startRouterOnLauncherStart) { + // Trigger the actual start at launch time + print("Start router on launch preference is enabled - Starting") + self.routerRunner.StartAgent(information) + } else { + print("Start router on launch preference is disabled - Router ready when user are!") + SBridge.sendUserNotification("I2P Router Ready", formattedMsg: "The I2P Router is ready to be launched, however the autostart is disabled and require user input to start.") + } + } + + func checkIfRouterCanStart() -> Bool { + return self.canRouterStart + } + func setRouterTask(router: I2PRouterTask) { self.routerInstance = router } diff --git a/launchers/macosx/I2PLauncher/routermgmt/RouterProcessStatus.swift b/launchers/macosx/I2PLauncher/routermgmt/RouterProcessStatus.swift index ca1abd0b83dd1c9e14a2156ae7fe9968eab37e3b..618190176654cc34892ac57347b77ae4f8e6ed4e 100644 --- a/launchers/macosx/I2PLauncher/routermgmt/RouterProcessStatus.swift +++ b/launchers/macosx/I2PLauncher/routermgmt/RouterProcessStatus.swift @@ -51,7 +51,7 @@ extension RouterProcessStatus { static var isRouterChildProcess : Bool = (RouterManager.shared().getRouterTask() != nil) static var routerVersion : String? = Optional.none static var routerStartedAt : Date? = Optional.none - static var i2pDirectoryPath : String = NSHomeDirectory() + "/Library/I2P" + static var i2pDirectoryPath : String = Preferences.shared().i2pBaseDirectory } diff --git a/launchers/macosx/I2PLauncher/routermgmt/RouterRunner.swift b/launchers/macosx/I2PLauncher/routermgmt/RouterRunner.swift index 3f11a0c9a9b4f364380e78b3fad2fd492ab75f63..22c2730a1c93ec3486fa2609fcd8f3ec933af141 100644 --- a/launchers/macosx/I2PLauncher/routermgmt/RouterRunner.swift +++ b/launchers/macosx/I2PLauncher/routermgmt/RouterRunner.swift @@ -20,20 +20,11 @@ class RouterRunner: NSObject { var currentRunningProcess: Subprocess? var currentProcessResults: ExecutionResult? - let domainLabel = "net.i2p.macosx.I2PRouter" + let domainLabel = String(NSString(format: "%@.I2PRouter", APPDOMAIN)) - let plistName = "net.i2p.macosx.I2PRouter.plist" + let plistName = String(NSString(format: "%@.I2PRouter.plist", APPDOMAIN)) - let defaultStartupCommand:String = "/usr/libexec/java_home" - - let defaultJavaHomeArgs:[String] = [ - "-v", - "1.7+", - "--exec", - "java", - ] - - let appSupportPath = FileManager.default.urls(for: FileManager.SearchPathDirectory.applicationSupportDirectory, in: FileManager.SearchPathDomainMask.userDomainMask) + //let appSupportPath = FileManager.default.urls(for: FileManager.SearchPathDirectory.applicationSupportDirectory, in: FileManager.SearchPathDomainMask.userDomainMask) override init() { super.init() @@ -59,22 +50,24 @@ class RouterRunner: NSObject { func SetupAndReturnAgent() -> LaunchAgent { + let applicationsSupportPath: URL = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first! + let defaultStartupFlags:[String] = [ - "-Xmx512M", - "-Xms128m", "-Djava.awt.headless=true", - "".appendingFormat("-Di2p.base.dir=%@", NSHomeDirectory()+"/Library/I2P"), - "".appendingFormat("-Dwrapper.logfile=%@/Library/I2P/router.log", NSHomeDirectory()), - "-Dwrapper.logfile.loglevel=DEBUG", - "".appendingFormat("-Dwrapper.java.pidfile=%@/i2p/router.pid", appSupportPath.description), + "".appendingFormat("-Di2p.base.dir=%@", Preferences.shared().i2pBaseDirectory), + "".appendingFormat("-Dwrapper.logfile=%@/i2p/router.log", applicationsSupportPath.absoluteString), + "".appendingFormat("-Dwrapper.java.pidfile=%@/i2p/router.pid", applicationsSupportPath.absoluteString), + "-Dwrapper.logfile.loglevel=DEBUG", // TODO: Allow loglevel to be set from Preferences? "-Dwrapper.console.loglevel=DEBUG", "net.i2p.router.Router" ] - self.daemonPath = self.defaultStartupCommand + let javaCliArgs = Preferences.shared().javaCommandPath.splitByWhitespace() + + self.daemonPath = javaCliArgs[0] self.arguments = defaultStartupFlags.joined(separator: " ") - let basePath = NSHomeDirectory()+"/Library/I2P" + let basePath = Preferences.shared().i2pBaseDirectory let jars = try! FileManager.default.contentsOfDirectory(atPath: basePath+"/lib") var classpath:String = "." @@ -85,19 +78,21 @@ class RouterRunner: NSObject { var cliArgs:[String] = [ self.daemonPath!, ] - cliArgs.append(contentsOf: self.defaultJavaHomeArgs) + cliArgs.append(contentsOf: javaCliArgs.dropFirst()) cliArgs.append(contentsOf: [ "-cp", classpath, ]) + // This allow java arguments to be passed from the settings + cliArgs.append(contentsOf: Preferences.shared().javaCommandOptions.splitByWhitespace()) cliArgs.append(contentsOf: defaultStartupFlags) let agent = LaunchAgent(label: self.domainLabel,program: cliArgs) agent.launchOnlyOnce = false agent.keepAlive = false agent.workingDirectory = basePath agent.userName = NSUserName() - agent.standardErrorPath = NSHomeDirectory()+"/Library/Logs/I2P/router.stderr.log" - agent.standardOutPath = NSHomeDirectory()+"/Library/Logs/I2P/router.stdout.log" + agent.standardErrorPath = NSString(format: "%@/router.stderr.log", Preferences.shared().i2pLogDirectory) as String + agent.standardOutPath = NSString(format: "%@/router.stdout.log", Preferences.shared().i2pLogDirectory) as String agent.environmentVariables = [ "PATH": "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin", "I2PBASE": basePath, @@ -106,12 +101,12 @@ class RouterRunner: NSObject { agent.processType = ProcessType.adaptive RouterRunner.launchAgent = agent - let userPreferences = UserDefaults.standard - let shouldStartupAtLogin = userPreferences.bool(forKey: "startRouterAtLogin") - agent.runAtLoad = shouldStartupAtLogin + // NOTE: I suspect this is better to solve in the application + agent.runAtLoad = false //Preferences.shared().startRouterOnLauncherStart agent.keepAlive = true DispatchQueue(label: "background_starter").async { do { + // TODO: Find a better way than sleep try LaunchAgentManager.shared.write(agent, called: self.plistName) sleep(1) try LaunchAgentManager.shared.load(agent) @@ -140,11 +135,15 @@ class RouterRunner: NSObject { func StartAgent(_ information:Any? = nil) { - let agent = RouterRunner.launchAgent ?? information as! LaunchAgent - DispatchQueue(label: "background_block").async { - LaunchAgentManager.shared.start(agent, { (proc) in - NSLog("Will call onLaunchdStarted") - }) + if (RouterManager.shared().checkIfRouterCanStart()) { + let agent = RouterRunner.launchAgent ?? information as! LaunchAgent + DispatchQueue(label: "background_block").async { + LaunchAgentManager.shared.start(agent, { (proc) in + NSLog("Will call onLaunchdStarted") + }) + } + } else { + SBridge.sendUserNotification("Whops! Please wait", formattedMsg: "I'm sorry but it's still something unresolved before we can start the I2P router. Please wait.") } }