Mac OS X Launcher: Changes in path lookups (many via Preferences), launchd template changes and java arguments for the router itself.

This commit is contained in:
meeh
2018-12-08 09:12:24 +00:00
parent f4496a0c4c
commit a0d356bc56
4 changed files with 51 additions and 34 deletions

View File

@ -8,6 +8,7 @@
import Foundation import Foundation
@objc class DetectJava : NSObject { @objc class DetectJava : NSObject {
static var hasJRE : Bool = false static var hasJRE : Bool = false

View File

@ -19,13 +19,14 @@ class RouterManager : NSObject {
// MARK: - Properties // MARK: - Properties
static let packedVersion : String = "0.9.37" static let packedVersion : String = NSDEF_I2P_VERSION
let eventManager = EventManager() let eventManager = EventManager()
let routerRunner = RouterRunner() let routerRunner = RouterRunner()
var logViewStorage: NSTextStorage? var logViewStorage: NSTextStorage?
var lastRouterPid : String? = nil var lastRouterPid : String? = nil
private var canRouterStart : Bool = false
private static func handleRouterException(information:Any?) { private static func handleRouterException(information:Any?) {
Logger.MLog(level:1,"event! - handle router exception") 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_version", action: handleRouterVersion)
routerManager.eventManager.listenTo(eventName: "router_exception", action: handleRouterException) routerManager.eventManager.listenTo(eventName: "router_exception", action: handleRouterException)
routerManager.eventManager.listenTo(eventName: "router_already_running", action: handleRouterAlreadyStarted) 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: "router_can_setup", action: routerManager.routerRunner.SetupAgent)
//routerManager.eventManager.listenTo(eventName: "launch_agent_running", action: routerManager.routerRunner.onLoadedAgent) //routerManager.eventManager.listenTo(eventName: "launch_agent_running", action: routerManager.routerRunner.onLoadedAgent)
@ -151,6 +152,22 @@ class RouterManager : NSObject {
return sharedRouterManager 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) { func setRouterTask(router: I2PRouterTask) {
self.routerInstance = router self.routerInstance = router
} }

View File

@ -51,7 +51,7 @@ extension RouterProcessStatus {
static var isRouterChildProcess : Bool = (RouterManager.shared().getRouterTask() != nil) static var isRouterChildProcess : Bool = (RouterManager.shared().getRouterTask() != nil)
static var routerVersion : String? = Optional.none static var routerVersion : String? = Optional.none
static var routerStartedAt : Date? = Optional.none static var routerStartedAt : Date? = Optional.none
static var i2pDirectoryPath : String = NSHomeDirectory() + "/Library/I2P" static var i2pDirectoryPath : String = Preferences.shared().i2pBaseDirectory
} }

View File

@ -20,20 +20,11 @@ class RouterRunner: NSObject {
var currentRunningProcess: Subprocess? var currentRunningProcess: Subprocess?
var currentProcessResults: ExecutionResult? 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 appSupportPath = FileManager.default.urls(for: FileManager.SearchPathDirectory.applicationSupportDirectory, in: FileManager.SearchPathDomainMask.userDomainMask)
let defaultJavaHomeArgs:[String] = [
"-v",
"1.7+",
"--exec",
"java",
]
let appSupportPath = FileManager.default.urls(for: FileManager.SearchPathDirectory.applicationSupportDirectory, in: FileManager.SearchPathDomainMask.userDomainMask)
override init() { override init() {
super.init() super.init()
@ -59,22 +50,24 @@ class RouterRunner: NSObject {
func SetupAndReturnAgent() -> LaunchAgent { func SetupAndReturnAgent() -> LaunchAgent {
let applicationsSupportPath: URL = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask).first!
let defaultStartupFlags:[String] = [ let defaultStartupFlags:[String] = [
"-Xmx512M",
"-Xms128m",
"-Djava.awt.headless=true", "-Djava.awt.headless=true",
"".appendingFormat("-Di2p.base.dir=%@", NSHomeDirectory()+"/Library/I2P"), "".appendingFormat("-Di2p.base.dir=%@", Preferences.shared().i2pBaseDirectory),
"".appendingFormat("-Dwrapper.logfile=%@/Library/I2P/router.log", NSHomeDirectory()), "".appendingFormat("-Dwrapper.logfile=%@/i2p/router.log", applicationsSupportPath.absoluteString),
"-Dwrapper.logfile.loglevel=DEBUG", "".appendingFormat("-Dwrapper.java.pidfile=%@/i2p/router.pid", applicationsSupportPath.absoluteString),
"".appendingFormat("-Dwrapper.java.pidfile=%@/i2p/router.pid", appSupportPath.description), "-Dwrapper.logfile.loglevel=DEBUG", // TODO: Allow loglevel to be set from Preferences?
"-Dwrapper.console.loglevel=DEBUG", "-Dwrapper.console.loglevel=DEBUG",
"net.i2p.router.Router" "net.i2p.router.Router"
] ]
self.daemonPath = self.defaultStartupCommand let javaCliArgs = Preferences.shared().javaCommandPath.splitByWhitespace()
self.daemonPath = javaCliArgs[0]
self.arguments = defaultStartupFlags.joined(separator: " ") self.arguments = defaultStartupFlags.joined(separator: " ")
let basePath = NSHomeDirectory()+"/Library/I2P" let basePath = Preferences.shared().i2pBaseDirectory
let jars = try! FileManager.default.contentsOfDirectory(atPath: basePath+"/lib") let jars = try! FileManager.default.contentsOfDirectory(atPath: basePath+"/lib")
var classpath:String = "." var classpath:String = "."
@ -85,19 +78,21 @@ class RouterRunner: NSObject {
var cliArgs:[String] = [ var cliArgs:[String] = [
self.daemonPath!, self.daemonPath!,
] ]
cliArgs.append(contentsOf: self.defaultJavaHomeArgs) cliArgs.append(contentsOf: javaCliArgs.dropFirst())
cliArgs.append(contentsOf: [ cliArgs.append(contentsOf: [
"-cp", "-cp",
classpath, classpath,
]) ])
// This allow java arguments to be passed from the settings
cliArgs.append(contentsOf: Preferences.shared().javaCommandOptions.splitByWhitespace())
cliArgs.append(contentsOf: defaultStartupFlags) cliArgs.append(contentsOf: defaultStartupFlags)
let agent = LaunchAgent(label: self.domainLabel,program: cliArgs) let agent = LaunchAgent(label: self.domainLabel,program: cliArgs)
agent.launchOnlyOnce = false agent.launchOnlyOnce = false
agent.keepAlive = false agent.keepAlive = false
agent.workingDirectory = basePath agent.workingDirectory = basePath
agent.userName = NSUserName() agent.userName = NSUserName()
agent.standardErrorPath = NSHomeDirectory()+"/Library/Logs/I2P/router.stderr.log" agent.standardErrorPath = NSString(format: "%@/router.stderr.log", Preferences.shared().i2pLogDirectory) as String
agent.standardOutPath = NSHomeDirectory()+"/Library/Logs/I2P/router.stdout.log" agent.standardOutPath = NSString(format: "%@/router.stdout.log", Preferences.shared().i2pLogDirectory) as String
agent.environmentVariables = [ agent.environmentVariables = [
"PATH": "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin", "PATH": "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin",
"I2PBASE": basePath, "I2PBASE": basePath,
@ -106,12 +101,12 @@ class RouterRunner: NSObject {
agent.processType = ProcessType.adaptive agent.processType = ProcessType.adaptive
RouterRunner.launchAgent = agent RouterRunner.launchAgent = agent
let userPreferences = UserDefaults.standard // NOTE: I suspect this is better to solve in the application
let shouldStartupAtLogin = userPreferences.bool(forKey: "startRouterAtLogin") agent.runAtLoad = false //Preferences.shared().startRouterOnLauncherStart
agent.runAtLoad = shouldStartupAtLogin
agent.keepAlive = true agent.keepAlive = true
DispatchQueue(label: "background_starter").async { DispatchQueue(label: "background_starter").async {
do { do {
// TODO: Find a better way than sleep
try LaunchAgentManager.shared.write(agent, called: self.plistName) try LaunchAgentManager.shared.write(agent, called: self.plistName)
sleep(1) sleep(1)
try LaunchAgentManager.shared.load(agent) try LaunchAgentManager.shared.load(agent)
@ -140,12 +135,16 @@ class RouterRunner: NSObject {
func StartAgent(_ information:Any? = nil) { func StartAgent(_ information:Any? = nil) {
if (RouterManager.shared().checkIfRouterCanStart()) {
let agent = RouterRunner.launchAgent ?? information as! LaunchAgent let agent = RouterRunner.launchAgent ?? information as! LaunchAgent
DispatchQueue(label: "background_block").async { DispatchQueue(label: "background_block").async {
LaunchAgentManager.shared.start(agent, { (proc) in LaunchAgentManager.shared.start(agent, { (proc) in
NSLog("Will call onLaunchdStarted") 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.")
}
} }
func StopAgent(_ callback: @escaping () -> () = {}) { func StopAgent(_ callback: @escaping () -> () = {}) {