mirror of
				https://github.com/Ylianst/MeshCentral.git
				synced 2025-03-09 15:40:18 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			206 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			206 lines
		
	
	
	
		
			6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*
 | |
| Copyright 2019 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.
 | |
| */
 | |
| 
 | |
| require('MeshAgent').on('Connected', function (status)
 | |
| {
 | |
|     if (status == 0)
 | |
|     {
 | |
|         return;
 | |
|     }
 | |
|     this.timeout = setTimeout(start, 10000);
 | |
| });
 | |
| 
 | |
| 
 | |
| 
 | |
| function sendServerLog(msg)
 | |
| {
 | |
|     require('MeshAgent').SendCommand({ action: 'diagnostic', value: { command: 'log', value: msg } });
 | |
| }
 | |
| function getMeshAgentService()
 | |
| {
 | |
|     try
 | |
|     {
 | |
|         var ret = require('service-manager').manager.getService(process.platform == 'win32' ? 'mesh agent' : 'meshagent');
 | |
|         return(ret);
 | |
|     }
 | |
|     catch(e)
 | |
|     {
 | |
|         return (null);
 | |
|     }
 | |
| }
 | |
| 
 | |
| function getARCHID() {
 | |
|     var ret = 0;
 | |
|     switch (process.platform) {
 | |
|         case 'linux':
 | |
|             // Need to detect Architecture ID
 | |
|             var child = require('child_process').execFile('/bin/sh', ['sh']);
 | |
|             child.stdout.str = '';
 | |
|             child.stdout.on('data', function (chunk) { this.str += chunk.toString(); });
 | |
|             child.stdin.write("uname -m\nexit\n");
 | |
|             child.waitExit();
 | |
|             switch (child.stdout.str.trim()) {
 | |
|                 case 'x86_64':
 | |
|                 case 'amd64':
 | |
|                     ret = 6;
 | |
|                     break;
 | |
|                 case 'x86':
 | |
|                 case 'i686':
 | |
|                 case 'i586':
 | |
|                 case 'i386':
 | |
|                     ret = 5;
 | |
|                     break;
 | |
|                 case 'armv6l':
 | |
|                 case 'armv7l':
 | |
|                     ret = 25;
 | |
|                     break;
 | |
|                 default:
 | |
|                     break;
 | |
|             }
 | |
|             break;
 | |
|         case 'darwin':
 | |
|             ret = 16;
 | |
|             break;
 | |
|         case 'win32':
 | |
|             ret = process.arch == 'x64' ? 4 : 3;
 | |
|             break;
 | |
|     }
 | |
|     return (ret);
 | |
| }
 | |
| 
 | |
| function DownloadAgentBinary(path, ID)
 | |
| {
 | |
|     var options = require('http').parseUri(require('MeshAgent').ServerInfo.ServerUri);
 | |
|     var downloadUri = 'https://' + options.host + ':' + options.port + '/meshagents?id=' + (ID != null ? ID : getARCHID());
 | |
|     sendServerLog('Diagnostic: Attempting to downlod agent from: ' + downloadUri);
 | |
| 
 | |
|     return (wget(downloadUri, path, { rejectUnauthorized: false }));
 | |
| }
 | |
| 
 | |
| function giveup()
 | |
| {
 | |
|     sendServerLog('Diagnostic: Unable to diagnose Mesh Agent');
 | |
|     finished();
 | |
| }
 | |
| function finished()
 | |
| {
 | |
|     sendServerLog('Diagnostic: End');
 | |
|     require('service-manager').manager.getService('meshagentDiagnostic').stop();
 | |
| }
 | |
| 
 | |
| function ConfigureAgent(agent)
 | |
| {
 | |
|     sendServerLog('...Configuring Agent...');
 | |
|     var info = require('MeshAgent').ServerInfo;
 | |
| 
 | |
|     var msh = 'MeshID=0x' + info.MeshID + '\n' + 'ServerID=' + info.ServerID + '\n' + 'MeshServer=' + info.ServerUri + '\n';
 | |
|     var cfg = require('global-tunnel').proxyConfig;
 | |
|     if(cfg == null)
 | |
|     {
 | |
|         msh += 'ignoreProxyFile=1\n';
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|         msh += ('WebProxy=' + cfg.host + ':' + cfg.port + '\n');
 | |
|     }
 | |
|     if(process.platform == 'win32')
 | |
|     {
 | |
|         require('fs').writeFileSync(agent.appLocation().replace('.exe', '.msh'), msh);
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|         require('fs').writeFileSync(agent.appLocation() + '.msh', msh);
 | |
|     }
 | |
| }
 | |
| 
 | |
| function start()
 | |
| {
 | |
|     sendServerLog('Diagnostic: Start');
 | |
| 
 | |
|     var id = getARCHID();
 | |
|     var s = getMeshAgentService();
 | |
|     if (s == null)
 | |
|     {
 | |
|         DownloadAgentBinary('agent_temporary.bin').then(function ()
 | |
|         {
 | |
|             // SUCCESS
 | |
|             try
 | |
|             {
 | |
|                 var agent = require('service-manager').manager.installService(
 | |
|                     {
 | |
|                         name: process.platform == 'win32' ? 'Mesh Agent' : 'meshagent',
 | |
|                         target: 'meshagent',
 | |
|                         description: 'Mesh Central Agent v2 Background Service',
 | |
|                         displayName: 'Mesh Agent v2 Background Service',
 | |
|                         servicePath: 'agent_temporary.bin',
 | |
|                         startType: 'DEMAND_START'
 | |
|                     });
 | |
|                 require('fs').unlinkSync('agent_temporary.bin');
 | |
|                 ConfigureAgent(agent);
 | |
|             }
 | |
|             catch(e)
 | |
|             {
 | |
|                 giveup();
 | |
|             }
 | |
|         },
 | |
|         function ()
 | |
|         {
 | |
|             // FAILURE
 | |
|             giveup();
 | |
|         });
 | |
|     }
 | |
|     if(s!=null)
 | |
|     {
 | |
|         // Mesh Agent Installation Found
 | |
|         sendServerLog('Diagnostic: Mesh Agent Service => ' + (s.isRunning() ? 'RUNNING' : 'NOT-RUNNING'));
 | |
|         if(s.isRunning())
 | |
|         {
 | |
|             finished();
 | |
|         }
 | |
|         else
 | |
|         {
 | |
|             sendServerLog('Diagnostic: Attempting to start Mesh Agent');
 | |
|             s.start();
 | |
|             sendServerLog('Diagnostic: ' + (s.isRunning() ? '(SUCCESS)' : '(FAILED)'));
 | |
|             if (s.isRunning())
 | |
|             {
 | |
|                 finished();
 | |
|                 return;
 | |
|             }
 | |
|             else
 | |
|             {
 | |
|                 DownloadAgentBinary(s.appLocation()).then(
 | |
|                     function () {
 | |
|                         sendServerLog('Diagnostic: Downloaded Successfully');
 | |
|                         sendServerLog('Diagnostic: Attempting to start Mesh Agent');
 | |
|                         s.start();
 | |
|                         sendServerLog('Diagnostic: ' + (s.isRunning() ? '(SUCCESS)' : '(FAILED)'));
 | |
|                         if (s.isRunning()) {
 | |
|                             finished();
 | |
|                             return;
 | |
|                         }
 | |
|                         else {
 | |
|                             giveup();
 | |
|                         }
 | |
|                     },
 | |
|                     function () {
 | |
|                         sendServerLog('Diagnostic: Download Failed');
 | |
|                         giveup();
 | |
|                     });
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| };
 |