| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- /*
- Copyright 2018-2021 Intel Corporation
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- */
- var obj = { meshCoreInfo: 'TinyCore v1' };
- var mesh = null;
- // Replace a string with a number if the string is an exact number
- function toNumberIfNumber(x) { if ((typeof x == 'string') && (+parseInt(x) === x)) { x = parseInt(x); } return x; }
- // Split a string taking into account the quoats. Used for command line parsing
- function splitArgs(str)
- {
- var myArray = [], myRegexp = /[^\s"]+|"([^"]*)"/gi;
- do { var match = myRegexp.exec(str); if (match != null) { myArray.push(match[1] ? match[1] : match[0]); } } while (match != null);
- return myArray;
- }
- // Parse arguments string array into an object
- function parseArgs(argv)
- {
- var results = { '_': [] }, current = null;
- for (var i = 1, len = argv.length; i < len; i++)
- {
- var x = argv[i];
- if (x.length > 2 && x[0] == '-' && x[1] == '-')
- {
- if (current != null) { results[current] = true; }
- current = x.substring(2);
- } else
- {
- if (current != null) { results[current] = toNumberIfNumber(x); current = null; } else { results['_'].push(toNumberIfNumber(x)); }
- }
- }
- if (current != null) { results[current] = true; }
- return results;
- }
- function sendConsoleText(msg, sessionid)
- {
- try
- {
- if (sessionid != null)
- {
- require('MeshAgent').SendCommand({ action: 'msg', type: 'console', value: msg, sessionid: sessionid });
- }
- else
- {
- require('MeshAgent').SendCommand({ action: 'msg', type: 'console', value: msg });
- }
- }
- catch(e)
- {
- }
- }
- function processConsoleCommand(cmd, args, rights, sessionid)
- {
- try
- {
- var response = null;
- switch (cmd)
- {
- case 'help':
- response = "Available commands are: eval, osinfo, setdebug, versions.";
- break;
- case 'versions':
- response = JSON.stringify(process.versions, null, ' ');
- break;
- case 'eval':
- { // Eval JavaScript
- if (args['_'].length < 1)
- {
- response = 'Proper usage: eval "JavaScript code"'; // Display correct command usage
- } else
- {
- response = JSON.stringify(require('MeshAgent').eval(args['_'][0])); // This can only be run by trusted administrator.
- }
- break;
- }
- case 'setdebug':
- {
- if (args['_'].length < 1) { response = 'Proper usage: setdebug (target), 0 = Disabled, 1 = StdOut, 2 = This Console, * = All Consoles, 4 = WebLog, 8 = Logfile'; } // Display usage
- else { if (args['_'][0] == '*') { console.setDestination(2); } else { console.setDestination(parseInt(args['_'][0]), sessionid); } }
- break;
- }
- case 'osinfo': { // Return the operating system information
- var i = 1;
- if (args['_'].length > 0) { i = parseInt(args['_'][0]); if (i > 8) { i = 8; } response = 'Calling ' + i + ' times.'; }
- for (var j = 0; j < i; j++)
- {
- var pr = require('os').name();
- pr.sessionid = sessionid;
- pr.then(function (v)
- {
- sendConsoleText("OS: " + v, this.sessionid);
- });
- }
- break;
- }
- default: { // This is an unknown command, return an error message
- response = 'Unknown command \"' + cmd + '\", type \"help\" for list of available commands.';
- break;
- }
- }
- } catch (e) { response = "Command returned an exception error: " + e; console.log(e); }
- if (response != null) { sendConsoleText(response, sessionid); }
- }
- // Handle a mesh agent command
- function handleServerCommand(data)
- {
- if ((typeof data == 'object') && (data.action == 'msg') && (data.type == 'console') && data.value && data.sessionid)
- {
- if (data.value && data.sessionid)
- {
- try
- {
- var args = splitArgs(data.value);
- processConsoleCommand(args[0].toLowerCase(), parseArgs(args), data.rights, data.sessionid);
- }
- catch(e)
- {
- sendConsoleText(e);
- }
- }
- }
- else
- {
- console.log(JSON.stringify(data, null, 1));
- }
- }
- // Called when the server connection state changes
- function handleServerConnection(state)
- {
- if (state == 1) { mesh.SendCommand({ "action": "coreinfo", "value": obj.meshCoreInfo }); } // Server connected, send mesh core information
- }
- obj.start = function ()
- {
- // Hook up mesh agent events
- mesh.AddCommandHandler(handleServerCommand);
- mesh.AddConnectHandler(handleServerConnection);
- mesh.SendCommand({ action: 'coreinfo', value: "TinyCore", caps: 0 });
- }
- obj.stop = function ()
- {
- mesh.AddCommandHandler(null);
- mesh.AddConnectHandler(null);
- }
- var xexports = null;
- try { xexports = module.exports; } catch (e) { }
- if (xexports != null)
- {
- // If we are running within NodeJS, export the core
- module.exports.createMeshCore = function (agent) { mesh = agent.getMeshApi(); return (obj); };
- }
- else
- {
- // If we are not running in NodeJS, launch the core
- sendConsoleText('TinyCore Started...');
- mesh = require('MeshAgent');
- obj.start();
- }
|