From d57d31e6e1f8e746d1f1abece3a8364f8a96a477 Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Tue, 15 Sep 2015 14:21:33 -0700 Subject: [PATCH 1/7] WIP upgrade --- osx/installerplugins/common/bugsnag.h | 54 +++++ osx/installerplugins/common/mixpanel.h | 19 +- osx/installerplugins/common/utils.h | 36 ++++ .../project.pbxproj | 87 +------- .../Base.lproj/managevmplugin.xib | 39 ++-- .../managevmplugin/managevmpluginPane.h | 4 +- .../managevmplugin/managevmpluginPane.m | 198 +++++++++++++----- .../overviewplugin/overviewpluginPane.m | 8 +- .../managevmplugin.bundle/Contents/Info.plist | 2 +- .../Contents/MacOS/managevmplugin | Bin 44132 -> 50308 bytes .../Resources/Base.lproj/managevmplugin.nib | Bin 14477 -> 13048 bytes .../overviewplugin.bundle/Contents/Info.plist | 2 +- .../Contents/MacOS/overviewplugin | Bin 23252 -> 23604 bytes .../Contents/Info.plist | 2 +- .../Contents/MacOS/quickstartplugin | Bin 24080 -> 24344 bytes 15 files changed, 268 insertions(+), 183 deletions(-) create mode 100644 osx/installerplugins/common/bugsnag.h create mode 100644 osx/installerplugins/common/utils.h diff --git a/osx/installerplugins/common/bugsnag.h b/osx/installerplugins/common/bugsnag.h new file mode 100644 index 0000000000..a91f0e098f --- /dev/null +++ b/osx/installerplugins/common/bugsnag.h @@ -0,0 +1,54 @@ +// +// bugsnag.h +// installerplugins +// +// Created by Jeffrey Dean Morgan on 9/12/15. +// Copyright (c) 2015 Docker Inc. All rights reserved. +// + +#ifndef installerplugins_bugsnag_h +#define installerplugins_bugsnag_h + +#import +#import "utils.h" + +@interface Bugsnag : NSObject + ++ (void) trackEvent:(NSString *)name forPane:(InstallerPane*)pane; + +@end + +@implementation Bugsnag + ++ (void) reportError:(NSString *)name forPane:(InstallerPane*)pane withProperties:(NSDictionary *)properties { + NSString *uuid = [Utils uuid]; + if (!uuid) { + return; + } + + NSString *props = @""; + for (NSString *key in properties) { + props = [props stringByAppendingFormat:@",\"%@\": \"%@\"", key, [properties objectForKey:key]]; + } + + NSString *osVersion = [@"Mac OS X " stringByAppendingString:[[[[NSProcessInfo processInfo] operatingSystemVersionString] componentsSeparatedByString:@" "] objectAtIndex:1]]; + + NSBundle* bundle = [[pane section] bundle]; + NSString* token = [bundle objectForInfoDictionaryKey:@"Bugsnag Token"]; + NSString* installerVersion = [bundle objectForInfoDictionaryKey:@"Installer Version"]; + NSString* payload = [NSString stringWithFormat:@"{\"event\": \"%@\", \"properties\": {\"token\": \"%@\", \"distinct_id\": \"%@\", \"os\": \"darwin\", \"os version\":\"%@\", \"version\": \"%@\" %@}}", name, token, uuid, osVersion, installerVersion, props]; + + NSData * data = [payload dataUsingEncoding:NSUTF8StringEncoding]; + NSString* base64Encoded = [data base64EncodedStringWithOptions:0]; + NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString: [NSString stringWithFormat:@"https://notify.bugsnag.com", base64Encoded]]]; + + NSOperationQueue *queue = [[NSOperationQueue alloc] init]; + [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {}]; +} + ++ (void) trackEvent:(NSString *)name forPane:(InstallerPane*)pane { + [self trackEvent:name forPane:pane withProperties:nil]; +} + +@end +#endif diff --git a/osx/installerplugins/common/mixpanel.h b/osx/installerplugins/common/mixpanel.h index 6847d8e9ef..03183fa051 100644 --- a/osx/installerplugins/common/mixpanel.h +++ b/osx/installerplugins/common/mixpanel.h @@ -10,6 +10,7 @@ #define installerplugins_mixpanel_h #import +#import "utils.h" @interface Mixpanel : NSObject @@ -19,28 +20,13 @@ @implementation Mixpanel -+ (NSString *) uuid { - NSString *appPath = [NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES) objectAtIndex:0]; - NSString *appDirPath = [NSString pathWithComponents:[NSArray arrayWithObjects:appPath, @"DockerToolbox", nil]]; - NSString *appFilePath = [NSString pathWithComponents:[NSArray arrayWithObjects:appDirPath, @"id", nil]]; - - NSString *uuid = [NSString stringWithContentsOfFile:appFilePath encoding:NSUTF8StringEncoding error:nil]; - if (!uuid || ![uuid length]) { - uuid = [[NSUUID UUID] UUIDString]; - [[NSFileManager defaultManager] createDirectoryAtPath:appDirPath withIntermediateDirectories:YES attributes:nil error:nil]; - [uuid writeToFile:appFilePath atomically:YES encoding:NSUTF8StringEncoding error:nil]; - } - - return uuid; -} - + (void) trackEvent:(NSString *)name forPane:(InstallerPane*)pane withProperties:(NSDictionary *)properties { BOOL trackingDisabled = [[[[pane section] sharedDictionary] objectForKey:@"disableTracking"] boolValue]; if (trackingDisabled) { return; } - NSString *uuid = [self uuid]; + NSString *uuid = [Utils uuid]; if (!uuid) { return; } @@ -63,7 +49,6 @@ NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {}]; - } + (void) trackEvent:(NSString *)name forPane:(InstallerPane*)pane { diff --git a/osx/installerplugins/common/utils.h b/osx/installerplugins/common/utils.h new file mode 100644 index 0000000000..d698276ad7 --- /dev/null +++ b/osx/installerplugins/common/utils.h @@ -0,0 +1,36 @@ +// +// uuid.h +// installerplugins +// +// Created by Jeffrey Dean Morgan on 9/14/15. +// Copyright (c) 2015 Docker Inc. All rights reserved. +// + +#ifndef installerplugins_uuid_h +#define installerplugins_uuid_h + +@interface Utils : NSObject + ++ (NSString *) uuid; + +@end + +@implementation Utils + ++ (NSString *) uuid { + NSString *appPath = [NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES) objectAtIndex:0]; + NSString *appDirPath = [NSString pathWithComponents:[NSArray arrayWithObjects:appPath, @"DockerToolbox", nil]]; + NSString *appFilePath = [NSString pathWithComponents:[NSArray arrayWithObjects:appDirPath, @"id", nil]]; + + NSString *uuid = [NSString stringWithContentsOfFile:appFilePath encoding:NSUTF8StringEncoding error:nil]; + if (!uuid || ![uuid length]) { + uuid = [[NSUUID UUID] UUIDString]; + [[NSFileManager defaultManager] createDirectoryAtPath:appDirPath withIntermediateDirectories:YES attributes:nil error:nil]; + [uuid writeToFile:appFilePath atomically:YES encoding:NSUTF8StringEncoding error:nil]; + } + + return uuid; +} + +@end +#endif diff --git a/osx/installerplugins/installerplugins.xcodeproj/project.pbxproj b/osx/installerplugins/installerplugins.xcodeproj/project.pbxproj index 11bbf9a15c..bba654e0f4 100644 --- a/osx/installerplugins/installerplugins.xcodeproj/project.pbxproj +++ b/osx/installerplugins/installerplugins.xcodeproj/project.pbxproj @@ -53,7 +53,8 @@ 1B4C91C31B85198100A06068 /* InstallerSections.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = InstallerSections.plist; sourceTree = ""; }; 1B8417E71B85261F00B1FA4D /* kitematic.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = kitematic.png; sourceTree = ""; }; 1B8417E81B85261F00B1FA4D /* quickstart.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = quickstart.png; sourceTree = ""; }; - 1B97EA281B9F674A00DBE255 /* informationplugin.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = informationplugin.bundle; path = /Users/jmorgan/workspace/toolbox/osx/installerplugins/build/Debug/informationplugin.bundle; sourceTree = ""; }; + 1BB3EBCC1BA74ABA00C2A3CF /* utils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = utils.h; path = common/utils.h; sourceTree = ""; }; + 1BB3EBCD1BA74AD300C2A3CF /* bugsnag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bugsnag.h; path = common/bugsnag.h; sourceTree = ""; }; 1BF102BB1B8BDEDA00FCB650 /* overviewplugin.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = overviewplugin.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 1BF102BE1B8BDEDA00FCB650 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 1BF102C01B8BDEDA00FCB650 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; @@ -80,13 +81,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 1BF1029B1B8B940500FCB650 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; 1BF102B81B8BDEDA00FCB650 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; @@ -138,7 +132,9 @@ 1B4C915D1B85021200A06068 /* common */ = { isa = PBXGroup; children = ( + 1BB3EBCD1BA74AD300C2A3CF /* bugsnag.h */, 1B4C915E1B85023200A06068 /* mixpanel.h */, + 1BB3EBCC1BA74ABA00C2A3CF /* utils.h */, ); name = common; sourceTree = ""; @@ -227,23 +223,6 @@ productReference = 1B4C91B31B85198100A06068 /* quickstartplugin.bundle */; productType = "com.apple.product-type.bundle"; }; - 1BF1029D1B8B940500FCB650 /* informationplugin */ = { - isa = PBXNativeTarget; - buildConfigurationList = 1BF102B21B8B940500FCB650 /* Build configuration list for PBXNativeTarget "informationplugin" */; - buildPhases = ( - 1BF1029A1B8B940500FCB650 /* Sources */, - 1BF1029B1B8B940500FCB650 /* Frameworks */, - 1BF1029C1B8B940500FCB650 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = informationplugin; - productName = informationplugin; - productReference = 1B97EA281B9F674A00DBE255 /* informationplugin.bundle */; - productType = "com.apple.product-type.bundle"; - }; 1BF102BA1B8BDEDA00FCB650 /* overviewplugin */ = { isa = PBXNativeTarget; buildConfigurationList = 1BF102CD1B8BDEDA00FCB650 /* Build configuration list for PBXNativeTarget "overviewplugin" */; @@ -276,9 +255,6 @@ 1B4C91B21B85198100A06068 = { CreatedOnToolsVersion = 6.4; }; - 1BF1029D1B8B940500FCB650 = { - CreatedOnToolsVersion = 6.4; - }; 1BF102BA1B8BDEDA00FCB650 = { CreatedOnToolsVersion = 6.4; }; @@ -299,7 +275,6 @@ targets = ( 1B4C91411B8500A700A06068 /* managevmplugin */, 1B4C91B21B85198100A06068 /* quickstartplugin */, - 1BF1029D1B8B940500FCB650 /* informationplugin */, 1BF102BA1B8BDEDA00FCB650 /* overviewplugin */, ); }; @@ -333,13 +308,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 1BF1029C1B8B940500FCB650 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; 1BF102B91B8BDEDA00FCB650 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; @@ -371,13 +339,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 1BF1029A1B8B940500FCB650 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; 1BF102B71B8BDEDA00FCB650 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -546,6 +507,7 @@ isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; GCC_PREPROCESSOR_DEFINITIONS = ( "DEBUG=1", "$(inherited)", @@ -561,6 +523,7 @@ isa = XCBuildConfiguration; buildSettings = { COMBINE_HIDPI_IMAGES = YES; + FRAMEWORK_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = managevmplugin/Info.plist; INSTALL_PATH = "$(HOME)/Library/Bundles"; PRODUCT_NAME = "$(TARGET_NAME)"; @@ -597,35 +560,6 @@ }; name = Release; }; - 1BF102B01B8B940500FCB650 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - COMBINE_HIDPI_IMAGES = YES; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = informationplugin/Info.plist; - INSTALL_PATH = "$(HOME)/Library/Bundles"; - MACOSX_DEPLOYMENT_TARGET = 10.8; - PRODUCT_NAME = "$(TARGET_NAME)"; - WRAPPER_EXTENSION = bundle; - }; - name = Debug; - }; - 1BF102B11B8B940500FCB650 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - COMBINE_HIDPI_IMAGES = YES; - DEBUG_INFORMATION_FORMAT = dwarf; - INFOPLIST_FILE = informationplugin/Info.plist; - INSTALL_PATH = "$(HOME)/Library/Bundles"; - MACOSX_DEPLOYMENT_TARGET = 10.8; - PRODUCT_NAME = "$(TARGET_NAME)"; - WRAPPER_EXTENSION = bundle; - }; - name = Release; - }; 1BF102CE1B8BDEDA00FCB650 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -685,15 +619,6 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 1BF102B21B8B940500FCB650 /* Build configuration list for PBXNativeTarget "informationplugin" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 1BF102B01B8B940500FCB650 /* Debug */, - 1BF102B11B8B940500FCB650 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; 1BF102CD1B8BDEDA00FCB650 /* Build configuration list for PBXNativeTarget "overviewplugin" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/osx/installerplugins/managevmplugin/Base.lproj/managevmplugin.xib b/osx/installerplugins/managevmplugin/Base.lproj/managevmplugin.xib index ff6c292727..0546fbb49a 100644 --- a/osx/installerplugins/managevmplugin/Base.lproj/managevmplugin.xib +++ b/osx/installerplugins/managevmplugin/Base.lproj/managevmplugin.xib @@ -1,5 +1,5 @@ - + @@ -14,10 +14,7 @@ - - - @@ -26,6 +23,7 @@ + @@ -33,16 +31,6 @@ - - - diff --git a/osx/installerplugins/managevmplugin/managevmpluginPane.h b/osx/installerplugins/managevmplugin/managevmpluginPane.h index 31a6b5e3f0..a45293841c 100644 --- a/osx/installerplugins/managevmplugin/managevmpluginPane.h +++ b/osx/installerplugins/managevmplugin/managevmpluginPane.h @@ -20,8 +20,8 @@ @property (weak) IBOutlet NSTextField *migrationStatusLabel; @property (unsafe_unretained) IBOutlet NSTextView *migrationLogsTextView; @property (weak) IBOutlet NSScrollView *migrationLogsScrollView; -@property (weak) IBOutlet NSButton *issueButton; +@property (weak) IBOutlet NSButton *submitButton; -- (IBAction)issueButtonClicked:(id)sender; +- (IBAction)submitButtonClicked:(id)sender; @end diff --git a/osx/installerplugins/managevmplugin/managevmpluginPane.m b/osx/installerplugins/managevmplugin/managevmpluginPane.m index 0372a57e49..810bbd33bf 100644 --- a/osx/installerplugins/managevmplugin/managevmpluginPane.m +++ b/osx/installerplugins/managevmplugin/managevmpluginPane.m @@ -10,8 +10,8 @@ #import "mixpanel.h" @interface managevmpluginPane() -@property BOOL migrating; -@property BOOL successfullyMigrated; +@property BOOL locked; +@property BOOL successful; @end @implementation managevmpluginPane @@ -25,6 +25,31 @@ NSString *dockerMachinePath = @"/usr/local/bin/docker-machine"; return [task terminationStatus] != 1; } +- (NSString *) boot2dockerISOVersionForVM:(NSString*)name { + NSTask* task = [[NSTask alloc] init]; + task.arguments = [NSArray arrayWithObjects:[NSString stringWithFormat:@"%@/.docker/machine/machines/%@/boot2docker.iso", NSHomeDirectory(), name], nil]; + task.launchPath = @"/usr/bin/file"; + + NSPipe * out = [NSPipe pipe]; + [task setStandardOutput:out]; + [task launch]; + [task waitUntilExit]; + + if (task.terminationStatus != 0) { + return nil; + } + + NSFileHandle * read = [out fileHandleForReading]; + NSData * dataRead = [read readDataToEndOfFile]; + NSString * stringRead = [[NSString alloc] initWithData:dataRead encoding:NSUTF8StringEncoding]; + + NSCharacterSet *delimiters = [NSCharacterSet characterSetWithCharactersInString:@"v'"]; + NSArray *splitString = [stringRead componentsSeparatedByCharactersInSet:delimiters]; + + NSString *version = [[splitString objectAtIndex:2] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; + return version; +} + - (BOOL) canMigrateBoot2DockerVM { // VirtualBox and Docker Machine exist if (![[NSFileManager defaultManager] fileExistsAtPath:vBoxManagePath] || ![[NSFileManager defaultManager] fileExistsAtPath:dockerMachinePath]) { @@ -50,9 +75,27 @@ NSString *dockerMachinePath = @"/usr/local/bin/docker-machine"; return YES; } -- (void) migrateBoot2DockerVM { +- (BOOL) canUpgradeBoot2DockerVM { + // VirtualBox and Docker Machine exist + if (![[NSFileManager defaultManager] fileExistsAtPath:vBoxManagePath] || ![[NSFileManager defaultManager] fileExistsAtPath:dockerMachinePath]) { + return NO; + } - self.migrating = YES; + // docker-machine path and VirtualBox VM exist + if (![self vmExists:@"default"] || + ![[NSFileManager defaultManager] fileExistsAtPath:[NSString stringWithFormat:@"%@/.docker/machine/machines/default", NSHomeDirectory()]] || + ![[NSFileManager defaultManager] fileExistsAtPath:[NSString stringWithFormat:@"%@/.docker/machine/machines/default/boot2docker.iso", NSHomeDirectory()]]) { + return NO; + } + + NSString *incomingVersion = [[[self section] bundle] objectForInfoDictionaryKey:@"Installer Version"]; + NSString *existingVersion = [self boot2dockerISOVersionForVM:@"default"]; + + return [existingVersion compare:incomingVersion options:NSNumericSearch] != NSOrderedAscending; +} + +- (void) migrateBoot2DockerVM { + self.locked = YES; // Remove existing vm if it exists (obviously user must have deleted the NSTask* removeVMTask = [NSTask launchedTaskWithLaunchPath:@"/usr/bin/sudo" arguments:[NSArray arrayWithObjects:@"-i", @"-u", NSUserName(), dockerMachinePath, @"rm", @"-f", @"default", nil]]; @@ -67,6 +110,70 @@ NSString *dockerMachinePath = @"/usr/local/bin/docker-machine"; migrateTask.launchPath = @"/usr/bin/sudo"; migrateTask.arguments = [NSArray arrayWithObjects:@"-i", @"-u", NSUserName(), dockerMachinePath, @"-D", @"create", @"-d", @"virtualbox", @"--virtualbox-memory", @"2048", @"--virtualbox-import-boot2docker-vm", @"boot2docker-vm", @"default", nil]; + + [self runTask:migrateTask onFinish:^void (int status) { + self.nextEnabled = YES; + self.boot2dockerImage.hidden = YES; + self.toolboxImage.hidden = YES; + [self.migrationProgress stopAnimation:self]; + self.migrationProgress.hidden = YES; + + self.migrationStatusLabel.hidden = NO; + self.migrationStatusImage.hidden = NO; + + if (status == 0) { + self.successful = YES; + self.migrationStatusLabel.stringValue = @"Your Boot2Docker VM was successfully migrated to a Docker Machine VM named \"default\"."; + self.migrationStatusImage.image = [[NSImage alloc]initWithContentsOfFile:[[NSBundle bundleForClass:[self class]] pathForResource:@"toolboxcheck" ofType:@"png"]]; + [Mixpanel trackEvent:@"Boot2Docker Migration Succeeded" forPane:self]; + [self gotoNextPane]; + } else { + self.migrationLogsScrollView.hidden = NO; + self.submitButton.hidden = NO; + [Mixpanel trackEvent:@"Boot2Docker Migration Failed" forPane:self]; + self.migrationStatusLabel.hidden = NO; + self.migrationStatusLabel.stringValue = @"Creating the VM failed. Following the install, try creating a vm manually via docker-machine."; + } + + }]; +} + +- (void) upgradeBoot2DockerVM { + self.locked = YES; + + // Do the migration + NSTask* task = [[NSTask alloc] init]; + task.launchPath = @"/usr/bin/sudo"; + task.arguments = [NSArray arrayWithObjects:@"-i", @"-u", NSUserName(), dockerMachinePath, @"-D", @"upgrade", @"default", nil]; + + [self runTask:task onFinish:^void (int status) { + self.nextEnabled = YES; + self.boot2dockerImage.hidden = YES; + self.toolboxImage.hidden = YES; + [self.migrationProgress stopAnimation:self]; + self.migrationProgress.hidden = YES; + + self.migrationStatusLabel.hidden = NO; + self.migrationStatusImage.hidden = NO; + + if (status == 0) { + self.successful = YES; + self.migrationStatusLabel.stringValue = @"Your Boot2Docker VM was successfully migrated to a Docker Machine VM named \"default\"."; + self.migrationStatusImage.image = [[NSImage alloc]initWithContentsOfFile:[[NSBundle bundleForClass:[self class]] pathForResource:@"toolboxcheck" ofType:@"png"]]; + [Mixpanel trackEvent:@"Boot2Docker Migration Succeeded" forPane:self]; + [self gotoNextPane]; + } else { + self.migrationLogsScrollView.hidden = NO; + self.submitButton.hidden = NO; + [Mixpanel trackEvent:@"Boot2Docker Migration Failed" forPane:self]; + self.migrationStatusLabel.hidden = NO; + self.migrationStatusLabel.stringValue = @"Creating the VM failed. Following the install, try creating a vm manually via docker-machine."; + } + + }]; +} + +- (void) runTask:(NSTask *)task onFinish:(void (^)(int))finish { // Remove certificates, ssh keys from logs NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"BEGIN.*END" options:NSRegularExpressionDotMatchesLineSeparators error:NULL]; NSFont *font = [NSFont fontWithName:@"Menlo" size:10.0]; @@ -84,48 +191,25 @@ NSString *dockerMachinePath = @"/usr/local/bin/docker-machine"; [self.migrationLogsTextView scrollRangeToVisible:NSMakeRange([[self.migrationLogsTextView string] length], 0)]; }); }; - - migrateTask.standardOutput = [NSPipe pipe]; - migrateTask.standardError = [NSPipe pipe]; - [[migrateTask.standardOutput fileHandleForReading] setReadabilityHandler:appendOutput]; - [[migrateTask.standardError fileHandleForReading] setReadabilityHandler:appendOutput]; + task.standardOutput = [NSPipe pipe]; + task.standardError = [NSPipe pipe]; - migrateTask.terminationHandler = ^(NSTask* task) { + [[task.standardOutput fileHandleForReading] setReadabilityHandler:appendOutput]; + [[task.standardError fileHandleForReading] setReadabilityHandler:appendOutput]; + + task.terminationHandler = ^(NSTask* task) { dispatch_async(dispatch_get_main_queue(), ^{ [task.standardOutput fileHandleForReading].readabilityHandler = nil; - - self.boot2dockerImage.hidden = YES; - self.toolboxImage.hidden = YES; - [self.migrationProgress stopAnimation:self]; - self.migrationProgress.hidden = YES; - - self.migrationStatusLabel.hidden = NO; - self.migrationStatusImage.hidden = NO; - - if (task.terminationStatus == 0) { - self.successfullyMigrated = YES; - self.migrationStatusLabel.stringValue = @"Your Boot2Docker VM was successfully migrated to a Docker Machine VM named \"default\"."; - self.migrationStatusImage.image = [[NSImage alloc]initWithContentsOfFile:[[NSBundle bundleForClass:[self class]] pathForResource:@"toolboxcheck" ofType:@"png"]]; - [Mixpanel trackEvent:@"Boot2Docker Migration Succeeded" forPane:self]; - self.nextEnabled = YES; - [self gotoNextPane]; - } else { - self.migrationLogsScrollView.hidden = NO; - self.issueButton.hidden = NO; - [Mixpanel trackEvent:@"Boot2Docker Migration Failed" forPane:self]; - self.migrationStatusLabel.hidden = NO; - self.migrationStatusLabel.stringValue = @"VM Migration failed. Please see the logs below."; - } + finish(task.terminationStatus); }); }; - [migrateTask launch]; + [task launch]; } - (id) init { - self.migrating = NO; - self.successfullyMigrated = NO; + self.successful = NO; self = [super init]; return self; } @@ -136,19 +220,14 @@ NSString *dockerMachinePath = @"/usr/local/bin/docker-machine"; - (void) didEnterPane:(InstallerSectionDirection)dir { [Mixpanel trackEvent:@"Installing Files Succeeded" forPane:self]; - if (self.successfullyMigrated) { - self.nextEnabled = YES; - return; - } - - if (self.migrating) { - self.nextEnabled = NO; - return; - } - + self.previousEnabled = NO; + [self.migrationProgress startAnimation:self]; - - if ([self canMigrateBoot2DockerVM]) { + + if ([self canUpgradeBoot2DockerVM]) { + self.migrateCheckbox.stringValue = @"Upgrade your Docker Toolbox VM"; + self.migrateExtraLabel.stringValue = @"Your existing Docker Toolbox VM will not be affected. This should take about a minute."; + } else if ([self canMigrateBoot2DockerVM]) { NSImage *image = [[NSImage alloc] initWithContentsOfFile:[[NSBundle bundleForClass:[self class]] pathForResource:@"boot2docker" ofType:@"png"]]; self.boot2dockerImage.image = image; self.boot2dockerImage.hidden = NO; @@ -190,9 +269,24 @@ NSString *dockerMachinePath = @"/usr/local/bin/docker-machine"; return YES; } - -- (IBAction)issueButtonClicked:(id)sender { - NSURL *url = [[NSURL alloc] initWithString: @"https://github.com/docker/toolbox/issues"]; - [[NSWorkspace sharedWorkspace] openURL:url]; +- (IBAction)submitButtonClicked:(id)sender { + + // Machine logs from UI + NSString *machineLogs = [self.migrationLogsTextView string]; + + // VirtualBox logs from file + NSString *virtualboxLogs; + + // Docker daemon logs via SSH + NSString *daemonLogs; + + // Include diagnostic information: + // - virtualbox version + // - Mac OS X version + // - Docker Toolbox Version + // - VBoxManage showvminfo output? + + // Submit all info to bugsnag } + @end diff --git a/osx/installerplugins/overviewplugin/overviewpluginPane.m b/osx/installerplugins/overviewplugin/overviewpluginPane.m index 1f67f26608..2a366360e1 100644 --- a/osx/installerplugins/overviewplugin/overviewpluginPane.m +++ b/osx/installerplugins/overviewplugin/overviewpluginPane.m @@ -41,8 +41,12 @@ if (dir != InstallerDirectionForward) { return; } - - [Mixpanel trackEvent:@"Continued from Overview" forPane:self]; + + [[[self section] sharedDictionary] removeObjectForKey:@"disableTracking"]; + + NSString *enabled = self.checkbox.state == NSOnState ? @"No" : @"Yes"; + [Mixpanel trackEvent:@"Continued from Overview" forPane:self withProperties:[[NSDictionary alloc] initWithObjectsAndKeys:@"enabled", @"Tracking Enabled", nil]]; + } - (IBAction)checkboxChanged:(id)sender { diff --git a/osx/mpkg/Plugins/managevmplugin.bundle/Contents/Info.plist b/osx/mpkg/Plugins/managevmplugin.bundle/Contents/Info.plist index 857260f0a5..765522f254 100644 --- a/osx/mpkg/Plugins/managevmplugin.bundle/Contents/Info.plist +++ b/osx/mpkg/Plugins/managevmplugin.bundle/Contents/Info.plist @@ -3,7 +3,7 @@ BuildMachineOSBuild - 15A279b + 15A282b CFBundleDevelopmentRegion en CFBundleExecutable diff --git a/osx/mpkg/Plugins/managevmplugin.bundle/Contents/MacOS/managevmplugin b/osx/mpkg/Plugins/managevmplugin.bundle/Contents/MacOS/managevmplugin index 6244a3fe01aa1589d6575f2969019e226bd18f28..b072846371f9dc45c9fabe54f1124c754f0cfce3 100755 GIT binary patch literal 50308 zcmeHwdwf*Ywf_kap;in&qNt!Fg5o0&9)p05CO~ka2_Oj%A9NU!fs7_^;Op^Bg_51xe z`DFH4dp-8rYp=cb-e>kc^XzBue>vE)@&;O#H3a`h;(y^+Evp?VUB}_S5lFwku5w`= zXJvjY&IB!iA=Apo|Dl5R`{ThCaRHFH<+U7ca7)IUl;A;Wast|%px+;hCzizQEVsPp z%MD6ZCOFTgMqNeTA(Ch0`5S{xEx{=A-15d&7{WV+p5Os;&q)vc>LcM;y25UG+eIGP zoGyZ?4RT$6e`Lw!_5S8yyfGYT4))M*hsYZ)23J_+W$21bzrQ{fkA}j_guty|*M$ag zz9^`0Zh5R4~3UT zK;+i1e4gRlC;|v}+e}cL`2E2~|I#Qmg}|BpW4FljNP7_6Tl-Q!yAKZU_s^)PleT2R zi}};CJd(O#>SrWZx)1onP5#)*<|UCPe@i@?Q{FHUNBz~Q7xf2~MI?UzvPjyCd+Ij~ z{B%t=iAAtmo?RAb{QjmuZ~FPbPgjdcEP|c#sJ_PvjuQB>tDj}sZ|h=1yg1LK1ZTt* zlWl)O-co1BaJPqNi6Jc~MQ{=9)X(ImKc(Mtzi0}@;%<41Lxy&^un_E$=QJPc%l$0W z99R}4S9Z%=A@Ve?5Zt>Tn|`ZCbjxcKd6PvT!7lyMmBpRt7YjB;gG&*f-SReHVaUgd z5Q3fZFlJ<{FWZkKy5;Q_=iDS(5bTtP>}>L4355A<^42GeAhjRC{g4-G4bZ63v%VWd zUZW9f5$uvD7?X(o8UpbEXSnNYwHms8$_2Q0dA6vm^7e^5H4?$S$)h;s!@u8OT{Y{% z${AG>hwagMjwse<(zP>8O5H`eAZLuSthQ3RYs35kNh8utj*dCJ-Llq$;lArFYX|V; z!_-HHud}SXk-ztcmbKwz%feK}(jqTMKK&0tUKFWJB>?rj7J^^LA}96)094NT|GnXZ z1230${Ce?6=WHDL%+aHfH;f2}AfO+5sC9ZLvv zEiD&@;@RtBaF9oGsl9EvN0Oax?M?3VNHo~Httv_~X{4MMXE|00+#2=H-5yn#uLYW# zg3&omiDjX1EL%+~O59W^gRWEYPyVsuo5mkc7kE2hy3WKu;R&8Y83(U}7Wn_r0`q*y zzf~-#m|rokqOR7rX7BLFXtw!#L~H92`skXDsO?L3b_J1EC7<%8yhqeqR&}cA8y8vD zxaX^rpHy_eNCY#O@JU~C(e~=pm?mHux3fA`Hh3vyq{@bH;{7v%p|4};_*%=V9Jh7c zR$uZJ5s@b%Qr<0~sZMs+B;QSA-x|jnR3{TVe91Q|x_6XNeAna5sF!@Gz zVFEG4*S@u&{RiNHkTFKc;lK;$7^6Ly@>l~k+fbHR2`g}w$eg<%U~dD-@%|-X3wXPf z%AzXlK<2~LI8d!}+|%InrRMG6a!3X!9#V>m&87-Z`%;Uj2vd{lc_A`cnBVvq?uNRk_2L8u<-^lDoQJ z@Fm;#ec9cO=Ief;D*2!A0?z9~9#lI8s-fX#fVw*Q_loYFq z-wC#VE{61u!m^9lF9iJ@(8eTxBQ#lXXT`d0Q0@I$3y6V2=U#8>se@L*CkXe8hh=vU_otP z25oi6n8)D*Y}uCz7Hlmzy}cX-A}KYA$0Wm$NU0UwFM)XoXLu)a{cd4&N5>pwR%{+- zk@(K;!ehDMc8f@<+)oIRYA2Cw|Mml{f%iOUP&p2Hg6g1r-;^Qo!%!p@)YVbUoWpT{ zL2ASS$wm$D^ix@{z;r*YA)9X#6NkZoMx;LQ3CM0CvW~+2Xgy!@&o#*|Av>SRwlPtD z3nYl;{|*=E?yNp%3+Y~ye5c?We%wgaj82exHcNF@zPs=g7NT_~*7lRZTAjRy&0u)p zNCQDfN~Fr3hU-AsXJ4mwEPAWj?m0g#Vts&n2RL>Uj#xKwJ{u3X=Ly$Qcqvz{Q+jO# zB*rmM0GcBrdnfbHWh8m$UCdk7jdrR|ekQyVjCis;To5`kCp6tc&BBHwhXs29v8T3> z&k64*XKA??0+%lG4dj!@C;x+++;o(bx0uT>d<^BMtM_XoqdNKE4swH(cZi{SID@K# zB|h#;c5G*=vP;MlQ{J~0QDW?$oH2TsFIhc$2r}4TlY>UXRMa03zEd64w`!96s#6^= zr>iiL1-EZCW#0*Lk5DXvLrWcxG6b6q!5R>Zdp?c*7&A0qlJwfd1S9_eC&5_qA^A$G z>^Gcv%Sg+P!c$ojk^3k(O`Dw!EcJeS7}&@tYO&G8NbyixtDVbxGP9-1I!rNNUS^yL zaR_%tNsdcpaYOJvva37tPrQ(@uT&>Lg)T;viArc)ss=ar7OJtiBjcDmGQPQ^#xi%* z#O98SZtlqWtCMe0=;FA;@u9nlOjEQQNlmI50s4O=;8mw2ka3u!@P`fwz3_2PVn^ag z-*ww4qNjuYlU=u9B}Gwx(UThcYv)uY|5TOirr=(9C(1A(cL1u)VJYA4Y;e{-%$-6P2w=?&eVYBno>GnLO<5s!4u< zrs=wo3n7n~dMOJzhlHe7@8C8>fbQ&C&iWY7K%-*ld=cbF5jl-GF9A5*2G$(Nt0=go zlQAz=6g<=kYm9Z+*KLf+7&#}Co2I&Fs(XV+#<(RpexGJA&;S4ZJr;hZ$vdZQ+JfW#$XkfLqplR@BI zF9Olk20k<1PP`bzPgCz+y`4J=kH?EyF3mwkb6b4EvooNe;)llNG5)ZDXl_Av8fXe% z%RK|;qDVcP)J}Q#p$t}}vuiLHOtZ_kkje5eb)(q$s(}q~mlL?%2590n34RRn-yjp= z5)((B({y&-e;Uan6L~i>1FVP1PG{H6K#+SSgQ#R#1GQkvTL==K6M3)39nb$j%d@6k zhIliGZ!^S;NnS_c(-#;X$SgO7ZGxl=frPX8l21r^qYdsp;GSK8U^qa7A!~C8V;5m& z3+t9mG6fWfHjw-d7PK|Vz33m{@5Yk=w$Xo!?Crpk$0Yw=gXuiCB_@2P1ykug9Qq2n{x^W@im>#~uG=`9Z2388(TJm~BwAD__lQr% zn3kOVHmV`!KeSNUNj3N$8V@ztT%By*TAfV5xysHlMW2-}dV(n$eRD7s{n2RR>FgT8 z*%WcwOwmvKq+fE#;eK`iw5F*?n4+tbXlgF{Tq-(M_D8Y`)=Beh!)*gkb#nD4?!O~% z2EOY$De@KlkQy6$s_{LbAz$DcudBQl21nGsZ8}wfr_`9!11}>A zg2W~okyhWwpPTt}D}Qe9exYsky;i~6KXCsnJKE@-pVs>@t}C2nzPxGnLb8p zOmH!1(L!&YZ<|S5=sBh#Q+^B@w2+BZ)I!rtarZzZ(6{2LsMPU4Sbiln9oDHuO;qN^ zQs#9?(VSb2o&E|Yl>03%7hMZuoX9ZrWT(|sZmJp5{%&kV%MZ5I@@Z6$w5@dDrGTpT z!McOGX~Ek2DHdQJY-&0gB|=Dd;YpA|mATQNha2=1MOy}a^VWigw!RlZ^}7o{uCT24 zmKY88;2zF^5Mf3pMS|1@|HUxl&TyR%92SL_Q2O6<*5?#^}Qtjp3P_5UoP(obq~2t!B+& zdx=fnJc&vnTb~H@!{rts;bkz9d4#m)KsP2|Pl*(k_}*#Ivb*pv=b~R6XDa+0?wu8e zJHu+2t3B20TyLJ@*k$Pvx(7#baGj}|2 zVe`E-f-vn4q_8i16ViN-*nG!i z@-eqE9GYfG8iuOWJkssc8Y-4M1cwkQ;1y(xVi(&5Jcvw(Vi^TIoMsqnGpt1>J?7{k z{<~@F&yLr6&(BI-*}lJEZ5Op*%KLLr)Fi*8CV=m5wK+$mIe~H5X$_ad)Hm7G|AR%Z zXeHF>N>9T;RjC>>$s{nL$8?vI30@L|{25GAuFsZqcMnNI{j)Un@iz4X$b{TZ$Ymv| z@ap7l#9_yS={>mbiIXT9dH|PX>q|x zYvC|vDd$UF<5|=_=DD-+l|C))e5q>*ei$%;&aZ9d{gTUozwLAz*`1-knM{>;?^b?f@`#eRwPrb`@ZV!z>@c_H)w;zeDIl zP@2a<$&8LqpG&ke__5DOi~#!B2dqR}_!CG+hkjZG*2KU zo|!~)$TK)rV#<+!2WMr8l~4?{94o2*xRqGB-f&Q?^m0WdR^pK&g-66nNJp)AqB$1! zJ2cKERa0fBK)B1{%h}HC@Vky7MW|*Ikm-m(sM`l#t(!Q-@HF4|ZNAT8Xa}D$hA{jc zICjs@uCQT{(D*vFPS4o&SepJ^yMQ}-Dd4U&!%&+cgv_j=aYdT?jY6&WIa#Tlq47JQ zNQcIIY|gwirvy8xb|aU=o^z#5{Q@ojOu!auIQ|2$sD#E7zyv3J`yB2ABI);FA}65v zpDiibLy}OhPg8dvt@ZmZG9mZpkjoaQ!n23Q04QCaaxP0`Pr2WgSYaeSLfxfj8y=Nr zxe6>MG(JR?!}BIAF4Cd#C&(1d_s=wll=matL25cQdbwNut5{ag(72SYZ1M4z<1^#q?SM1m z<8^!QLu|m)abNNl`kK#|+)_?SYGeYmc$Qn0d=aauWP2k&wdWZtOw_)RiOO22LGXRB z(RKi|MejWmoDUCySWKBIbijrF`$!Uo&R#ataO^^Rz@Yo4Sk^xZhUKq6it5Rvk1=Wc zVpG6LOg?n;I4b8WDC)<=NTU}M-vnaQ&R>!WDetjZZV?X8L2<`{9Kg^v;!oCW=&alb zy)cWs8wnH`T0ejh_u+OY)CLVEih*lfLiJr*nv$ACwX^Vmqw|-liI-yzOb; zJ8j-BRMKWt4(}@_x5oYwdN~-_Ox^{M0tQi{))w>&w$>Z?wuLk{&+4c%q(%mz3$0kt z^w8qlESg6IH0x2e+-^+$({eu_M*36b7Kq&Bf7i%YL%zT_SznRcz(T&CsqCy}br3>`t@+WYPAT)U}hjM0~%4jT6RGXg*qY7|HHP zZ0!2{aNHnF!V!ibj|`W7poqzgdfS?9zFa26_j&)UO0B}m6#WO4hY=qvVvA6;S%m_O zyVG+&c1wOz)4=(7`ck%=Op)^L;h86_ST}lXRjPV)De@9v;qDI>^5A9`fgpf+7qak7 zvlb@zmT0k!Z?Lr?{}J3_qK2<7bq7rM?xj3Gu9#ozOMd7}UG2dX_mrM%E&ao%ZFlr{eo2+HsWm%m7~cWffK` zXy)_bY3MA&z$&qK*H_6o$OWFnia>ixXV+uMH!g4jcx2v&Eoeorok0ll2quQtUgN1s zeVw}bMUcSJ?ZRQ8Kov5b;IG;2U6tGq%aM@o!X$}a^CbE}>)1yIvyI*$huAX%%CNDW z{!j~Q@gGNvX3js>bfVU+9u~G}&liVU*3!)N8?V>C0!bvEx9zdRdFP`leCKqk z?V>KY^*OKuT4^6DT270qj@4aV--Se8B8thOUuxv@)Mv0ii|m>5-VF(?ruTScz%JZ* zct(3EadYo}mQWpq>oBTtJY)ki&Do$a-q2kbfGG4nHc1}x)&Kab0<`iM@RUWS@ISGJ zg$p1MUg=>*eA$D6+`F8s#;Y{~t3fFMV%GMrs7lpFTONZkr9i-Wb1ZNv?>RsihP7Mc zEyx&eXHe9;-j;B@(cwc5^l%tF*!A8;GRS*qk(-ynSYtE(m8R+)g|FC*;6M}a@eX7K zo;MnI7gj+SJ^L@>{Ia>EG2)6$R%wgn$eAYZHb}H^Ct$$2AXcj4C4n4!Dyx4410muV(S6Al=#v#ZG# zFxF_m+i8q#uQv?$W-y#%Gu(!J$BM4Ia6Z$Q`N_m7?|qoRvMQ*<$Xb(kcUn}+`+Wc~ zV!Fz^2Ww?+AXG=;{XCq$fm)w}!B8}&eq%>m`+JNx&z;Iry9?=CbExqt z)JRu%wOzy%Q@T9+Bv-o4Fl^6YsJ0oXJ{i?rX6Sdb7HZECHvI}W{n>_oLk9icL$uC5 zH~nBk-T?Z+P&OQH8q={a=uuw$a5l{WHjCH#a*G zU?cw49M2^)7{=NRYmx8PsT^g%VY>^@=E7)hlYbW7W(MNjXsZW}SQlo@{?R?d%9p>+ z^R+);&~Cmk_fDrqOO5#>D0xo9E1>oHI*e2knkQV;HGh`JRx033o$uF!*z}~+kk8=& z)3j|h$&V2sRzWUj;qiDk;sn+tRcrp4hY~LVrl5TZODszeC-x!IbEJ;K0*s>at#ZnH z3G&9hDm$ua4HiO1TGhV|QdKL65F4*i3_V}M;MRQ#`9953y%{{ew0XR2H%#SeR}Hfg z^|2Y$Yi#N_CS{ahL?6#0)EM(^;$MN7Th!Lb&_ACc{8XF%l}z;waR-E?>-s4oqZ!>P zABH*vlOmV+pV{Ky^8?jg_}M5n?WJ};1+QOFjODQ^hJ0QjB~HW$ z^eW*ou9yNJ#8iX#wA~4!f`^{WbU1sWQacAMSCH;0Zxoa?K%mqqcBu&xX9f=BpUm~5 z%_udbEKikC>*^#umC!wNyJ>v%4J`W>6zY0w0MT_W+Or)ug1CZf^3tL`ucz~ZMEsBv z)Akf0u2$k-rt`{)IH|;x1Nk=PK*KvJw?nm(HW-wq0i_@eygnp-Oz3=B4t# z^jg-p1`RIw{Z_m5_mH*DE0P7=5vZ^rr=GJSb(blpP}&{WyY0^VxCgn-{P z;MWCQVZieR3>mOgz)K8xoPZY^aDadquc@H-CYo{)$}Hc&kvj>*kWK!)XwPtDc8_T} zi9VzJ8RySd{#?PISMld6{=9}i+xYVv{JEAtujkKo{P`_>qQiBJ{PT(EaJAiIo<_R9 zkuvwZg9iwW$I{(vbT^Ieo~OGyy4y~7SJK_@>F(Qf_ZzzV1>OCW?*2%38|m&{y1SL` zjzoLyxq-88zRr!9?sx(n0Y3c72+9XRD0U5+z=!TNYbyeixfTrt%OM5BR~ z3qtY6*_gFkA`D+C&XO9P3fcugRTQ^`@QJ{k53pe2boZl$CvqoH`PF2Y&_;*sW1J&xwB?4eL15o)kvC#&aH2UF#R<&tGOBxR z99m5^Jh7=vqo$d*5(gNAVKN1zH3#CbV>D79jK!+xbpjC_CT20_aG{*x6ywy}hOP~^ z1V9&Tn6}d3vWQp25}XZf3Z`p7<)mxI^@*|ZNpsbSj{44vLCH#OH)}~C7MwJZ;b4Oi zP8_pa$YN;vd2_2x-RWHrQ>|$5ibOCLrz~LLKTS=MdMgwT#bM=eLq%+5xV|wO2}csK zxrTHq7!pC4tGT5qNJ4!9(j3kbj|S?OSGK~PrY?;{=LEt*_JKK3GFP0MJsXMD6iA?q zU_)IXww&~+W|&}!tfSt->hDdK^TNWS2m&-#99LNK^p~`(qE^otc!-4QSW6ok_sR` zssRiWi^rt%S*^_m=57!l-w>%^9*kDi&K6%qMd#N{MaO7{i=q>#d%#H5MA`sX4aR5T z6)u(Gz>+3{(Vc8L^fm$_@P!&0f>;E_(bbkjR#b6*b7&d$jz}0SzbuMA1N|c{6=A%? zfO4l=Hi2oo>cEm4#lS> z;&FtaXd+C0J2euXiB1#4N+}v#mS_q@D_68o)lpw^7BW&AQg5FYSLg-mIBR(}2 zx(Z4**wKs-CW=#c;s_9E4TPGgImiL60EZ~{MU>jo1h1(H#L<<~Zl~=U4TP7O-dGnz zzoodBS-(2enrlaI?Wsi+rv|1lKw5|oJAyXZtU_bBgc%KPR*Y>mmx`>5%n!vvP*~c| zbiYb7xWqDgBZ;KG7g!Q%3dL92QAMekiHPdbecvWR&9l4Hf&$$)00WyhdIc!V6 zgEpoda2o_$HIsw7p}J{LOuB@$EXF&UMnOa*=4mx=!WcD`G(wgQvx=TE<*Qd) zjq!L(Y-&kKpe0n?EP57W5G&!iN6C2&h>K-o%B|K3!FDW)0CBmU; ztOPiRFBXSlk+d`#>aEt(nBPHEQja-S%*j^N+FVi}C~gTh_mdU^`cJ()xY8z$#TrXO z4St64c;+Dh`=R5)`TC$et)gJ!>jne{bxM;IgwAA7TqTA?Ft7wL-SgfK3tJO3% zMfIYhG*HwWY{pW?8eckbawZ~#WmGg?~cOeFPk6HtIg;`yVD%NQghV=U7Rtq|U zDB#KT_F}7b9Cf+SWJ`uEYg*;`RkMoEsKg%onqasoVzo{N0q7=4*QB+c8No+Qc4X6h z3K=w%)$w2_5s1_vmYAcyGFp39lKI7;67yhC(<(ul7ZY<2yywbLQ6np9#Lufc2Q$6v(a-fz(5^XbC#kVv;8+F!#v*tUynjy*%nbYO2V&*hO zW^c&M7^rP_(`@t8V}AyjT{Pu7hI3|5!!8TCh%<(M=5)4Z2396Mb@gzgp7SEkP6sV( z9#-5jdrDv-0$`@tiX{ZSF^RgUHT+1c99_C}D*EumQc4LNKe2qmcpirB467cQ2C@h* zxAn@bDTZ$0IS)f~tD(GN+$80vTggR9xaC42#;Uh6y9$G12)hW%@qxhX$lvg;!$~$3*HL!k&W$io8$}2b??~gjk$}7RsNY5B+z=vb3fgPu!%+ss^ z>rb=t9y`q%WR0~3#Kv0Iq!Mf3cT23iE#s^~*zU+z-c@t0ycNUph8;F|2)$PgUvRMA zEt~NG5!XqiFkKag54(QA^r45;tQma6A=tq+=-Z?k(^n()KVsCYJY4mZ84 zzGTO}pkKek&=;`s4*3ET9eq!-q7OPM|7)Q03tbSh`BHsd3%l@bT0}W zeZRw(mYb#CanSo-HTBk*X#2UN-gkm-j?j&9%XQFg1KmQQqc2{x#>hdYS#wPeNW^qfDU}AelGhE{mr0%;tgXT>NCC3 zQ@yr<{>#4_`b9!+>nrh*>kqmKZyLJe+;jpH-O&ifqlHe#2V0(l?rWeM)(?3Npv&ur zyc)=$0^Pm+kXHw~4gHX}3Uq7xA@6R` zCHf)nkDv?mL*7TAo7)e0BQUo(w;%FmfUcw;@@VJQ2|{;7FaCEk=mzzJ?suSje|O*h z{5I%b7rNg3m|)akIhVct(Sp&tE6;{o-ZDCb1TSI1rc(R|g3o2YkNUuWBKTbT(JLqEa)m3~zX#4X z_*~^5B6v*QGA`ABXdnE;1fR?QP7wT28Pe1CFA=;eeA@a?6#S?h{0js>F9-g9!5@|b z|A^po+3)v)=S^o08ET)`1y9eMoR{K17rebr5F*7dk@%jgeJ>Y$F8k7phv~vnBjZx} zKM{Pc`1@!B+INkM ze{8GKXN9C2B~|rl$0ChIk4-Z<`a3rIdq~$Io5pH;yf$Q({(g@BK8IxIOxl1MBL7Yz zmE+9o?Vj|dzJ2KoLv>l5NxwbJq}ND(v*f3aG5NXb;T5{l%MD#$pKTz>Ru7fa7r)}$ zVf1WvJy-Nmy1r7f$7%TQsx*{W3;zpJ?|(@C^^(6^9$+k}GW6e({9B|$jCAF1mX2_% zp5Utm&|GeYv`yXZ?Le}s#^ zO7gu@uF9u_Uvw3@=vyVf(nbF*$**wH|48!dUHbf1@)x-1cSwH3CI4;7Z+6jtA^Eqv z!Lqb@^5j`FOd90eMX+zXSw7*;G(DZ%+Pg)_?6OkNd9&g{f{Mo znv4Ds$$#5L|AORyEcx0m-j)25q+ZX7UwtO||8&tGTFz=(54h+@O1=l^q4?jIzz43u zvL1O&3yUl)EF*N5PLqu`5j;O`UsIf8%R#lK1L)q?-jh2JcA zzuCKUJohfOZq?b$j z9Z7#8=}VHnC25|t(-29Imh>b^*TT8VA%7$OotKU~<;$J9@YAq?FB1L@Ee6)#_j{wl zz#mAOFY}0ENxhQNTM+50l(bIL4U%q?^pBGMMbh^q)%nTC0(+(#c~c~~~ z>5`U7S|{lWN$-;MK}lbdRL6TA-w&5~qjBmCfpvVlP+%RublgZtzQ%2h_Zq*p2>uyK zUy$@INk5mAUZ+Es&c8+qtnpgou+9qtg71)Yqoi9T{Vz#(Nvh+7N5+e@Bt2i!%OtIr zbfu&zN$KrObp29NdW92RFG>2Tq(fzV)OnDO-#RYqyh+E=tAze~N!LrN^CeSC?oXYc z=cf4gFgoA=SGje4Am*@tD{7$#S}bX!q!JFS6#}3sSuZz)}zsHn~LH*N9p z)8|$!Zk*9Fr=_%IUEbX3EuOj4=~I@)))D3Y+0!nV?w?*=QCsUD?VnZaJ}+opbj7+e z*Y_ZsW)4EPZ8iHqy1Vmw(%9!;YjHTXt*aMGIxwKe)Y~@oLRgdFbAslmqt(`yrBor| z6GeP#+G<_FlO zLj7{V(XX=c#Wa4Lt*Kw`uWwxLUzWf@bSlM<19EstLw%#a83p;TKpuY4xdEh!C4QVA zYrq>8+GJNQ>3MWHikgW-X?BOASbR21;>tMssSUO*X@l*uow(IJy~FiP}j8 zvNd@64F$b+89uJuQweyMOT6DdeI`r{D}`|inO;%AXS(MGmj0>S;4=~K1;q2OAAX-nSxarjk z`l1WG(V!|kBSNhfBhrOTIxiNCa)TgeG5nvMDv-b-7vorSgYiT(Y~D)&l13%rqq&il z3xa{=B&-|8Z34k)JfYUvD7Y~g zD$<%YxKvy3A~hZj85?W_4)#Zbs`AD>>LW}=wMM}3<2-(78S8r=BOU%vr_V^CO@y$! zK!9F2fowdK_v1U~f$X-{gjV~|CAERIEzg`jle2T2hu?o1;A~~9Mq>)jB@8s@SX%XL ztM&7|EJs;>pEt;AqfPZf{^LBG{#V)PH-r8@&=0b9@aF;k-1t7_Z0FB?{CNPM`$l|! z(EhI;;_DdjVE&JW?9AVC$Zdm%75r_$o%sCtkS7N`JfO6+e8L@hKgugD^%PXZb`9A( zXwh*;XZ{^=1i?oQJ8GEq+3Sbp!%DQfXozEW0_FJ{An8C!2T4jibRA+6Yp|sJ9dCmI zNa=Z$6Q=zIO9$pzM=kq=pX^gX#rV+gt;gYhv;#g5_iI6;7eLlE6a8rXt04#`eVj1y>-X7oHiGySCVJv0 zJJCfj@jGGS*YAbt4OhgkFwqnLP`bfI3Gq8&;@9twR|&tuL{I#B&PDm1F!Ag6%nt~^ z!pg7bUX|m#Q!uA z;i8vZ62HPkPpI3(!wDvSCrtc{#{z*XD*Os7|1g8L?eBz%U-yNs6Mlu2zre-sgo$6j zpZ|gIE3Eu_&W2#p-w6}{+oziX=qw1;UtyxB`rnCsx(FtICrtdhU-c`448Ow4@2oHJ zJ7MD2eXgT~Ut#5U)|dF5F!Ad?gmZ;oVdd9zI|LKI6DIzn$5HJNdxT$M<=1mO%I}1U zf5CXezft%VR{kk;gG>3HF!AgD-Pg4K6Vmjfaa(FYo8Ji&zwZ0}SojsD^7_NC`+<)@ z2@}8W>p5Te6;}S3i{A+ozwZC37k-76U(Y`g zO!_-v;@5pb-xPj@m0!<8DZdjYe%()Wzwj%p{JQT^`JFKF>;9sbgNf%@0MD3}t@*gcSmEQ>yzwTdJEBp#8zq7nq$aKQQult9@7IimV2to+XMvX!sRle^3dP?{eR{p-q*L`B|3cte2-&gs%pN!5%QTr*Z z{C$!0kGD$r6;}Sf%GZ5+-xq#`mA|j@ zb${Pe!mqIMALX*Y6DIrXKEStxUt#4R=Hhq4#D8eHAsF;kV}FH}-&r2TFDFd=y037I z@GGqR&hm)g2@`*jlz)NnE3EwYxb#;z4Ej?K$9!_JA-G=P-2&ewuoW=)hXpPbc&EUN z1^&Ch>jgd(8{ApGz+(j7CvZ7nj}gtEQ5U??1wZG42VrxclmBcNTw zr@ZrAaI*`(#RWg^g8%G--*>@7FfntMcajS(cfmmyoN&Q;uwny!$h8jm!vX8_lv@SX z=O6zmus**y1dc`Y`aI%Pf%W;qOo8=z!3u$O{r_Wubv?gRU|pYg3#{wyuOSdpdAfd{ zE3mGI=|`*xuj|`e1=jWI3j*ulSm*0UATUyS zI{z*bSm)Ch39R$uD+Sj1?hggl`RmgH>-_U0fptE4Y@sPn=ZEJCtnm(C&m@6$KC?hzou8}{Smzt}3as;omjt%w12{K9_R{gaRA3#i zFB4eD-x~zh@$?aab$r|_u#R{1!=NNz$FE5O>v&Wvu#PWrfpxsNMPQBpj|f~;ZaVbq z1S5uMyxuRc#_Pi|&=Owb_2~j@yq+Pj#%sU88n3Sscx%9vM?W`9@-$v=0(>HDs{7X8 z6j=AE55xHr!t1{D3W0SWdR$=LcYd$Hy3hOtfpuT`S57eUbRYS70_(oNMAK1LLWJxvq23|Ih_L?1Eo% z@qggL4?Qtc-%&1jvVraL>kMqyC+dQ4HZYz7o9kyT{2yHK8!q^B7d-N$O#4lA!Bqyf z^;_h^U+sd|8`!q*CIj30{+EFVs{Vg48?#Q$CR|33czUD+P1 zguac9m0XT@c`gftORkJWm-E}zOXPKkC6U;Q5`2A2Z@dgf&0Fnacn_=dEq5hZ-g;Nu z>=s=eS`x)i5R}ZoyK$T7b+{!9@ly&xz|l}Eexv|zo$XOjQE=tTt1geO3|tkCM6S5J zKCmQKe?@e8G|_t1<&7oN5}~Gs66Y@{#Ck|5Ucy9k%~#7V#RWOr{1QY_n10Bhsbt0E zN&ZO_U8MANd2z%#^HTnv)I-0ru*hA*ei{#N<86+FOA_?rz~V-T)bCL7Leai{AK-sk zru|0XM$7N_Pn`6xmF-_byE*)!a4X(l+=t$atfEUZy@V`?ccjWo_jBMKFO7A-ia!TO zefIZ?=cdl~{_-5u=FO9tFDzfgmK&e7c3J5&tp>B#M_N|;8-q>g0)iuvvb({B$XZOc z*Pi#LR#y6cs5Ra@DW_)R@jF*pmFw}of7WcmlztNTQ0w30^p7Xads=$@lnJ@3G-YBg zrn7rtnoPKVPs<6VQ~rHs|M&^xO0z3GVcfW!3Qri9!!#4darLwM;e>JC?5#~dfRLl} z@O$`k;4W(4{4&Nqd*+c&%|?G99G3WTxMI zoLd<7@5ygZFGBG=aTPy5p!;#wT@1oOOknWb8Z>c{EHX4xYI9q&MkpoDsO&w zCkIi+FN*LuXl77|vGvhV3$_OO4$OyAP}8SIor*_RP4*6Xu?;VegZ}8TtB_FVRS& zTfZ67F{!^Sj*!zgOFH=UO>1{oN6`3}xy<|6`!udymb0(_3x#F&`o0;R-MMdS(`Ean zOLtD8b?$04`&ct~b35~#w7T#TF}fW#M|MyD&Qg3fBG=wrf6uMCnaj$5ZB<4c{@_Z^ z{B*_qnjDc>;)LVZL5P$rcW@!s1hC)1_13}lR`w8+p3>#^o`dVHzNg0SXIy=AI3r)* z)CbpFW|j8;_j;?3g_3i*rKH)`Mf~ufm-Uzv<&^2n&nCC$`pWNKf@M1&+~aU7GWtH& z3L^VJYv!sm^Av3+4u}2u>~N1<*G~pZk5ntps+Gh4ZoZ83{%)k>46+;LJpJDTM`xqm zndVruJ68_=^C{*WI5}aT1M7HYfSba6JKIAM*UJOkT>RpI9+{4p2DouO-xJ`b$Wa4+ zEr6Sr4sK`3bG#;?2XPm^1r5PwZ!TH$g_0yoUI;RY$+SMd>RlauW{xWV)|32w6WT?ZME m90)gg`pN@^_=N{fAlD&rC(SfkW?CjEeJs4kn+#~P$NvFuHV9z= literal 44132 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 bD#Uvu-9WC5V{V=*-Zp74&Q`G@n;!ok4VkYf diff --git a/osx/mpkg/Plugins/managevmplugin.bundle/Contents/Resources/Base.lproj/managevmplugin.nib b/osx/mpkg/Plugins/managevmplugin.bundle/Contents/Resources/Base.lproj/managevmplugin.nib index 9b338b6a0434ab6d40dc80a7b7c699c57727743b..53354cacd617398f6b0b9aca821f226d9100dc25 100644 GIT binary patch literal 13048 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 literal 14477 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 BuildMachineOSBuild - 15A279b + 15A282b CFBundleDevelopmentRegion en CFBundleExecutable diff --git a/osx/mpkg/Plugins/overviewplugin.bundle/Contents/MacOS/overviewplugin b/osx/mpkg/Plugins/overviewplugin.bundle/Contents/MacOS/overviewplugin index 1514347089239c9c776f7c5b4e1c9c528b7e16d7..4f9531244fffe5b3b69e29e0e366f286f310b721 100755 GIT binary patch literal 23604 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 diff --git a/osx/mpkg/Plugins/quickstartplugin.bundle/Contents/Info.plist b/osx/mpkg/Plugins/quickstartplugin.bundle/Contents/Info.plist index 91edcc43a6..1fbc08cbc1 100644 --- a/osx/mpkg/Plugins/quickstartplugin.bundle/Contents/Info.plist +++ b/osx/mpkg/Plugins/quickstartplugin.bundle/Contents/Info.plist @@ -3,7 +3,7 @@ BuildMachineOSBuild - 15A279b + 15A282b CFBundleDevelopmentRegion en CFBundleExecutable diff --git a/osx/mpkg/Plugins/quickstartplugin.bundle/Contents/MacOS/quickstartplugin b/osx/mpkg/Plugins/quickstartplugin.bundle/Contents/MacOS/quickstartplugin index aebf40b5a97726afbcb0b2ca64f1f6d553cd14ae..f9737f4e775d292b112332474009903f1abf7f84 100755 GIT binary patch literal 24344 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 Jl$UuF{{@(#=tKYj literal 24080 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 From 30d33dea9c84627886e1a4a2415ab5d69f863b19 Mon Sep 17 00:00:00 2001 From: Jeffrey Morgan Date: Fri, 9 Oct 2015 16:36:13 -0400 Subject: [PATCH 2/7] Keep only mixpanel Signed-off-by: Jeffrey Morgan --- osx/installerplugins/common/bugsnag.h | 54 ------------------- osx/installerplugins/common/mixpanel.h | 25 +++++++-- osx/installerplugins/common/utils.h | 36 ------------- .../project.pbxproj | 4 -- .../Base.lproj/managevmplugin.xib | 4 +- .../managevmplugin/managevmpluginPane.m | 20 ------- 6 files changed, 22 insertions(+), 121 deletions(-) delete mode 100644 osx/installerplugins/common/bugsnag.h delete mode 100644 osx/installerplugins/common/utils.h diff --git a/osx/installerplugins/common/bugsnag.h b/osx/installerplugins/common/bugsnag.h deleted file mode 100644 index a91f0e098f..0000000000 --- a/osx/installerplugins/common/bugsnag.h +++ /dev/null @@ -1,54 +0,0 @@ -// -// bugsnag.h -// installerplugins -// -// Created by Jeffrey Dean Morgan on 9/12/15. -// Copyright (c) 2015 Docker Inc. All rights reserved. -// - -#ifndef installerplugins_bugsnag_h -#define installerplugins_bugsnag_h - -#import -#import "utils.h" - -@interface Bugsnag : NSObject - -+ (void) trackEvent:(NSString *)name forPane:(InstallerPane*)pane; - -@end - -@implementation Bugsnag - -+ (void) reportError:(NSString *)name forPane:(InstallerPane*)pane withProperties:(NSDictionary *)properties { - NSString *uuid = [Utils uuid]; - if (!uuid) { - return; - } - - NSString *props = @""; - for (NSString *key in properties) { - props = [props stringByAppendingFormat:@",\"%@\": \"%@\"", key, [properties objectForKey:key]]; - } - - NSString *osVersion = [@"Mac OS X " stringByAppendingString:[[[[NSProcessInfo processInfo] operatingSystemVersionString] componentsSeparatedByString:@" "] objectAtIndex:1]]; - - NSBundle* bundle = [[pane section] bundle]; - NSString* token = [bundle objectForInfoDictionaryKey:@"Bugsnag Token"]; - NSString* installerVersion = [bundle objectForInfoDictionaryKey:@"Installer Version"]; - NSString* payload = [NSString stringWithFormat:@"{\"event\": \"%@\", \"properties\": {\"token\": \"%@\", \"distinct_id\": \"%@\", \"os\": \"darwin\", \"os version\":\"%@\", \"version\": \"%@\" %@}}", name, token, uuid, osVersion, installerVersion, props]; - - NSData * data = [payload dataUsingEncoding:NSUTF8StringEncoding]; - NSString* base64Encoded = [data base64EncodedStringWithOptions:0]; - NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString: [NSString stringWithFormat:@"https://notify.bugsnag.com", base64Encoded]]]; - - NSOperationQueue *queue = [[NSOperationQueue alloc] init]; - [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {}]; -} - -+ (void) trackEvent:(NSString *)name forPane:(InstallerPane*)pane { - [self trackEvent:name forPane:pane withProperties:nil]; -} - -@end -#endif diff --git a/osx/installerplugins/common/mixpanel.h b/osx/installerplugins/common/mixpanel.h index 2c6bc2c45f..c1ab286b2c 100644 --- a/osx/installerplugins/common/mixpanel.h +++ b/osx/installerplugins/common/mixpanel.h @@ -10,7 +10,6 @@ #define installerplugins_mixpanel_h #import -#import "utils.h" @interface Mixpanel : NSObject @@ -20,13 +19,28 @@ @implementation Mixpanel ++ (NSString *) uuid { + NSString *appPath = [NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES) objectAtIndex:0]; + NSString *appDirPath = [NSString pathWithComponents:[NSArray arrayWithObjects:appPath, @"DockerToolbox", nil]]; + NSString *appFilePath = [NSString pathWithComponents:[NSArray arrayWithObjects:appDirPath, @"id", nil]]; + + NSString *uuid = [NSString stringWithContentsOfFile:appFilePath encoding:NSUTF8StringEncoding error:nil]; + if (!uuid || ![uuid length]) { + uuid = [[NSUUID UUID] UUIDString]; + [[NSFileManager defaultManager] createDirectoryAtPath:appDirPath withIntermediateDirectories:YES attributes:nil error:nil]; + [uuid writeToFile:appFilePath atomically:YES encoding:NSUTF8StringEncoding error:nil]; + } + + return uuid; +} + + (void) trackEvent:(NSString *)name forPane:(InstallerPane*)pane withProperties:(NSDictionary *)properties { BOOL trackingDisabled = [[[[pane section] sharedDictionary] objectForKey:@"disableTracking"] boolValue]; if (trackingDisabled) { return; } - - NSString *uuid = [Utils uuid]; + + NSString *uuid = [self uuid]; if (!uuid) { return; } @@ -35,18 +49,19 @@ for (NSString *key in properties) { props = [props stringByAppendingFormat:@",\"%@\": \"%@\"", key, [properties objectForKey:key]]; } - + NSString *osVersion = [@"Mac OS X " stringByAppendingString:[[[[NSProcessInfo processInfo] operatingSystemVersionString] componentsSeparatedByString:@" "] objectAtIndex:1]]; NSBundle* bundle = [[pane section] bundle]; NSString* token = [bundle objectForInfoDictionaryKey:@"Mixpanel Token"]; NSString* installerVersion = [bundle objectForInfoDictionaryKey:@"Installer Version"]; NSString* payload = [NSString stringWithFormat:@"{\"event\": \"%@\", \"properties\": {\"token\": \"%@\", \"distinct_id\": \"%@\", \"os\": \"darwin\", \"os version\":\"%@\", \"version\": \"%@\" %@}}", name, token, uuid, osVersion, installerVersion, props]; - + @try { NSData * data = [payload dataUsingEncoding:NSUTF8StringEncoding]; NSString* base64Encoded = [data base64EncodedStringWithOptions:0]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString: [NSString stringWithFormat:@"https://api.mixpanel.com/track/?data=%@", base64Encoded]]]; + NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [NSURLConnection sendAsynchronousRequest:request queue:queue completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {}]; } diff --git a/osx/installerplugins/common/utils.h b/osx/installerplugins/common/utils.h deleted file mode 100644 index d698276ad7..0000000000 --- a/osx/installerplugins/common/utils.h +++ /dev/null @@ -1,36 +0,0 @@ -// -// uuid.h -// installerplugins -// -// Created by Jeffrey Dean Morgan on 9/14/15. -// Copyright (c) 2015 Docker Inc. All rights reserved. -// - -#ifndef installerplugins_uuid_h -#define installerplugins_uuid_h - -@interface Utils : NSObject - -+ (NSString *) uuid; - -@end - -@implementation Utils - -+ (NSString *) uuid { - NSString *appPath = [NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES) objectAtIndex:0]; - NSString *appDirPath = [NSString pathWithComponents:[NSArray arrayWithObjects:appPath, @"DockerToolbox", nil]]; - NSString *appFilePath = [NSString pathWithComponents:[NSArray arrayWithObjects:appDirPath, @"id", nil]]; - - NSString *uuid = [NSString stringWithContentsOfFile:appFilePath encoding:NSUTF8StringEncoding error:nil]; - if (!uuid || ![uuid length]) { - uuid = [[NSUUID UUID] UUIDString]; - [[NSFileManager defaultManager] createDirectoryAtPath:appDirPath withIntermediateDirectories:YES attributes:nil error:nil]; - [uuid writeToFile:appFilePath atomically:YES encoding:NSUTF8StringEncoding error:nil]; - } - - return uuid; -} - -@end -#endif diff --git a/osx/installerplugins/installerplugins.xcodeproj/project.pbxproj b/osx/installerplugins/installerplugins.xcodeproj/project.pbxproj index bba654e0f4..8aba50cba6 100644 --- a/osx/installerplugins/installerplugins.xcodeproj/project.pbxproj +++ b/osx/installerplugins/installerplugins.xcodeproj/project.pbxproj @@ -53,8 +53,6 @@ 1B4C91C31B85198100A06068 /* InstallerSections.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = InstallerSections.plist; sourceTree = ""; }; 1B8417E71B85261F00B1FA4D /* kitematic.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = kitematic.png; sourceTree = ""; }; 1B8417E81B85261F00B1FA4D /* quickstart.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = quickstart.png; sourceTree = ""; }; - 1BB3EBCC1BA74ABA00C2A3CF /* utils.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = utils.h; path = common/utils.h; sourceTree = ""; }; - 1BB3EBCD1BA74AD300C2A3CF /* bugsnag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = bugsnag.h; path = common/bugsnag.h; sourceTree = ""; }; 1BF102BB1B8BDEDA00FCB650 /* overviewplugin.bundle */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = overviewplugin.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; 1BF102BE1B8BDEDA00FCB650 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 1BF102C01B8BDEDA00FCB650 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; @@ -132,9 +130,7 @@ 1B4C915D1B85021200A06068 /* common */ = { isa = PBXGroup; children = ( - 1BB3EBCD1BA74AD300C2A3CF /* bugsnag.h */, 1B4C915E1B85023200A06068 /* mixpanel.h */, - 1BB3EBCC1BA74ABA00C2A3CF /* utils.h */, ); name = common; sourceTree = ""; diff --git a/osx/installerplugins/managevmplugin/Base.lproj/managevmplugin.xib b/osx/installerplugins/managevmplugin/Base.lproj/managevmplugin.xib index bd9b2b313e..00c9dc39f6 100644 --- a/osx/installerplugins/managevmplugin/Base.lproj/managevmplugin.xib +++ b/osx/installerplugins/managevmplugin/Base.lproj/managevmplugin.xib @@ -1,5 +1,5 @@ - + @@ -98,7 +98,7 @@