mirror of
				https://github.com/Ylianst/MeshCentral.git
				synced 2025-03-09 15:40:18 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			180 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			180 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*
 | |
| 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();
 | |
| }
 |