2 * Copyright 2013 IBM Corp.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 module.exports = function(RED) {
20 var util = require("util");
21 var vm = require("vm");
22 //var dgxml=require("/home/users/schinthakayala/nodered/sheshi/dgxml/dgxml2");
23 var _=require('lodash');
25 var path = require('path');
26 var appDir = path.dirname(require.main.filename);
27 var userDir = appDir + "/" + RED.settings.userDir;
28 var dbHost = RED.settings.dbHost;
29 var request = require('request');
30 var sharedDir = appDir + "/" + RED.settings.sharedDir;
31 var xmlDir = appDir + "/" + RED.settings.xmlPath;
33 //console.log("appDir:" + appDir);
34 //var dgeraw=fs.readFileSync(appDir + "/dge.json").toString();
35 //var dgejson=JSON.parse(dgeraw);
36 //var uploadUrl=dgejson.slaHost + dgejson.uploadUrl;
37 //var slaUrl=dgejson.slaHost + dgejson.slaUrl;
38 //var uploadUrl=RED.settings.slaHost + RED.settings.uploadUrl;
39 //var slaUrl=RED.settings.slaHost + RED.settings.slaUrl;
42 //console.log("Upload url: " + uploadUrl);
45 RED.nodes.createNode(this,n);
50 function writeHtmlToFile(fileName,str){
51 var localfile = appDir + "/" + RED.settings.htmlPath + fileName;
53 fs.writeFileSync(localfile,str);
55 console.log("Error:" + e);
59 function writeXmlToFile(fileName,str){
60 var localfile = appDir + "/" + RED.settings.xmlPath + fileName;
62 fs.writeFileSync(localfile,str);
64 console.log("Error:" + e);
68 function sendXml(fileName,res) {
69 var needle, localfile, data;
70 needle = require('needle')
71 localfile = appDir + "/" + RED.settings.xmlPath + fileName;
72 console.log("localfile:" + localfile);
74 uploadedfile: { file: localfile, content_type: 'text/xml' }
76 needle.post(uploadUrl, data, { multipart: true }, function(err, resp, body) {
78 if(resp != undefined && resp != null){
79 console.log("resp Code for sendXml:" + resp.statusCode);
81 fs.unlink(localfile, function (error) {
83 console.log("Error deleting file "+localfile);
85 //console.log("deleted file:" + localfile);
90 console.log("Error posting to slaUrl:" + slaUrl);
91 console.log("Error:" +err);
92 res.json({"error":err});
95 //console.log("slaUrl:" + slaUrl);
96 res.json({"url":slaUrl});
102 function oldsendXml(fileName) {
103 console.log("In sendXML for file: " + fileName);
104 var fileStream, formdata, localfile;
105 localfile = appDir + "/" + RED.settings.xmlPath + fileName;
108 MAX_FILE_SIZE: "100000",
111 contentType: 'audio/mpeg'
117 console.log("Attempting to upload file: " + localfile);
118 console.log("Sending to: " + uploadUrl);
119 formdata.uploadedfile.value = fs.createReadStream(localfile);
120 fileStream = formdata.uploadedfile.value;
122 //console.log("Formdata:");
123 //console.dir(formdata);
129 }, function(err, resp, body) {
131 console.log("err: " + err);
132 return console.log("body: " + body);
137 RED.nodes.registerType("dgstart",dgstart);
139 RED.httpAdmin.post("/uploadxml", function(req,res) {
141 console.log("USER:" + req.user);
142 console.log("Got request to upload xml to SDN-C.");
143 console.log("Requested filename to upload: " + req.params.fileName);
144 console.log("Requested xml to upload: " + req.params.xmlStr);
145 writeToFile( req.params.fileName,req.params.xmlStr);
147 sendXml(req.params.fileName,res);
148 // res.send("Attempt complete.");
149 // res.redirect(slaUrl);
153 RED.httpAdmin.post("/OldUploadxml", function(req,res) {
155 //console.log("USER:" + req.user);
156 var qs = require('querystring');
158 req.on('data', function (data) {
160 // Too much POST data, kill the connection!
161 /*if (body.length > 1e6)
162 request.connection.destroy();
165 req.on('end', function () {
166 //console.log("BODY:" + body);
167 var d = new Date().getTime();
169 var fileName= user + "_" + d +".xml";
170 var post = qs.parse(body);
171 //console.log(JSON.stringify(post));
172 // use post['blah'], etc.
173 var localfile = appDir + "/" + RED.settings.xmlPath + fileName;
174 //console.log("localfile:" + localfile);
175 var xmlStr = post['flowXml'];
176 writeXmlToFile(fileName,xmlStr);
177 sendXml(fileName,res);
183 RED.httpAdmin.post("/uploadxml", function(req,res) {
185 //console.log("USER:" + req.user);
186 var qs = require('querystring');
188 req.on('data', function (data) {
190 // Too much POST data, kill the connection!
191 /*if (body.length > 1e6)
192 request.connection.destroy();
195 req.on('end', function () {
196 //console.log("BODY:" + body);
197 var d = new Date().getTime();
199 var fileName= user + "_" + d +".xml";
200 var post = qs.parse(body);
201 //console.log(JSON.stringify(post));
202 // use post['blah'], etc.
203 var localfile = appDir + "/" + RED.settings.xmlPath + fileName;
204 //console.log("localfile:" + localfile);
205 var xmlStr = post['flowXml'];
206 var moduleName = post['module'];
207 var rpc = post['rpc'];
208 writeXmlToFile(fileName,xmlStr);
209 uploadDG(localfile,moduleName,rpc,res);
215 function uploadDG(filePath,moduleName,rpc,res){
216 console.log("called uploadDG...");
217 var exec = require('child_process').exec;
218 var commandToExec = appDir + "/svclogic/svclogic.sh load " + filePath + " " + userDir + "/conf/svclogic.properties";
219 console.log("commandToExec:" + commandToExec);
220 var child = exec(commandToExec ,function (error,stdout,stderr){
221 //console.log(error);
222 console.log("stdout:" + stdout);
223 console.log("stderr:" + stderr);
225 console.log("Error occured:" + error);
227 //console.log("stderr:" + stderr);
228 res.send(500,{'error':error,'stderr':stderr});
230 res.send(500,{'error':error});
232 //console.log("stdout :" + stdout);
235 //console.log("output:" + stdout);
236 if(stdout.indexOf('Compiler error') != -1){
237 //console.log("compileError occured.");
241 'stderr':"COMPILE_ERROR",
248 res.send(200,{'stdout':stdout,'stderr':stderr,"url":dbHost,"module" : moduleName,"rpc" : rpc});
251 if(stderr && !stdout){
252 //console.log("stderr:" + stderr);
253 if(stderr.indexOf("Saving SvcLogicGraph to database") != -1){
254 res.send(200,{'error':error,'stdout' :'','stderr':stderr,"url":dbHost,"module" : moduleName,"rpc" : rpc});
256 res.send(500,{'error':error,'stdout' :'','stderr':stderr});
263 RED.httpAdmin.get("/displayXml", function(req,res) {
264 var _module = req.query._module;
265 var rpc = req.query.rpc;
266 var version = req.query.version;
267 var mode = req.query.mode;
268 var d = new Date().getTime();
269 displayXml(_module,rpc,version,mode,res);
272 function displayXml(_module,rpc,version,mode,res){
273 var exec = require('child_process').exec;
280 var commandToExec = appDir + "/svclogic/svclogic.sh get-source " + _module + " "
281 + rpc + " " + mode + " " + version + " " + userDir + "/conf/svclogic.properties";
282 console.log("commandToExec:" + commandToExec);
283 var child = exec(commandToExec ,{'maxBuffer':16*1024*1024},function (error,stdout,stderr){
285 console.log("Error occured:" + error);
287 //console.log("stderr:" + stderr);
288 res.send(500,{'error':error,'stderr':stderr,'msg':msg});
290 res.send(500,{'error':error,'msg':msg});
294 console.log("stderr:" + stderr);
297 res.send({'xmldata' : "<xmp>" + stdout + "</xmp>"});
304 RED.httpAdmin.post("/downloadDGXml", function(req,res) {
306 var qs = require('querystring');
308 req.on('data', function (data) {
312 req.on('end', function () {
313 var post = qs.parse(body);
314 var _module = post._module;
316 var version = post.version;
317 var mode = post.mode;
318 var d = new Date().getTime();
319 downloadDGXml(_module,rpc,version,mode,res);
323 function downloadDGXml(_module,rpc,version,mode,res){
324 var exec = require('child_process').exec;
331 var commandToExec = appDir + "/svclogic/svclogic.sh get-source " + _module + " "
332 + rpc + " " + mode + " " + version + " " + userDir + "/conf/svclogic.properties";
333 console.log("commandToExec:" + commandToExec);
334 var child = exec(commandToExec ,function (error,stdout,stderr){
336 console.log("Error occured:" + error);
338 //console.log("stderr:" + stderr);
339 res.send(500,{'error':error,'stderr':stderr,'msg':msg});
341 res.send(500,{'error':error,'msg':msg});
345 console.log("stderr:" + stderr);
348 //console.log("output:" + stdout);
349 //var newOutput = "<pre>" + stdout.replace(/\n/g,'<br>') + "</pre>";
350 //res.json({'stdout': stdout ,'stderr':stderr,"msg":msg});
351 //res.set('Content-Type', 'text/xml');
352 //res.set('Content-Type', 'application/octet-stream');
353 //res.end("<code>" + stdout + "</code>" );
354 //var newOutput ="<html><body>" + stdout + "</body></html>";
355 //res.send(new Buffer( "<code>" + newOutput + "</code>" ) );
356 //res.send(newOutput);
359 var xslStr = '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">' +
360 '<xsl:output omit-xml-declaration="yes" indent="yes"/>' +
361 '<xsl:template match="node()|@*">' +
363 '<xsl:apply-templates select="node()|@*"/>' +
369 var formatted_date = getCurrentDate();
370 var fileName= "db_" + _module + "_" +rpc+ "_" + version + "_" + formatted_date + ".html";
371 var file = xmlDir + "/" + fileName;
372 var xmlStr = '<xmp>' + stdout + "</xmp>";
373 //var xmlStr = "<![CDATA[" + stdout + "]]";
374 //var xmlStr = stdout.replace(/</g,"<");
375 //xmlStr = xmlStr.replace(/>/g,">");
376 //xmlStr = xmlStr.replace(/\n>/g,"<br>");
377 //xmlStr = xmlStr.replace(/\t>/g," ");
379 writeToFile(file,"<html><body>" +xmlStr+ "</body></html>");
380 //console.log("xmlStr:" + xmlStr);
381 res.setHeader('Content-disposition', 'attachment; filename=' + file);
382 //res.setHeader('Content-type', 'text/html');
383 res.setHeader('Content-type', 'text/xml');
391 RED.httpAdmin.get("/displayAsGv", function(req,res) {
392 var _module = req.query._module;
393 var rpc = req.query.rpc;
394 var version = req.query.version;
395 var mode = req.query.mode;
396 var d = new Date().getTime();
397 displayAsGv(_module,rpc,version,mode,res);
400 function displayAsGv(_module,rpc,version,mode,res){
401 var exec = require('child_process').exec;
408 var commandToExec = appDir + "/svclogic/svclogic.sh print " +
409 _module + " " + rpc + " " + mode + " " + version + " "
410 //+ userDir + "/conf/svclogic.properties | dot -Tpng ";
411 //the label="""" is giving an error so replacing it with "null"
412 + userDir + "/conf/svclogic.properties |sed -e 's%label=\"\"\"\"%label=\"null\"%g'| dot -Tsvg ";
413 console.log("commandToExec:" + commandToExec);
414 //+ userDir + "/conf/svclogic.properties | dot -Tsvg ";
415 //var child = exec(commandToExec ,function (error,stdout,stderr){
416 //var child = exec(commandToExec ,{maxBuffer:16*1024*1024},function (error,stdout,stderr){
417 //var child = exec(commandToExec ,{encoding:'base64',maxBuffer:20*1024*1024},function (error,stdout,stderr){
418 var child = exec(commandToExec ,{maxBuffer:20*1024*1024},function (error,stdout,stderr){
420 console.log("Error occured:" + error);
422 console.log("stderr:" + stderr);
423 res.send(500,{'error':error,'stderr':stderr,"msg":msg});
425 res.send(500,{'error':error,"msg":msg});
429 console.log("stderr:" + stderr);
430 //To convert base64 to ascii
431 //console.log(new Buffer(stderr, 'base64').toString('ascii'));
434 //console.log(stdout.length);
435 //console.log("output:" + stdout);
436 //var svg_html = stdout ;
437 //var image = "<img src='data:image/png;base64," + stdout + "'>";
438 //var image = "<iframe width='1200' height='750' src='data:image/png;base64," + stdout + "'></frame>";
439 //var image = "<iframe width='1200' height='750' src='data:image/svg+xml;base64," + stdout + "'></frame>";
440 //var image = "<iframe width='1200' height='750' src='data:image/gif;base64," + stdout + "'></frame>";
441 var image = "<iframe width='1200' height='750' src='data:image/svg+xml;UTF-8," + stdout + "'></frame>";
442 //console.log(image);
443 res.send({'svg_html':image});
449 RED.httpAdmin.post("/shareFlow", function(req,res) {
451 //console.log("USER:" + req.user);
452 var qs = require('querystring');
454 req.on('data', function (data) {
456 // Too much POST data, kill the connection!
457 /*if (body.length > 1e6)
458 request.connection.destroy();
461 req.on('end', function () {
462 var post = qs.parse(body);
464 var nodeSet = JSON.parse(post['flowData']);
465 var activeWorkspace=post['activeWorkspace'];
468 for(var i=0;nodeSet != null && i<nodeSet.length;i++){
469 var node = nodeSet[i];
470 if(node.type == 'module' ){
471 moduleName= node.name;
472 moduleName=moduleName.replace(/ /g,"-");
474 if(node.type == 'method' ){
475 methodName= node.name;
476 methodName=methodName.replace(/ /g,"-");
479 //console.log("BODY:" + body);
480 var d = new Date().getTime();
482 var fileName= moduleName + "_" +methodName+".json";
483 var localfile = sharedDir + "/" + fileName;
484 //console.log("localfile:" + localfile);
486 writeToFile(localfile,JSON.stringify(nodeSet));
487 res.send({"fileName": fileName});
493 RED.httpAdmin.post("/sendEmail", function(req,res) {
495 console.log("USER:" + req.user);
496 var fromAddr = RED.settings.emailAddress;
497 var toAddr = RED.settings.emailAddress;
498 var qs = require('querystring');
500 req.on('data', function (data) {
502 // Too much POST data, kill the connection!
503 /*if (body.length > 1e6)
504 request.connection.destroy();
507 req.on('end', function () {
508 //console.log("BODY:" + body);
509 var d = new Date().getTime();
511 var fileName= user + "_" + d +".html";
512 var post = qs.parse(body);
513 //console.log(JSON.stringify(post));
514 // use post['blah'], etc.
515 var localfile = appDir + "/" + RED.settings.htmlPath + fileName;
516 //console.log("localfile:" + localfile);
517 var nodemailer = require("nodemailer");
518 nodemailer.sendmail = true;
519 var transporter = nodemailer.createTransport();
520 var ua = req.headers['user-agent'];
521 var host = req.headers.host;
522 var fullHtml="<!doctype html><html><head>" + post['flowHtml'];
523 //fullHtml+="<div style='fill:both'></div>";
524 fullHtml+="<div style='margin-left:10px;'><p>XML</p><br><textarea rows='50' cols='150'>" + post['flowXml'] + "</textarea>";
525 fullHtml+="<p>JSON</p><br><textarea rows='50' cols='150'>" + post['flowJson'] + "</textarea></div>";
526 fullHtml+="</body></html>";
527 writeHtmlToFile(fileName,fullHtml);
529 transporter.sendMail({
532 html: "<p>DG Node Flow. click on the attachment to view</p>",
533 subject: 'Node flow from Host:<' + host + '>',
534 attachments : [{'filename': fileName,
535 'contentType': "text/html",
536 /*'filePath': localfile*/
537 'content': fs.createReadStream(localfile)
540 }, function(err, response) {
541 var fullPathtoFileName = appDir + "/" + RED.settings.htmlPath + fileName;
542 fs.unlink(fullPathtoFileName, function (error) {
544 console.log("Error deleting file "+fullPathtoFileName);
546 //console.log("deleted file:" + fullPathtoFileName);
551 console.log("Error:" + err);
556 console.log(response);
564 RED.httpAdmin.post("/doxml/:id", function(req,res) {
565 var node = RED.nodes.getNode(req.params.id);
569 //console.log("doxml was called for node: ");
571 //console.log("calling getJson");
572 var nrjson=dgxml.getJson();
573 console.log("calling nodered2xml");
575 results=dgxml.nodered2xml(nrjson,node.id);
576 var nrxml=results[0];
578 console.log("Got this filename: " + fileName);
580 console.log("appDir: " + appDir);
581 fs.writeFileSync(appDir + "/public/xml/"+fileName,nrxml);
582 // res.send("XML generated! See help on right for link.");
586 node.error("doxml failed:"+err);
587 console.log(err.stack);