From 90abfc479a31e557905f4b280b89f793390a3afc Mon Sep 17 00:00:00 2001 From: Jim Ehrismann Date: Mon, 7 Jun 2021 18:18:45 -0400 Subject: [PATCH] if shell-env() ever fails its execution will be bypassed on subsequent tries Signed-off-by: Jim Ehrismann --- src/main/shell-session/shell-session.ts | 4 +- src/main/shell-sync.ts | 14 +------ src/main/utils/shell-env.ts | 51 +++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 14 deletions(-) create mode 100644 src/main/utils/shell-env.ts diff --git a/src/main/shell-session/shell-session.ts b/src/main/shell-session/shell-session.ts index eaa95f0fd8..116ea9d6b9 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"; @@ -138,7 +138,7 @@ export abstract class ShellSession { } protected async getShellEnv() { - const env = clearKubeconfigEnvVars(JSON.parse(JSON.stringify(await shellEnv()))); + const env = clearKubeconfigEnvVars(JSON.parse(JSON.stringify(await shellEnv(undefined, 5_000)))); const pathStr = [...this.getPathEntries(), await this.kubectlBinDirP, process.env.PATH].join(path.delimiter); const shell = UserStore.getInstance().resolvedShell; diff --git a/src/main/shell-sync.ts b/src/main/shell-sync.ts index ff38ede3bb..fe710e7492 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, 5_000); 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..1b6ead2951 --- /dev/null +++ b/src/main/utils/shell-env.ts @@ -0,0 +1,51 @@ +/** + * 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; + +export async function shellEnv(shell?: string, timeout?: number) : Promise { + let envVars = {}; + + 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.")); + }, timeout)) + ]); + } 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; +}