diff --git a/src/main/shell-session/shell-session.ts b/src/main/shell-session/shell-session.ts index eaa95f0fd8..039caa44ce 100644 --- a/src/main/shell-session/shell-session.ts +++ b/src/main/shell-session/shell-session.ts @@ -22,7 +22,7 @@ import type { Cluster } from "../cluster"; import { Kubectl } from "../kubectl"; import type * as WebSocket from "ws"; -import shellEnv from "shell-env"; +import { shellEnv } from "../utils/shell-env"; import { app } from "electron"; import { clearKubeconfigEnvVars } from "../utils/clear-kube-env-vars"; import path from "path"; diff --git a/src/main/shell-sync.ts b/src/main/shell-sync.ts index ff38ede3bb..d699969224 100644 --- a/src/main/shell-sync.ts +++ b/src/main/shell-sync.ts @@ -19,10 +19,9 @@ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -import shellEnv from "shell-env"; +import { shellEnv } from "./utils/shell-env"; import os from "os"; import { app } from "electron"; -import logger from "./logger"; interface Env { [key: string]: string; @@ -37,16 +36,7 @@ export async function shellSync() { const { shell } = os.userInfo(); let envVars = {}; - try { - envVars = await Promise.race([ - shellEnv(shell), - new Promise((_resolve, reject) => setTimeout(() => { - reject(new Error("Resolving shell environment is taking very long. Please review your shell configuration.")); - }, 5_000)) - ]); - } catch (error) { - logger.error(`shellEnv: ${error}`); - } + envVars = await shellEnv(shell); const env: Env = JSON.parse(JSON.stringify(envVars)); diff --git a/src/main/utils/shell-env.ts b/src/main/utils/shell-env.ts new file mode 100644 index 0000000000..b544603075 --- /dev/null +++ b/src/main/utils/shell-env.ts @@ -0,0 +1,66 @@ +/** + * Copyright (c) 2021 OpenLens Authors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +import shellEnvironment from "shell-env"; +import logger from "../logger"; + +export interface EnvironmentVariables { + readonly [key: string]: string; +} + +let shellSyncFailed = false; + +/** + * Attempts to get the shell environment per the user's existing startup scripts. + * If the environment can't be retrieved after 5 seconds an error message is logged. + * Subsequent calls after such a timeout simply log an error message without trying + * to get the environment, unless forceRetry is true. + * @param shell the shell to get the environment from + * @param forceRetry if true will always try to get the environment, otherwise if + * a previous call to this function failed then this call will fail too. + * @returns object containing the shell's environment variables. An empty object is + * returned if the call fails. + */ +export async function shellEnv(shell?: string, forceRetry = false) : Promise { + let envVars = {}; + + if (forceRetry) { + shellSyncFailed = false; + } + + if (!shellSyncFailed) { + try { + envVars = await Promise.race([ + shellEnvironment(shell), + new Promise((_resolve, reject) => setTimeout(() => { + reject(new Error("Resolving shell environment is taking very long. Please review your shell configuration.")); + }, 5_000)) + ]); + } catch (error) { + logger.error(`shellEnv: ${error}`); + shellSyncFailed = true; + } + } else { + logger.error("shellSync(): Resolving shell environment took too long. Please review your shell configuration."); + } + + return envVars; +}