diff --git a/src/main/kubectl.ts b/src/main/kubectl.ts index 8973d6e3b8..1842d46307 100644 --- a/src/main/kubectl.ts +++ b/src/main/kubectl.ts @@ -97,7 +97,7 @@ export class Kubectl { this.url = `${this.getDownloadMirror()}/v${this.kubectlVersion}/bin/${platformName}/${arch}/${binaryName}` - this.dirname = path.normalize(path.join(Kubectl.kubectlDir, this.kubectlVersion)) + this.dirname = path.normalize(path.join(this.getDownloadDir(), this.kubectlVersion)) this.path = path.join(this.dirname, binaryName) } @@ -105,7 +105,19 @@ export class Kubectl { return Kubectl.bundledKubectlPath } + public getPathFromPreferences() { + return userStore.preferences.kubectlBinariesPath || this.getBundledPath() + } + + protected getDownloadDir() { + return userStore.preferences.downloadBinariesPath || Kubectl.kubectlDir + } + public async getPath(bundled = false): Promise { + if (!userStore.preferences.downloadKubectlBinaries) { + return this.getPathFromPreferences() + } + // return binary name if bundled path is not functional if (!await this.checkBinary(this.getBundledPath(), false)) { Kubectl.invalidBundle = true @@ -128,6 +140,7 @@ export class Kubectl { public async binDir() { try { await this.ensureKubectl() + await this.writeInitScripts() return this.dirname } catch (err) { logger.error(err) @@ -180,6 +193,9 @@ export class Kubectl { } public async ensureKubectl(): Promise { + if (!userStore.preferences.downloadKubectlBinaries) { + return true + } if (Kubectl.invalidBundle) { logger.error(`Detected invalid bundle binary, returning ...`) return false @@ -203,10 +219,6 @@ export class Kubectl { release() return false } - await this.writeInitScripts().catch((error) => { - logger.error("Failed to write init scripts"); - logger.error(error) - }) logger.debug(`Releasing lock for ${this.kubectlVersion}`) release() return true @@ -266,54 +278,51 @@ export class Kubectl { } protected async writeInitScripts() { + const kubectlPath = userStore.preferences.downloadKubectlBinaries ? this.dirname : path.dirname(this.getPathFromPreferences()) const helmPath = helmCli.getBinaryDir() const fsPromises = fs.promises; const bashScriptPath = path.join(this.dirname, '.bash_set_path') - const bashScriptIsLatest = await this.scriptIsLatest(bashScriptPath) - if (!bashScriptIsLatest) { - let bashScript = "" + initScriptVersionString - bashScript += "tempkubeconfig=\"$KUBECONFIG\"\n" - bashScript += "test -f \"/etc/profile\" && . \"/etc/profile\"\n" - bashScript += "if test -f \"$HOME/.bash_profile\"; then\n" - bashScript += " . \"$HOME/.bash_profile\"\n" - bashScript += "elif test -f \"$HOME/.bash_login\"; then\n" - bashScript += " . \"$HOME/.bash_login\"\n" - bashScript += "elif test -f \"$HOME/.profile\"; then\n" - bashScript += " . \"$HOME/.profile\"\n" - bashScript += "fi\n" - bashScript += `export PATH="${this.dirname}:${helmPath}:$PATH"\n` - bashScript += "export KUBECONFIG=\"$tempkubeconfig\"\n" - bashScript += "unset tempkubeconfig\n" - await fsPromises.writeFile(bashScriptPath, bashScript.toString(), { mode: 0o644 }) - } + + let bashScript = "" + initScriptVersionString + bashScript += "tempkubeconfig=\"$KUBECONFIG\"\n" + bashScript += "test -f \"/etc/profile\" && . \"/etc/profile\"\n" + bashScript += "if test -f \"$HOME/.bash_profile\"; then\n" + bashScript += " . \"$HOME/.bash_profile\"\n" + bashScript += "elif test -f \"$HOME/.bash_login\"; then\n" + bashScript += " . \"$HOME/.bash_login\"\n" + bashScript += "elif test -f \"$HOME/.profile\"; then\n" + bashScript += " . \"$HOME/.profile\"\n" + bashScript += "fi\n" + bashScript += `export PATH="${helmPath}:${kubectlPath}:$PATH"\n` + bashScript += "export KUBECONFIG=\"$tempkubeconfig\"\n" + bashScript += "unset tempkubeconfig\n" + await fsPromises.writeFile(bashScriptPath, bashScript.toString(), { mode: 0o644 }) const zshScriptPath = path.join(this.dirname, '.zlogin') - const zshScriptIsLatest = await this.scriptIsLatest(zshScriptPath) - if (!zshScriptIsLatest) { - let zshScript = "" + initScriptVersionString - zshScript += "tempkubeconfig=\"$KUBECONFIG\"\n" - // restore previous ZDOTDIR - zshScript += "export ZDOTDIR=\"$OLD_ZDOTDIR\"\n" - // source all the files - zshScript += "test -f \"$OLD_ZDOTDIR/.zshenv\" && . \"$OLD_ZDOTDIR/.zshenv\"\n" - zshScript += "test -f \"$OLD_ZDOTDIR/.zprofile\" && . \"$OLD_ZDOTDIR/.zprofile\"\n" - zshScript += "test -f \"$OLD_ZDOTDIR/.zlogin\" && . \"$OLD_ZDOTDIR/.zlogin\"\n" - zshScript += "test -f \"$OLD_ZDOTDIR/.zshrc\" && . \"$OLD_ZDOTDIR/.zshrc\"\n" + let zshScript = "" + initScriptVersionString - // voodoo to replace any previous occurrences of kubectl path in the PATH - zshScript += `kubectlpath=\"${this.dirname}"\n` - zshScript += `helmpath=\"${helmPath}"\n` - zshScript += "p=\":$kubectlpath:\"\n" - zshScript += "d=\":$PATH:\"\n" - zshScript += "d=${d//$p/:}\n" - zshScript += "d=${d/#:/}\n" - zshScript += "export PATH=\"$kubectlpath:$helmpath:${d/%:/}\"\n" - zshScript += "export KUBECONFIG=\"$tempkubeconfig\"\n" - zshScript += "unset tempkubeconfig\n" - zshScript += "unset OLD_ZDOTDIR\n" - await fsPromises.writeFile(zshScriptPath, zshScript.toString(), { mode: 0o644 }) - } + zshScript += "tempkubeconfig=\"$KUBECONFIG\"\n" + // restore previous ZDOTDIR + zshScript += "export ZDOTDIR=\"$OLD_ZDOTDIR\"\n" + // source all the files + zshScript += "test -f \"$OLD_ZDOTDIR/.zshenv\" && . \"$OLD_ZDOTDIR/.zshenv\"\n" + zshScript += "test -f \"$OLD_ZDOTDIR/.zprofile\" && . \"$OLD_ZDOTDIR/.zprofile\"\n" + zshScript += "test -f \"$OLD_ZDOTDIR/.zlogin\" && . \"$OLD_ZDOTDIR/.zlogin\"\n" + zshScript += "test -f \"$OLD_ZDOTDIR/.zshrc\" && . \"$OLD_ZDOTDIR/.zshrc\"\n" + + // voodoo to replace any previous occurrences of kubectl path in the PATH + zshScript += `kubectlpath=\"${kubectlPath}"\n` + zshScript += `helmpath=\"${helmPath}"\n` + zshScript += "p=\":$kubectlpath:\"\n" + zshScript += "d=\":$PATH:\"\n" + zshScript += "d=${d//$p/:}\n" + zshScript += "d=${d/#:/}\n" + zshScript += "export PATH=\"$helmpath:$kubectlpath:${d/%:/}\"\n" + zshScript += "export KUBECONFIG=\"$tempkubeconfig\"\n" + zshScript += "unset tempkubeconfig\n" + zshScript += "unset OLD_ZDOTDIR\n" + await fsPromises.writeFile(zshScriptPath, zshScript.toString(), { mode: 0o644 }) } protected getDownloadMirror() { diff --git a/src/main/shell-session.ts b/src/main/shell-session.ts index b02b038aab..77f767cfea 100644 --- a/src/main/shell-session.ts +++ b/src/main/shell-session.ts @@ -4,12 +4,13 @@ import { EventEmitter } from "events"; import path from "path" import shellEnv from "shell-env" import { app } from "electron" -import { Kubectl } from "./kubectl" +import { Kubectl, bundledKubectl } from "./kubectl" import { Cluster } from "./cluster" import { ClusterPreferences } from "../common/cluster-store"; import { helmCli } from "./helm/helm-cli" import { isWindows } from "../common/vars"; import { tracker } from "../common/tracker"; +import { userStore } from "../common/user-store"; export class ShellSession extends EventEmitter { static shellEnvs: Map = new Map() @@ -35,7 +36,8 @@ export class ShellSession extends EventEmitter { } public async open() { - this.kubectlBinDir = await this.kubectl.binDir() + const pathFromPreferences = userStore.preferences.kubectlBinariesPath || Kubectl.bundledKubectlPath + this.kubectlBinDir = userStore.preferences.downloadKubectlBinaries ? await this.kubectl.binDir() : path.dirname(pathFromPreferences) this.helmBinDir = helmCli.getBinaryDir() const env = await this.getCachedShellEnv() const shell = env.PTYSHELL @@ -67,11 +69,11 @@ export class ShellSession extends EventEmitter { protected async getShellArgs(shell: string): Promise> { switch(path.basename(shell)) { case "powershell.exe": - return ["-NoExit", "-command", `& {Set-Location $Env:USERPROFILE; $Env:PATH="${this.kubectlBinDir};${this.helmBinDir};$Env:PATH"}`] + return ["-NoExit", "-command", `& {Set-Location $Env:USERPROFILE; $Env:PATH="${this.helmBinDir};${this.kubectlBinDir};$Env:PATH"}`] case "bash": return ["--init-file", path.join(this.kubectlBinDir, '.bash_set_path')] case "fish": - return ["--login", "--init-command", `export PATH="${this.kubectlBinDir}:${this.helmBinDir}:$PATH"; export KUBECONFIG="${this.kubeconfigPath}"`] + return ["--login", "--init-command", `export PATH="${this.helmBinDir}:${this.kubectlBinDir}:$PATH"; export KUBECONFIG="${this.kubeconfigPath}"`] case "zsh": return ["--login"] default: