changes to add stdin support to the exec node

pull/4880/head
Gerrit Riessen 2024-09-13 16:12:55 +02:00
parent a16c72b6a8
commit fb4f515c6e
3 changed files with 48 additions and 4 deletions

View File

@ -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);

View File

@ -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);
}
}
}
}
});

View File

@ -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)"
},