mirror of https://github.com/docker/docs.git
149 lines
4.6 KiB
JavaScript
149 lines
4.6 KiB
JavaScript
var child_process = require('child_process');
|
|
var net = require('net');
|
|
var os = require('os');
|
|
var fs = require('fs');
|
|
var path = require('path');
|
|
|
|
var app = require('app');
|
|
var BrowserWindow = require('browser-window');
|
|
|
|
var dirname = __dirname;
|
|
console.log(dirname);
|
|
|
|
var freeport = function (callback) {
|
|
var server = net.createServer();
|
|
var port = 0;
|
|
server.on('listening', function() {
|
|
port = server.address().port;
|
|
server.close();
|
|
});
|
|
server.on('close', function() {
|
|
callback(null, port);
|
|
});
|
|
server.listen(0, '127.0.0.1');
|
|
};
|
|
|
|
var start = function (callback) {
|
|
if (process.env.NODE_ENV === 'development') {
|
|
callback('http://localhost:3000');
|
|
} else {
|
|
process.stdout.write('Starting production server\n');
|
|
if (os.platform() === 'darwin') {
|
|
var kitePath = path.join(process.env.HOME, 'Library/Application Support/Kitematic/');
|
|
var dataPath = path.join(kitePath, 'data');
|
|
console.log(dataPath);
|
|
var bundlePath = path.join(kitePath, 'bundle');
|
|
if (!fs.existsSync(kitePath)) {
|
|
fs.mkdirSync(kitePath);
|
|
}
|
|
if (!fs.existsSync(dataPath)) {
|
|
fs.mkdirSync(dataPath);
|
|
}
|
|
if (!fs.existsSync(bundlePath)) {
|
|
fs.mkdirSync(bundlePath);
|
|
}
|
|
}
|
|
|
|
// One for meteor, one for mongo
|
|
freeport(function (err, webPort) {
|
|
freeport(function(err, mongoPort) {
|
|
console.log('MongoDB: ' + mongoPort);
|
|
console.log('webPort: ' + webPort);
|
|
child_process.exec('kill $(ps aux -e | grep PURPOSE=KITEMATIC | awk \'{print $2}\') && rm ' + path.join(dataPath, 'mongod.lock'), function (error, stdout, stderr) {
|
|
var mongoChild = child_process.spawn(path.join(dirname, 'resources', 'mongod'), ['--bind_ip', '127.0.0.1', '--dbpath', dataPath, '--port', mongoPort, '--unixSocketPrefix', dataPath], {
|
|
env: {
|
|
PURPOSE: 'KITEMATIC'
|
|
}
|
|
});
|
|
var started = false;
|
|
mongoChild.stdout.setEncoding('utf8');
|
|
mongoChild.stdout.on('data', function (data) {
|
|
console.log(data);
|
|
if (data.indexOf('waiting for connections on port ' + mongoPort)) {
|
|
if (!started) {
|
|
started = true;
|
|
} else {
|
|
return;
|
|
}
|
|
|
|
console.log('Starting node child...');
|
|
var rootURL = 'http://localhost:' + webPort;
|
|
var user_env = process.env;
|
|
user_env.ROOT_URL = rootURL;
|
|
user_env.PORT = webPort;
|
|
user_env.BIND_IP = '127.0.0.1';
|
|
user_env.DB_PATH = dataPath;
|
|
user_env.MONGO_URL = 'mongodb://localhost:' + mongoPort + '/meteor';
|
|
user_env.METEOR_SETTINGS = fs.readFileSync(path.join(dirname, 'resources', 'settings.json'), 'utf8');
|
|
user_env.DIR = dirname;
|
|
user_env.NODE_ENV = 'production';
|
|
user_env.NODE_PATH = path.join(dirname, 'node_modules');
|
|
var nodeChild = child_process.spawn(path.join(dirname, 'resources', 'node'), [path.join(dirname, 'bundle', 'main.js')], {
|
|
env: user_env
|
|
});
|
|
|
|
var opened = false;
|
|
nodeChild.stdout.setEncoding('utf8');
|
|
nodeChild.stdout.on('data', function (data) {
|
|
console.log(data);
|
|
if (data.indexOf('Kitematic started.') !== -1) {
|
|
if (!opened) {
|
|
opened = true;
|
|
} else {
|
|
return;
|
|
}
|
|
setTimeout(function () {
|
|
callback(rootURL, nodeChild, mongoChild);
|
|
}, 100);
|
|
}
|
|
});
|
|
}
|
|
});
|
|
});
|
|
});
|
|
});
|
|
}
|
|
};
|
|
|
|
mainWindow = null;
|
|
|
|
app.on('activate-with-no-open-windows', function () {
|
|
if (mainWindow) {
|
|
mainWindow.show();
|
|
}
|
|
return false;
|
|
});
|
|
|
|
app.on('ready', function() {
|
|
start(function (url, nodeChild, mongoChild) {
|
|
var cleanUpChildren = function () {
|
|
console.log('Cleaning up children.');
|
|
mongoChild.kill();
|
|
nodeChild.kill();
|
|
app.quit();
|
|
process.exit();
|
|
};
|
|
|
|
if (nodeChild && mongoChild) {
|
|
process.on('exit', cleanUpChildren);
|
|
process.on('uncaughtException', cleanUpChildren);
|
|
process.on('SIGINT', cleanUpChildren);
|
|
process.on('SIGTERM', cleanUpChildren);
|
|
}
|
|
|
|
// Create the browser window.
|
|
var windowOptions = {
|
|
width: 800,
|
|
height: 578,
|
|
frame: false,
|
|
resizable: false,
|
|
'web-preferences': {
|
|
'web-security': false
|
|
}
|
|
};
|
|
mainWindow = new BrowserWindow(windowOptions);
|
|
mainWindow.focus();
|
|
mainWindow.loadUrl(url);
|
|
});
|
|
});
|