/** * Copyright 2013 IBM Corp. * * 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. **/ module.exports = function(RED) { "use strict"; var util = require("util"); var vm = require("vm"); //var dgxml=require("/home/users/schinthakayala/nodered/sheshi/dgxml/dgxml2"); var _=require('lodash'); var fs=require('fs'); var path = require('path'); var appDir = path.dirname(require.main.filename); var userDir = appDir + "/" + RED.settings.userDir; var dbHost = RED.settings.dbHost; var request = require('request'); var sharedDir = appDir + "/" + RED.settings.sharedDir; var xmlDir = appDir + "/" + RED.settings.xmlPath; //console.log("appDir:" + appDir); //var dgeraw=fs.readFileSync(appDir + "/dge.json").toString(); //var dgejson=JSON.parse(dgeraw); //var uploadUrl=dgejson.slaHost + dgejson.uploadUrl; //var slaUrl=dgejson.slaHost + dgejson.slaUrl; //var uploadUrl=RED.settings.slaHost + RED.settings.uploadUrl; //var slaUrl=RED.settings.slaHost + RED.settings.slaUrl; var uploadUrl=""; var slaUrl=""; //console.log("Upload url: " + uploadUrl); function dgstart(n) { RED.nodes.createNode(this,n); this.name = n.name; this.topic = n.topic; } function writeHtmlToFile(fileName,str){ var localfile = appDir + "/" + RED.settings.htmlPath + fileName; try{ fs.writeFileSync(localfile,str); }catch(e){ console.log("Error:" + e); } } function writeXmlToFile(fileName,str){ var localfile = appDir + "/" + RED.settings.xmlPath + fileName; try{ fs.writeFileSync(localfile,str); }catch(e){ console.log("Error:" + e); } } function sendXml(fileName,res) { var needle, localfile, data; needle = require('needle') localfile = appDir + "/" + RED.settings.xmlPath + fileName; console.log("localfile:" + localfile); data={ uploadedfile: { file: localfile, content_type: 'text/xml' } } needle.post(uploadUrl, data, { multipart: true }, function(err, resp, body) { //console.log(body) if(resp != undefined && resp != null){ console.log("resp Code for sendXml:" + resp.statusCode); } fs.unlink(localfile, function (error) { if (error) { console.log("Error deleting file "+localfile); }else{ //console.log("deleted file:" + localfile); } }); if(err){ console.log("Error posting to slaUrl:" + slaUrl); console.log("Error:" +err); res.json({"error":err}); }else{ //console.dir(resp); //console.log("slaUrl:" + slaUrl); res.json({"url":slaUrl}); } }); } function oldsendXml(fileName) { console.log("In sendXML for file: " + fileName); var fileStream, formdata, localfile; localfile = appDir + "/" + RED.settings.xmlPath + fileName; formdata = { MAX_FILE_SIZE: "100000", uploadedfile: { options: { contentType: 'audio/mpeg' } } }; console.log("Attempting to upload file: " + localfile); console.log("Sending to: " + uploadUrl); formdata.uploadedfile.value = fs.createReadStream(localfile); fileStream = formdata.uploadedfile.value; //console.log("Formdata:"); //console.dir(formdata); request.post({ url: uploadUrl, proxy: false, formData: formdata }, function(err, resp, body) { fileStream.close(); console.log("err: " + err); return console.log("body: " + body); }); }; RED.nodes.registerType("dgstart",dgstart); /* RED.httpAdmin.post("/uploadxml", function(req,res) { console.dir(req); console.log("USER:" + req.user); console.log("Got request to upload xml to SDN-C."); console.log("Requested filename to upload: " + req.params.fileName); console.log("Requested xml to upload: " + req.params.xmlStr); writeToFile( req.params.fileName,req.params.xmlStr); sendXml(req.params.fileName,res); // res.send("Attempt complete."); // res.redirect(slaUrl); }); */ RED.httpAdmin.post("/OldUploadxml", function(req,res) { //console.dir(req); //console.log("USER:" + req.user); var qs = require('querystring'); var body = ''; req.on('data', function (data) { body += data; // Too much POST data, kill the connection! /*if (body.length > 1e6) request.connection.destroy(); */ }); req.on('end', function () { //console.log("BODY:" + body); var d = new Date().getTime(); var user = req.user; var fileName= user + "_" + d +".xml"; var post = qs.parse(body); //console.log(JSON.stringify(post)); // use post['blah'], etc. var localfile = appDir + "/" + RED.settings.xmlPath + fileName; //console.log("localfile:" + localfile); var xmlStr = post['flowXml']; writeXmlToFile(fileName,xmlStr); sendXml(fileName,res); }); }); RED.httpAdmin.post("/uploadxml", function(req,res) { //console.dir(req); //console.log("USER:" + req.user); var qs = require('querystring'); var body = ''; req.on('data', function (data) { body += data; // Too much POST data, kill the connection! /*if (body.length > 1e6) request.connection.destroy(); */ }); req.on('end', function () { //console.log("BODY:" + body); var d = new Date().getTime(); var user = req.user; var fileName= user + "_" + d +".xml"; var post = qs.parse(body); //console.log(JSON.stringify(post)); // use post['blah'], etc. var localfile = appDir + "/" + RED.settings.xmlPath + fileName; //console.log("localfile:" + localfile); var xmlStr = post['flowXml']; var moduleName = post['module']; var rpc = post['rpc']; writeXmlToFile(fileName,xmlStr); uploadDG(localfile,moduleName,rpc,res); }); }); function uploadDG(filePath,moduleName,rpc,res){ console.log("called uploadDG..."); var exec = require('child_process').exec; var commandToExec = appDir + "/svclogic/svclogic.sh load " + filePath + " " + userDir + "/conf/svclogic.properties"; console.log("commandToExec:" + commandToExec); var child = exec(commandToExec ,function (error,stdout,stderr){ //console.log(error); console.log("stdout:" + stdout); console.log("stderr:" + stderr); if(error){ console.log("Error occured:" + error); if(stderr){ //console.log("stderr:" + stderr); res.send(500,{'error':error,'stderr':stderr}); }else{ res.send(500,{'error':error}); } //console.log("stdout :" + stdout); }else{ if(stdout ){ //console.log("output:" + stdout); if(stdout.indexOf('Compiler error') != -1){ //console.log("compileError occured."); var resp = { 'stdout':stdout, 'stderr':"COMPILE_ERROR", 'url':dbHost, 'module':moduleName, 'rpc':rpc } res.send(500,resp); }else{ res.send(200,{'stdout':stdout,'stderr':stderr,"url":dbHost,"module" : moduleName,"rpc" : rpc}); } } if(stderr && !stdout){ //console.log("stderr:" + stderr); if(stderr.indexOf("Saving SvcLogicGraph to database") != -1){ res.send(200,{'error':error,'stdout' :'','stderr':stderr,"url":dbHost,"module" : moduleName,"rpc" : rpc}); }else{ res.send(500,{'error':error,'stdout' :'','stderr':stderr}); } } } }); } RED.httpAdmin.get("/displayXml", function(req,res) { var _module = req.query._module; var rpc = req.query.rpc; var version = req.query.version; var mode = req.query.mode; var d = new Date().getTime(); displayXml(_module,rpc,version,mode,res); }); function displayXml(_module,rpc,version,mode,res){ var exec = require('child_process').exec; var msg = { '_module' : _module, 'rpc' : rpc, 'version' : version, 'mode' : mode } var commandToExec = appDir + "/svclogic/svclogic.sh get-source " + _module + " " + rpc + " " + mode + " " + version + " " + userDir + "/conf/svclogic.properties"; console.log("commandToExec:" + commandToExec); var child = exec(commandToExec ,{'maxBuffer':16*1024*1024},function (error,stdout,stderr){ if(error){ console.log("Error occured:" + error); if(stderr){ //console.log("stderr:" + stderr); res.send(500,{'error':error,'stderr':stderr,'msg':msg}); }else{ res.send(500,{'error':error,'msg':msg}); } }else{ if(stderr){ console.log("stderr:" + stderr); } if(stdout){ res.send({'xmldata' : "<xmp>" + stdout + "</xmp>"}); } } }); } RED.httpAdmin.post("/downloadDGXml", function(req,res) { //console.dir(req); var qs = require('querystring'); var body = ''; req.on('data', function (data) { body += data; }); req.on('end', function () { var post = qs.parse(body); var _module = post._module; var rpc = post.rpc; var version = post.version; var mode = post.mode; var d = new Date().getTime(); downloadDGXml(_module,rpc,version,mode,res); }); }); function downloadDGXml(_module,rpc,version,mode,res){ var exec = require('child_process').exec; var msg = { '_module' : _module, 'rpc' : rpc, 'version' : version, 'mode' : mode } var commandToExec = appDir + "/svclogic/svclogic.sh get-source " + _module + " " + rpc + " " + mode + " " + version + " " + userDir + "/conf/svclogic.properties"; console.log("commandToExec:" + commandToExec); var child = exec(commandToExec ,function (error,stdout,stderr){ if(error){ console.log("Error occured:" + error); if(stderr){ //console.log("stderr:" + stderr); res.send(500,{'error':error,'stderr':stderr,'msg':msg}); }else{ res.send(500,{'error':error,'msg':msg}); } }else{ if(stderr){ console.log("stderr:" + stderr); } if(stdout){ //console.log("output:" + stdout); //var newOutput = "<pre>" + stdout.replace(/\n/g,'<br>') + "</pre>"; //res.json({'stdout': stdout ,'stderr':stderr,"msg":msg}); //res.set('Content-Type', 'text/xml'); //res.set('Content-Type', 'application/octet-stream'); //res.end("<code>" + stdout + "</code>" ); //var newOutput ="<html><body>" + stdout + "</body></html>"; //res.send(new Buffer( "<code>" + newOutput + "</code>" ) ); //res.send(newOutput); /* var xslStr = '<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">' + '<xsl:output omit-xml-declaration="yes" indent="yes"/>' + '<xsl:template match="node()|@*">' + '<xsl:copy>' + '<xsl:apply-templates select="node()|@*"/>' + '</xsl:copy>' + '</xsl:template>' + '</xsl:stylesheet>'; */ var formatted_date = getCurrentDate(); var fileName= "db_" + _module + "_" +rpc+ "_" + version + "_" + formatted_date + ".html"; var file = xmlDir + "/" + fileName; var xmlStr = '<xmp>' + stdout + "</xmp>"; //var xmlStr = "<![CDATA[" + stdout + "]]"; //var xmlStr = stdout.replace(/</g,"<"); //xmlStr = xmlStr.replace(/>/g,">"); //xmlStr = xmlStr.replace(/\n>/g,"<br>"); //xmlStr = xmlStr.replace(/\t>/g," "); writeToFile(file,"<html><body>" +xmlStr+ "</body></html>"); //console.log("xmlStr:" + xmlStr); res.setHeader('Content-disposition', 'attachment; filename=' + file); //res.setHeader('Content-type', 'text/html'); res.setHeader('Content-type', 'text/xml'); res.download(file); } } }); } RED.httpAdmin.get("/displayAsGv", function(req,res) { var _module = req.query._module; var rpc = req.query.rpc; var version = req.query.version; var mode = req.query.mode; var d = new Date().getTime(); displayAsGv(_module,rpc,version,mode,res); }); function displayAsGv(_module,rpc,version,mode,res){ var exec = require('child_process').exec; var msg = { '_module' : _module, 'rpc' : rpc, 'version' : version, 'mode' : mode } var commandToExec = appDir + "/svclogic/svclogic.sh print " + _module + " " + rpc + " " + mode + " " + version + " " //+ userDir + "/conf/svclogic.properties | dot -Tpng "; //the label="""" is giving an error so replacing it with "null" + userDir + "/conf/svclogic.properties |sed -e 's%label=\"\"\"\"%label=\"null\"%g'| dot -Tsvg "; console.log("commandToExec:" + commandToExec); //+ userDir + "/conf/svclogic.properties | dot -Tsvg "; //var child = exec(commandToExec ,function (error,stdout,stderr){ //var child = exec(commandToExec ,{maxBuffer:16*1024*1024},function (error,stdout,stderr){ //var child = exec(commandToExec ,{encoding:'base64',maxBuffer:20*1024*1024},function (error,stdout,stderr){ var child = exec(commandToExec ,{maxBuffer:20*1024*1024},function (error,stdout,stderr){ if(error){ console.log("Error occured:" + error); if(stderr){ console.log("stderr:" + stderr); res.send(500,{'error':error,'stderr':stderr,"msg":msg}); }else{ res.send(500,{'error':error,"msg":msg}); } }else{ if(stderr){ console.log("stderr:" + stderr); //To convert base64 to ascii //console.log(new Buffer(stderr, 'base64').toString('ascii')); } if(stdout){ //console.log(stdout.length); //console.log("output:" + stdout); //var svg_html = stdout ; //var image = "<img src='data:image/png;base64," + stdout + "'>"; //var image = "<iframe width='1200' height='750' src='data:image/png;base64," + stdout + "'></frame>"; //var image = "<iframe width='1200' height='750' src='data:image/svg+xml;base64," + stdout + "'></frame>"; //var image = "<iframe width='1200' height='750' src='data:image/gif;base64," + stdout + "'></frame>"; var image = "<iframe width='1200' height='750' src='data:image/svg+xml;UTF-8," + stdout + "'></frame>"; //console.log(image); res.send({'svg_html':image}); } } }); } RED.httpAdmin.post("/shareFlow", function(req,res) { //console.dir(req); //console.log("USER:" + req.user); var qs = require('querystring'); var body = ''; req.on('data', function (data) { body += data; // Too much POST data, kill the connection! /*if (body.length > 1e6) request.connection.destroy(); */ }); req.on('end', function () { var post = qs.parse(body); var nodeSet = JSON.parse(post['flowData']); var activeWorkspace=post['activeWorkspace']; var methodName = ""; var moduleName = ""; for(var i=0;nodeSet != null && i<nodeSet.length;i++){ var node = nodeSet[i]; if(node.type == 'module' ){ moduleName= node.name; moduleName=moduleName.replace(/ /g,"-"); } if(node.type == 'method' ){ methodName= node.name; methodName=methodName.replace(/ /g,"-"); } } //console.log("BODY:" + body); var d = new Date().getTime(); var user = req.user; var fileName= moduleName + "_" +methodName+".json"; var localfile = sharedDir + "/" + fileName; //console.log("localfile:" + localfile); writeToFile(localfile,JSON.stringify(nodeSet)); res.send({"fileName": fileName}); }); }); RED.httpAdmin.post("/sendEmail", function(req,res) { //console.dir(req); console.log("USER:" + req.user); var fromAddr = RED.settings.emailAddress; var toAddr = RED.settings.emailAddress; var qs = require('querystring'); var body = ''; req.on('data', function (data) { body += data; // Too much POST data, kill the connection! /*if (body.length > 1e6) request.connection.destroy(); */ }); req.on('end', function () { //console.log("BODY:" + body); var d = new Date().getTime(); var user = req.user; var fileName= user + "_" + d +".html"; var post = qs.parse(body); //console.log(JSON.stringify(post)); // use post['blah'], etc. var localfile = appDir + "/" + RED.settings.htmlPath + fileName; //console.log("localfile:" + localfile); var nodemailer = require("nodemailer"); nodemailer.sendmail = true; var transporter = nodemailer.createTransport(); var ua = req.headers['user-agent']; var host = req.headers.host; var fullHtml="<!doctype html><html><head>" + post['flowHtml']; //fullHtml+="<div style='fill:both'></div>"; fullHtml+="<div style='margin-left:10px;'><p>XML</p><br><textarea rows='50' cols='150'>" + post['flowXml'] + "</textarea>"; fullHtml+="<p>JSON</p><br><textarea rows='50' cols='150'>" + post['flowJson'] + "</textarea></div>"; fullHtml+="</body></html>"; writeHtmlToFile(fileName,fullHtml); transporter.sendMail({ from: fromAddr, to: toAddr, html: "<p>DG Node Flow. click on the attachment to view</p>", subject: 'Node flow from Host:<' + host + '>', attachments : [{'filename': fileName, 'contentType': "text/html", /*'filePath': localfile*/ 'content': fs.createReadStream(localfile) }] }, function(err, response) { var fullPathtoFileName = appDir + "/" + RED.settings.htmlPath + fileName; fs.unlink(fullPathtoFileName, function (error) { if (error) { console.log("Error deleting file "+fullPathtoFileName); }else{ //console.log("deleted file:" + fullPathtoFileName); } }); if(err){ console.log("Error:" + err); res.json(err); }else{ res.json(response); } console.log(response); }); }); }); /* RED.httpAdmin.post("/doxml/:id", function(req,res) { var node = RED.nodes.getNode(req.params.id); if (node != null) { try { // node.receive(); //console.log("doxml was called for node: "); //console.dir(node); //console.log("calling getJson"); var nrjson=dgxml.getJson(); console.log("calling nodered2xml"); var results=[]; results=dgxml.nodered2xml(nrjson,node.id); var nrxml=results[0]; fileName=results[1]; console.log("Got this filename: " + fileName); // res.send(200); console.log("appDir: " + appDir); fs.writeFileSync(appDir + "/public/xml/"+fileName,nrxml); // res.send("XML generated! See help on right for link."); res.send(fileName); } catch(err) { res.send(500); node.error("doxml failed:"+err); console.log(err.stack); } } else { res.send(404); } }); */ }