forked from I2P_Developers/i2p.i2p
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:
@ -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
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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 () -> () = {}) {
|
||||||
|
Reference in New Issue
Block a user