2018-09-22 22:13:40 +00:00
//
// R o u t e r M a n a g e r . s w i f t
// I 2 P L a u n c h e r
//
// C r e a t e d b y M i k a l V i l l a o n 2 2 / 0 9 / 2 0 1 8 .
// C o p y r i g h t © 2 0 1 8 T h e I 2 P P r o j e c t . A l l r i g h t s r e s e r v e d .
//
import Foundation
2018-09-26 20:42:58 +00:00
enum ErrorsInRouterMgmr : Swift . Error {
case NoJavaFound
case InvalidVersion
case NotFound
}
2018-09-22 22:13:40 +00:00
class RouterManager : NSObject {
// MARK: - P r o p e r t i e s
2018-12-08 09:12:24 +00:00
static let packedVersion : String = NSDEF_I2P_VERSION
2018-09-22 22:13:40 +00:00
let eventManager = EventManager ( )
2018-10-11 16:59:59 +00:00
let routerRunner = RouterRunner ( )
2018-09-22 22:13:40 +00:00
var logViewStorage : NSTextStorage ?
2018-10-13 03:54:01 +00:00
var lastRouterPid : String ? = nil
2018-12-08 09:12:24 +00:00
private var canRouterStart : Bool = false
2018-09-22 22:13:40 +00:00
2018-09-26 20:42:58 +00:00
private static func handleRouterException ( information : Any ? ) {
2018-10-11 16:59:59 +00:00
Logger . MLog ( level : 1 , " event! - handle router exception " )
Logger . MLog ( level : 1 , information as ! String )
2018-09-26 20:42:58 +00:00
}
2018-09-22 22:13:40 +00:00
private static func handleRouterStart ( information : Any ? ) {
2018-10-11 16:59:59 +00:00
Logger . MLog ( level : 1 , " event! - handle router start " )
2018-09-22 22:13:40 +00:00
RouterProcessStatus . routerStartedAt = Date ( )
RouterProcessStatus . isRouterChildProcess = true
RouterProcessStatus . isRouterRunning = true
}
2018-10-11 16:59:59 +00:00
private static func handleRouterAlreadyStarted ( information : Any ? ) {
Logger . MLog ( level : 1 , " event! - handle router already started " ) ;
}
2018-09-22 22:13:40 +00:00
private static func handleRouterStop ( information : Any ? ) {
2018-10-11 16:59:59 +00:00
Logger . MLog ( level : 1 , " event! - handle router stop " )
// TODO: D o u b l e c h e c k , c h e c k i f p i d s t o r e d e x i s t s
2018-09-22 22:13:40 +00:00
RouterProcessStatus . routerStartedAt = nil
RouterProcessStatus . isRouterChildProcess = false
RouterProcessStatus . isRouterRunning = false
}
private static func handleRouterPid ( information : Any ? ) {
2018-10-11 16:59:59 +00:00
Logger . MLog ( level : 1 , " " . appendingFormat ( " event! - handle router pid: " , information as ! String ! ) )
if ( information != nil ) {
let intPid = Int ( information as ! String )
}
2018-09-22 22:13:40 +00:00
}
private static func handleRouterVersion ( information : Any ? ) {
2018-09-26 20:42:58 +00:00
do {
2018-10-11 16:59:59 +00:00
Logger . MLog ( level : 1 , " " . appendingFormat ( " event! - handle router version: " , information as ! String ! ) )
2018-09-26 20:42:58 +00:00
guard let currentVersion : String = information as ? String else {
throw ErrorsInRouterMgmr . InvalidVersion
}
if ( currentVersion = = " Unknown " ) {
throw ErrorsInRouterMgmr . InvalidVersion
}
if ( packedVersion . compare ( currentVersion , options : . numeric ) = = . orderedDescending ) {
2018-10-11 16:59:59 +00:00
Logger . MLog ( level : 1 , " event! - router version: Packed version is newer, gonna re-deploy " )
2018-09-26 20:42:58 +00:00
RouterManager . shared ( ) . eventManager . trigger ( eventName : " router_must_upgrade " , information : " got new version " )
} else {
2018-10-11 16:59:59 +00:00
Logger . MLog ( level : 1 , " event! - router version: No update needed " )
RouterManager . shared ( ) . eventManager . trigger ( eventName : " router_can_setup " , information : " all ok " )
2018-09-26 20:42:58 +00:00
}
} catch ErrorsInRouterMgmr . InvalidVersion {
// T h i s i s m o s t l i k e l y d u e t o a n e a r l i e r e x t r a c t g o t k i l l e d h a l f w a y o r s o m e t h i n g
// T r i g g e r a n u p d a t e
RouterManager . shared ( ) . eventManager . trigger ( eventName : " router_must_upgrade " , information : " invalid version found " )
} catch {
// W T F
NSLog ( " Fatal error in RouterManager " ) ;
print ( error )
2018-09-22 22:13:40 +00:00
}
}
private static var sharedRouterManager : RouterManager = {
2018-10-11 16:59:59 +00:00
let routerManager = RouterManager ( detectJavaInstance : DetectJava . shared ( ) )
2018-09-22 22:13:40 +00:00
// C o n f i g u r a t i o n
// . . .
routerManager . updateState ( )
routerManager . eventManager . listenTo ( eventName : " router_start " , action : handleRouterStart )
routerManager . eventManager . listenTo ( eventName : " router_stop " , action : handleRouterStop )
routerManager . eventManager . listenTo ( eventName : " router_pid " , action : handleRouterPid )
routerManager . eventManager . listenTo ( eventName : " router_version " , action : handleRouterVersion )
2018-09-26 20:42:58 +00:00
routerManager . eventManager . listenTo ( eventName : " router_exception " , action : handleRouterException )
2018-10-11 16:59:59 +00:00
routerManager . eventManager . listenTo ( eventName : " router_already_running " , action : handleRouterAlreadyStarted )
2018-12-08 09:12:24 +00:00
routerManager . eventManager . listenTo ( eventName : " router_can_start " , action : routerManager . setLauncherReadyToStartRouter )
2018-10-11 16:59:59 +00:00
routerManager . eventManager . listenTo ( eventName : " router_can_setup " , action : routerManager . routerRunner . SetupAgent )
2018-10-13 03:54:01 +00:00
// r o u t e r M a n a g e r . e v e n t M a n a g e r . l i s t e n T o ( e v e n t N a m e : " l a u n c h _ a g e n t _ r u n n i n g " , a c t i o n : r o u t e r M a n a g e r . r o u t e r R u n n e r . o n L o a d e d A g e n t )
routerManager . eventManager . listenTo ( eventName : " launch_agent_running " , action : {
let agent = RouterRunner . launchAgent !
let agentStatus = agent . status ( )
switch agentStatus {
case . running ( let pid ) :
DispatchQueue . main . async {
routerManager . eventManager . trigger ( eventName : " router_start " , information : String ( pid ) )
routerManager . routerRunner . routerStatus . setRouterStatus ( true )
routerManager . routerRunner . routerStatus . setRouterRanByUs ( true )
routerManager . eventManager . trigger ( eventName : " router_pid " , information : String ( pid ) )
}
break
default :
NSLog ( " wtf, agent status = \( agentStatus ) " )
break
}
} )
2018-09-22 22:13:40 +00:00
return routerManager
} ( )
// MARK: -
let detectJava : DetectJava
private var routerInstance : I2PRouterTask ? {
// C a l l e d a f t e r t h e c h a n g e
didSet {
print ( " RouterManager.routerInstance did change to " , self . routerInstance ? ? " null " )
if ( self . routerInstance != nil ) {
RouterProcessStatus . isRouterRunning = ( self . routerInstance ? . isRouterRunning ) !
}
}
} ;
// I n i t i a l i z a t i o n
private init ( detectJavaInstance : DetectJava ) {
self . detectJava = detectJavaInstance
}
// MARK: - A c c e s s o r s
2018-10-11 16:59:59 +00:00
static func logInfo ( format : String , messages : String . . . ) {
// S B r i d g e . s h a r e d I n s t a n c e ( ) . l o g M e s s a g e W i t h F o r m a t ( 0 , f o r m a t , m e s s a g e s ) f u n c k ( _ x : I n t 3 2 , _ p a r a m s : S t r i n g . . . ) {
/* w i t h V a L i s t ( m e s s a g e s ) {
genericLogger ( x , $0 )
} */
}
2018-09-22 22:13:40 +00:00
class func shared ( ) -> RouterManager {
return sharedRouterManager
}
2018-12-08 09:12:24 +00:00
func setLauncherReadyToStartRouter ( _ information : Any ? ) {
self . canRouterStart = true
if ( Preferences . shared ( ) . startRouterOnLauncherStart ) {
// T r i g g e r t h e a c t u a l s t a r t a t l a u n c h t i m e
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
}
2018-09-22 22:13:40 +00:00
func setRouterTask ( router : I2PRouterTask ) {
self . routerInstance = router
}
func getRouterTask ( ) -> I2PRouterTask ? {
return self . routerInstance
}
func updateState ( ) {
self . routerInstance = SBridge . sharedInstance ( ) ? . currentRouterInstance
}
}