dataflo.ws
Version:
Zero-code JSON config-based dataflow engine for Node, PhoneGap and browser.
74 lines (65 loc) • 1.87 kB
JavaScript
var spawn = require ('child_process').spawn,
fs = require ('fs'),
task = require('dataflo.ws/task/base'),
util = require('util');
/**
* Run shell script
*/
var shellTask = module.exports = function (config) {
this.init (config);
};
util.inherits(shellTask, task);
util.extend(shellTask.prototype, {
/**
* Run shell command
*
* @param {Object} env - environment, parameters passed as environment to shell
* @param {String} commandString - command for shell
* @param {Boolean} [strictEnv=false] - don't copy env from process.env
* @param {Boolean} [splitStrings=false] - split strings at output
* @param {String} [result=output] - what result you need? you can choose between `output`, `exitCode` and `success`
* @api public
*/
run: function () {
var self = this;
var env = {};
if (!this.strictEnv) {
for (var k in process.env) {
env[k] = process.env[k];
}
}
for (k in self.env) {
env[k] = self.env[k];
}
var shellOutput = '';
var shell = spawn('/bin/sh', ['-c', this.commandString], {
env: env, stdio: ['pipe', 'pipe', 2]
});
shell.stdout.on('data', function (data) {
shellOutput += data;
});
shell.on('close', function (code) {
if (self.result == "exitCode") {
self.completed (code);
return;
}
if (code !== 0) {
console.log('shell process exited with code ' + code);
self.failed (); // this is for both results: success and output
return;
} else if (self.result == "success") {
self.completed(true);
return;
}
if (self.splitStrings) {
var dataForHandler = shellOutput.replace("\r", "").split("\n")
//dataForHandler.pop();
self.completed (dataForHandler);
} else {
self.completed (shellOutput);
};
});
//child.stdout.on('data', function(data) { process.stdout.write(data); });
}
});
module.exports = shellTask;