| /* |
| ============LICENSE_START========================================== |
| =================================================================== |
| Copyright (C) 2019 AT&T Intellectual Property. All rights reserved. |
| =================================================================== |
| |
| Unless otherwise specified, all software contained herein is licensed |
| under the Apache License, Version 2.0 (the License); |
| you may not use this software 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. |
| |
| ============LICENSE_END============================================ */ |
| //.. processing on server side |
| 'use strict'; |
| |
| const fs = require('fs'); |
| //var spawn = require("child_process").spawn; |
| var Chproc = require("child_process"); |
| var logger = require('./srvlogger'); |
| |
| var clName= "ServerDataSvc"; |
| //const DIST_FLDR = join(process.cwd(), 'dist'); |
| //var DIST_FLDR = "dist"; |
| var cdt_home = "."; |
| var LOG_DIR = "/tmp"; |
| var LogF = "ndserver.log"; |
| var SubProcScript= "/app/subnproc.js"; |
| //var HTML_ROOT_FLDR= DIST_FLDR; |
| //var DelScript= DIST_FLDR +"/app/deleteOldData.js"; |
| //var inputFilePfx = DIST_FLDR +"/posted_data_"; |
| var fsAvSpaceKB= -1; |
| var rsfname= ""; |
| var remAddr= ""; //.. remote client address |
| var taskId= ""; |
| var fdI; |
| var fdRsf; |
| var fDelim= "&"; |
| |
| //.. to be called by server at initialization |
| exports.setHomeDir = function( homeDir, logDir ) { |
| this.cdt_home= homeDir; |
| this.LOG_DIR= logDir; |
| // this.DIST_FLDR= this.cdt_home+"/dist"; |
| this.LogF= this.LOG_DIR+"/ndserver.log"; |
| console.log( clName+": setHomeDir: cdt_home:["+this.cdt_home+"]"); |
| console.log( clName+": setHomeDir: LogF:["+this.LogF+"]"); |
| }; |
| |
| //.. to be called by server on receiving GET /getUserRole request |
| // (simulation only) |
| exports.getUserRoles = function( requrl ) { |
| var methName= "getUserRoles"; |
| logger.addLog( clName+": "+methName+ |
| ": start: url:["+ requrl+"]\n cdt_home:["+this.cdt_home+"]\n",this.LogF); |
| let timeStamp = new Date().toISOString(); |
| logger.addLog( clName+": "+methName+": timeStamp:["+timeStamp+"]\n",this.LogF); |
| var resp= '{\"respStr\":\"notfoundResp\"}'; |
| this.urolfname= this.cdt_home+"/userRoles.json"; |
| resp= this.readResultFile( this.urolfname ); |
| logger.addLog( clName+": "+methName+ |
| ": result length="+resp.length+"\n",this.LogF); |
| return resp; |
| }; |
| |
| //.. to be called by server on receiving GET /api/* request |
| exports.getData = function( requrl ) { |
| var methName= "getData"; |
| //console.log(clName+": getData: start: url:["+ requrl+"]\n cdt_home:["+ |
| // this.cdt_home+"]"); |
| logger.addLog( clName+": "+methName+ |
| ": start: url:["+ requrl+"]\n cdt_home:["+this.cdt_home+"]\n",this.LogF); |
| let timeStamp = new Date().toISOString(); |
| logger.addLog( clName+": "+methName+": timeStamp:["+timeStamp+"]\n",this.LogF); |
| var resp= '{\"respStr\":\"notfoundResp\"}'; |
| var taskStr= "taskId="; |
| //... Regular Expressions for different requests ... |
| //.. to get processing result |
| var rexpGRESUL= new RegExp(/\/api\/get_result/); |
| //.. to get progress percentage of the processing |
| var rexpGPROGR= new RegExp(/\/api\/get_progress/); |
| //.. to get parameters calculated via the processing |
| var rexpGPRMS= new RegExp(/\/api\/get_params/); |
| //.. to get parameters format-error file |
| var rexpPFMTERR= new RegExp(/\/api\/get_pfmterr/); |
| //.. to get Available space in server-side file-system |
| var rexpGFSAVSP= new RegExp(/\/api\/get_fsAvSpace/); |
| //.. to check for ACE-editor resource files |
| var rexpACERES= new RegExp(/\/node_modules\/ace-builds\/src-min/); |
| // |
| //... checking which url is matching ... |
| if( requrl == '/' ) { |
| // console.log(clName+": getData: this is a ROOT request ..."); |
| logger.addLog( clName+": getData: this is a ROOT request ...\n",this.LogF); |
| return this.getRoot(); |
| }; |
| //.. non-root, api url |
| var match1= null; |
| if( (match1= rexpGRESUL.exec(requrl)) != null ) { |
| logger.addLog( clName+": "+methName+": URL match /api/get_result\n",this.LogF); |
| //.. assuming: /api/get_result?taskId=f7be82e43e34cb4e960b45d35e8d9596 |
| var indT= requrl.indexOf( taskStr, 0); |
| if( indT < 0 ) { |
| var errMsg= |
| clName+": "+methName+": Error: No taskId found in the URL !\n"; |
| logger.addLog( errMsg,this.LogF); |
| resp= '{\"Error\":\"'+errMsg+'\"}'; |
| } |
| else { //.. indT > -1 - have taskId in URL |
| this.taskId= requrl.substr( indT+ taskStr.length ); |
| logger.addLog( clName+": "+methName+ |
| ": extracted from URL: taskId:["+this.taskId+"]\n",this.LogF); |
| this.rsfname= this.cdt_home+"/sync_template_res_"+this.taskId+".txt"; |
| resp= this.readResultFile( this.rsfname ); |
| logger.addLog( clName+": "+methName+ |
| ": result length="+resp.length+"\n",this.LogF); |
| logger.addLog( clName+": "+methName+ |
| ": got result -Start data cleanup...\n",this.LogF); |
| this.deleteOldFiles( this.taskId ); |
| }; |
| } |
| else |
| if( (match1= rexpGPROGR.exec(requrl)) != null ) { |
| logger.addLog( clName+": "+methName+ |
| ": URL match /api/get_progress\n",this.LogF); |
| //.. assuming: /api/get_progress?taskId=f7be82e43e34cb4e960b45d35e8d9596 |
| var indT= requrl.indexOf( taskStr, 0); |
| if( indT < 0 ) { |
| var errMsg= |
| clName+": "+methName+": Error: No taskId found in the URL !\n"; |
| logger.addLog( errMsg,this.LogF); |
| resp= '{\"Error\":\"'+errMsg+'\"}'; |
| } |
| else { //.. indT > -1 - have taskId in URL |
| this.taskId= requrl.substr( indT+ taskStr.length ); |
| logger.addLog( clName+": "+methName+ |
| ": extracted from URL: taskId:["+this.taskId+"]\n",this.LogF); |
| this.pgfname= this.cdt_home+"/proc_status_"+this.taskId+".json"; |
| // resp= '{\"percentage\":\"3\"}'; |
| resp= this.readResultFile( this.pgfname ); |
| } |
| logger.addLog( clName+": "+methName+ |
| ": result length="+resp.length+"\n",this.LogF); |
| logger.addLog( clName+": "+methName+": progress:["+resp+"]\n",this.LogF); |
| } |
| else |
| if( (match1= rexpGPRMS.exec(requrl)) != null ) { |
| logger.addLog( clName+": "+methName+ |
| ": URL match /api/get_params\n",this.LogF); |
| //.. assuming: /api/get_params?taskId=f7be82e43e34cb4e960b45d35e8d9596 |
| var indT= requrl.indexOf( taskStr, 0); |
| if( indT < 0 ) { |
| var errMsg= |
| clName+": "+methName+": Error: No taskId found in the URL !\n"; |
| logger.addLog( errMsg,this.LogF); |
| resp= '{\"Error\":\"'+errMsg+'\"}'; |
| } |
| else { //.. indT > -1 - have taskId in URL |
| this.taskId= requrl.substr( indT+ taskStr.length ); |
| logger.addLog( clName+": "+methName+ |
| ": extracted from URL: taskId:["+this.taskId+"]\n",this.LogF); |
| var prmfname= this.cdt_home+"/template_params_"+this.taskId+".txt"; |
| resp= this.readResultFile( prmfname ); |
| } |
| logger.addLog( clName+": "+methName+ |
| ": params length="+resp.length+"\n",this.LogF); |
| } |
| else |
| if( (match1= rexpPFMTERR.exec(requrl)) != null ) { |
| //.. parameter format error file |
| logger.addLog( clName+": "+methName+ |
| ": URL match /api/get_pfmterr\n",this.LogF); |
| //.. assuming: /api/get_pfmterr?taskId=f7be82e43e34cb4e960b45d35e8d9596 |
| var indT= requrl.indexOf( taskStr, 0); |
| if( indT < 0 ) { |
| var errMsg= |
| clName+": "+methName+": Error: No taskId found in the URL !\n"; |
| logger.addLog( errMsg,this.LogF); |
| resp= '{\"Error\":\"'+errMsg+'\"}'; |
| } |
| else { //.. indT > -1 - have taskId in URL |
| this.taskId= requrl.substr( indT+ taskStr.length ); |
| logger.addLog( clName+": "+methName+ |
| ": extracted from URL: taskId:["+this.taskId+"]\n",this.LogF); |
| var errfname= this.cdt_home+"/sync_template_err_"+this.taskId+".txt"; |
| resp= this.readResultFile( errfname ); |
| } |
| logger.addLog( clName+": "+methName+ |
| ": params length="+resp.length+"\n",this.LogF); |
| } |
| else |
| if( (match1= rexpGFSAVSP.exec(requrl)) != null ) { |
| //.. Available Space in Server-side file-system |
| logger.addLog( clName+": "+methName+ |
| ": URL match /api/get_fsAvSpace \n",this.LogF); |
| var errMsg= this.getFsAvailSpace( this.cdt_home ); |
| if( errMsg.length > 0 ) { |
| //.. return non-empty Error message |
| resp= '{\"Error\":\"'+errMsg+'\"}'; |
| }else{ |
| resp= fsAvSpaceKB; //.. empty return means no error |
| }; |
| } |
| else |
| if( (match1= rexpACERES.exec(requrl)) != null ) { |
| //.. (simulated env.) ACE-editor resource files |
| logger.addLog( clName+": "+methName+ |
| ": URL match /node_modules/ace-builds...\n",this.LogF); |
| var acebldStr= "src-min\/"; |
| var indAB= requrl.indexOf( acebldStr, 0); |
| if( indAB < 0 ) { |
| logger.addLog( clName+": "+methName+ |
| ": Warn: No URL match("+acebldStr+").\n",this.LogF); |
| } |
| else { //.. indAB > -1 -got acebldStr |
| var acefname= requrl.substr( indAB +acebldStr.length ); |
| logger.addLog( clName+": "+methName+ |
| ": req.file name:["+acefname+"]\n",this.LogF); |
| // if( acefname == "mode-velocity.js" || acefname == "theme-chrome.js" ) |
| if( acefname == "mode-velocity.js" ) |
| { |
| var aresfname= this.cdt_home+"/app/"+acefname; |
| resp= this.readResultFile( aresfname ); |
| } |
| else { |
| logger.addLog( clName+": "+methName+ |
| ": Warn: No ace URL match("+acebldStr+"...js).\n",this.LogF); |
| } |
| } |
| } |
| else { //.. |
| logger.addLog( clName+": "+methName+ |
| ": Warn: No URL match - nothing to do !\n",this.LogF); |
| }; |
| logger.addLog( clName+": "+methName+ |
| ": resp.length="+resp.length+"\n finish.\n",this.LogF); |
| return resp; |
| }; |
| |
| exports.deleteOldFiles = function( ctaskId ) { |
| var methName= "deleteOldFiles"; |
| logger.addLog( clName+": "+methName+ |
| ": start. the complete task Id:["+ctaskId+"]\n",this.LogF); |
| var cp_args= new Array( 0 ); |
| cp_args.push( ctaskId ); //.. give it taskId in args |
| cp_args.push( cdt_home ); |
| cp_args.push( LOG_DIR ); |
| var DelScript= this.cdt_home +"/app/deleteOldData.js"; |
| var chprocI= Chproc.fork( DelScript, cp_args ); |
| logger.addLog( clName+": "+methName+ |
| ": DelScript started ...\n",this.LogF); |
| let timeStamp = new Date().toISOString(); |
| logger.addLog( clName+": "+methName+": timeStamp:["+timeStamp+"]\n",this.LogF); |
| }; |
| |
| exports.getRoot = function() { |
| var methName= "getRoot"; |
| logger.addLog( clName+": "+methName+": start. ROOT URL match \n",this.LogF); |
| logger.addLog( clName+": "+methName+ |
| ": cdt_home:["+this.cdt_home+"]\n",this.LogF); |
| var HTML_ROOT_FLDR= this.cdt_home; |
| this.rsfname= HTML_ROOT_FLDR+"/index.html"; |
| var resp= this.readResultFile( this.rsfname ); |
| logger.addLog( clName+": "+methName+ |
| ": result length="+resp.length+"\n",this.LogF); |
| logger.addLog( clName+": "+methName+": resp:["+resp+"]\n",this.LogF); |
| return resp; |
| }; |
| |
| exports.readResultFile = function( rfname ) { |
| var methName= "readResultFile"; |
| //.. read processing result from file and send back to the client |
| logger.addLog( clName+": "+methName+ |
| ": start. rfname:["+rfname+"]\n",this.LogF); |
| var rdata= ""; |
| try { |
| rdata= fs.readFileSync( rfname, 'utf8'); |
| } |
| catch( err ) { |
| logger.addLog( clName+": "+methName+ |
| ": result-file read: Error: code="+err.code+"\n",this.LogF); |
| throw err; |
| } |
| logger.addLog( clName+": "+methName+ |
| ": result-file content length="+rdata.length+"\n",this.LogF); |
| return rdata; |
| }; |
| |
| exports.postSrvLogRec = function ( requrl, inpdata, remaddr ) { |
| //.. to be called by server on receiving POST /api/post_logrec request |
| var methName= "postSrvLogRec"; |
| logger.addLog( clName+": "+methName+ |
| ": start: url:["+ requrl+"]\n",this.LogF); |
| let timeStamp = new Date().toISOString(); |
| logger.addLog( clName+": "+methName+": timeStamp:["+timeStamp+"]\n",this.LogF); |
| logger.addLog( clName+": "+methName+ |
| ": cdt_home:\n["+cdt_home+"]\n",this.LogF); |
| logger.addLog( clName+": "+methName+ |
| ": client: remaddr:["+ remaddr+"]\n",this.LogF); |
| if( remaddr != null && remaddr != undefined ) { |
| this.remAddr= remaddr; |
| }; |
| logger.addLog( clName+": "+methName+ |
| ": Log Record:\n-["+inpdata+"]-\n",this.LogF); |
| var resp= '{\"respStr\":\"OK\"}'; |
| logger.addLog( clName+": "+methName+": done: resp:["+resp+"]\n",this.LogF); |
| return( resp ); |
| }; |
| |
| exports.procReq = function ( requrl, inpdata, remaddr ) { |
| //.. to be called by server on receiving POST /api/* request |
| // receive input data, save into a file and start server-side processing task |
| var methName= "procReq"; |
| logger.addLog( clName+": "+methName+ |
| ": start: url:["+ requrl+"]\n",this.LogF); |
| let timeStamp = new Date().toISOString(); |
| logger.addLog( clName+": "+methName+": timeStamp:["+timeStamp+"]\n",this.LogF); |
| logger.addLog( clName+": "+methName+ |
| ": cdt_home:\n["+cdt_home+"]\n",this.LogF); |
| logger.addLog( clName+": "+methName+ |
| ": client: remaddr:["+ remaddr+"]\n",this.LogF); |
| if( remaddr != null && remaddr != undefined ) { |
| this.remAddr= remaddr; |
| }; |
| logger.addLog( clName+": "+methName+ |
| ": remAddr:["+ this.remAddr+"]\n",this.LogF); |
| var inpdLen= inpdata.length; |
| logger.addLog( clName+": "+methName+": inpdata length="+inpdLen+"\n",this.LogF); |
| if( inpdLen > 300 ) { |
| logger.addLog( clName+": "+methName+ |
| ": inpdata:\n["+inpdata.substr(0,299)+"...]\n",this.LogF); |
| }else{ |
| logger.addLog( clName+": "+methName+ |
| ": inpdata:\n["+inpdata+"]\n",this.LogF); |
| }; |
| var resp= '{\"respStr\":\"postNotFoundResp\"}'; |
| var taskStr= "taskId="; |
| var rexp2= new RegExp(/\/api\/proc_cont/); |
| var match2= rexp2.exec( requrl ); |
| if( match2 ) { |
| logger.addLog( clName+": "+methName+ |
| ": URL match: proc_cont - processing content...\n",this.LogF); |
| //.. check available space before server-side processiong |
| var emsg= this.getFsAvailSpace( this.cdt_home ); |
| var doAdd= ''; //.. false |
| var doProc= ''; //.. false |
| //.. assuming format: |
| // url: /api/proc_cont?taskId=1fcf9ebb05cec21caeb71ebac7e34b2c&part=2of2 |
| var indT= requrl.indexOf( taskStr, 0); |
| if( indT < 0 ) { |
| logger.addLog( clName+": "+methName+ |
| ": Warn: No taskId found in the URL - New Task !\n",this.LogF); |
| this.calcTaskId(); |
| logger.addLog( clName+": "+methName+ |
| ": calculated New taskId:["+this.taskId+"]\n", this.LogF); |
| resp= '{\"respStr\":\"proc_start\",\"taskId\":\"'+this.taskId+'\"}'; |
| } |
| else { //.. indT > -1 - have taskId in URL |
| var indTV= indT+ taskStr.length; |
| var indDL= requrl.indexOf( fDelim, indTV ); |
| if( indDL < 0 ) { |
| logger.addLog( clName+": "+methName+ |
| ": no more fields after taskId.\n",this.LogF); |
| this.taskId= requrl.substr( indTV ); |
| }else{ //.. found delimiter |
| this.taskId= requrl.substring( indTV, indDL ); |
| }; |
| logger.addLog( clName+": "+methName+ |
| ": extracted from URL: taskId:["+this.taskId+"]\n", this.LogF); |
| doAdd= "true"; //.. will add to old content |
| resp= '{\"respStr\":\"proc_upload\"}'; //.. no return of old taskId |
| } |
| var inputFilePfx = this.cdt_home +"/posted_data_"; |
| var infname= inputFilePfx +this.taskId +".txt"; |
| logger.addLog( clName+": "+methName+ |
| ": got input file name:["+infname+"]\n",this.LogF); |
| //.. extracting parts info, e.g.: "...&part=2of2" |
| var rexp2p= new RegExp(/part=(\d+)of(\d+)/); |
| var match2p= rexp2p.exec( requrl ); |
| if( match2p == null ) { |
| logger.addLog( clName+": "+methName+ |
| ": Warn: No part number found in the URL "+ |
| "-cant determine the last part !\n",this.LogF); |
| } |
| else { //.. match2p != null |
| logger.addLog( clName+": "+methName+ |
| ": match2p: length="+match2p.length+"\n",this.LogF); |
| for( var i1=0; i1 < match2p.length; i1++ ) { |
| logger.addLog( clName+": "+methName+ |
| ": match2p:["+match2p[i1]+"]\n",this.LogF); |
| }; |
| var partNum= match2p[ 1]; |
| var partCnt= match2p[ 2]; |
| logger.addLog( clName+": "+methName+ |
| ": partNum:["+partNum+"] partCnt:["+partCnt+"]\n",this.LogF); |
| if( partNum == partCnt ) { |
| logger.addLog( clName+": "+methName+ |
| ": this is the last part -need doProc\n",this.LogF); |
| doProc= "true"; |
| }; |
| }; |
| //.. write data into the file and start processing right after the close |
| var errW= this.writeInp2File( infname, inpdata, doAdd, doProc ); |
| if( errW.length > 0 ) { |
| resp= errW; |
| }; |
| } |
| else { //.. no match2 |
| logger.addLog( clName+": "+methName+": Warn: No URL match.\n",this.LogF); |
| } |
| logger.addLog( clName+": "+methName+": done: resp:["+resp+"]\n",this.LogF); |
| return( resp ); |
| }; |
| |
| exports.getFsAvailSpace = function ( fspath ) { |
| var methName= "getFsAvailSpace"; |
| //.. get available space (kB) in filesystem where the fspath is mounted |
| logger.addLog( clName+": "+methName+ |
| ": start: fspath:\n["+fspath+"]\n",this.LogF); |
| var timeStampI = Date.now(); |
| logger.addLog( clName+": "+methName+": timeStampI="+timeStampI+"\n",this.LogF); |
| var timeStamp = new Date( timeStampI ).toISOString(); |
| logger.addLog( clName+": "+methName+": timeStamp:["+timeStamp+"]\n",this.LogF); |
| if( fspath.length < 1 ) { |
| var errMsg= methName+": Error: the filesystem directory path is empty !"; |
| logger.addLog( clName+ errMsg+"\n", this.LogF); |
| return errMsg; |
| }; |
| // var carg= "-k "+fspath; |
| // var mopts= { input: carg, timeout: 4000 }; |
| //var moutObj= Chproc.spawnSync('df',[],mopts); |
| var c_args= new Array( 0 ); |
| c_args.push( '-k' ); |
| c_args.push( fspath ); |
| var mopts= { timeout: 4000 }; |
| logger.addLog( clName+": "+methName+ |
| ": mopts:["+JSON.stringify(mopts)+"]\n",this.LogF); |
| //.. start |
| var moutObj= Chproc.spawnSync('df', c_args, mopts); |
| logger.addLog( clName+": "+methName+ |
| ": df done: moutObj: status:["+moutObj.status+"](0 means Ok)\n",this.LogF); |
| var timeStampI = Date.now(); |
| logger.addLog( clName+": "+methName+": timeStampI="+timeStampI+"\n",this.LogF); |
| if( moutObj.error != null ) { |
| var errMsg= clName+": "+methName+ |
| ": spawn df: Error:["+JSON.stringify(moutObj.error)+"]"; |
| logger.addLog( errMsg+"\n", this.LogF); |
| return errMsg; |
| }; |
| logger.addLog( clName+": "+methName+ |
| ": df moutObj.output: length="+moutObj.output.length+"\n",this.LogF); |
| if( moutObj.output.length > 0 ) { |
| for( var i0=0; i0 < moutObj.output.length; i0++ ) { |
| logger.addLog( clName+": "+methName+ |
| ": moutObj.output["+i0+"]:["+moutObj.output[i0]+"]\n",this.LogF); |
| }; //.. loop |
| //.. output[1]: should contain 2 lines: |
| // [Filesystem 1K-blocks Used Available Use% Mounted on\n |
| // /dev/dm-0 37383720 8933604 26528068 26% /\n] |
| var out1= moutObj.output[1]; |
| logger.addLog( clName+": "+methName+": to parse out1:["+out1+"]\n",this.LogF); |
| var rexp1= new RegExp(/\s+(\d+)\s+(\d+)\s+(\d+)\s+/); |
| logger.addLog( clName+": "+methName+": rexp1:["+rexp1+"]\n",this.LogF); |
| var matchArr= rexp1.exec( out1 ); |
| if( matchArr == null ) { |
| var errMsg= clName+": "+methName+ |
| ": spawn: Error: No digitals (bytes counts) found in the output !"; |
| logger.addLog( errMsg+"\n", this.LogF); |
| return errMsg; |
| }; |
| if( matchArr[3] == null || matchArr[3] == undefined ) { |
| var errMsg= clName+": "+methName+ |
| ": parsed: Error: The 3-rd byte count is empty (no Available Kbytes) !"; |
| logger.addLog( errMsg+"\n", this.LogF); |
| return errMsg; |
| }; |
| fsAvSpaceKB= matchArr[3]; |
| logger.addLog( clName+": "+methName+ |
| ": extracted fsAvSpaceKB="+fsAvSpaceKB+"\n",this.LogF); |
| }else{ |
| var errMsg= clName+": "+methName+ |
| ": spawn: Error: Empty df-command output array !"; |
| logger.addLog( errMsg+"\n", this.LogF); |
| return errMsg; |
| } |
| logger.addLog( clName+": "+methName+": finished.\n",this.LogF); |
| return ''; |
| }; |
| |
| exports.calcTaskId = function () { |
| var methName= "calcTaskId"; |
| //.. calculate taskId |
| logger.addLog( clName+": "+methName+": start:\n",this.LogF); |
| var timeStampI = Date.now(); |
| logger.addLog( clName+": "+methName+": timeStampI="+timeStampI+"\n",this.LogF); |
| var timeStamp = new Date( timeStampI ).toISOString(); |
| logger.addLog( clName+": "+methName+": timeStamp:["+timeStamp+"]\n",this.LogF); |
| |
| var rawId = String( this.remAddr+'-'+timeStampI ); |
| logger.addLog( clName+": "+methName+": rawId:["+rawId+"]\n",this.LogF); |
| |
| var mopts= { input: rawId, timeout: 4000 }; |
| logger.addLog( clName+": "+methName+ |
| ": mopts:["+JSON.stringify(mopts)+"]\n",this.LogF); |
| |
| var moutObj= Chproc.spawnSync('md5sum',[],mopts); |
| logger.addLog( clName+": "+methName+ |
| ": moutObj: status:["+moutObj.status+"]\n",this.LogF); |
| if( moutObj.error != null ) { |
| logger.addLog( clName+": "+methName+ |
| ": moutObj calc.: Error:["+JSON.stringify(moutObj.error)+"]\n",this.LogF); |
| throw moutObj.error; |
| } |
| else { //.. no errors |
| logger.addLog( clName+": "+methName+ |
| ": moutObj: output: length="+moutObj.output.length+"\n",this.LogF); |
| if( moutObj.output.length > 0 ) { |
| for( var i0=0; i0 < moutObj.output.length; i0++ ) { |
| logger.addLog( clName+": "+methName+ |
| ": moutObj: output:["+moutObj.output[i0]+"]\n",this.LogF); |
| } |
| } |
| var out1= moutObj.output[ 1 ]; |
| logger.addLog( clName+": "+methName+": out1:["+out1+"]\n",this.LogF); |
| var rexp1= new RegExp(/\w+/); //.. alphanumeric |
| logger.addLog( clName+": "+methName+": rexp1:["+rexp1+"]\n",this.LogF); |
| var match1= rexp1.exec( out1 ); |
| if( match1 == null ) { |
| logger.addLog( clName+": "+methName+ |
| ": Warn.: No Match of rexp1 in the cmd output (No taskId) !\n",this.LogF); |
| } |
| else { |
| logger.addLog( clName+": "+methName+ |
| ": match1:["+match1[0]+"] length="+match1.length+"\n",this.LogF); |
| this.taskId= match1[0]; |
| }; |
| }; |
| logger.addLog( clName+": "+methName+ |
| ": done: calculated taskId:["+this.taskId+"]\n",this.LogF); |
| }; |
| |
| exports.writeInp2File = function ( fname, inpd, doAdd, doProc ) { |
| var methName= "writeInp2File"; |
| //.. write input data to the file |
| logger.addLog( clName+": "+methName+ |
| ": Start: file:["+fname+"]\n",this.LogF); |
| let timeStamp = new Date().toISOString(); |
| logger.addLog( clName+": "+methName+": timeStamp:["+timeStamp+"]\n",this.LogF); |
| var inpdLen= inpd.length; |
| logger.addLog( clName+": "+methName+": inpd length="+ inpdLen+"\n",this.LogF); |
| if( inpdLen < 1 ) { |
| logger.addLog( clName+": "+methName+ |
| ": Warn.: Empty input - nothing to do !\n",this.LogF); |
| return ''; //.. not an error |
| }; |
| if( inpdLen > 300 ) { |
| logger.addLog( clName+": "+methName+ |
| ": inpd(begin):["+ inpd.substr(0,299)+"...]\n",this.LogF); |
| } |
| else { |
| logger.addLog( clName+": "+methName+": inpd:["+ inpd+"]\n",this.LogF); |
| }; |
| logger.addLog( clName+": "+methName+ |
| ": doAdd:["+doAdd+"] doProc:["+doProc+"]\n",this.LogF); |
| if( ! doAdd ) { |
| logger.addLog( clName+": "+methName+ |
| ": Dont doAdd - need new content.\n",this.LogF); |
| //.. removing old file if is there with the same name (async is Not OK !) |
| var fname_o= fname+".save"; |
| try { |
| fs.renameSync( fname, fname_o ); |
| } |
| catch( err ) { |
| var errMsg= clName+": "+methName+ |
| ": Warn.: Failed to rename old file:["+fname+"]"+ |
| " err.code="+err.code+"\n"; |
| logger.addLog( errMsg, this.LogF ); |
| }; |
| }; |
| logger.addLog( clName+": "+methName+": opening file:["+fname+"]\n",this.LogF); |
| try { |
| this.fdI= fs.openSync( fname, 'a' ); |
| } |
| catch( err ) { |
| var errMsg= clName+": "+methName+ |
| ": Error: Failed to open file:["+fname+"]"+ |
| " err.code="+err.code+"\n"; |
| logger.addLog( errMsg, this.LogF ); |
| return( errMsg ); |
| }; |
| logger.addLog( clName+": "+methName+ |
| ": writing data into the file: fdI="+ this.fdI+"\n",this.LogF); |
| try { |
| fs.appendFileSync( this.fdI, inpd, 'utf8' ); |
| } |
| catch( err ) { |
| var errMsg= clName+": "+methName+ |
| ": Error: Failed to append input data to file: err.code="+err.code+"\n"; |
| logger.addLog( errMsg, this.LogF ); |
| return( errMsg ); |
| }; |
| logger.addLog( clName+": "+methName+ |
| ": closing input data file...\n",this.LogF); |
| try { |
| fs.closeSync( this.fdI ); |
| } |
| catch( err ) { |
| var errMsg= clName+": "+methName+ |
| ": Error: Failed to close input data file: err.code="+err.code+"\n"; |
| logger.addLog( errMsg, this.LogF ); |
| return( errMsg ); |
| }; |
| logger.addLog( clName+": "+methName+ |
| ": input file was written and closed successfully.\n",this.LogF); |
| timeStamp = new Date().toISOString(); |
| logger.addLog( clName+": "+methName+": timeStamp:["+timeStamp+"]\n",this.LogF); |
| if( doProc ) { |
| logger.addLog( clName+": "+methName+ |
| ": starting processing...\n",this.LogF); |
| this.startProcFile(); |
| }; |
| return ''; //.. no error |
| }; |
| |
| exports.startProcFile = function () { |
| var methName= "startProcFile"; |
| //.. start processing of the input file in external sub-process |
| logger.addLog( clName+": "+methName+ |
| ": Start: taskId:["+this.taskId+"]\n",this.LogF); |
| let timeStamp = new Date().toISOString(); |
| logger.addLog( clName+": "+methName+ |
| ": timeStamp:["+timeStamp+"]\n",this.LogF); |
| console.log(methName+": cdt_home:["+this.cdt_home+"]"); |
| var SubProcScriptP= this.cdt_home + SubProcScript; |
| logger.addLog( clName+": "+methName+ |
| ": run SubProcScript:\n["+SubProcScriptP+"]\n",this.LogF); |
| var cp_args= new Array( 0 ); |
| cp_args.push( this.taskId ); //.. give it taskId in args |
| cp_args.push( this.cdt_home ); |
| cp_args.push( this.LOG_DIR ); |
| var chprocI= Chproc.fork( SubProcScriptP, cp_args ); |
| |
| // chprocI.on('message', (msg) => { |
| // console.log(methName+": chprocI got msgJ:["+JSON.stringify(msg)+"]"); |
| // }); |
| // console.log("startProcFile: sending a message to child."); |
| // chprocI.send({ hello: 'world' }); |
| logger.addLog( clName+": "+methName+" done submit.\n",this.LogF); |
| }; |