docs/src/utils/SetupUtil.js

108 lines
4.0 KiB
JavaScript

var _ = require('underscore');
var crypto = require('crypto');
var fs = require('fs');
var path = require('path');
var request = require('request');
var progress = require('request-progress');
var Promise = require('bluebird');
var util = require('./Util');
var resources = require('./ResourcesUtil');
var virtualBox = require ('./VirtualBoxUtil');
var SetupUtil = {
needsBinaryFix() {
return this.pathDoesNotExistOrDenied(util.binsPath()) ||
(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) || 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()) ||
this.checksum(util.dockerMachineBinPath()) !== this.checksum(resources.dockerMachine()) ||
this.checksum(util.dockerBinPath()) !== this.checksum(resources.docker());
},
copycmd: function (src, dest) {
return ['rm', '-f', dest, '&&', 'cp', src, dest];
},
copyBinariesCmd: function () {
var cmd = ['mkdir', '-p', '/usr/local/bin'];
cmd.push('&&');
cmd.push.apply(cmd, this.copycmd(util.escapePath(resources.dockerMachine()), '/usr/local/bin/docker-machine'));
cmd.push('&&');
cmd.push.apply(cmd, this.copycmd(util.escapePath(resources.docker()), '/usr/local/bin/docker'));
return cmd.join(' ');
},
fixBinariesCmd: function () {
var cmd = [];
cmd.push.apply(cmd, ['chown', `${process.getuid()}:${80}`, path.join('/usr/local/bin')]);
cmd.push('&&');
cmd.push.apply(cmd, ['chown', `${process.getuid()}:${80}`, path.join('/usr/local/bin', 'docker-machine')]);
cmd.push('&&');
cmd.push.apply(cmd, ['chown', `${process.getuid()}:${80}`, path.join('/usr/local/bin', 'docker')]);
return cmd.join(' ');
},
installVirtualBoxCmd: function () {
if(util.isWindows()) {
return `powershell.exe -ExecutionPolicy unrestricted -Command "Start-Process \\\"${path.join(util.supportDir(), virtualBox.filename())}\\\" -ArgumentList \\\"--silent --msiparams REBOOT=ReallySuppress\\\" -Verb runAs -Wait"`;
} else {
return `installer -pkg ${util.escapePath(path.join(util.supportDir(), virtualBox.filename()))} -target /`;
}
},
macSudoCmd: function (cmd) {
return `${util.escapePath(resources.macsudo())} -p "Kitematic requires administrative privileges to install and/or start VirtualBox." sh -c \"${cmd}\"`;
},
simulateProgress(estimateSeconds, progress) {
var times = _.range(0, estimateSeconds * 1000, 200);
var timers = [];
_.each(times, time => {
var timer = setTimeout(() => {
progress(100 * time / (estimateSeconds * 1000));
}, time);
timers.push(timer);
});
},
checksum(filename) {
return crypto.createHash('sha256').update(fs.readFileSync(filename), 'utf8').digest('hex');
},
download(url, filename, checksum, percentCallback) {
return new Promise((resolve, reject) => {
if (fs.existsSync(filename)) {
var existingChecksum = this.checksum(filename);
if (existingChecksum === checksum) {
resolve();
return;
} else {
fs.unlinkSync(filename);
}
}
progress(request({ uri: url, rejectUnauthorized: false }), { throttle: 10 }).on('progress', state => {
if (percentCallback) {
percentCallback(state.percent);
}
}).on('error', err => {
reject(err);
}).pipe(fs.createWriteStream(filename)).on('error', err => {
reject(err);
}).on('close', err => {
if (err) {
reject(err);
}
resolve();
});
});
}
};
module.exports = SetupUtil;