diff --git a/src/menutemplate.js b/src/menutemplate.js index f673f8d265..36d5b44634 100644 --- a/src/menutemplate.js +++ b/src/menutemplate.js @@ -3,6 +3,7 @@ var app = remote.require('app'); var shell = require('shell'); var router = require('./router'); var util = require('./utils/Util'); +var setupUtil = require('./utils/SetupUtil'); var metrics = require('./utils/MetricsUtil'); var machine = require('./utils/DockerMachineUtil'); import docker from './utils/DockerUtil'; @@ -20,6 +21,23 @@ var MenuTemplate = function () { { type: 'separator' }, + { + label: 'Install Docker Commands', + enabled: true, + click: function () { + metrics.track('Installed Docker Commands'); + if (!setupUtil.shouldUpdateBinaries()) { + return; + } + + if (setupUtil.needsBinaryFix()) { + let cmd = setupUtil.copyBinariesCmd() + ' && ' + setupUtil.fixBinariesCmd(); + util.exec(setupUtil.macSudoCmd(cmd)).catch(() => {}); + } else { + util.exec(setupUtil.copyBinariesCmd()); + } + }, + }, { label: 'Preferences', accelerator: util.CommandOrCtrl() + '+,', diff --git a/src/stores/SetupStore-test.js b/src/stores/SetupStore-test.js index 5613d44aa5..66e0a251f6 100644 --- a/src/stores/SetupStore-test.js +++ b/src/stores/SetupStore-test.js @@ -33,8 +33,6 @@ describe('SetupStore', function () { describe('install step', function () { util.exec.mockReturnValue(Promise.resolve()); - setupUtil.copyBinariesCmd.mockReturnValue(Promise.resolve()); - setupUtil.fixBinariesCmd.mockReturnValue(Promise.resolve()); virtualBox.killall.mockReturnValue(Promise.resolve()); setupUtil.installVirtualBoxCmd.mockReturnValue(Promise.resolve()); setupUtil.macSudoCmd.mockImplementation(cmd => 'macsudo ' + cmd); @@ -44,22 +42,9 @@ describe('SetupStore', function () { util.exec.mockReturnValue(Promise.resolve()); return setupStore.steps().install.run().then(() => { expect(virtualBox.killall).toBeCalled(); - expect(setupUtil.copyBinariesCmd).toBeCalled(); - expect(setupUtil.fixBinariesCmd).toBeCalled(); expect(setupUtil.installVirtualBoxCmd).toBeCalled(); }); }); - - pit('only installs binaries if virtualbox is installed', function () { - virtualBox.installed.mockReturnValue(true); - util.compareVersions.mockReturnValue(0); - setupUtil.needsBinaryFix.mockReturnValue(true); - return setupStore.steps().install.run().then(() => { - expect(setupUtil.copyBinariesCmd).toBeCalled(); - expect(setupUtil.fixBinariesCmd).toBeCalled(); - expect(setupUtil.installVirtualBoxCmd).not.toBeCalled(); - }); - }); }); describe('init step', function () { diff --git a/src/stores/SetupStore.js b/src/stores/SetupStore.js index be11126a6e..f97a8e7cbb 100644 --- a/src/stores/SetupStore.js +++ b/src/stores/SetupStore.js @@ -37,20 +37,14 @@ var _steps = [{ percent: 0, seconds: 5, run: Promise.coroutine(function* (progressCallback) { - var cmd = setupUtil.copyBinariesCmd() + ' && ' + setupUtil.fixBinariesCmd(); if (!virtualBox.installed()) { yield virtualBox.killall(); - cmd += ' && ' + setupUtil.installVirtualBoxCmd(); - } else { - if (!setupUtil.needsBinaryFix()) { - return; - } - } - try { progressCallback(50); // TODO: detect when the installation has started so we can simulate progress - yield util.exec(setupUtil.macSudoCmd(cmd)); - } catch (err) { - throw null; + try { + yield util.exec(setupUtil.macSudoCmd(setupUtil.installVirtualBoxCmd())); + } catch (err) { + throw null; + } } }) }, { @@ -159,7 +153,7 @@ var SetupStore = assign(Object.create(EventEmitter.prototype), { var vboxNeedsInstall = !virtualBox.installed(); required.download = vboxNeedsInstall && (!fs.existsSync(vboxfile) || setupUtil.checksum(vboxfile) !== virtualBox.checksum()); - required.install = vboxNeedsInstall || setupUtil.needsBinaryFix(); + required.install = vboxNeedsInstall; required.init = required.install || !(yield machine.exists()) || (yield machine.state()) !== 'Running' || !isoversion || util.compareVersions(isoversion, packagejson['docker-version']) < 0; var exists = yield machine.exists(); @@ -176,20 +170,10 @@ var SetupStore = assign(Object.create(EventEmitter.prototype), { }); return Promise.resolve(_requiredSteps); }), - updateBinaries: function () { - if (setupUtil.needsBinaryFix()) { - return Promise.resolve(); - } - if (setupUtil.shouldUpdateBinaries()) { - return util.exec(setupUtil.copyBinariesCmd()); - } - return Promise.resolve(); - }, run: Promise.coroutine(function* () { metrics.track('Started Setup', { virtualbox: virtualBox.installed() ? yield virtualBox.version() : 'Not Installed' }); - yield this.updateBinaries(); var steps = yield this.requiredSteps(); for (let step of steps) { _currentStep = step; diff --git a/src/utils/DockerMachineUtil.js b/src/utils/DockerMachineUtil.js index 98399d3c25..b5dceb62d7 100644 --- a/src/utils/DockerMachineUtil.js +++ b/src/utils/DockerMachineUtil.js @@ -156,7 +156,7 @@ var DockerMachine = { }); } else { this.info().then(machine => { - var cmd = [resources.terminal(), `DOCKER_HOST=${machine.url} DOCKER_CERT_PATH=${path.join(util.home(), '.docker/machine/machines/' + machine.name)} DOCKER_TLS_VERIFY=1 $SHELL`]; + var cmd = [resources.terminal(), `PATH=${resources.resourceDir()}:$PATH DOCKER_HOST=${machine.url} DOCKER_CERT_PATH=${path.join(util.home(), '.docker/machine/machines/' + machine.name)} DOCKER_TLS_VERIFY=1 $SHELL`]; util.exec(cmd).then(() => {}); }); } diff --git a/src/utils/SetupUtil.js b/src/utils/SetupUtil.js index 49e2bc0e25..a7697daec1 100644 --- a/src/utils/SetupUtil.js +++ b/src/utils/SetupUtil.js @@ -12,16 +12,19 @@ var virtualBox = require ('./VirtualBoxUtil'); var SetupUtil = { needsBinaryFix() { return this.pathDoesNotExistOrDenied(util.binsPath()) || - this.pathDoesNotExistOrDenied(util.dockerBinPath()) || - this.pathDoesNotExistOrDenied(util.dockerMachineBinPath()); + (fs.existsSync(util.dockerBinPath()) && this.pathDenied(util.dockerBinPath())) || + (fs.existsSync(util.dockerMachineBinPath()) && this.pathDenied(util.dockerMachineBinPath())); }, pathDoesNotExistOrDenied: function (path) { if(util.isWindows()) { return (!fs.existsSync(path)); } else { - return (!fs.existsSync(path) || fs.statSync(path).gid !== 80 || fs.statSync(path).uid !== process.getuid()); + return (!fs.existsSync(path) || this.pathDenied(path)); } }, + pathDenied: function (path) { + return fs.statSync(path).gid !== 80 || fs.statSync(path).uid !== process.getuid(); + }, shouldUpdateBinaries: function () { return !fs.existsSync(util.dockerBinPath()) || !fs.existsSync(util.dockerMachineBinPath()) ||