Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add detection logic for missing OpenSSL symlinks on macOS #986

Merged
merged 1 commit into from
Nov 24, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 32 additions & 15 deletions src/coreclr-debug/activate.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ let _debugUtil: CoreClrDebugUtil = null;
let _reporter: TelemetryReporter = null;
let _logger: Logger = null;

export function activate(context: vscode.ExtensionContext, reporter: TelemetryReporter, logger: Logger) {
export function activate(context: vscode.ExtensionContext, reporter: TelemetryReporter, logger: Logger, channel: vscode.OutputChannel) {
_debugUtil = new CoreClrDebugUtil(context.extensionPath, logger);
_reporter = reporter;
_logger = logger;
Expand All @@ -24,7 +24,7 @@ export function activate(context: vscode.ExtensionContext, reporter: TelemetryRe
PlatformInformation.GetCurrent().then((info) => {
if (info.runtimeId) {
logger.appendLine("[ERROR]: C# Extension failed to install the debugger package");
showInstallErrorMessage();
showInstallErrorMessage(channel);
} else {
if (info.isLinux) {
logger.appendLine(`[WARNING]: The current Linux distribution '${info.distribution.name}' version '${info.distribution.version}' is not currently supported by the .NET Core debugger. Debugging will not be available.`);
Expand All @@ -35,22 +35,38 @@ export function activate(context: vscode.ExtensionContext, reporter: TelemetryRe
}, (err) => {
// Somehow we couldn't figure out the platform we are on
logger.appendLine("[ERROR]: C# Extension failed to install the debugger package");
showInstallErrorMessage();
showInstallErrorMessage(channel);
});
} else if (!CoreClrDebugUtil.existsSync(_debugUtil.installCompleteFilePath())) {
_debugUtil.checkDotNetCli()
.then((dotnetInfo: DotnetInfo) => {
let installer = new debugInstall.DebugInstaller(_debugUtil);
installer.finishInstall()
.then(() => {
vscode.window.setStatusBarMessage('Successfully installed .NET Core Debugger.');
})
.catch((err) => {
logger.appendLine("[ERROR]: An error occured while installing the .NET Core Debugger:");
logger.appendLine(err);
showInstallErrorMessage();
// TODO: log telemetry?
});
_debugUtil.checkOpenSSLInstalledIfRequired().then((isInstalled) => {
if (isInstalled) {
let installer = new debugInstall.DebugInstaller(_debugUtil);
installer.finishInstall()
.then(() => {
vscode.window.setStatusBarMessage('Successfully installed .NET Core Debugger.');
})
.catch((err) => {
logger.appendLine("[ERROR]: An error occured while installing the .NET Core Debugger:");
logger.appendLine(err);
showInstallErrorMessage(channel);
// TODO: log telemetry?
});
} else {
logger.appendLine("[ERROR] The debugger cannot be installed. A required component, OpenSSL, is not correctly configured.");
logger.appendLine("In order to use the debugger, open a terminal window and execute the following instructions.");
logger.appendLine("See https://www.microsoft.com/net/core#macos for more details.");
logger.appendLine();
logger.appendLine(" brew update");
logger.appendLine(" brew install openssl");
logger.appendLine(" mkdir -p /usr/local/lib");
logger.appendLine(" ln -s /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib /usr/local/lib/");
logger.appendLine(" ln -s /usr/local/opt/openssl/lib/libssl.1.0.0.dylib /usr/local/lib/");
channel.show();
vscode.window.showErrorMessage("The .NET Core debugger cannot be installed. OpenSSL is not correctly configured. See the C# output channel for details.");
}
});
}, (err) => {
// Check for dotnet tools failed. pop the UI
// err is a DotNetCliError but use defaults in the unexpected case that it's not
Expand All @@ -61,7 +77,8 @@ export function activate(context: vscode.ExtensionContext, reporter: TelemetryRe
}
}

function showInstallErrorMessage() {
function showInstallErrorMessage(channel: vscode.OutputChannel) {
channel.show();
vscode.window.showErrorMessage("An error occured during installation of the .NET Core Debugger. The C# extension may need to be reinstalled.");
}

Expand Down
48 changes: 27 additions & 21 deletions src/coreclr-debug/proxy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,27 +70,33 @@ function proxy() {
//first check if dotnet is on the path and new enough
util.checkDotNetCli()
.then((dotnetInfo) => {
// next check if we have begun installing packages
common.installFileExists(common.InstallFileType.Begin)
.then((beginExists: boolean) => {
if (beginExists) {
// packages manager has begun
sendStillDownloadingMessage();
} else {
// begin doesn't exist. There is a chance we finished downloading and begin had been deleted. Check if lock exists
common.installFileExists(common.InstallFileType.Lock)
.then((lockExists) => {
if (lockExists) {
// packages have finished installing but we had not finished rewriting our manifest when F5 came in
sendStillDownloadingMessage();
}
else {
// no install files existed when we checked. we have likely not been activated
sendDownloadingNotStartedMessage();
}
});
}
});
util.checkOpenSSLInstalledIfRequired().then((isInstalled) => {
if (isInstalled) {
// next check if we have begun installing packages
common.installFileExists(common.InstallFileType.Begin)
.then((beginExists: boolean) => {
if (beginExists) {
// packages manager has begun
sendStillDownloadingMessage();
} else {
// begin doesn't exist. There is a chance we finished downloading and begin had been deleted. Check if lock exists
common.installFileExists(common.InstallFileType.Lock)
.then((lockExists) => {
if (lockExists) {
// packages have finished installing but we had not finished rewriting our manifest when F5 came in
sendStillDownloadingMessage();
}
else {
// no install files existed when we checked. we have likely not been activated
sendDownloadingNotStartedMessage();
}
});
}
});
} else {
sendErrorMessage("The .NET Core debugger cannot be started. OpenSSL is not correctly configured. See the C# output channel for details.");
}
});
}, (err) => {
// error from checkDotNetCli
sendErrorMessage(err.ErrorMessage || util.defaultDotNetCliErrorMessage());
Expand Down
20 changes: 20 additions & 0 deletions src/coreclr-debug/util.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

import * as path from 'path';
import * as fs from 'fs';
import * as os from 'os';
import * as semver from 'semver';
import { execChildProcess } from './../common';
import { Logger } from './../logger';
Expand Down Expand Up @@ -75,6 +76,25 @@ export class CoreClrDebugUtil
return 'Failed to find up to date dotnet cli on the path.';
}

public checkOpenSSLInstalledIfRequired(): Promise<boolean> {
if (os.platform() !== "darwin") {
// We only need special handling on OSX
return Promise.resolve(true);
}

return new Promise<boolean>((resolve, reject) => {
fs.access("/usr/local/lib/libcrypto.1.0.0.dylib", (err1) => {
if (err1) {
resolve(false);
} else {
fs.access("/usr/local/lib/libssl.1.0.0.dylib", (err2) => {
resolve(!err2);
});
}
});
});
}

// This function checks for the presence of dotnet on the path and ensures the Version
// is new enough for us.
// Returns: a promise that returns a DotnetInfo class
Expand Down
2 changes: 1 addition & 1 deletion src/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ export function activate(context: vscode.ExtensionContext): any {
OmniSharp.activate(context, reporter);

// activate coreclr-debug
coreclrdebug.activate(context, reporter, logger);
coreclrdebug.activate(context, reporter, logger, _channel);
});
}

Expand Down