diff --git a/src/extensions/common-api/registrations.ts b/src/extensions/common-api/registrations.ts index be3e8d87cd..03340e4519 100644 --- a/src/extensions/common-api/registrations.ts +++ b/src/extensions/common-api/registrations.ts @@ -11,3 +11,4 @@ export type { PageRegistration, RegisteredPage, PageParams, PageComponentProps, export type { ClusterPageMenuRegistration, ClusterPageMenuComponents } from "../registries/page-menu-registry"; export type { ProtocolHandlerRegistration, RouteParams as ProtocolRouteParams, RouteHandler as ProtocolRouteHandler } from "../registries/protocol-handler"; export type { CustomCategoryViewProps, CustomCategoryViewComponents, CustomCategoryViewRegistration } from "../../renderer/components/+catalog/custom-views"; +export type { ShellEnvModifier, ShellEnvClusterData } from "../../main/shell-session/shell-env-modifier/shell-env-modifier-registration"; diff --git a/src/extensions/lens-main-extension.ts b/src/extensions/lens-main-extension.ts index 74d6e509c9..f1cfe6ff19 100644 --- a/src/extensions/lens-main-extension.ts +++ b/src/extensions/lens-main-extension.ts @@ -10,11 +10,14 @@ import type { CatalogEntity } from "../common/catalog"; import type { IObservableArray } from "mobx"; import type { MenuRegistration } from "../main/menu/menu-registration"; import type { TrayMenuRegistration } from "../main/tray/tray-menu-registration"; -import type { ShellEnvVarRegistration } from "../main/shell-session/env-var/env-var-registration"; +import type { ShellEnvModifier } from "../main/shell-session/shell-env-modifier/shell-env-modifier-registration"; +import { noop } from "../common/utils"; + export class LensMainExtension extends LensExtension { appMenus: MenuRegistration[] = []; trayMenus: TrayMenuRegistration[] = []; - shellEnvVars: ShellEnvVarRegistration[] = []; + + shellEnvModifier: ShellEnvModifier = noop; async navigate(pageId?: string, params?: Record, frameId?: number) { return WindowManager.getInstance().navigateExtension(this.id, pageId, params, frameId); diff --git a/src/main/shell-session/env-var/env-var-registration.ts b/src/main/shell-session/env-var/env-var-registration.ts deleted file mode 100644 index 47cd265f5b..0000000000 --- a/src/main/shell-session/env-var/env-var-registration.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Copyright (c) OpenLens Authors. All rights reserved. - * Licensed under MIT License. See LICENSE in root directory for more information. - */ - -export interface ShellEnvVarRegistration { - title: string; - env: Record; -} - diff --git a/src/main/shell-session/local-shell-session/local-shell-session.injectable.ts b/src/main/shell-session/local-shell-session/local-shell-session.injectable.ts index 30ac1c2d2e..ea693c4496 100644 --- a/src/main/shell-session/local-shell-session/local-shell-session.injectable.ts +++ b/src/main/shell-session/local-shell-session/local-shell-session.injectable.ts @@ -7,6 +7,7 @@ import { LocalShellSession } from "./local-shell-session"; import type { Cluster } from "../../../common/cluster/cluster"; import type WebSocket from "ws"; import createKubectlInjectable from "../../kubectl/create-kubectl.injectable"; +import shellEnvModifiersInjectable from "../shell-env-modifier/shell-env-modifier.injectable"; interface InstantiationParameter { webSocket: WebSocket; @@ -17,10 +18,11 @@ interface InstantiationParameter { const localShellSessionInjectable = getInjectable({ instantiate: (di, { cluster, tabId, webSocket }: InstantiationParameter) => { const createKubectl = di.inject(createKubectlInjectable); + const shellEnvModifiers = di.inject(shellEnvModifiersInjectable); const kubectl = createKubectl(cluster.version); - return new LocalShellSession(kubectl, webSocket, cluster, tabId); + return new LocalShellSession(kubectl, shellEnvModifiers.get(), webSocket, cluster, tabId); }, lifecycle: lifecycleEnum.transient, diff --git a/src/main/shell-session/node-shell-session/node-shell-session.ts b/src/main/shell-session/node-shell-session/node-shell-session.ts index 1fa05a4ae2..45bc291ee3 100644 --- a/src/main/shell-session/node-shell-session/node-shell-session.ts +++ b/src/main/shell-session/node-shell-session/node-shell-session.ts @@ -25,7 +25,7 @@ export class NodeShellSession extends ShellSession { protected readonly cwd: string | undefined = undefined; constructor(protected nodeName: string, kubectl: Kubectl, socket: WebSocket, cluster: Cluster, terminalId: string) { - super(kubectl, socket, cluster, terminalId); + super(kubectl, [], socket, cluster, terminalId); } public async open() { diff --git a/src/main/shell-session/shell-env-modifier/shell-env-modifier-registration.ts b/src/main/shell-session/shell-env-modifier/shell-env-modifier-registration.ts new file mode 100644 index 0000000000..6ae16eb754 --- /dev/null +++ b/src/main/shell-session/shell-env-modifier/shell-env-modifier-registration.ts @@ -0,0 +1,14 @@ +/** + * Copyright (c) OpenLens Authors. All rights reserved. + * Licensed under MIT License. See LICENSE in root directory for more information. + */ + +import type { noop } from "../../../common/utils"; + +export interface ShellEnvClusterData { + context: string; + kubeconfigPath: string; + id: string; +} + +export type ShellEnvModifier = ((cluster: ShellEnvClusterData, env: Record) => Record) | typeof noop; diff --git a/src/main/shell-session/env-var/env-var.injectable.ts b/src/main/shell-session/shell-env-modifier/shell-env-modifier.injectable.ts similarity index 71% rename from src/main/shell-session/env-var/env-var.injectable.ts rename to src/main/shell-session/shell-env-modifier/shell-env-modifier.injectable.ts index d0f362eaca..d8b699a97e 100644 --- a/src/main/shell-session/env-var/env-var.injectable.ts +++ b/src/main/shell-session/shell-env-modifier/shell-env-modifier.injectable.ts @@ -5,15 +5,15 @@ import { getInjectable, lifecycleEnum } from "@ogre-tools/injectable"; import mainExtensionsInjectable from "../../../extensions/main-extensions.injectable"; -import { getShellEnvVars } from "./get-shell-env-vars"; +import { shellEnvModifiers } from "./shell-env-modifiers"; -const shellEnvVarInjectable = getInjectable({ +const shellEnvModifiersInjectable = getInjectable({ instantiate: (di) => - getShellEnvVars({ + shellEnvModifiers({ extensions: di.inject(mainExtensionsInjectable), }), lifecycle: lifecycleEnum.singleton, }); -export default shellEnvVarInjectable; +export default shellEnvModifiersInjectable; diff --git a/src/main/shell-session/env-var/get-shell-env-vars.ts b/src/main/shell-session/shell-env-modifier/shell-env-modifiers.ts similarity index 76% rename from src/main/shell-session/env-var/get-shell-env-vars.ts rename to src/main/shell-session/shell-env-modifier/shell-env-modifiers.ts index 9845fa2a98..59f7598516 100644 --- a/src/main/shell-session/env-var/get-shell-env-vars.ts +++ b/src/main/shell-session/shell-env-modifier/shell-env-modifiers.ts @@ -10,9 +10,9 @@ interface Dependencies { extensions: IComputedValue; } -export const getShellEnvVars = ({ extensions }: Dependencies) => { +export const shellEnvModifiers = ({ extensions }: Dependencies) => { return computed(() => ( extensions.get() - .flatMap((extension) => extension.shellEnvVars) + .flatMap((extension) => extension.shellEnvModifier) )); }; diff --git a/src/main/shell-session/shell-session.ts b/src/main/shell-session/shell-session.ts index 25b7217219..f8b893e90a 100644 --- a/src/main/shell-session/shell-session.ts +++ b/src/main/shell-session/shell-session.ts @@ -19,6 +19,7 @@ import logger from "../logger"; import { TerminalChannels, TerminalMessage } from "../../renderer/api/terminal-api"; import { deserialize, serialize } from "v8"; import { stat } from "fs/promises"; +import type { ShellEnvModifier } from "./shell-env-modifier/shell-env-modifier-registration"; export class ShellOpenError extends Error { constructor(message: string, public cause: Error) { @@ -155,7 +156,7 @@ export abstract class ShellSession { return { shellProcess, resume }; } - constructor(protected kubectl: Kubectl, protected websocket: WebSocket, protected cluster: Cluster, terminalId: string) { + constructor(protected kubectl: Kubectl, protected shellEnvModifiers: ShellEnvModifier[], protected websocket: WebSocket, protected cluster: Cluster, terminalId: string) { this.kubeconfigPathP = this.cluster.getProxyKubeconfigPath(); this.kubectlBinDirP = this.kubectl.binDir(); this.terminalId = `${cluster.id}:${terminalId}`; @@ -311,7 +312,7 @@ export abstract class ShellSession { } protected async getShellEnv() { - const env = clearKubeconfigEnvVars(JSON.parse(JSON.stringify(await shellEnv()))); + let env = clearKubeconfigEnvVars(JSON.parse(JSON.stringify(await shellEnv()))); const pathStr = [...this.getPathEntries(), await this.kubectlBinDirP, process.env.PATH].join(path.delimiter); const shell = UserStore.getInstance().resolvedShell; @@ -341,8 +342,10 @@ export abstract class ShellSession { env.DISABLE_AUTO_UPDATE = "true"; } + const kubeconfigPath = await this.kubeconfigPathP; + env.PTYPID = process.pid.toString(); - env.KUBECONFIG = await this.kubeconfigPathP; + env.KUBECONFIG = kubeconfigPath; env.TERM_PROGRAM = app.getName(); env.TERM_PROGRAM_VERSION = app.getVersion(); @@ -358,6 +361,8 @@ export abstract class ShellSession { .filter(Boolean) .join(); + this.shellEnvModifiers.map(modifier => env = { ...env, ...modifier({ context: this.cluster.contextName, kubeconfigPath, id: this.cluster.id }, env) }); + return env; }