Added new modules to help prevent Cross Site Request Forgery
[sdnc/oam.git] / admportal / server / router / routes / dbRoutes.js
1 var express = require('express'),
2     app = express();
3 var mysql = require('mysql');
4 var properties = require(process.env.SDNC_CONFIG_DIR + '/admportal.json');
5 var fs = require('fs.extra');
6 var util = require('util');
7 var os = require('os');
8 var async = require('async');
9 var l_ = require('lodash');
10 var dns = require('dns');
11 var dnsSync = require('dns-sync');
12
13 var pool = '';
14 var currentDB = '';
15 var currentDbName = '';
16 var fabricDB = properties.dbFabricServer;
17 var dbArray = properties.databases;
18 var enckey = properties.passwordKey;
19
20 console.log('dbFabric=' + properties.dbFabric);
21
22 if ( properties.dbFabric == 'true' )
23 {
24         connectFabric();
25 }
26 else
27 {
28     initDB();
29 }
30
31
32 exports.dbConnect = function(){
33
34         console.log('fabric=' + fabricDB);
35         if ( properties.dbFabric == 'true' )
36         {
37                 connectFabric();
38         }
39         else
40         {
41         initDB();
42         }
43 }
44
45 function setCurrentDbName(){
46         
47         function createFunction(dbentry)
48         {
49                 return function(callback) { findCurrentDbIP(dbentry,callback); }
50         }
51
52         var tasks = [];
53         for (var x=0; x<dbArray.length; x++){
54                 var dbElement = dbArray[x];
55                 var dbElementArray = dbElement.split("|");
56
57                 tasks.push( createFunction(dbElement) );
58         }
59         async.series(tasks, function(err,result){
60         
61                 if(err){
62                         currentDbName = err;
63                         console.log('currentDbName: ' + err);
64             return;
65         }
66         else {
67                         console.log('not found');
68             return;
69         }
70         });
71 }
72
73
74 function findCurrentDbIP(dbElement, callback){
75
76         var dbElementArray = dbElement.split("|");
77
78         dns.lookup( dbElementArray[0], function onLookup(err, addresses, family) {
79
80         if ( currentDB == addresses ){
81                 callback(dbElementArray[1]);
82             return;
83         }
84                 else {
85                 callback(null);
86                 return;
87                 }
88     });
89 }
90
91
92 exports.getCurrentDB = function(){
93         return currentDbName;
94 }
95                 
96         
97 exports.testdb = function(req,res,callback){
98 console.log('testdb');
99
100         osObj = {
101         'hostname' : os.hostname(),
102         'type'     : os.type(),
103         'platform' : os.platform(),
104         'arch'     : os.arch(),
105         'release'  : os.release(),
106         'uptime'   : os.uptime(),
107         'totalmem' : os.totalmem(),
108         'dbhealth' : ''
109     };
110
111     pool.getConnection(function(err,connection)
112         {
113         if(err){
114             callback(err);
115             return;
116         }
117
118                 // http://stackoverflow.com/questions/10982281/mysql-connection-validity-test-in-datasource-select-1-or-something-better
119                 connection.query("/* pint */ SELECT 1", function(err,result){
120
121             connection.release();
122             if(err) {
123                                 callback(err);
124                 return;
125             }
126                         callback(null,'Database Connectivity to ' + currentDB + ' is working.');
127             return;
128         }); //end query
129     }); // end getConnection
130 }
131
132 /*
133 exports.checkSvcLogic = function(req,res){
134
135         if ( DBmasterHost.length > 0 && currentHost != DBmasterHost )
136         {
137                  // need to copy file so SLA functionality works
138          var source = process.env.SDNC_CONFIG_DIR
139              + "/svclogic.properties." + currentHost;
140          var target = process.env.SDNC_CONFIG_DIR
141              + "/svclogic.properties";
142          fs.copy(source,target,{replace:true}, function(err){
143                 if(err){
144                 res.render("pages/err",
145                         {result:{code:'error',
146                               msg:"Unable to copy svclogic.properties. "+ String(err) }});
147                 return;
148             }
149          });
150         }
151 }
152 */
153 function initDB( next ) {
154
155
156         var tasks = [];
157         for (var x=0; x<properties.databases.length; x++){
158
159                 var db = properties.databases[x];
160                 var dbArray = db.split("|");
161                 var _dbIP = dnsSync.resolve(dbArray[0]);
162                 var _dbName = dbArray[1];
163
164         tasks.push( createFindMasterFunctionObj(_dbIP, _dbName) );
165         }
166     async.series(tasks, function(err,result)
167     {
168         if(err){
169                         if ( err == 'found' ){
170                                 if ( typeof next != 'undefined'){
171                                         next();
172                                 }
173                                 else {
174                                         return;
175                                 }
176                         }
177                         else {
178                 console.error( String(err) ); // ALARM
179                 return;
180                         }
181         }
182                 console.log('result=' + result);
183         });
184         return;
185 }
186
187
188 function createFindMasterFunctionObj(dbIP,dbName){
189         return function(callback) { findMaster(dbIP, dbName, callback); }
190 }
191
192 function findMaster (ldbIP, ldbName, callback){
193 var dbIP = ldbIP;
194 var dbName = ldbName;
195
196         console.log('checking dbIP:' + dbIP);
197
198     pool = mysql.createPool({
199         connectionLimit : properties.dbConnLimit,
200         host            : dbIP,
201         user            : properties.dbUser,
202         password        : properties.dbPassword,
203         database        : properties.dbName,
204         multipleStatements: true,
205         debug           : false
206     });
207
208         pool.getConnection(function(err,connection){
209
210         if(err){
211                         callback( String(err) ); 
212             return;
213         }
214         var sql = 'select @@read_only';
215         connection.query(sql, function(err,result){
216             connection.release();
217
218             // @@read_only=0 means db is writeable
219             console.log('@@read_only=' + result[0]['@@read_only']);
220             if ( result[0]['@@read_only'] == '0' )
221             { // writeable
222                                 // if this is not the current DB, make it since its writeable
223                                         currentDB = dbIP;
224                                         currentDbName = dbName;
225                                         console.log('currentDB=' + currentDB + "|" + currentDbName);
226                         var newpool = mysql.createPool({
227                                 connectionLimit : properties.dbConnLimit,
228                                 host            : currentDB,
229                                 user            : properties.dbUser,
230                                 password        : properties.dbPassword,
231                                 database        : properties.dbName,
232                                 multipleStatements: true,
233                                 debug           : false
234                         }); // end create
235                         pool = newpool;
236                                         callback('found', currentDB);
237                                         return;
238                         }
239                 // otherwise this is the current db and its writeable, just return
240                 callback(null, currentDB);
241                 return;
242         });
243     });
244 }
245
246 exports.checkDB = function(req,res,next){
247
248 console.log('checkDB');
249
250
251         if ( properties.dbFabric == 'true' )
252         {
253                 connectFabric();
254                 next();
255         }
256         else
257         {
258                 initDB( next );
259         }
260 }
261
262
263 exports.saveUser = function(req,res){
264
265 console.log('b4 sani');
266         var email = req.sanitize(req.body.nf_email);
267         var pswd = req.sanitize(req.body.nf_password);
268 console.log('after sani');
269
270         pool.getConnection(function(err,connection)
271         {
272                 if(err){
273                         console.error( String(err) ); // ALARM
274                         res.render("pages/signup", {result:{code:'error', msg:"Unable to get database connection. " + String(err)},header:process.env.MAIN_MENU});
275                         return;
276                 }
277                 var sql = "SELECT email FROM PORTAL_USERS WHERE email='" + email + "'";
278
279                 connection.query(sql, function(err,result)
280                 {
281                         if(err){
282                                 connection.release();
283                                 res.render("pages/signup", {result:{code:'error', msg:"Unable to get database connection. " + String(err)},header:process.env.MAIN_MENU});
284                                 return;
285                         }
286                         if (result.length == 1 || result.length > 1)
287                         {
288                                 connection.release();
289                                 res.render("pages/signup", {result:{code:'error', msg:'User Information already exists.'},header:process.env.MAIN_MENU});
290                                 return;
291                         }
292
293                         sql = "INSERT INTO PORTAL_USERS (email,password,privilege) VALUES ("
294             +"'"+ email + "',"
295             + "AES_ENCRYPT('" + pswd + "','" + enckey + "'),"
296             +"'A')";
297
298                         connection.query(sql, function(err,result)
299                         {
300                                 connection.release();
301                                 
302                                 if(err){
303                                         res.render("pages/signup", {result:{ code:'error', msg:String(err) },header:process.env.MAIN_MENU});;
304                                         return;
305                                 }
306                                 res.render('pages/signup', {result:{code:'success', msg:'User created.  Please login.'},header:process.env.MAIN_MENU});
307                                 return;
308                         });
309                 });
310         });
311 }
312
313 // delete User
314 exports.deleteUser = function(req,res){
315
316         var rows={};
317         var resultObj = { code:'', msg:'' };
318         var privilegeObj = req.session.loggedInAdmin;
319
320     pool.getConnection(function(err,connection) {
321         if(err){
322                         console.error( String(err) ); // ALARM
323             res.render("user/list", {rows: null, result:{code:'error', msg:"Unable to get database connection. Error:" + String(err), 
324                                 privilege:privilegeObj },header:process.env.MAIN_MENU});
325                         return;
326         }
327
328         var sqlUpdate = "DELETE FROM PORTAL_USERS WHERE email='" + req.query.email + "'";
329
330                 console.log(sqlUpdate);
331
332         connection.query(sqlUpdate,function(err,result){
333
334             if(err){
335                  resultObj = {code:'error', msg:'Delete of user failed Error: '+ String(err) };
336             }
337
338             // Need DB lookup logic here
339             connection.query("SELECT email,password,privilege FROM PORTAL_USERS", function(err, rows) {
340                 connection.release();
341                 if(!err) {
342                     if ( rows.length > 0 )
343                     {
344                                                 resultObj = {code:'success',msg:'Successfully deleted user.'};
345                         res.render('user/list', { rows: rows, result:resultObj, privilege:privilegeObj,header:process.env.MAIN_MENU } );
346                                                 return;
347                     }else{
348                         res.render("user/list", { rows: null, result:{code:'error', msg:'Unexpected no rows returned from database, please try again.',
349                                                         privilege:privilegeObj },header:process.env.MAIN_MENU});
350                                                 return;
351                     }
352                 } else {
353                     res.render("user/list", { rows: null, result:{code:'error', msg:'Unexpected no rows returned from database. Error: ' + String(err),
354                                                         privilege:privilegeObj },header:process.env.MAIN_MENU});
355                                         return;
356                 }
357             }); //end query
358         });
359     }); // end of getConnection
360 }
361
362 // add User
363 exports.addUser = function(req,res){
364         
365         var rows={};
366         var resultObj = { code:'', msg:'' };
367         var privilegeObj = req.session.loggedInAdmin;
368         var privilege = req.sanitize(req.body.nf_privilege);
369         var email = req.sanitize(req.body.nf_email);
370   var pswd = req.sanitize(req.body.nf_password);
371
372
373         pool.getConnection(function(err,connection) 
374         {
375                 if(err)
376                 {
377                         console.error( String(err) ); // ALARM
378                         res.render("user/list", {rows: null, result:{code:'error', msg:"Unable to get database connection. "+ String(err),
379                         privilege:privilegeObj },header:process.env.MAIN_MENU});
380                         return;
381                 }
382
383                 if( privilege == "admin" ){
384                         var char_priv = 'A';
385                 }else if(privilege == 'readonly'){
386                         var char_priv = 'R';
387                 }else{
388                         var char_priv = 'R';
389                 }
390
391                 //connection.query(sqlRequest, function(err,result)
392                 var sqlUpdate = "INSERT INTO PORTAL_USERS (email, password, privilege) VALUES ("
393                         +"'"+ email + "',"
394                         + "AES_ENCRYPT('" + pswd + "','" + enckey + "'),"
395                         +"'"+ char_priv + "')";
396
397
398                 connection.query(sqlUpdate,function(err,result)
399                 {
400                         if(err){
401                                 resultObj = {code:'error', msg:'Add of user failed Error: '+err};
402                         }
403                         // Need DB lookup logic here
404                         connection.query("SELECT email,AES_DECRYPT(password, '" + enckey + "') password,privilege FROM PORTAL_USERS", function(err, rows)
405                         {
406                                 connection.release();
407                                 if(!err)
408                                 {
409                                         if ( rows.length > 0 )
410                                         {
411                                                 resultObj = {code:'success',msg:'Successfully added user.'};
412                                                 res.render('user/list', { rows: rows, result:resultObj, privilege:privilegeObj,header:process.env.MAIN_MENU } );
413                                                 return;
414                                         }else{
415                                                 res.render("user/list", {rows: null, result:{code:'error', msg:'Unexpected no rows returned from database, please try again.',
416                                                         privilege:privilegeObj },header:process.env.MAIN_MENU});
417                                                 return;
418                                         }
419                                 }
420                                 else {
421                                         res.render("user/list", {rows: null, result:{code:'error', msg:'Unexpected no rows returned from database. Error: '+ err ,
422                                                 privilege:privilegeObj },header:process.env.MAIN_MENU});
423                                         return;
424                                 }
425                         }); //end query
426                 });
427         }); // end of getConnection
428 }
429
430 // updateUser
431 exports.updateUser= function(req,res){
432
433         var rows={};
434         var resultObj = { code:'', msg:'' };
435         var privilegeObj = req.session.loggedInAdmin;
436         var email = req.sanitize(req.body.uf_email);
437         var key_email = req.sanitize(req.body.uf_key_email)
438   var pswd = req.sanitize(req.body.uf_password);
439   var privilege = req.sanitize(req.body.uf_privilege);
440
441         pool.getConnection(function(err,connection)
442         {
443                 if(err){
444                         console.error( String(err) ); // ALARM
445                         res.render("user/list", {rows: null, result:{code:'error', msg:"Unable to get database connection. " + String(err),
446                                 privilege:privilegeObj },header:process.env.MAIN_MENU});
447                         return;
448                 }
449
450                 if( privilege == "admin" ){
451                         var char_priv = 'A';
452                 }else if(privilege == 'readonly'){
453                         var char_priv = 'R';
454                 }else{
455                         var char_priv = 'R';
456                 }
457
458                 var sqlUpdate = "UPDATE PORTAL_USERS SET "
459                         + "email = '" + email + "',"
460                         + "password = " + "AES_ENCRYPT('" + pswd + "','" + enckey + "'), "
461                         + "privilege = '"+ char_priv + "'"
462                         + " WHERE email = '" + key_email + "'";
463
464                 connection.query(sqlUpdate,function(err,result)
465                 {
466                         if(err){
467                                 resultObj = {code:'error', msg:'Update of user failed Error: '+err};
468                         }
469                         // Need DB lookup logic here
470                         connection.query("SELECT email, AES_DECRYPT(password,'" + enckey + "') password, privilege FROM PORTAL_USERS", function(err, rows)
471                         {
472                                 connection.release();
473                                 if(!err)
474                                 {
475                                         if ( rows.length > 0 )
476                                         {
477                                                 resultObj = {code:'success',msg:'Successfully updated user.'};
478                                                 res.render('user/list', { rows: rows, result:resultObj, privilege:privilegeObj,header:process.env.MAIN_MENU} );
479                                                 return;
480                                         }else{
481                                                 res.render("user/list", {rows: null, result:{ code:'error', msg:'Unexpected no rows returned from database.',
482                                                         privilege:privilegeObj },header:process.env.MAIN_MENU});
483                                                 return;
484                                         }
485                                 } else {
486                                         res.render("user/list", {rows: null, result:{code:'error', msg:'Unexpected no rows returned from database. ' + String(err),
487                                                 privilege:privilegeObj },header:process.env.MAIN_MENU});
488                                         return;
489                                 }
490                         }); //end query
491                 });
492         }); // end of getConnection
493 }
494
495 exports.listUsers = function(req,res,resultObj){
496
497         var privilegeObj = req.session.loggedInAdmin;
498         var rows={};
499         pool.getConnection(function(err,connection)
500         {
501     
502                 if(err){
503                         console.error( String(err) ); // ALARM
504                         res.render("pages/list", 
505                         {
506                                 rows: null, 
507                                 result:{
508                                         code:'error', 
509                                         msg:"Unable to get database connection. " + String(err), 
510                                         privilege:privilegeObj },
511                                         header:process.env.MAIN_MENU
512                         });
513                         return;
514                 }
515
516                 // Need DB lookup logic here
517                 var selectUsers = "SELECT email, AES_DECRYPT(password,'" 
518                         + enckey + "') password, privilege from PORTAL_USERS";
519
520                 connection.query(selectUsers, function(err, rows) {
521
522                 connection.release();
523                 if(err){
524                         resultObj = {code:'error', msg:'Unable to SELECT users Error: '+err};
525                 }
526                 if(!err)
527                 {
528                         if ( rows.length > 0 )
529                         {
530                                 console.log(JSON.stringify(rows));
531                                 res.render('user/list', 
532                                 {
533                                         rows: rows, 
534                                         result:resultObj, 
535                                         privilege:privilegeObj,
536                                         header:process.env.MAIN_MENU 
537                                 });
538                                 return;
539                         }
540                         else{
541                                 res.render("user/list", 
542                                 {
543                                         rows: null, 
544                                         result:{
545                                                 code:'error', 
546                                                 msg:'Unexpected no rows returned from database.',
547                                                 privilege:privilegeObj },
548                                                 header:process.env.MAIN_MENU
549                                 });
550                                 return;
551                         }
552                 }
553                 else
554                 {
555                         res.render("user/list", 
556                         {
557                                 rows: null, 
558                                 result:{
559                                         code:'error', 
560                                         msg:'Unexpected no rows returned from database. ' + String(err),
561                                         privilege:privilegeObj },header:process.env.MAIN_MENU
562                         });
563                         return;
564                 }
565                 }); //end query
566         }); // end getConnection
567 }
568
569 exports.listSLA = function(req,res,resultObj){
570
571         var privilegeObj = req.session.loggedInAdmin;
572
573         pool.getConnection(function(err,connection) {
574
575         if(err){
576                         console.error( String(err) ); // ALARM
577             res.render("pages/err", {result:{code:'error', msg:"Unable to get database connection. "+ String(err)},header:process.env.MAIN_MENU});
578                         return;
579         }
580
581         // Need DB lookup logic here
582                 connection.query("SELECT module,rpc,version,mode,active,graph FROM SVC_LOGIC", function(err, rows) {
583
584             connection.release();
585             if(err) {
586                 res.render("pages/err", {result:{code:'error',msg:'Database Error: '+ String(err)},header:process.env.MAIN_MENU});
587                                 return;
588                         }
589                         else {
590                                 res.render("sla/list", {rows:rows, result:resultObj, privilege:privilegeObj, header:process.env.MAIN_MENU} );
591                                 return;
592             }
593         }); //end query
594     }); // end getConnection
595 }
596
597 exports.executeSQL = function(sql,req,res,callback){
598
599     console.log(sql);
600
601     pool.getConnection(function(err,connection) {
602
603         if(err){
604             console.error( String(err) ); // ALARM
605             callback(err, 'Unable to get database connection.' + err);
606             return;
607         }
608
609         connection.query(sql, function(err,result){
610             connection.release();
611                         if (err) {
612                                 callback(err,'Database operation failed. ' + err );
613                         }
614             else
615             {
616 console.log('affectedRows='+result.affectedRows);
617                 callback(null, result.affectedRows);
618             }
619        }); //end query
620     }); // end getConnection
621 }
622
623
624 // gamma - deleteParameter
625 exports.deleteParameter = function(req,res,callback){
626
627     var sql = "DELETE FROM PARAMETERS WHERE name='" + req.query.name + "'";
628
629     console.log(sql);
630
631     pool.getConnection(function(err,connection) {
632
633         if(err){
634             console.log( String(err) ); // ALARM
635             callback(err, 'Unable to get database connection.' + err);
636             return;
637         }
638         connection.query(sql, function(err,result){
639             connection.release();
640                if(err){
641                     console.log('Update failed. ' + err );
642                     callback(err,'Update failed. ' + err );
643                }
644                else
645                {
646                     callback(null,'');
647                }
648        }); //end query
649     }); // end getConnection
650 }
651
652
653 exports.getTable = function(req,res,sql,rdestination,resultObj,privilegeObj){
654
655 console.log('SQL:'+sql);
656
657     pool.getConnection(function(err,connection) {
658
659         if(err){
660             console.error( String(err) ); // ALARM
661             res.render("pages/err", {result:{code:'error', msg:"Unable to get database connection. "+ String(err)},header:process.env.MAIN_MENU});
662             return;
663         }
664         connection.query(sql,function(err, rows)
665         {
666             connection.release();
667             if(err) {
668                 res.render(rdestination, {result:{code:'error',msg:'Database Error: '+ String(err)},header:process.env.MAIN_MENU});
669                 return;
670             }
671             else {
672                 res.render(rdestination, { rows: rows, result:resultObj, privilege:privilegeObj,header:process.env.MAIN_MENU } );
673                 return;
674             }
675         }); //end query
676     }); // end getConnection
677 }
678
679 exports.getMetaTable = function(req,res,sql,rdestination,resultObj,privilegeObj){
680
681     console.log('SQL:'+ sql);
682
683     var rdata = [];
684     var v_tables = [];
685     var vtables = properties.viewTables;
686
687         for ( var i in vtables ) {
688                 v_tables.push(vtables[i]);
689         }
690
691     pool.getConnection(function(err,connection) {
692
693         if(err){
694             console.error( String(err) ); // ALARM
695             res.render("pages/err", {result:{code:'error', msg:"Unable to get database connection. "+ String(err)},header:process.env.MAIN_MENU});
696             return;
697         }
698         connection.query(sql,function(err, rows, fields)
699         {
700             console.log('rows:' + JSON.stringify(rows,null,2));
701             // http://stackoverflow.com/questions/14528385/how-to-convert-json-object-to-javascript-array
702             //logger.debug(Object.keys(rows[0]).map(function(v) { return rows[0][v]; }));
703             for ( var i in rows ){
704                 rdata.push(Object.keys(rows[i]).map(function(v) { return rows[i][v]; }));
705                 //logger.debug(Object.keys(rows[i]).map(function(v) { return rows[i][v]; }));
706                 //logger.debug([i, rows[i]]);
707             }
708             for ( var x in rdata ){
709                 for ( var j in rdata[x] ){
710                     console.log('rdata[' + x + ']: ' + rdata[x][j]);
711                 }
712             }
713             console.log('rdata:' + rdata[0]);
714             console.log('fields:' + JSON.stringify(fields,null,2));
715             connection.release();
716             if(err) {
717                 res.render(rdestination, {result:{code:'error',msg:'Database Error: '+ String(err)},header:process.env.MAIN_MENU});
718                 return;
719             }
720             else {
721                 res.render(rdestination, { displayTable:true, vtables:v_tables, rows:rdata, fields:fields, result:resultObj, privilege:privilegeObj, header:process.env.MAIN_MENU } );
722                 return;
723             }
724         }); //end query
725     }); // end getConnection
726 }
727
728 exports.getVnfProfile = function(req,res,resultObj,privilegeObj){
729
730         pool.getConnection(function(err,connection)
731         {
732                 if(err){
733                         console.error( String(err) ); // ALARM
734                         res.render("pages/err", {result:{code:'error', msg:"Unable to get database connection. "+ String(err)},header:process.env.MAIN_MENU});
735                         return;
736                 }
737                 var sql = "SELECT vnf_type,availability_zone_count,equipment_role FROM VNF_PROFILE ORDER BY VNF_TYPE";
738                 console.log(sql);
739                 connection.query(sql, function(err, rows)
740                 {
741                         connection.release();
742                         if(err) {
743                                 res.render("mobility/vnfProfile", {result:{code:'error',msg:'Database Error: '+ String(err)},header:process.env.MAIN_MENU});
744                                 return;
745                         }
746                         else {
747                                 console.log('render vnfProfile');
748                                 res.render('mobility/vnfProfile', { rows: rows, result:resultObj, privilege:privilegeObj,header:process.env.MAIN_MENU } );
749                                 return;
750                         }
751                 }); //end query
752         }); // end getConnection
753 }
754
755
756 exports.getVnfPreloadData = function(req,res,dbtable,callback){
757
758     pool.getConnection(function(err,connection) {
759
760                  if(err){
761             console.error( String(err) ); // ALARM
762             callback(err, 'Unable to get database connection.' + err);
763             return;
764         }
765
766         // Need DB lookup logic here
767         connection.query("SELECT preload_data FROM " + dbtable + " WHERE id="
768                         + req.query.id, function(err, rows)
769         {
770             connection.release();
771             if(err) {
772                 callback(err);
773                 return;
774             }
775             else {
776                                 var buffer = rows[0].preload_data;
777                 var decode_buffer = decodeURI(buffer);
778                                 var content = JSON.parse(decode_buffer);
779                                 callback(null,content);
780                                 return;
781             }
782         }); //end query
783     }); // end getConnection
784 }
785
786
787
788 exports.getVnfNetworkData = function(req,res,resultObj,privilegeObj)
789
790         pool.getConnection(function(err,connection)
791         {
792                 if(err){
793                         console.error( String(err) ); // ALARM
794                         res.render("pages/err",
795                                 {result:{code:'error', msg:"Unable to get database connection. "+ String(err)},header:process.env.MAIN_MENU});
796                         return;
797                 }
798                 // Need DB lookup logic here
799                 var sql = "SELECT id,svc_request_id,svc_action,status,filename,ts,preload_data FROM PRE_LOAD_VNF_NETWORK_DATA ORDER BY id";
800                 console.log(sql);
801                 connection.query(sql, function(err, rows)
802                 {
803                         var msgArray = new Array();
804                         connection.release();
805                         if(err) {
806                                 msgArray = 'Database Error: '+ String(err);
807                                 res.render("mobility/vnfPreloadNetworkData", {
808                                         result:{code:'error',msg:msgArray},
809                                         privilege:privilegeObj,
810                                         preloadImportDirectory: properties.preloadImportDirectory,
811                                         header:process.env.MAIN_MENU
812                                 });
813                                 return;
814                         }
815                         else {
816                                 var retData = [];
817                                 for( r=0; r<rows.length; r++)
818                                 {
819                                         var rowObj = {};
820                                         rowObj.row = rows[r];
821                                         if ( rows[r].filename.length > 0 )
822                                         {
823                                                 try{
824                                                         var buffer = rows[r].preload_data;
825                                                         var decode_buffer = decodeURI(buffer);
826                                                         var filecontent = JSON.parse(decode_buffer);
827                                                         rowObj.filecontent = filecontent;
828                                                         rowObj.network_name = filecontent.input["network-topology-information"]["network-topology-identifier"]["network-name"];
829                                                         rowObj.network_type = filecontent.input["network-topology-information"]["network-topology-identifier"]["network-type"];
830                                                 }
831                                                 catch(error){
832                                                         msgArray.push('File ' + rows[r].filename + ' has invalid JSON. Error:' + error);
833                                                 }
834                                         }
835                                         else {
836                                                 rowObj.filecontent = '';
837                                         }
838                                         retData.push(rowObj);
839                                 }//endloop
840                                 if(msgArray.length>0){
841                                         resultObj.code = 'failure';
842                                         resultObj.msg = msgArray;
843                                 }
844                                 res.render('mobility/vnfPreloadNetworkData', { 
845                                         retData:retData, 
846                                         result:resultObj, 
847                                         privilege:privilegeObj,
848                                         preloadImportDirectory: properties.preloadImportDirectory,
849                                         header:process.env.MAIN_MENU 
850                                 });
851                                 return;
852                         }
853                 }); //end query
854         }); // end getConnection
855 }
856
857 exports.getVnfData = function(req,res,resultObj,privilegeObj)
858 {
859         pool.getConnection(function(err,connection)
860         {
861                 if(err){
862                         console.error( String(err) ); // ALARM
863                         res.render("pages/err", {result:{code:'error', msg:"Unable to get database connection. "+ String(err)},header:process.env.MAIN_MENU});
864                         return;
865                 }
866                 // Need DB lookup logic here
867                 var sql = "SELECT id,svc_request_id,svc_action,status,filename,ts,preload_data FROM PRE_LOAD_VNF_DATA ORDER BY id";
868                 console.log(sql);
869                 connection.query(sql,function(err, rows) 
870                 {
871                         var msgArray = new Array();
872                         connection.release();
873                         if(err) {
874                                 msgArray = 'Database Error: '+ String(err);
875                                 res.render("mobility/vnfPreloadData", {
876                                         result:{code:'error',msg:msgArray},
877                                         privilege:privilegeObj,
878                                         preloadImportDirectory: properties.preloadImportDirectory,
879                                         header:process.env.MAIN_MENU
880                                 });
881                                 return;
882                         }
883                         else {
884                                 var retData = [];
885                                 for( r=0; r<rows.length; r++)
886                                 {
887                                         var rowObj = {};
888                                         rowObj.row = rows[r];
889                                         if ( rows[r].filename.length > 0 )
890                                         {
891                                                 try{
892                                                         var buffer = rows[r].preload_data;
893                                                         var s_buffer = decodeURI(buffer);
894                                                         var filecontent = JSON.parse(s_buffer);
895                                                         rowObj.filecontent = filecontent;
896                                                         rowObj.vnf_name = filecontent.input["vnf-topology-information"]["vnf-topology-identifier"]["vnf-name"];
897                                                         rowObj.vnf_type = filecontent.input["vnf-topology-information"]["vnf-topology-identifier"]["vnf-type"];
898                                                 }
899                                                 catch(error){
900                                                         msgArray.push('File ' + rows[r].filename + ' has invalid JSON. Error:' + error);
901                                                 }
902                                         }
903                                         else {
904                                                 rowObj.filecontent = '';
905                                         }
906                                         retData.push(rowObj);
907                                 }//endloop
908                                 if(msgArray.length>0){
909                                         resultObj.code = 'failure';
910                                         resultObj.msg = msgArray;
911                                 }
912                                 res.render('mobility/vnfPreloadData',{ 
913                                         retData:retData, result:resultObj, 
914                                         privilege:privilegeObj,
915                                         header:process.env.MAIN_MENU, 
916                                         preloadImportDirectory: properties.preloadImportDirectory
917                                 });
918                                 return;
919                         }
920                 }); //end query
921         }); // end getConnection
922 }
923
924
925 exports.findAdminUser = function(email,res,callback) {
926
927
928         var adminUser={};
929         pool.getConnection(function(err,connection) {
930         if(err){
931                         console.error( String(err) ); // ALARM
932             res.render("pages/login", {result:{code:'error', msg:"Unable to get database connection. "+ String(err)},header:process.env.MAIN_MENU});
933                         return;
934         }
935
936                 // Need DB lookup logic here
937                 connection.query("SELECT email, AES_DECRYPT(password, '" + enckey + "') password, privilege FROM PORTAL_USERS WHERE email='" + email + "'", function(err, rows) {
938
939                         connection.release();
940                 if(!err) {
941                                 if ( rows.length > 0 )
942                 {
943                         rows.forEach(function(row){
944                         adminUser = {
945                                 "email" : row.email,
946                                 "password" : row.password,
947                                 "privilege" : row.privilege };
948                         });
949                         callback(adminUser);
950                                         return;
951                 }else{
952                         console.log("no rows returned");
953                         res.render("pages/login", {result:{code:'error', msg:'User is not in database.'},header:process.env.MAIN_MENU});
954                                         return;
955                 }
956             } else {
957                     res.render("pages/err", {result:{code:'error',msg:'Unexpected no rows returned from database. '+ String(err)},header:process.env.MAIN_MENU});
958                                         return;
959                         }
960                 }); //end query
961     }); // end getConnection
962 }
963
964
965 exports.addRow = function(sql,req,res,callback){
966
967         console.log(sql);
968
969         pool.getConnection(function(err,connection) {
970
971                 if(err){
972                         console.error( String(err) ); // ALARM
973                         callback(err, 'Unable to get database connection.' + err);
974                         return;
975                 }
976                 connection.query(sql, function(err,result){
977                         connection.release();
978                         if(err){
979                                 console.debug('Database operation failed. ' + err );
980                                 callback(err,'Database operation failed. ' + err );
981                         }
982                         else
983                         {
984                                 callback(null, result.affectedRows);
985                         }
986                 }); //end query
987         }); // end getConnection
988 }
989
990
991
992 exports.addVnfProfile = function(row,res,callback){
993
994         var sqlInsert;
995
996     if ( row.length < 3 )
997     {
998         console.log('Row [' + row + '] does not have enough fields.');
999         callback(null, 'Row [' + row + '] does not have enough fields.');
1000                 return;
1001     }
1002
1003     sqlInsert = "INSERT INTO VNF_PROFILE ("
1004         + "vnf_type,availability_zone_count,equipment_role) VALUES ("
1005         + "'" + row[0] + "',"
1006                 + row[1] 
1007         + ",'" + row[2] + "')";
1008
1009     console.log('SQL='+sqlInsert);
1010
1011     pool.getConnection(function(err,connection) {
1012
1013         if(err){
1014             console.log( String(err) ); // ALARM
1015             callback(err, 'Unable to get database connection.');
1016             return;
1017         }
1018         connection.query(sqlInsert, function(err,result){
1019             connection.release();
1020             if(err){
1021                 console.log('Row [' + row + '] failed to insert. ' + err );
1022                 callback(null,'Row [' + row + '] failed to insert. ' + err );
1023             }
1024             else
1025             {
1026                 callback(null,'');
1027             }
1028         }); //end query
1029     }); // end getConnection
1030 }
1031
1032
1033 // Add to SVC_LOGIC table
1034 exports.addDG = function(_module, version, rpc, mode, xmlfile, req,res){
1035
1036         var privilegeObj = req.session.loggedInAdmin;
1037         var rows={};
1038
1039     pool.getConnection(function(err,connection) {
1040         if(err){
1041                         console.error( String(err) ); // ALARM
1042             res.render("pages/err", {result:{code:'error', msg:"Unable to get database connection. "+ String(err)},header:process.env.MAIN_MENU});
1043                         return;
1044         }
1045
1046         var post = {
1047             module  :  _module,
1048             rpc     : rpc,
1049             version : version,
1050             mode    : mode,
1051             active  : "N",
1052             graph   : xmlfile
1053         };
1054
1055         //logger.debug( JSON.stringify(post));
1056
1057         //connection.query(sqlRequest, function(err,result){
1058         connection.query('INSERT INTO SVC_LOGIC SET ?', post, function(err,result){
1059             // neat!
1060
1061             // Need DB lookup logic here
1062             connection.query("SELECT module,rpc,version,mode,active,graph FROM SVC_LOGIC", function(err, rows) {
1063
1064                 if(!err) {
1065                     if ( rows.length > 0 )
1066                     {
1067                         res.render('sla/list', { rows: rows, result:{code:'',msg:''}, privilege:privilegeObj,header:process.env.MAIN_MENU } );
1068                                                 return;
1069                     }else{
1070                         console.log("no rows returned");
1071                         res.render("pages/home");
1072                                                 return;
1073                     }
1074                 }
1075                 connection.on('error', function(err){
1076                     connection.release();
1077                     console.log(500, "An error has occurred -- " + err);
1078                     res.render("pages/home");
1079                                         return;
1080                 });
1081             }); //end query
1082
1083             connection.release();
1084         });
1085         //connection.query('INSERT INTO SVC_LOGIC SET ?', post, function(err,result){
1086             // neat!
1087             //logger.debug('inserted rows');
1088         //});
1089
1090         //if(err){
1091             //res.render('pages/home');
1092         //}
1093         return;
1094
1095     }); // end of getConnection
1096 };
1097
1098 exports.activate = function(req,res,_module,rpc,version,mode,callback){
1099
1100         var sql = "UPDATE SVC_LOGIC SET active=\'Y\' WHERE module=\'"
1101             + _module + "' AND rpc=\'"
1102             + rpc + "' AND version=\'"
1103             +  version + "' AND mode=\'"
1104             +  mode + "'";
1105
1106         console.log('SQL='+sql);
1107
1108     pool.getConnection(function(err,connection) {
1109     
1110         if(err){
1111                         console.error( String(err) ); // ALARM
1112             callback(err, 'Unable to get database connection.' + err);
1113                         return;
1114         }
1115
1116         connection.query(sql, function(err,result){
1117
1118             connection.release();
1119                         if(err){
1120                 callback(err, 'Unable to get database connection.' + err);
1121                 }
1122             else
1123             {
1124                  callback(null,'');
1125             }
1126        }); //end query
1127     }); // end getConnection
1128 }
1129
1130
1131 exports.deactivate = function(req,res,_module,rpc,version,mode,callback){
1132
1133     var sql = "UPDATE SVC_LOGIC SET active=\'N\' WHERE module=\'"
1134             + _module + "' AND rpc=\'"
1135             + rpc + "' AND version=\'"
1136             +  version + "' AND mode=\'"
1137             +  mode + "'";
1138
1139         console.log('SQL='+sql);
1140
1141     pool.getConnection(function(err,connection) {
1142
1143         if(err){
1144                         console.error( String(err) ); // ALARM
1145             callback(err, 'Unable to get database connection.' + err);
1146                         return;
1147         }
1148
1149         connection.query(sql, function(err,result){
1150
1151             connection.release();
1152             if(err){
1153                 callback(err, 'Unable to get database connection.' + err);
1154             }
1155             else
1156             {
1157                  callback(null,'');
1158             }
1159        }); //end query
1160     }); // end getConnection
1161 }
1162
1163 exports.global_deactivate = function(req,res,_module,rpc,mode,callback){
1164
1165     var sql = "UPDATE SVC_LOGIC SET active=\'N\' WHERE module=\'"
1166             + _module + "' AND rpc=\'"
1167             + rpc + "' AND mode=\'"
1168             +  mode + "'";
1169
1170
1171     pool.getConnection(function(err,connection) {
1172
1173         if(err){
1174             callback(err, 'Unable to get database connection.' + err);
1175             return;
1176         }
1177
1178         connection.query(sql, function(err,result){
1179
1180             connection.release();
1181             if(err){
1182                 callback(err, err);
1183             }
1184             else
1185             {
1186                  callback(null,'');
1187             }
1188        }); //end query
1189     }); // end getConnection
1190 }
1191
1192
1193 exports.deleteDG = function(req,res,_module,rpc,version,mode,callback){
1194
1195         var sql = "DELETE FROM SVC_LOGIC WHERE module=\'"
1196             + _module + "' AND rpc=\'"
1197             + rpc + "' AND version=\'"
1198             +  version + "' AND mode=\'"
1199             +  mode + "'";
1200
1201         console.log('SQL='+sql);
1202
1203     pool.getConnection(function(err,connection) {
1204
1205         if(err){
1206                         console.error( String(err) ); // ALARM
1207             callback(err, 'Unable to get database connection.' + err);
1208                         return;
1209         }
1210
1211         connection.query(sql, function(err,result){
1212
1213             connection.release();
1214             if(err){
1215                 callback(err, 'Unable to get database connection.' + err);
1216             }
1217             else
1218             {
1219                  callback(null,'');
1220             }
1221        }); //end query
1222     }); // end getConnection
1223 }
1224
1225
1226
1227 function padLeft(nr, n, str){
1228     return Array(n-String(nr).length+1).join(str||'0')+nr;
1229 }
1230