From ec6ec7511e5f2a1a5fd16bb47fdea11ec7693656 Mon Sep 17 00:00:00 2001 From: Zhihe Li Date: Tue, 16 Jul 2024 17:51:16 -0400 Subject: [PATCH] =?UTF-8?q?refactor:=20=F0=9F=92=A1=20Remove=20stack=20tra?= =?UTF-8?q?ces=20and=20add=20logs=20for=20version=20info=20(#2391)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../addon/handlers/cache-daemon-handler.js | 7 +++-- .../app/routes/scopes/scope/projects.js | 4 +-- .../scopes/scope/projects/sessions/session.js | 2 +- .../scopes/scope/projects/targets/index.js | 2 +- .../electron-app/src/helpers/app-updater.js | 2 +- .../src/helpers/request-promise.js | 4 +-- ui/desktop/electron-app/src/index.js | 13 +++++++- ui/desktop/electron-app/src/ipc/handlers.js | 7 ++++- .../src/services/cache-daemon-manager.js | 31 +++++++++---------- .../services/client-agent-daemon-manager.js | 3 ++ .../src/utils/generateErrorPromise.js | 5 +-- ui/desktop/electron-app/src/utils/jsonify.js | 1 - 12 files changed, 51 insertions(+), 30 deletions(-) diff --git a/addons/api/addon/handlers/cache-daemon-handler.js b/addons/api/addon/handlers/cache-daemon-handler.js index 3817aba4c..792b0160a 100644 --- a/addons/api/addon/handlers/cache-daemon-handler.js +++ b/addons/api/addon/handlers/cache-daemon-handler.js @@ -123,12 +123,15 @@ export default class CacheDaemonHandler { ); } catch (err) { // If it fails again just fall back to fetching controller data - __electronLog?.error('Failed to add token to daemons', err); + __electronLog?.error( + 'Failed to add token to daemons', + err.message, + ); } } else { __electronLog?.error( 'Failed to search cache daemon; falling back to search controller', - e, + e.message, ); return fetchControllerData(context, next); diff --git a/ui/desktop/app/routes/scopes/scope/projects.js b/ui/desktop/app/routes/scopes/scope/projects.js index d87618351..2d37e18a3 100644 --- a/ui/desktop/app/routes/scopes/scope/projects.js +++ b/ui/desktop/app/routes/scopes/scope/projects.js @@ -100,12 +100,12 @@ export default class ScopesScopeProjectsRoute extends Route { __electronLog?.info('Starting polling of new sessions again'); return; } catch (e) { - __electronLog?.error('Failed to add token to daemons', e); + __electronLog?.error('Failed to add token to daemons', e.message); // If it fails again, just let the poller be killed } } - __electronLog?.error('Failed to get new Sessions', e); + __electronLog?.error('Failed to get new Sessions', e.message); if (this.job) { this.flashMessages.danger( this.intl.t('errors.client-agent-failed.sessions'), diff --git a/ui/desktop/app/routes/scopes/scope/projects/sessions/session.js b/ui/desktop/app/routes/scopes/scope/projects/sessions/session.js index ca8b85f2b..2fe6171ef 100644 --- a/ui/desktop/app/routes/scopes/scope/projects/sessions/session.js +++ b/ui/desktop/app/routes/scopes/scope/projects/sessions/session.js @@ -41,7 +41,7 @@ export default class ScopesScopeProjectsSessionsSessionRoute extends Route { } catch (e) { __electronLog?.error( 'Failed to fetch credentials from client agent', - e, + e.message, ); this.flashMessages.danger( diff --git a/ui/desktop/app/routes/scopes/scope/projects/targets/index.js b/ui/desktop/app/routes/scopes/scope/projects/targets/index.js index 6557ee06a..8b1993137 100644 --- a/ui/desktop/app/routes/scopes/scope/projects/targets/index.js +++ b/ui/desktop/app/routes/scopes/scope/projects/targets/index.js @@ -136,7 +136,7 @@ export default class ScopesScopeProjectsTargetsIndexRoute extends Route { try { await aliasPromise; } catch (e) { - __electronLog?.warn('Could not retrieve aliases for targets', e); + __electronLog?.warn('Could not retrieve aliases for targets', e.message); // Separately await and catch the error here so we can continue loading // the page in case the controller doesn't support aliases yet } diff --git a/ui/desktop/electron-app/src/helpers/app-updater.js b/ui/desktop/electron-app/src/helpers/app-updater.js index 450a3a77e..de508d80d 100644 --- a/ui/desktop/electron-app/src/helpers/app-updater.js +++ b/ui/desktop/electron-app/src/helpers/app-updater.js @@ -33,7 +33,7 @@ const returnArchitectureToUpdate = () => { return 'arm64'; } } catch (err) { - log.error(`returnArchitectureToUpdate: ${err}`); + log.error(`returnArchitectureToUpdate:`, err.message); } return nodeArchitecture; }; diff --git a/ui/desktop/electron-app/src/helpers/request-promise.js b/ui/desktop/electron-app/src/helpers/request-promise.js index cbb7f7508..65041bde6 100644 --- a/ui/desktop/electron-app/src/helpers/request-promise.js +++ b/ui/desktop/electron-app/src/helpers/request-promise.js @@ -60,7 +60,7 @@ const unixSocketRequest = (options, reqBody) => if (statusCode < 200 || statusCode >= 400) { reject({ statusCode, - ...parsedResponse, + message: parsedResponse?.api_error ?? parsedResponse?.error, }); } @@ -71,7 +71,7 @@ const unixSocketRequest = (options, reqBody) => path: options.path, socketPath: options.socketPath, })}):`, - e, + e.message, ); reject(e); diff --git a/ui/desktop/electron-app/src/index.js b/ui/desktop/electron-app/src/index.js index d9112ff55..dbcaf1a98 100644 --- a/ui/desktop/electron-app/src/index.js +++ b/ui/desktop/electron-app/src/index.js @@ -33,6 +33,8 @@ const menu = require('./config/menu.js'); const appUpdater = require('./helpers/app-updater.js'); const { isMac, isLinux, isWindows } = require('./helpers/platform.js'); const fixPath = require('./utils/fixPath'); +const config = require('../config/config.js'); +const { version } = require('./cli/index.js'); const isDev = require('electron-is-dev'); // Register the custom file protocol @@ -60,11 +62,20 @@ fixPath(); log.initialize(); log.transports.console.level = false; log.transports.file.format = - '[{y}-{m}-{d} {h}:{i}:{s}.{ms}{z}] [{level}] {text}'; + '[{y}-{m}-{d}T{h}:{i}:{s}.{ms}{z}] [{level}] {text}'; log.transports.file.fileName = 'desktop-client.log'; // Set the max file size to 10MB log.transports.file.maxSize = 10485760; +// Immediately log the version information +log.info( + `Boundary Desktop Client Version: ${config.releaseVersion} | Commit: ${config.releaseCommit}`, +); +const cliInfo = version(); +log.info( + `Boundary CLI Version: ${cliInfo.versionNumber} | Commit: ${cliInfo.gitRevision}`, +); + if (isWindows()) { // Set the app user model ID to the app name as it will display the ID // in any notifications on windows unless a squirrel installation is used. diff --git a/ui/desktop/electron-app/src/ipc/handlers.js b/ui/desktop/electron-app/src/ipc/handlers.js index c6ef9fd4e..bf058a24b 100644 --- a/ui/desktop/electron-app/src/ipc/handlers.js +++ b/ui/desktop/electron-app/src/ipc/handlers.js @@ -156,7 +156,12 @@ handle('searchCacheDaemon', async (request) => * socket path as a proxy for whether the daemon is running. */ handle('isCacheDaemonRunning', async () => { - cacheDaemonManager.status(); + try { + await cacheDaemonManager.status(); + } catch (e) { + // There was likely an error connecting to the cache daemon. + return false; + } return Boolean(cacheDaemonManager.socketPath); }); diff --git a/ui/desktop/electron-app/src/services/cache-daemon-manager.js b/ui/desktop/electron-app/src/services/cache-daemon-manager.js index 8796795a5..108ac84fd 100644 --- a/ui/desktop/electron-app/src/services/cache-daemon-manager.js +++ b/ui/desktop/electron-app/src/services/cache-daemon-manager.js @@ -11,6 +11,7 @@ const sanitizer = require('../utils/sanitizer.js'); const { isWindows } = require('../helpers/platform.js'); const treeKill = require('tree-kill'); const log = require('electron-log/main'); +const generateErrorPromise = require('../utils/generateErrorPromise'); class CacheDaemonManager { #socketPath; @@ -23,15 +24,21 @@ class CacheDaemonManager { /** * Checks the status of the cache daemon. - * @returns {string} + * @returns {Promise} */ status() { const daemonStatusCommand = ['cache', 'status', '-format=json']; - const { stdout } = spawnSync(daemonStatusCommand); + const { stdout, stderr } = spawnSync(daemonStatusCommand); - const status = jsonify(stdout); - this.#socketPath = status?.item?.socket_address; - return status; + const parsedResponse = jsonify(stdout); + this.#socketPath = parsedResponse?.item?.socket_address; + + if (parsedResponse?.status_code === 200) { + return parsedResponse.item; + } + + log.warn('Cache Daemon Status:', stderr); + return generateErrorPromise(stderr); } /** @@ -106,11 +113,8 @@ class CacheDaemonManager { return; } - parsedResponse = jsonify(stderr); - return Promise.reject({ - statusCode: parsedResponse?.status_code, - ...parsedResponse?.api_error, - }); + log.warn('Cache Daemon Add Token:', stderr); + return generateErrorPromise(stderr); } search(requestData) { @@ -157,17 +161,12 @@ const searchCliCommand = (requestData) => { return parsedResponse?.item; } - parsedResponse = jsonify(stderr); - // Log request data and response, but clean up token from log const requestCopy = { ...requestData }; delete requestData.token; log.error(`searchCliCommand(${JSON.stringify(requestCopy)}):`, stderr); - return Promise.reject({ - statusCode: parsedResponse?.status_code, - ...parsedResponse?.api_error, - }); + return generateErrorPromise(stderr); }; // Export an instance so we get a singleton diff --git a/ui/desktop/electron-app/src/services/client-agent-daemon-manager.js b/ui/desktop/electron-app/src/services/client-agent-daemon-manager.js index 437f637d4..9111f2bd9 100644 --- a/ui/desktop/electron-app/src/services/client-agent-daemon-manager.js +++ b/ui/desktop/electron-app/src/services/client-agent-daemon-manager.js @@ -6,6 +6,7 @@ const { spawnSync, spawn } = require('../helpers/spawn-promise'); const jsonify = require('../utils/jsonify.js'); const generateErrorPromise = require('../utils/generateErrorPromise'); +const log = require('electron-log/main'); class ClientAgentDaemonManager { /** @@ -21,6 +22,7 @@ class ClientAgentDaemonManager { return parsedResponse.item; } + log.warn('Client Agent Status:', stderr); return generateErrorPromise(stderr); } @@ -42,6 +44,7 @@ class ClientAgentDaemonManager { return parsedResponse.items; } + log.warn('Client Agent Sessions:', stderr); return generateErrorPromise(stderr); } } diff --git a/ui/desktop/electron-app/src/utils/generateErrorPromise.js b/ui/desktop/electron-app/src/utils/generateErrorPromise.js index 8362b53be..eb78864ad 100644 --- a/ui/desktop/electron-app/src/utils/generateErrorPromise.js +++ b/ui/desktop/electron-app/src/utils/generateErrorPromise.js @@ -3,6 +3,7 @@ * SPDX-License-Identifier: MPL-2.0 */ const jsonify = require('./jsonify'); +const log = require('electron-log/main'); // Convert to json const generateErrorPromise = async (stderr) => { @@ -11,12 +12,12 @@ const generateErrorPromise = async (stderr) => { if (parsedResponse?.status_code) { return Promise.reject({ statusCode: parsedResponse?.status_code, - error: parsedResponse?.api_error, + message: parsedResponse?.api_error, }); } return Promise.reject({ - error: parsedResponse?.error, + message: parsedResponse?.error, }); }; diff --git a/ui/desktop/electron-app/src/utils/jsonify.js b/ui/desktop/electron-app/src/utils/jsonify.js index c1e78524d..30a158c15 100644 --- a/ui/desktop/electron-app/src/utils/jsonify.js +++ b/ui/desktop/electron-app/src/utils/jsonify.js @@ -11,7 +11,6 @@ const jsonify = (data) => { try { return JSON.parse(data); } catch (e) { - log.warn('jsonify:', e); // Ignore parse errors } };