const express = require("express"); const execSync = require('child_process').execSync; var parser = require('xml2json'); const fs = require('fs'); const redis = require('redis'); const client = redis.createClient(); const app = express(); const port = 3000; //client.connect('127.0.0.1', 6379); const jsn = require("./base.json"); const di = require("./di.json"); const ia = require("./ia.json"); const mach = require("./machinery.json"); const mt = require("./mt.json"); let ns_array = []; console.log(typeof jsn); //console.log(jsn.UANodeSet.UAObject.find( record => record.NodeId === "i=84")); client.on('connect', function(){ console.log('Connected.'); }); async function redis_set(shorty, data){ await client.json.set(shorty,'.',data); } function inverse(dev){ var str = ''; if("IsForward" in dev){ if(dev.IsForward === "false"){ str = "<-"; } }else{ str = "->"; } return str; } function forward(dev){ var b = true; if("IsForward" in dev){ if(dev.IsForward === "false"){ b = false; } }else{ b = true; } return b; } function sortNS(files){ let nsets = []; for(let x = 0; x{ try{ var shorty = req.params["ident"]; const id = './'+shorty+".json"; const fl = require(id); redis_set(shorty, fl); res.json({result:"OK"}); }catch(err){ console.log("NOK"); res.json({result:"NOK"}); } }) app.get('/requirejson/:ident/:name',(req, res) =>{ try{ var namejs = req.params["name"]; var shorty = req.params["ident"]; const id = "./"+namejs+".json"; const fl = require(id); for(let i = 0; i < ns_array.length; i++){ if(ns_array[i][1] === shorty){ return res.json({result:"Array already includes element."}) } } ns_array.push([fl, shorty]); res.json({result:"OK"}); }catch(err){ console.log("NOK"); res.json({result:"NOK", error: "Json file may not be available. Call list json files."}); } }) app.get('/shownsarray',(req, res) =>{ try{ let str = ''; for(let i = 0; i < ns_array.length; i++){ str += '('+i+': '+ns_array[i][1]+')'; } res.json({result:str}); console.log(ns_array); }catch(err){ console.log("NOK"); res.json({result:"NOK", error: "Json file may not be available. Call list json files."}); } }) app.get('/getredis',(req, res) =>{ try{ redis_get(); res.json({result:"OK"}); }catch(err){ console.log("NOK"); res.json({result:"NOK"}); } }) app.get('/get_root',(req, res) =>{ try{ let rt = jsn.UANodeSet.UAObject.find( record => record.NodeId === "i=84"); let resj = { id: rt.NodeId, parent: "#", text: rt.DisplayName}; res.json(resj); }catch(err){ console.log("NOK"); res.json({result:"NOK"}); } }) app.get('/get_children/base/:id',(req, res) =>{ var nid = req.params["id"]; try{ if(Array.isArray(jsn.UANodeSet.UAObject)){ for (let i = 0; i < jsn.UANodeSet.UAObject.length;i++){ if(Array.isArray(jsn.UANodeSet.UAObject[i].References.Reference)){ for (let x = 0; x < jsn.UANodeSet.UAObject[i].References.Reference.length;x++){ if(jsn.UANodeSet.UAObject[i].References.Reference[x].$t === nid){ console.log(jsn.UANodeSet.UAObject[i].BrowseName + inverse(jsn.UANodeSet.UAObject[i].References.Reference[x]) +jsn.UANodeSet.UAObject[i].References.Reference[x].ReferenceType); } } }else{ if(jsn.UANodeSet.UAObject[i].References.Reference.$t === nid){ console.log(jsn.UANodeSet.UAObject[i].BrowseName + inverse(jsn.UANodeSet.UAObject[i].References.Reference) +jsn.UANodeSet.UAObject[i].References.Reference.ReferenceType); } } } }else{ if(Array.isArray(jsn.UANodeSet.UAObject.References.Reference)){ for (let x = 0; x < jsn.UANodeSet.UAObject.References.Reference.length;x++){ if(jsn.UANodeSet.UAObject[i].References.Reference[x].$t === nid){ console.log(jsn.UANodeSet.UAObject[i].BrowseName + inverse(jsn.UANodeSet.UAObject.References.Reference[x]) +jsn.UANodeSet.UAObject.References.Reference[x].ReferenceType); } } }else{ if(jsn.UANodeSet.UAObject.References.Reference.$t === nid){ console.log(jsn.UANodeSet.UAObject.BrowseName + inverse(jsn.UANodeSet.UAObject.References.Reference) +jsn.UANodeSet.UAObject.References.Reference.ReferenceType); } } } console.log(''); res.json({result:"OK"}); }catch(err){ console.log("NOK"); res.json({result:"NOK"}); } }) app.get('/get_children/all/:ns/:id',(req, res) =>{ var ret_obj = []; var ns = req.params["ns"]; var id = req.params["id"]; var nid = ns+';'+id; get_Children(di, nid, ret_obj); get_Children(ia, nid, ret_obj); get_Children(mach, nid, ret_obj); get_Children(mt, nid, ret_obj); res.json(ret_obj); }) app.get('/flushall',(req, res) =>{ redis_flush(); res.json({result:"OK"}); }) app.get('/p2json/:nodeset/:ident',(req, res) =>{ var name = req.params["nodeset"]; var shorty = req.params["ident"]; p2json(name, shorty); res.json({result:"OK"}); }) app.get('/list_projects', (req, res) => { //reacts to requests -> /list_projects const output = execSync("cd .. && cd Projects && ls", { encoding: 'utf-8' }); var out = output.split("\n"); if(out[out.length-1] === ""){ out.splice(-1,1); } console.log("Response: ", out); res.json({result:out}); }) app.get('/list_nodesets', (req, res) => { //reacts to requests -> /list_nodesets const output = execSync("cd .. && cd nodesets && ls", { encoding: 'utf-8' }); var out = output.split("\n"); var result = []; for(let i = 0; i < out.length; i++){ if(out[i].includes(".xml")){ result.push(out[i]); } } console.log("Response: ", result); res.json({result:result}); }) app.get('/new_project', (req, res) => { //reacts to requests -> /new_project?name=myproject const name = req.query.name; //project name const output = execSync("cd .. && cd Projects && ls", { encoding: 'utf-8' }); var out = output.split("\n"); var result = ""; var err = "Error - Project already exists."; for(let i = 0; i < out.length; i++){ if(out[i] === name){ return res.json({result:err}); } } const dir = execSync("cd .. && cd Projects && mkdir "+name, { encoding: 'utf-8' }); var cp = execSync("sudo cp /home/pi/ModelingTool/nodesets/Opc.Ua.NodeSet2.xml /home/pi/ModelingTool/Projects/"+name+"/Opc.Ua.NodeSet2.xml", { encoding: 'utf-8' }); cp = execSync("sudo cp /home/pi/ModelingTool/nodesets/Opc.Ua.NodeSet2.json /home/pi/ModelingTool/Projects/"+name+"/Opc.Ua.NodeSet2.json", { encoding: 'utf-8' }); const cur_dir = execSync("cd .. && cd Projects && cd "+name+" && ls", { encoding: 'utf-8' }); console.log("New Project was created."); res.json({result:cur_dir}); }) app.get('/save_project', (req, res) => { //reacts to requests -> /save_project?name=myproject const name = req.query.name; //project name const output = execSync("sudo cp /var/www/html/root.json /home/pi/ModelingTool/Projects/"+name+"/"+name+".json", { encoding: 'utf-8' }); console.log("Project "+name+" was saved."); res.json({result:"Project saved"}); }) app.get('/load_json', (req, res) => { //reacts to requests -> /load_json?name=myproject const name = req.query.name; //project name var output = execSync("cd .. && cd Projects && ls", { encoding: 'utf-8' }); var out = output.split("\n"); var result = ""; var err = "Error - Project or file not available."; for(let i = 0; i < out.length; i++){ if(out[i] === name){ var output1 = execSync("cd .. && cd Projects && cd "+name+" && ls", { encoding: 'utf-8' }); var out1 = output1.split("\n"); var chk = name+".json" for(let y = 0; y < out1.length; y++){ if(out1[y] === chk){ result = execSync("sudo cp /home/pi/ModelingTool/Projects/"+name+"/"+name+".json /var/www/html/root.json", { encoding: 'utf-8' }); console.log("Project has been loaded."); return res.json({result:"Project loaded"}); } } } } res.json({result:err}); }) app.get('/root', (req, res) => { //reacts to requests -> /root console.log("Return root."); res.json([{id:1,text:"Root node",children:[{id:2,text:"Child node 1",children:true},{id:3,text:"Child node 2"}]}]); }) app.listen(port, () => { console.log("Server listening at http://localhost:", port); })