UNPKG

yrexpert-js

Version:

L'interface Web pour votre système expert...

736 lines (634 loc) 24.6 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>JSDoc: Source: lib/yrexpert-js.js</title> <script src="scripts/prettify/prettify.js"> </script> <script src="scripts/prettify/lang-css.js"> </script> <!--[if lt IE 9]> <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css"> <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css"> </head> <body> <div id="main"> <h1 class="page-title">Source: lib/yrexpert-js.js</h1> <section> <article> <pre class="prettyprint source linenums"><code>/* !----------------------------------------------------------------------------! ! ! ! YRexpert : (Your Yrelay) Système Expert sous Mumps GT.M et GNU/Linux ! ! Copyright (C) 2001-2015 by Hamid LOUAKED (HL). ! ! ! !----------------------------------------------------------------------------! */ var build = require('./build'); var sessions = require('ewd-session'); var beatryxRobot = require('./beatryxRobot'); var runRPC = require('yrexpert-rpc/lib/proto/runRPC'); var fs = require('fs'); var os = require('os'); /** * Module yrexpert-js. * @module lib/yrexpert-js */ /** Fonction yrexpert-js. */ module.exports = { /** Initialisation. */ init: function() { var types = [ 'qoper8-stats', 'qoper8-getStats', 'getMasterProcessDetails', 'getWorkerDetails', 'getPoolSize' ]; if (this.dontLog) this.dontLog(types); }, /** Services autorisés. */ servicesAllowed: { 'ewd-react-tools': true }, /** Gestionnaire d'évènemments. */ handlers: { /** * Exécuter le RPC [RPCUSR ETABLIR CONNEXION]. * @constructor * @param {object} messageObj - Message : [ac, vc]. * @param {number} session - Session. * @param {string} send - Send. * @param {object} finished - Message de retour de la fonction. */ loginRpc: function(messageObj, session, send, finished) { if (session.authenticated) { finished({error: 'Vous êtes déjà connectés à yrexpert-js'}); return; } var accessCode = messageObj.params.ac; var verifyCode = messageObj.params.vc; //console.log("-----messageObj.params.ac: " + JSON.stringify(messageObj.params.ac)); //console.log("-----messageObj.params.vc: " + JSON.stringify(messageObj.params.vc)); if (accessCode === '') { finished({error: "Vous devez entrer un code d'accès"}); return; } if (verifyCode === '') { finished({error: 'Vous devez saisir un code de validation'}); return; } if (!this.db.symbolTable) this.db.symbolTable = sessions.symbolTable(this.db); var params = { rpcName: 'RPCUSR ETABLIR CONNEXION' }; // N'enregistrez pas encore la table des symboles! var response = runRPC.call(this, params, session, false); //console.log("-----response: " + JSON.stringify(response)); params = { rpcName: 'RPCUSR VERIFIER CODE', rpcArgs: [{ type: 'LITERAL', value: accessCode + ';' + verifyCode }] }; var response = runRPC.call(this, params, session, false); console.log('login response: ' + JSON.stringify(response)); var values = response.value; var duz = values[0]; var err = values[3]; //console.log("-----err: " + JSON.stringify(err)); if (duz.toString() === '0' &amp;&amp; err !== '') { finished({error: err}); } else { // Connecté avec succès // Enregistrer la table des symboles à la session ... ok = this.db.symbolTable.save(session); // Nettoyer le processus de back-end Cache / GT.M: ok = this.db.symbolTable.clear(); // ** important ! Signaler l'utilisateur comme authentifié pour empêcher l'accès non autorisé aux RPC par un utilisateur avant de se connecter session.authenticated = true; // Réponse de retour var greeting = values[7]; var pieces = greeting.split(' '); pieces = pieces.splice(2, pieces.length); var displayName = pieces.join(' '); var results = { displayName: displayName, greeting: greeting, lastSignon: values[8], messages: values.splice(8, values.length) }; // Notez que nous ne renvoyons pas le DUZ! //finished(results); session.timeout = 20 * 60; session.authenticated = true; finished({ok: true}); } }, getToken: function(messageObj, session, send, finished) { //console.log("-----getToken: " + JSON.stringify(messageObj)); finished(messageObj); }, /** * Exécuter le RPC [RPCBDD EXECUTER COMMANDE SET]. * @constructor * @param {object} messageObj - Message : [qui, rep, ind, att, val, ice]. * @param {number} session - Session. * @param {string} send - Send. * @param {object} finished - Message de retour de la fonction. */ setRPCBDDC: function(messageObj, session, send, finished) { var partition = messageObj.params.qui; var repertoire = messageObj.params.rep; var individu = messageObj.params.ind; var attribut = messageObj.params.att; var valeur = messageObj.params.val; var indice = messageObj.params.ice; //console.log("-----messageObj.params.qui: " + JSON.stringify(messageObj.params.qui)); //console.log("-----messageObj.params.rep: " + JSON.stringify(messageObj.params.rep)); if (partition === '') { finished({error: "Vous devez indiquer le nom d'une base de données (partition utilisateur)"}); return; } if (repertoire === '') { finished({error: "Vous devez indiquer le non d'un répertoire (repertoire)"}); return; } if (individu === '') { finished({error: "Vous devez indiquer le nom d'un individu (individu)"}); return; } if (attribut === '') { finished({error: "Vous devez indiquer le nom d'un attribut (attribut)"}); return; } if (valeur === '') { finished({error: "Vous devez indiquer une valeur pour l'attribut (valeur)"}); return; } if (indice === '') { finished({error: "Vous devez indiquer un indice pour l'attribut (indice)"}); return; } if (!this.db.symbolTable) this.db.symbolTable = sessions.symbolTable(this.db); params = { rpcName: 'RPCBDD EXECUTER COMMANDE SET', rpcArgs: [ {type: 'LITERAL', value: partition}, {type: 'LITERAL', value: repertoire}, {type: 'LITERAL', value: individu}, {type: 'LITERAL', value: attribut}, {type: 'LITERAL', value: valeur}, {type: 'LITERAL', value: indice} ], }; var response = runRPC.call(this, params, session, false); var value = response.value; //console.log("-----value: " + JSON.stringify(value)); if (value !== 1) { finished({error: value}); } else { // Attribut mofifié avec succès // Enregistrer la table des symboles à la session ... ok = this.db.symbolTable.save(session); // Nettoyer le processus de back-end Cache / GT.M: ok = this.db.symbolTable.clear(); // Réponse de retour var message = value; var results = { message: message }; finished({ok: true}); } }, /** * Exécuter le RPC [RPCBDD EXECUTER COMMANDE READ]. * @constructor * @param {object} messageObj - Message : [qui, rep, ind, att, ice]. * @param {number} session - Session. * @param {string} send - Send. * @param {object} finished - Message de retour de la fonction. */ readRPCBDDC: function(messageObj, session, send, finished) { var partition = messageObj.params.qui; var repertoire = messageObj.params.rep; var individu = messageObj.params.ind; var attribut = messageObj.params.att; var indice = messageObj.params.ice; //console.log("-----messageObj.params.qui: " + JSON.stringify(messageObj.params.qui)); //console.log("-----messageObj.params.rep: " + JSON.stringify(messageObj.params.rep)); if (partition === '') { finished({error: "Vous devez indiquer le nom d'une base de données (partition utilisateur)"}); return; } if (repertoire === '') { finished({error: "Vous devez indiquer le non d'un répertoire (repertoire)"}); return; } if (individu === '') { finished({error: "Vous devez indiquer le nom d'un individu (individu)"}); return; } if (attribut === '') { finished({error: "Vous devez indiquer le nom d'un attribut (attribut)"}); return; } if (indice === '') { finished({error: "Vous devez indiquer un indice pour l'attribut (indice)"}); return; } if (!this.db.symbolTable) this.db.symbolTable = sessions.symbolTable(this.db); params = { rpcName: 'RPCBDD EXECUTER COMMANDE READ', rpcArgs: [ {type: 'LITERAL', value: partition}, {type: 'LITERAL', value: repertoire}, {type: 'LITERAL', value: individu}, {type: 'LITERAL', value: attribut}, {type: 'LITERAL', value: indice} ], }; var response = runRPC.call(this, params, session, false); console.log("-----response: " + JSON.stringify(response)); if (response.value === undefined) { finished({error: "Aucune valeur trouvée pour " + partition + " " + repertoire + " " + individu + " " + attribut + " " + indice}); } else { // Attribut mofifié avec succès // Enregistrer la table des symboles à la session ... ok = this.db.symbolTable.save(session); // Nettoyer le processus de back-end Cache / GT.M: ok = this.db.symbolTable.clear(); // Réponse de retour finished({value: response.value}); } }, /** * Se déplacer sur une partition. * @constructor * @param {object} messageObj - Message. * @param {number} session - Session. * @param {string} send - Send. * @param {object} finished - Message de retour de la fonction. */ cdNameSpace: function(messageObj, session, send, finished) { var fn = {}; var path = '/home/' + process.env['instance'] + '/partitions/' + messageObj.params.namespace.toLowerCase() + '/globals/'; if (messageObj.params.namespace != '') { if (fs.existsSync(path + messageObj.params.namespace.toUpperCase() + '.gld')) { var fn = this.db.function({function: 'ZGBLDIR^%GTM', arguments: [messageObj.params.namespace.toUpperCase()]}); } } finished(fn); }, /** * Obtenir la liste des noms des partitions installées. * @constructor * @param {object} messageObj - Message. * @param {number} session - Session. * @param {string} send - Send. * @param {object} finished - Liste des noms des partitions installées sous la forme ["DMO", "YXP"]. */ getNameSpace: function(messageObj, session, send, finished) { var path = '/home/' + process.env['instance'] + '/partitions/'; fs.readdir(path, function(err, items) { if (err) { finished(err); } finished(items); }); }, getQui: function(messageObj, session, send, finished) { var node = { global: 'QUI', subscripts: [] }; var result = this.db.get(node); //console.log("-----getQui: " + JSON.stringify(result)); finished({qui: result.data}); }, setQui: function(messageObj, session, send, finished) { if (messageObj.params.partition &amp;&amp; messageObj.params.partition !== '') { var node = { global: 'QUI', subscripts: [], data: messageObj.params.partition }; var result = this.db.set(node); //console.log("-----setQui: " + JSON.stringify(result.data)); finished({ok: true}); } else { finished({error: 'Partition non valide'}); } }, /* A supprimer */ login: function(messageObj, session, send, finished) { if (messageObj.params.password === this.userDefined.config.managementPassword) { session.timeout = 20 * 60; session.authenticated = true; finished({ok: true}); } else { finished({error: 'Invalid login attempt'}); } return; }, getServerName: function(messageObj, session, send, finished) { var serverName = ''; if (this.userDefined.config &amp;&amp; this.userDefined.config.serverName) serverName = this.userDefined.config.serverName; finished({serverName: serverName}); }, getBuildDetails: function(messageObj, session, send, finished) { var node = { global: 'INCONNE', subscripts: ['VERSION'] }; var rep = this.db.get(node); if (session.authenticated) { var buildDetails = { nodejsBuild: process.version, dbInterface: this.db.version(), qoper8Build: this.build, docStoreBuild: this.documentStore.build, xpressBuild: this.xpress.build, yrexpertmVersion: rep.data, yrexpertjsBuild: build }; //console.log("-----buildDetails: " + JSON.stringify(buildDetails)); if (this.userDefined.config &amp;&amp; this.userDefined.config.qxBuild) buildDetails.qxBuild = this.userDefined.config.qxBuild; finished(buildDetails); } else { finished({error: 'Non authentifié'}); } }, getMasterProcessDetails: function(messageObj, session, send, finished) { if (session.authenticated) { //var details = {}; //if (this.userDefined.config &amp;&amp; this.userDefined.config.masterProcessPid) details.pid = this.userDefined.config.masterProcessPid; //finished(details); finished({ok: true}); } else { finished({error: 'Non authentifié'}); } }, stopMasterProcess: function(messageObj, session, send, finished) { if (session.authenticated) { send({displayButton: true}); finished({closeSocket: true}); } else { finished({error: 'Non authentifié'}); } }, getWorkerDetails: function(messageObj, session, send, finished) { if (session.authenticated) { finished({ok: true}); } else { finished({error: 'Non authentifié'}); } }, stopWorkerProcess: function(messageObj, session, send, finished) { finished({pid: messageObj.params.pid}); }, setPoolSize: function(messageObj, session, send, finished) { finished({poolSize: messageObj.params.poolSize}); }, getPoolSize: function(messageObj, session, send, finished) { finished({ok: true}); }, getGlobalDirectory: function(messageObj, session, send, finished) { var dir = this.db.global_directory(); finished(dir); }, getNextSubscripts: function(messageObj, session, send, finished) { var subscripts = messageObj.params.path.split('.'); var global = subscripts.shift(); var glo = new this.documentStore.DocumentNode(global, subscripts); var data = {}; glo.forEachChild(function(name, node) { if (node.hasChildren) { data[name] = messageObj.params.expandText } else data[name] = node.value; }); finished(data); }, getSessions: function(messageObj, session, send, finished) { var activeSessions = this.sessions.active(); var sessions = []; var disabled; activeSessions.forEach(function(ewdSession) { disabled = false; if (ewdSession.id.toString() === session.id.toString()) disabled = true; sessions.push({ id: ewdSession.id, token: ewdSession.token, application: ewdSession.application, expiry: ewdSession.expiryTime, disabled: disabled }); }); finished(sessions); }, stopSession: function(messageObj, session, send, finished) { var ewdSession = this.sessions.byToken(messageObj.params.token); if (ewdSession) ewdSession.delete(); finished({ok: true}); }, showSession: function(messageObj, session, send, finished) { var token = messageObj.params.token; var ewdSession = this.sessions.byToken(token); if (ewdSession) { var data = {}; var expandText = ' -->'; ewdSession.data.forEachChild(function(name, childNode) { data[name] = expandText; if (childNode.hasValue) data[name] = childNode.value; if (name === 'ewd_symbolTable') data[name] = 'Données de table de symboles mumps'; }); finished({ token: token, id: ewdSession.id, data: data }); } else { finished({ token: token, error: 'La session n existe plus' }); } }, getSessionSubscripts: function(messageObj, session, send, finished) { var subs = messageObj.params.path.split('.'); var token = messageObj.params.token; var ewdSession = this.sessions.byToken(token); if (ewdSession) { var documentName = ewdSession.documentName; var subscripts = ewdSession.data._node.subscripts.concat(subs); var doc = new this.documentStore.DocumentNode(documentName, subscripts); var data = {}; doc.forEachChild(function(name, childNode) { data[name] = messageObj.params.expandText; if (childNode.hasValue) data[name] = childNode.value; }); finished({ data: data }); } else { finished({error: 'La session n existe plus'}); } }, getBeatryxRobot: function(messageObj, beatryx, send, finished) { console.log("-----this.beatryxRobot: " + JSON.stringify(this.beatryxRobot)); var beatryxRobot = []; beatryxRobot.push({ id: 123456789, token: "ewdSession.token", application: "Raison sociale", expiry: "31/12/2017", disabled: true }); finished(beatryxRobot); /** console.log("-----messageObj: " + JSON.stringify(messageObj)); console.log("-----beatryx: " + JSON.stringify(beatryx)); console.log("-----this.beatryxRobot: " + JSON.stringify(this.beatryxRobot)); console.log("-----this.beatryxRobot.active(): " + JSON.stringify(this.beatryxRobot.active())); var activeBeatryxRobot = this.beatryxRobot.active(); var beatryxRobot = []; var disabled; activeBeatryxRobot.forEach(function(ewdSession) { disabled = false; if (ewdSession.id.toString() === session.id.toString()) disabled = true; beatryxRobot.push({ id: ewdSession.id, token: ewdSession.token, application: ewdSession.application, expiry: ewdSession.expiryTime, disabled: disabled }); }); finished(beatryxRobot); */ }, stopBeatryx: function(messageObj, beatryx, send, finished) { var ewdSession = this.beatryxRobot.byToken(messageObj.params.token); if (ewdSession) ewdSession.delete(); finished({ok: true}); }, showBeatryx: function(messageObj, beatryx, send, finished) { var token = messageObj.params.token; var ewdSession = this.beatryxRobot.byToken(token); if (ewdSession) { var data = {}; var expandText = ' -->'; ewdSession.data.forEachChild(function(name, childNode) { data[name] = expandText; if (childNode.hasValue) data[name] = childNode.value; if (name === 'ewd_symbolTable') data[name] = 'Données de table de symboles mumps'; }); finished({ token: token, id: ewdSession.id, data: data }); } else { finished({ token: token, error: 'La session n existe plus' }); } }, getBeatryxSubscripts: function(messageObj, beatryx, send, finished) { var subs = messageObj.params.path.split('.'); var token = messageObj.params.token; var ewdSession = this.beatryxRobot.byToken(token); if (ewdSession) { var documentName = ewdSession.documentName; var subscripts = ewdSession.data._node.subscripts.concat(subs); var doc = new this.documentStore.DocumentNode(documentName, subscripts); var data = {}; doc.forEachChild(function(name, childNode) { data[name] = messageObj.params.expandText; if (childNode.hasValue) data[name] = childNode.value; }); finished({ data: data }); } else { finished({error: 'La session n existe plus'}); } } }, workerResponseHandlers: { // Permettre l'interception par le processus maître d'augmenter/traiter la demande après l'authentification dans le worker getMasterProcessDetails: function(message) { var stats = this.getStats(); return { pid: process.pid, startTime: new Date(this.startTime).toLocaleString(), upTime: stats.uptime, memory: stats.memory } }, getWorkerDetails: function(message, send) { // utiliser la fonction de gestionnaire spécial pour obtenir des statistiques pour master et les workers var that = this; this.handleStats(function(messageObj) { var resultObj = { type: 'getWorkerDetails', results: messageObj.worker }; send(resultObj); }); return; }, stopMasterProcess: function(message) { if (message.displayButton) return message ; // retarder légèrement pour permettre l'envoi de la réponse au navigateur var that = this; setTimeout(function() { that.stop(); }, 2000); //return {disconnect: true, error: 'EWD AppRunner a été arrêté'}; return {ok: true}; }, stopWorkerProcess: function(message) { this.stopWorker(message.pid); return {pid: message.pid}; }, getPoolSize: function(message) { return {poolSize: this.worker.poolSize}; }, setPoolSize: function(message) { this.setWorkerPoolSize(message.poolSize); return {ok: true}; } } }; </code></pre> </article> </section> </div> <nav> <h2><a href="index.html">Home</a></h2><h3>Modules</h3><ul><li><a href="module-lib_yrexpert-js.html">lib/yrexpert-js</a></li></ul><h3>Classes</h3><ul><li><a href="module-lib_yrexpert-js.handlers.cdNameSpace.html">cdNameSpace</a></li><li><a href="module-lib_yrexpert-js.handlers.getNameSpace.html">getNameSpace</a></li><li><a href="module-lib_yrexpert-js.handlers.loginRpc.html">loginRpc</a></li><li><a href="module-lib_yrexpert-js.handlers.readRPCBDDC.html">readRPCBDDC</a></li><li><a href="module-lib_yrexpert-js.handlers.setRPCBDDC.html">setRPCBDDC</a></li></ul> </nav> <br class="clear"> <footer> Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Thu Aug 09 2018 21:05:19 GMT+0200 (CEST) </footer> <script> prettyPrint(); </script> <script src="scripts/linenumber.js"> </script> </body> </html>