2018-07-13 06:30:16 +00:00
|
|
|
#include "RouterTask.h"
|
|
|
|
|
|
|
|
#include <dispatch/dispatch.h>
|
|
|
|
#include <future>
|
|
|
|
#include <stdlib.h>
|
|
|
|
|
2018-09-18 15:39:32 +00:00
|
|
|
#ifdef __cplusplus
|
|
|
|
#include "include/subprocess.hpp"
|
|
|
|
#import "I2PLauncher-Swift.h"
|
|
|
|
#include "AppDelegate.h"
|
|
|
|
#endif
|
2018-09-20 03:20:39 +00:00
|
|
|
|
2018-09-18 15:39:32 +00:00
|
|
|
#include "include/PidWatcher.h"
|
2018-07-13 06:30:16 +00:00
|
|
|
|
|
|
|
#import <AppKit/AppKit.h>
|
2018-09-18 15:39:32 +00:00
|
|
|
#import <Foundation/Foundation.h>
|
2018-07-13 06:30:16 +00:00
|
|
|
|
|
|
|
@implementation RTaskOptions
|
|
|
|
@end
|
|
|
|
|
2018-07-24 16:26:40 +00:00
|
|
|
@implementation I2PRouterTask
|
2018-07-13 06:30:16 +00:00
|
|
|
|
2018-07-13 09:11:46 +00:00
|
|
|
|
2018-07-24 16:26:40 +00:00
|
|
|
- (void)routerStdoutData:(NSNotification *)notification
|
|
|
|
{
|
|
|
|
NSLog(@"%@", [[NSString alloc] initWithData:[notification.object availableData] encoding:NSUTF8StringEncoding]);
|
|
|
|
[notification.object waitForDataInBackgroundAndNotify];
|
|
|
|
}
|
|
|
|
|
2018-07-13 06:30:16 +00:00
|
|
|
- (instancetype) initWithOptions : (RTaskOptions*) options
|
|
|
|
{
|
2018-09-18 15:39:32 +00:00
|
|
|
self.userRequestedRestart = NO;
|
|
|
|
self.isRouterRunning = NO;
|
|
|
|
self.input = [NSFileHandle fileHandleWithStandardInput];
|
|
|
|
self.routerTask = [NSTask new];
|
|
|
|
self.processPipe = [NSPipe new];
|
|
|
|
[self.routerTask setLaunchPath:options.binPath];
|
|
|
|
[self.routerTask setArguments:options.arguments];
|
|
|
|
NSDictionary *envDict = @{
|
|
|
|
@"I2PBASE": options.i2pBaseDir
|
|
|
|
};
|
|
|
|
[self.routerTask setEnvironment: envDict];
|
|
|
|
NSLog(@"Using environment variables: %@", envDict);
|
|
|
|
[self.routerTask setStandardOutput:self.processPipe];
|
2018-07-13 06:30:16 +00:00
|
|
|
[self.routerTask setStandardError:self.processPipe];
|
2018-07-24 16:26:40 +00:00
|
|
|
|
|
|
|
NSFileHandle *stdoutFileHandle = [self.processPipe fileHandleForReading];
|
|
|
|
[[NSNotificationCenter defaultCenter] addObserver:self
|
|
|
|
selector:@selector(routerStdoutData:)
|
|
|
|
name:NSFileHandleDataAvailableNotification
|
|
|
|
object:stdoutFileHandle];
|
|
|
|
|
2018-09-19 17:00:17 +00:00
|
|
|
[stdoutFileHandle waitForDataInBackgroundAndNotify];
|
|
|
|
|
|
|
|
[self.routerTask setTerminationHandler:^(NSTask* task) {
|
2018-09-20 03:20:39 +00:00
|
|
|
// Cleanup
|
2018-09-19 17:00:17 +00:00
|
|
|
NSLog(@"termHandler triggered!");
|
|
|
|
auto swiftRouterStatus = [[RouterProcessStatus alloc] init];
|
2018-09-20 03:20:39 +00:00
|
|
|
[swiftRouterStatus setRouterStatus: false];
|
|
|
|
[swiftRouterStatus setRouterRanByUs: false];
|
2018-09-19 17:00:17 +00:00
|
|
|
sendUserNotification(APP_IDSTR, @"I2P Router has stopped");
|
|
|
|
}];
|
2018-07-13 06:30:16 +00:00
|
|
|
return self;
|
|
|
|
}
|
|
|
|
|
2018-07-13 09:11:46 +00:00
|
|
|
- (void) requestShutdown
|
|
|
|
{
|
|
|
|
[self.routerTask interrupt];
|
|
|
|
}
|
|
|
|
|
|
|
|
- (void) requestRestart
|
|
|
|
{
|
2018-07-24 16:26:40 +00:00
|
|
|
self.userRequestedRestart = YES;
|
|
|
|
kill([self.routerTask processIdentifier], SIGHUP);
|
2018-07-13 09:11:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
- (BOOL) isRunning
|
|
|
|
{
|
|
|
|
return self.routerTask.running;
|
|
|
|
}
|
|
|
|
|
2018-07-13 06:30:16 +00:00
|
|
|
- (int) execute
|
|
|
|
{
|
2018-07-24 16:26:40 +00:00
|
|
|
@try {
|
2018-09-20 03:20:39 +00:00
|
|
|
[self.routerTask launch];
|
|
|
|
watchPid([self.routerTask processIdentifier]);
|
|
|
|
self.isRouterRunning = YES;
|
|
|
|
return 1;
|
2018-07-24 16:26:40 +00:00
|
|
|
}
|
2018-07-13 06:30:16 +00:00
|
|
|
@catch (NSException *e)
|
|
|
|
{
|
|
|
|
NSLog(@"Expection occurred %@", [e reason]);
|
2018-09-20 03:20:39 +00:00
|
|
|
auto swiftRouterStatus = [[RouterProcessStatus alloc] init];
|
|
|
|
[swiftRouterStatus setRouterStatus: false];
|
|
|
|
[swiftRouterStatus setRouterRanByUs: false];
|
|
|
|
sendUserNotification(@"An error occured, can't start the I2P Router", [e reason]);
|
|
|
|
return 0;
|
2018-07-24 16:26:40 +00:00
|
|
|
}
|
2018-07-13 06:30:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
- (int) getPID
|
|
|
|
{
|
2018-09-20 03:20:39 +00:00
|
|
|
return [self.routerTask processIdentifier];
|
2018-07-13 06:30:16 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
@end
|