Files
docker-docs/src/SetupStore.js
Jeffrey Morgan e0f4049c82 Merging
2015-02-09 21:24:12 -08:00

126 lines
4.0 KiB
JavaScript

var EventEmitter = require('events').EventEmitter;
var assign = require('object-assign');
var fs = require('fs');
var path = require('path');
var Promise = require('bluebird');
var boot2docker = require('./Boot2Docker');
var virtualbox = require('./Virtualbox');
var setupUtil = require('./SetupUtil');
var util = require('./Util');
var packagejson = JSON.parse(fs.readFileSync(path.join(__dirname, '..', 'package.json'), 'utf8'));
var _percent = 0;
var _currentStep = null;
var _error = null;
var VIRTUALBOX_FILE = `https://github.com/kitematic/virtualbox/releases/download/${packagejson['virtualbox-version']}/${packagejson['virtualbox-filename']}`;
var SUDO_PROMPT = 'Kitematic requires administrative privileges to install VirtualBox.';
var SetupStore = assign(EventEmitter.prototype, {
PROGRESS_EVENT: 'setup_progress',
STEP_EVENT: 'setup_step',
ERROR_EVENT: 'setup_error',
downloadVirtualboxStep: Promise.coroutine(function* () {
if (virtualbox.installed()) {
var version = yield virtualbox.version();
if (setupUtil.compareVersions(version, packagejson['virtualbox-required-version']) >= 0) {
return;
}
}
yield setupUtil.download(VIRTUALBOX_FILE, path.join(setupUtil.supportDir(), packagejson['virtualbox-filename']), packagejson.checksum, percent => {
_percent = percent;
SetupStore.emit(SetupStore.PROGRESS_EVENT);
});
}),
installVirtualboxStep: Promise.coroutine(function* () {
if (virtualbox.installed()) {
var version = yield virtualbox.version();
if (setupUtil.compareVersions(version, packagejson['virtualbox-required-version']) >= 0) {
return;
}
yield virtualbox.killall();
}
var isSudo = yield setupUtil.isSudo();
var iconPath = path.join(setupUtil.resourceDir(), 'kitematic.icns');
var sudoCmd = isSudo ? ['sudo'] : [path.join(setupUtil.resourceDir(), 'cocoasudo'), '--icon=' + iconPath, `--prompt=${SUDO_PROMPT}`];
sudoCmd.push.apply(sudoCmd, ['installer', '-pkg', path.join(setupUtil.supportDir(), packagejson['virtualbox-filename']), '-target', '/']);
yield util.exec(sudoCmd);
}),
cleanupKitematicStep: function () {
return virtualbox.vmdestroy('kitematic-vm');
},
initBoot2DockerStep: Promise.coroutine(function* () {
var exists = yield boot2docker.exists();
if (!exists) {
yield boot2docker.init();
return;
}
if (!boot2docker.haskeys()) {
throw new Error('Boot2Docker SSH keys do not exist. Fix this by removing the existing Boot2Docker VM setup and re-run the installer. This usually occurs because an old version of Boot2Docker is installed.');
}
var isoversion = boot2docker.isoversion();
if (!isoversion || setupUtil.compareVersions(isoversion, boot2docker.version()) < 0) {
yield boot2docker.stop();
yield boot2docker.upgrade();
}
}),
startBoot2DockerStep: function () {
return boot2docker.waitstatus('saving').then(boot2docker.status).then(status => {
if (status !== 'running') {
return boot2docker.start();
}
});
},
step: function () {
if (_currentStep) {
return _currentStep;
} else {
return '';
}
},
percent: function () {
return _percent;
},
error: function () {
return _error;
},
run: Promise.coroutine(function* () {
var steps = [{
name: 'download_virtualbox',
run: this.downloadVirtualboxStep
}, {
name: 'install_virtualbox',
run: this.installVirtualboxStep
}, {
name: 'cleanup_kitematic',
run: this.cleanupKitematicStep
}, {
name: 'init_boot2docker',
run: this.initBoot2DockerStep
}, {
name: 'start_boot2docker',
run: this.startBoot2DockerStep
}];
_error = null;
for (let step of steps) {
console.log(step.name);
_currentStep = step.name;
_percent = 0;
this.emit(this.STEP_EVENT);
try {
yield step.run();
} catch (err) {
console.log(err);
_error = err;
this.emit(this.ERROR_EVENT);
throw err;
}
}
})
});
module.exports = SetupStore;