From b51763798167d6a9e95c520a3680f2119b2390d4 Mon Sep 17 00:00:00 2001 From: Bryan Roe Date: Tue, 28 Jun 2022 13:01:56 -0700 Subject: [PATCH] Fixed 2 issues causing Agent Update to fail on very old agents 1. Added null check on callback, because old agents may return null 2. if needStreamFix was set on an old agent, and hash check fails, added retry without fix, as the fix was not needed on some very old agents. 3. Updated retry timeout to 20 seconds instead of 60 seconds --- agents/recoverycore.js | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/agents/recoverycore.js b/agents/recoverycore.js index c0bbfc66..0f4341fb 100644 --- a/agents/recoverycore.js +++ b/agents/recoverycore.js @@ -7,7 +7,6 @@ var tunnels = {}; var fs = require('fs'); var needStreamFix = (new Date(process.versions.meshAgent) < new Date('2020-01-21 13:27:45.000-08:00')); - try { Object.defineProperty(Array.prototype, 'find', { @@ -553,15 +552,15 @@ function agentUpdate_Start(updateurl, updateoptions) { if (process.platform == 'win32') { // Special Processing for Temporary/Console Mode Agents on Windows - var parms = windows_getCommandLine(); - if (parms.findIndex(function (val) { return (val.toUpperCase() == 'RUN' || val.toUpperCase() == 'CONNECT');})>=0) + var parms = windows_getCommandLine(); // This uses FFI to fetch the command line parameters that the agent was started with + if (parms.findIndex(function (val) { return (val != null && (val.toUpperCase() == 'RUN' || val.toUpperCase() == 'CONNECT')); }) >= 0) { // This is a Temporary/Console Mode Agent sendConsoleText('This is a temporary/console agent, checking for conflicts with background services...'); // Check to see if our binary conflicts with an installed agent var agents = _getPotentialServiceNames(); - if(_getPotentialServiceNames().length>0) + if (_getPotentialServiceNames().length > 0) { sendConsoleText('Self update cannot continue because the installed agent (' + agents[0] + ') conflicts with the currently running Temp/Console agent...', sessionid); return; @@ -648,11 +647,25 @@ function agentUpdate_Start(updateurl, updateoptions) { sendAgentMessage('Self Update FAILED because the downloaded agent FAILED hash check (' + agentUpdate_Start._retryCount + '), URL: ' + updateurl, 3); agentUpdate_Start._selfupdate = null; + try + { + // We are clearing these two properties, becuase some older agents may not cleanup correctly causing problems with the retry + require('https').globalAgent.sockets = {}; + require('https').globalAgent.requests = {}; + } + catch(z) + {} + if (needStreamFix) + { + sendConsoleText('This is an older agent that may have an httpstream bug. On next retry will try to fetch the update differently...'); + needStreamFix = false; + } + if (agentUpdate_Start._retryCount < 4) { // Retry the download again - sendConsoleText('Self Update will try again in 60 seconds...', sessionid); - agentUpdate_Start._timeout = setTimeout(agentUpdate_Start, 60000, updateurl, updateoptions); + sendConsoleText('Self Update will try again in 20 seconds...', sessionid); + agentUpdate_Start._timeout = setTimeout(agentUpdate_Start, 20000, updateurl, updateoptions); } else { @@ -900,7 +913,8 @@ function onTunnelControlData(data, ws) { } -require('MeshAgent').AddCommandHandler(function (data) { +require('MeshAgent').AddCommandHandler(function (data) +{ if (typeof data == 'object') { // If this is a console command, parse it and call the console handler switch (data.action) {