[CCSDK-28] populated the seed code for dgbuilder
[ccsdk/distribution.git] / dgbuilder / nodes / dge / dgemain / dgstart.js
diff --git a/dgbuilder/nodes/dge/dgemain/dgstart.js b/dgbuilder/nodes/dge/dgemain/dgstart.js
new file mode 100644 (file)
index 0000000..f2b4815
--- /dev/null
@@ -0,0 +1,594 @@
+/**
+ * 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,"&lt;");
+                               //xmlStr =   xmlStr.replace(/>/g,"&gt;");
+                               //xmlStr =   xmlStr.replace(/\n>/g,"<br>");
+                               //xmlStr =   xmlStr.replace(/\t>/g,"&nbsp;&nbsp;&nbsp;");
+               
+                               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);
+            }
+    });
+*/
+}