mirror of https://github.com/node-red/node-red.git
changes to add stdin support to the exec node
parent
a16c72b6a8
commit
fb4f515c6e
|
@ -23,6 +23,11 @@
|
|||
<label><i class="fa fa-plus"></i> <span data-i18n="exec.label.append"></span></label>
|
||||
<input type="checkbox" id="node-input-addpay-cb" style="display:inline-block; width:auto;">
|
||||
<input type="text" id="node-input-addpay" style="margin-left: 5px; width:160px;">
|
||||
<span data-i18n="exec.label.as"></span>
|
||||
<select type="text" id="node-input-addpayTo" style="width:25%">
|
||||
<option value="parameter" data-i18n="exec.opt.parameter"></option>
|
||||
<option value="stdin" data-i18n="exec.opt.stdin"></option>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-row">
|
||||
<label for="node-input-append"> </label>
|
||||
|
@ -57,6 +62,7 @@
|
|||
defaults: {
|
||||
command: {value:""},
|
||||
addpay: {value:"", validate: RED.validators.typedInput({ type: 'msg', allowBlank: true })},
|
||||
addpayTo: { value: "parameter" },
|
||||
append: {value:""},
|
||||
useSpawn: {value:"false"},
|
||||
timer: {value:""},
|
||||
|
@ -84,10 +90,16 @@
|
|||
if ($("#node-input-useSpawn").val() === null) {
|
||||
$("#node-input-useSpawn").val(this.useSpawn.toString());
|
||||
}
|
||||
|
||||
if ($("#node-input-addpayTo").val() === null) {
|
||||
$("#node-input-addpayTo").val(this.addpayTo.toString());
|
||||
}
|
||||
|
||||
$("#node-input-addpay-cb").prop("checked", this.addpay === true || (this.addpay !== false && this.addpay !== ""))
|
||||
var addpayValue = (this.addpay === true)?"payload":((this.addpay === false || this.addpay === "")?"payload":this.addpay);
|
||||
$("#node-input-addpay-cb").on("change", function(evt) {
|
||||
$("#node-input-addpay").typedInput("disable",!$("#node-input-addpay-cb").prop("checked"));
|
||||
$("#node-input-addpayTo").prop("disabled", !$("#node-input-addpay-cb").prop("checked"));
|
||||
});
|
||||
|
||||
$("#node-input-addpay").val(addpayValue);
|
||||
|
|
|
@ -20,6 +20,8 @@ module.exports = function(RED) {
|
|||
var exec = require('child_process').exec;
|
||||
var fs = require('fs');
|
||||
var isUtf8 = require('is-utf8');
|
||||
var stream = require('stream')
|
||||
|
||||
const isWindows = process.platform === 'win32'
|
||||
|
||||
function ExecNode(n) {
|
||||
|
@ -30,6 +32,12 @@ module.exports = function(RED) {
|
|||
if (this.addpay === true) {
|
||||
this.addpay = "payload";
|
||||
}
|
||||
|
||||
this.addpayTo = n.addpayTo;
|
||||
if ( this.addpayTo === undefined ) {
|
||||
this.addpayTo = "parameter"
|
||||
}
|
||||
|
||||
this.append = (n.append || "").trim();
|
||||
this.useSpawn = (n.useSpawn == "true");
|
||||
this.timer = Number(n.timer || 0)*1000;
|
||||
|
@ -69,7 +77,7 @@ module.exports = function(RED) {
|
|||
// make the extra args into an array
|
||||
// then prepend with the msg.payload
|
||||
var arg = node.cmd;
|
||||
if (node.addpay) {
|
||||
if (node.addpay && node.addpayTo == "parameter") {
|
||||
var value = RED.util.getMessageProperty(msg, node.addpay);
|
||||
if (value !== undefined) {
|
||||
arg += " " + value;
|
||||
|
@ -87,7 +95,7 @@ module.exports = function(RED) {
|
|||
});
|
||||
var cmd = arg.shift();
|
||||
// Since 18.20.2/20.12.2, it is invalid to call spawn on Windows with a .bat/.cmd file
|
||||
// without using shell: true.
|
||||
// without using shell: true.
|
||||
const opts = isWindows ? { ...node.spawnOpt, shell: true } : node.spawnOpt
|
||||
/* istanbul ignore else */
|
||||
node.debug(cmd+" ["+arg+"]");
|
||||
|
@ -137,6 +145,16 @@ module.exports = function(RED) {
|
|||
node.error(code,RED.util.cloneMessage(msg));
|
||||
}
|
||||
});
|
||||
|
||||
if (node.addpay && node.addpayTo == "stdin") {
|
||||
var value = RED.util.getMessageProperty(msg, node.addpay);
|
||||
if (value !== undefined) {
|
||||
var stdinStream = new stream.Readable();
|
||||
stdinStream.push(value); // Add data to the internal queue for users of the stream to consume
|
||||
stdinStream.push(null); // Signals the end of the stream (EOF)
|
||||
stdinStream.pipe(child.stdin);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* istanbul ignore else */
|
||||
|
@ -181,6 +199,16 @@ module.exports = function(RED) {
|
|||
child.tout = setTimeout(function() { cleanup(child.pid); }, node.timer);
|
||||
}
|
||||
node.activeProcesses[child.pid] = child;
|
||||
|
||||
if (node.addpay && node.addpayTo == "stdin") {
|
||||
var value = RED.util.getMessageProperty(msg, node.addpay);
|
||||
if (value !== undefined) {
|
||||
var stdinStream = new stream.Readable();
|
||||
stdinStream.push(value); // Add data to the internal queue for users of the stream to consume
|
||||
stdinStream.push(null); // Signals the end of the stream (EOF)
|
||||
stdinStream.pipe(child.stdin);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
|
@ -233,14 +233,18 @@
|
|||
"stdout": "stdout",
|
||||
"stderr": "stderr",
|
||||
"retcode": "return code",
|
||||
"winHide": "Hide console"
|
||||
"winHide": "Hide console",
|
||||
"as": "as"
|
||||
|
||||
},
|
||||
"placeholder": {
|
||||
"extraparams": "extra input parameters"
|
||||
},
|
||||
"opt": {
|
||||
"exec": "when the command is complete - exec mode",
|
||||
"spawn": "while the command is running - spawn mode"
|
||||
"spawn": "while the command is running - spawn mode",
|
||||
"parameter": "parameter",
|
||||
"stdin": "stdin"
|
||||
},
|
||||
"oldrc": "Use old style output (compatibility mode)"
|
||||
},
|
||||
|
|
Loading…
Reference in New Issue