/** * Copyright JS Foundation and other contributors, http://js.foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. **/ const child_process = require('child_process'); const { util } = require('@node-red/util'); var events; function logLines(id,type,data) { events.emit("event-log", {id:id,payload:{ts: Date.now(),data:data,type:type}}); } module.exports = { init: function(_runtime) { events = _runtime.events; }, run: function(command,args,options,emit) { var invocationId = util.generateId(); emit && events.emit("event-log", {ts: Date.now(),id:invocationId,payload:{ts: Date.now(),data:command+" "+args.join(" ")}}); return new Promise((resolve, reject) => { let stdout = ""; let stderr = ""; const child = child_process.spawn(command,args,options); child.stdout.on('data', (data) => { const str = ""+data; stdout += str; emit && logLines(invocationId,"out",str); }); child.stderr.on('data', (data) => { const str = ""+data; stderr += str; emit && logLines(invocationId,"err",str); }); child.on('error', function(err) { stderr = err.toString(); emit && logLines(invocationId,"err",stderr); }) child.on('close', (code) => { let result = { code: code, stdout: stdout, stderr: stderr } emit && events.emit("event-log", {id:invocationId,payload:{ts: Date.now(),data:"rc="+code}}); if (code === 0) { resolve(result) } else { reject(result); } }); }) } }