UNPKG

cd-cluster

Version:

A lightweight Continuous Deployment / Continuous Integration platform written in node.

158 lines (145 loc) 3.73 kB
var os = require('os'); var path = require('path'); var fs = require('fs-extra'); var spawn = require('child_process').spawn; var errFactory = require('./err_factory'); exports.startInstance = function (role, env) { var configDir = exports.getConfigDir(); var child = spawn(process.argv[0], [path.join(__dirname, '../bin/www')], { env: env, detached: true, stdio: ['ignore'] }); child.unref(); child.stdout.on('data', function () { fs.outputFileSync(configDir + '/pids/' + role + '.pid', child.pid); process.exit(); }); child.stderr.on('data', function (data) { console.error(data.toString()); }); fs.outputJsonSync(configDir + '/envs/' + role + '.json', env); }; exports.reloadInstance = function (role) { var configDir = exports.getConfigDir(); var env = fs.readJsonSync(configDir + '/envs/' + role + '.json'); exports.stopInstance(role); exports.startInstance(role, env); }; exports.stopInstance = function (role) { try { var filename = exports.getConfigDir() + '/pids/' + role + '.pid'; var pid = fs.readFileSync(filename); fs.remove(filename); process.kill(pid); } catch (e) { console.error(e.message); } }; exports.extend = function (target, /** ..., **/ objects) { target = target || {}; for (var i = 1, l = arguments.length; i < l; ++i) { var object = arguments[i]; exports.forEach(object, function (value, key) { target[key] = value; }); } return target; }; exports.forEach = function (object, iterator, thisObj) { var i, l; if (Array.isArray(object)) { for (i = 0, l = object.length; i < l; ++i) { if (iterator.call(thisObj, object[i], i, object) === false) { break; } } } else if (object instanceof Object) { var key, keys = Object.keys(object); for (i = 0, l = keys.length; i < l; ++i) { key = keys[i]; if (iterator.call(thisObj, object[key], key, object) === false) { break; } } } else if (object !== undefined && iterator !== undefined) { iterator.call(thisObj, object, 0, object); } }; exports.receiveBody = function (stream, next) { var length = 0, chunks = []; stream.on('data', function (chunk) { chunks.push(chunk); length += chunk.length; }); stream.on('end', function () { var body = Buffer.concat(chunks, length); next(null, body); }); }; exports.receiveJSON = function (stream, next) { exports.receiveBody(stream, function (err, body) { var data; if (body && body.length) { try { data = JSON.parse(body); } catch (e) { err = errFactory.notAcceptable(e.message, e.stack); } } next(err, data); }); }; exports.getConfigDir = function () { var configDir = os.homedir() + '/.cd-cluster'; try { fs.accessSync(configDir); } catch (e) { fs.mkdirSync(configDir); } return configDir; }; exports.readConfig = function (name, next) { var err, config; var configDir = exports.getConfigDir(); var filename = configDir + '/' + name + '.json'; try { config = fs.readJsonSync(filename); } catch (e) { err = e; config = null; } next && next(err, config); return config; }; exports.writeConfig = function (name, config, next) { var configDir = exports.getConfigDir(); var filename = configDir + '/' + name + '.json'; fs.outputJson(filename, config, next); }; exports.checkParams = function (params, next) { var err = null; var count = 0; exports.forEach(params, function (item) { if (!item && item !== 0) { err = errFactory.paramError(); return false; } ++count; }); if (!count) { err = errFactory.paramError(); } next(err); }; exports.filter = function (target, cols) { var result = {}; exports.forEach(target, function (value, field) { if (cols.indexOf(field) >= 0) { result[field] = value; } }); return result; };