mirror of
https://github.com/robbyrussell/oh-my-zsh.git
synced 2026-01-08 11:34:46 +01:00
chore(kube-ps1): update to 0b0e6daf (#13503)
Co-authored-by: ohmyzsh[bot] <54982679+ohmyzsh[bot]@users.noreply.github.com>
This commit is contained in:
2
.github/dependencies.yml
vendored
2
.github/dependencies.yml
vendored
@@ -30,7 +30,7 @@ dependencies:
|
||||
plugins/kube-ps1:
|
||||
repo: jonmosco/kube-ps1
|
||||
branch: master
|
||||
version: e1da055e905a91242f0c5a89a425a64ee8adcd6b
|
||||
version: 0b0e6daf4197ecabb1ae4f2d46fb148a8e1e73e5
|
||||
precopy: |
|
||||
set -e
|
||||
find . ! -name kube-ps1.sh ! -name LICENSE ! -name README.md -delete
|
||||
|
||||
201
plugins/kube-ps1/LICENSE
Normal file
201
plugins/kube-ps1/LICENSE
Normal file
@@ -0,0 +1,201 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
@@ -1,49 +1,82 @@
|
||||
# kube-ps1: Kubernetes prompt for bash and zsh
|
||||
|
||||

|
||||
[](https://github.com/jonmosco/kube-ps1/actions/workflows/ci.yml)
|
||||
|
||||
A script that lets you add the current Kubernetes context and namespace
|
||||
configured on `kubectl` to your Bash/Zsh prompt strings (i.e. the `$PS1`).
|
||||
|
||||
Inspired by several tools used to simplify usage of `kubectl`.
|
||||
|
||||

|
||||
|
||||
## Installing
|
||||
|
||||
### MacOS
|
||||
### Packages
|
||||
|
||||
### MacOS Brew Ports
|
||||
|
||||
Homebrew package manager:
|
||||
|
||||
```sh
|
||||
brew update
|
||||
brew install kube-ps1
|
||||
```
|
||||
$ brew update
|
||||
$ brew install kube-ps1
|
||||
|
||||
### Arch Linux
|
||||
|
||||
AUR Package available at [https://aur.archlinux.org/packages/kube-ps1/](https://aur.archlinux.org/packages/kube-ps1/).
|
||||
|
||||
### Oh My Zsh
|
||||
|
||||
https://github.com/ohmyzsh/ohmyzsh
|
||||
|
||||
kube-ps1 is included as a plugin in the oh-my-zsh project. To enable it, edit your `~/.zshrc` and
|
||||
add the plugin:
|
||||
|
||||
```bash
|
||||
plugins=(
|
||||
kube-ps1
|
||||
)
|
||||
PROMPT='$(kube_ps1)'$PROMPT # or RPROMPT='$(kube_ps1)'
|
||||
```
|
||||
### From Source
|
||||
|
||||
## Zsh zinit plugin
|
||||
|
||||
### Using [zinit](https://github.com/zdharma-continuum/zinit)
|
||||
|
||||
Update `.zshrc` with:
|
||||
|
||||
```sh
|
||||
zinit light jonmosco/kube-ps1
|
||||
PROMPT='$(kube_ps1)'$PROMPT # or RPROMPT='$(kube_ps1)'
|
||||
```
|
||||
|
||||
### Fig
|
||||
|
||||
Install `kube-ps1` in zsh, bash, or fish with one click.
|
||||
|
||||
<a href="https://fig.io/plugins/other/kube-ps1" target="_blank"><img src="https://fig.io/badges/install-with-fig.svg" width="120" /></a>
|
||||
|
||||
### From Source (git clone)
|
||||
|
||||
1. Clone this repository
|
||||
2. Source the kube-ps1.sh in your `~/.zshrc` or your `~/.bashrc`
|
||||
|
||||
### Arch Linux
|
||||
AUR Package available at [https://aur.archlinux.org/packages/kube-ps1/](https://aur.archlinux.org/packages/kube-ps1/).
|
||||
|
||||
#### Zsh
|
||||
|
||||
```sh
|
||||
source /path/to/kube-ps1.sh
|
||||
PROMPT='$(kube_ps1)'$PROMPT
|
||||
PROMPT='$(kube_ps1)'$PROMPT # or RPROMPT='$(kube_ps1)'
|
||||
```
|
||||
|
||||
#### Bash
|
||||
|
||||
```sh
|
||||
source /path/to/kube-ps1.sh
|
||||
PS1='[\u@\h \W $(kube_ps1)]\$ '
|
||||
```
|
||||
|
||||
### Zsh Plugin Managers
|
||||
|
||||
#### Using [zplugin](https://github.com/zdharma/zplugin)
|
||||
|
||||
Update `.zshrc` with:
|
||||
```sh
|
||||
zplugin light jonmosco/kube-ps1
|
||||
PROMPT='$(kube_ps1)'$PROMPT
|
||||
```
|
||||
|
||||
## Requirements
|
||||
|
||||
The default prompt assumes you have the `kubectl` command line utility installed.
|
||||
@@ -54,22 +87,23 @@ Official installation instructions and binaries are available:
|
||||
If using this with OpenShift, the `oc` tool needs installed. It can be obtained
|
||||
from brew ports:
|
||||
|
||||
```
|
||||
```sh
|
||||
brew install openshift-cli
|
||||
```
|
||||
|
||||
or the source can be downloaded:
|
||||
|
||||
[OC Client Tools](https://www.openshift.org/download.html)
|
||||
[OC Client Tools](https://github.com/okd-project/okd/releases)
|
||||
|
||||
Set the binary to `oc` with the following environment variable:
|
||||
Set the binary to `oc` with the following variable:
|
||||
|
||||
```
|
||||
```sh
|
||||
KUBE_PS1_BINARY=oc
|
||||
```
|
||||
|
||||
If neither binary is available, the prompt will print the following:
|
||||
|
||||
```
|
||||
```sh
|
||||
(<symbol>|BINARY-N/A:N/A)
|
||||
```
|
||||
|
||||
@@ -90,13 +124,13 @@ tmux, and like the functionality provided by kube-ps1, checkout the
|
||||
|
||||
The default prompt layout is:
|
||||
|
||||
```
|
||||
```sh
|
||||
(<symbol>|<context>:<namespace>)
|
||||
```
|
||||
|
||||
If the current-context is not set, kube-ps1 will return the following:
|
||||
|
||||
```
|
||||
```sh
|
||||
(<symbol>|N/A:N/A)
|
||||
```
|
||||
|
||||
@@ -107,7 +141,7 @@ run `kubeoff`. To disable the prompt for all shell sessions, run `kubeoff -g`.
|
||||
You can enable it again in the current shell by running `kubeon`, and globally
|
||||
with `kubeon -g`.
|
||||
|
||||
```
|
||||
```sh
|
||||
kubeon : turn on kube-ps1 status for this shell. Takes precedence over
|
||||
global setting for current session
|
||||
kubeon -g : turn on kube-ps1 status globally
|
||||
@@ -116,39 +150,69 @@ kubeoff : turn off kube-ps1 status for this shell. Takes precedence over
|
||||
kubeoff -g : turn off kube-ps1 status globally
|
||||
```
|
||||
|
||||
## Symbol
|
||||
|
||||
The default symbols are UTF8 and should work with most fonts. If you want to use the Kubernetes and OpenShift
|
||||
glyphs, you need to install a patched font that contains the glyph. [Nerd Fonts](https://www.nerdfonts.com/) provides both glyphs. Follow their installation instructions to install the patched font.
|
||||
|
||||
`KUBE_PS1_SYMBOL_CUSTOM` options
|
||||
|
||||
| Options | Symbol | Description |
|
||||
| ------------- | ------ | ----------- |
|
||||
| default (empty string) | ⎈ | Default symbol (Unicode `\u2388`) |
|
||||
| img | ☸️ | Symbol often used to represent Kubernetes (Unicode `\u2638`) |
|
||||
| oc |  | Symbol representing OpenShift (Unicode `\ue7b7`) |
|
||||
| k8s |  | Symbol representing Kubernetes (Unicode `\ue7b7`) |
|
||||
|
||||
To set the symbol to one of the custom glyphs, add the following to your `~/.bashrc` or `~/.zshrc`:
|
||||
|
||||
```sh
|
||||
KUBE_PS1_SYMBOL_CUSTOM=img
|
||||
```
|
||||
|
||||
To set the symbol to the default, set the `KUBE_PS1_SYMBOL` to an empty string.
|
||||
|
||||
Heres a demo of the symbols in action:
|
||||

|
||||
|
||||
If the font is not properly installed, and the glyph is not available, it will display an empty set of brackets or similar:
|
||||
|
||||
```sh
|
||||
echo -n "\ue7b7"
|
||||
|
||||
```
|
||||
|
||||
## Customization
|
||||
|
||||
The default settings can be overridden in `~/.bashrc` or `~/.zshrc` by setting
|
||||
the following environment variables:
|
||||
the following variables:
|
||||
|
||||
| Variable | Default | Meaning |
|
||||
| :------- | :-----: | ------- |
|
||||
| `KUBE_PS1_BINARY` | `kubectl` | Default Kubernetes binary |
|
||||
| `KUBE_PS1_NS_ENABLE` | `true` | Display the namespace. If set to `false`, this will also disable `KUBE_PS1_DIVIDER` |
|
||||
| `KUBE_PS1_PREFIX` | `(` | Prompt opening character |
|
||||
| `KUBE_PS1_SYMBOL_ENABLE` | `true ` | Display the prompt Symbol. If set to `false`, this will also disable `KUBE_PS1_SEPARATOR` |
|
||||
| `KUBE_PS1_PREFIX` | `(` | Prompt opening character |
|
||||
| `KUBE_PS1_SYMBOL_ENABLE` | `true` | Display the prompt Symbol. If set to `false`, this will also disable `KUBE_PS1_SEPARATOR` |
|
||||
| `KUBE_PS1_SYMBOL_PADDING` | `false` | Adds a space (padding) after the symbol to prevent clobbering prompt characters |
|
||||
| `KUBE_PS1_SYMBOL_DEFAULT` | `⎈ ` | Default prompt symbol. Unicode `\u2388` |
|
||||
| `KUBE_PS1_SYMBOL_USE_IMG` | `false` | ☸️ , Unicode `\u2638` as the prompt symbol |
|
||||
| `KUBE_PS1_SYMBOL_CUSTOM` | `⎈` | Change the Default prompt symbol. Unicode `\u2388`. Options are `k8s`, `img`, `oc` |
|
||||
| `KUBE_PS1_SYMBOL_COLOR` | `blue` | Change the Default symbol color. |
|
||||
| `KUBE_PS1_SEPARATOR` | | | Separator between symbol and context name |
|
||||
| `KUBE_PS1_DIVIDER` | `:` | Separator between context and namespace |
|
||||
| `KUBE_PS1_SUFFIX` | `)` | Prompt closing character |
|
||||
| `KUBE_PS1_CLUSTER_FUNCTION` | No default, must be user supplied | Function to customize how cluster is displayed |
|
||||
| `KUBE_PS1_NAMESPACE_FUNCTION` | No default, must be user supplied | Function to customize how namespace is displayed |
|
||||
| `KUBE_PS1_KUBECONFIG_SYMLINK` | `false` | Treat `KUBECONFIG` and `~/.kube/config` files as symbolic links |
|
||||
|
||||
For terminals that do not support UTF-8, the symbol will be replaced with the
|
||||
string `k8s`.
|
||||
| `KUBE_PS1_CTX_COLOR_FUNCTION` | No default, must be user supplied | Function to customize context color based on context name |
|
||||
| `KUBE_PS1_HIDE_IF_NOCONTEXT` | `false` | Hide the kube-ps1 prompt if no context is set |
|
||||
|
||||
To disable a feature, set it to an empty string:
|
||||
|
||||
```
|
||||
```sh
|
||||
KUBE_PS1_SEPARATOR=''
|
||||
```
|
||||
|
||||
## Colors
|
||||
|
||||
The default colors are set with the following environment variables:
|
||||
The default colors are set with the following variables:
|
||||
|
||||
| Variable | Default | Meaning |
|
||||
| :------- | :-----: | ------- |
|
||||
@@ -166,13 +230,13 @@ namespace.
|
||||
Set the variable to an empty string if you do not want color for each
|
||||
prompt section:
|
||||
|
||||
```
|
||||
```sh
|
||||
KUBE_PS1_CTX_COLOR=''
|
||||
```
|
||||
|
||||
Names are usable for the following colors:
|
||||
|
||||
```
|
||||
```text
|
||||
black, red, green, yellow, blue, magenta, cyan
|
||||
```
|
||||
|
||||
@@ -216,6 +280,45 @@ export KUBE_PS1_NAMESPACE_FUNCTION=get_namespace_upper
|
||||
|
||||
In both cases, the variable is set to the name of the function, and you must have defined the function in your shell configuration before kube_ps1 is called. The function must accept a single parameter and echo out the final value.
|
||||
|
||||
## Dynamic Context Colors
|
||||
|
||||
You can set different colors for different contexts using the
|
||||
`KUBE_PS1_CTX_COLOR_FUNCTION` variable. This is useful for color-coding
|
||||
contexts to make production environments stand out visually.
|
||||
|
||||
For example, to make production contexts red and development contexts green:
|
||||
|
||||
```sh
|
||||
function kube_ps1_ctx_color() {
|
||||
local context="$1"
|
||||
|
||||
case "$context" in
|
||||
*prod*)
|
||||
echo "red"
|
||||
;;
|
||||
*dev*)
|
||||
echo "green"
|
||||
;;
|
||||
*staging*|*stg*)
|
||||
echo "yellow"
|
||||
;;
|
||||
*)
|
||||
echo "cyan" # default color for other contexts
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
export KUBE_PS1_CTX_COLOR_FUNCTION=kube_ps1_ctx_color
|
||||
```
|
||||
|
||||
The function receives the context name as the first parameter and should echo
|
||||
the desired color name. All color options supported by `KUBE_PS1_CTX_COLOR` are
|
||||
available, including named colors (black, red, green, yellow, blue, magenta,
|
||||
cyan, white) and 256-color codes (0-256).
|
||||
|
||||
If `KUBE_PS1_CTX_COLOR_FUNCTION` is not set, kube-ps1 will use the value of
|
||||
`KUBE_PS1_CTX_COLOR` (default: red).
|
||||
|
||||
### Bug Reports and shell configuration
|
||||
|
||||
Due to the vast ways of customizing the shell, please try the prompt with a
|
||||
@@ -224,18 +327,28 @@ minimal configuration before submitting a bug report.
|
||||
This can be done as follows for each shell before loading kube-ps1:
|
||||
|
||||
Bash:
|
||||
```bash
|
||||
|
||||
```sh
|
||||
bash --norc
|
||||
```
|
||||
|
||||
Zsh:
|
||||
```bash
|
||||
|
||||
```sh
|
||||
zsh -f
|
||||
or
|
||||
zsh --no-rcs
|
||||
```
|
||||
|
||||
## Contributors
|
||||
For the prompt symbol, a patched font that contains the glyphs must be installed.
|
||||
[Nerd Fonts Downloads](https://www.nerdfonts.com/font-downloads) provides patched
|
||||
fonts containing the glyphs. Please consult their documentation for this, support
|
||||
is out of scope for this project.
|
||||
|
||||
* [Ahmet Alp Balkan](https://github.com/ahmetb)
|
||||
* Jared Yanovich
|
||||
### Contributors
|
||||
|
||||
Thank you to everyone in the community for their contributions to kube-ps1!
|
||||
|
||||
<a href="https://github.com/jonmosco/kube-ps1/graphs/contributors">
|
||||
<img src="https://contrib.rocks/image?repo=jonmosco/kube-ps1" />
|
||||
</a>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
# Kubernetes prompt helper for bash/zsh
|
||||
# Displays current context and namespace
|
||||
|
||||
# Copyright 2021 Jon Mosco
|
||||
# Copyright 2026 Jon Mosco
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
@@ -24,9 +24,9 @@
|
||||
# Override these values in ~/.zshrc or ~/.bashrc
|
||||
KUBE_PS1_BINARY="${KUBE_PS1_BINARY:-kubectl}"
|
||||
KUBE_PS1_SYMBOL_ENABLE="${KUBE_PS1_SYMBOL_ENABLE:-true}"
|
||||
KUBE_PS1_SYMBOL_DEFAULT=${KUBE_PS1_SYMBOL_DEFAULT:-$'\u2388'}
|
||||
KUBE_PS1_SYMBOL_PADDING="${KUBE_PS1_SYMBOL_PADDING:-false}"
|
||||
KUBE_PS1_SYMBOL_USE_IMG="${KUBE_PS1_SYMBOL_USE_IMG:-false}"
|
||||
KUBE_PS1_SYMBOL_COLOR="${KUBE_PS1_SYMBOL_COLOR:-}"
|
||||
|
||||
KUBE_PS1_NS_ENABLE="${KUBE_PS1_NS_ENABLE:-true}"
|
||||
KUBE_PS1_CONTEXT_ENABLE="${KUBE_PS1_CONTEXT_ENABLE:-true}"
|
||||
KUBE_PS1_PREFIX="${KUBE_PS1_PREFIX-(}"
|
||||
@@ -34,29 +34,28 @@ KUBE_PS1_SEPARATOR="${KUBE_PS1_SEPARATOR-|}"
|
||||
KUBE_PS1_DIVIDER="${KUBE_PS1_DIVIDER-:}"
|
||||
KUBE_PS1_SUFFIX="${KUBE_PS1_SUFFIX-)}"
|
||||
|
||||
KUBE_PS1_SYMBOL_COLOR="${KUBE_PS1_SYMBOL_COLOR-blue}"
|
||||
KUBE_PS1_CTX_COLOR="${KUBE_PS1_CTX_COLOR-red}"
|
||||
KUBE_PS1_NS_COLOR="${KUBE_PS1_NS_COLOR-cyan}"
|
||||
KUBE_PS1_BG_COLOR="${KUBE_PS1_BG_COLOR}"
|
||||
KUBE_PS1_HIDE_IF_NOCONTEXT="${KUBE_PS1_HIDE_IF_NOCONTEXT:-false}"
|
||||
|
||||
KUBE_PS1_KUBECONFIG_CACHE="${KUBECONFIG}"
|
||||
KUBE_PS1_KUBECONFIG_SYMLINK="${KUBE_PS1_KUBECONFIG_SYMLINK:-false}"
|
||||
KUBE_PS1_DISABLE_PATH="${HOME}/.kube/kube-ps1/disabled"
|
||||
KUBE_PS1_LAST_TIME=0
|
||||
KUBE_PS1_CLUSTER_FUNCTION="${KUBE_PS1_CLUSTER_FUNCTION}"
|
||||
KUBE_PS1_NAMESPACE_FUNCTION="${KUBE_PS1_NAMESPACE_FUNCTION}"
|
||||
_KUBE_PS1_KUBECONFIG_CACHE="${KUBECONFIG}"
|
||||
_KUBE_PS1_DISABLE_PATH="${HOME}/.kube/kube-ps1/disabled"
|
||||
_KUBE_PS1_LAST_TIME=0
|
||||
|
||||
# Determine our shell
|
||||
if [ "${ZSH_VERSION-}" ]; then
|
||||
KUBE_PS1_SHELL="zsh"
|
||||
elif [ "${BASH_VERSION-}" ]; then
|
||||
KUBE_PS1_SHELL="bash"
|
||||
fi
|
||||
_kube_ps1_shell_type() {
|
||||
local _KUBE_PS1_SHELL_TYPE
|
||||
|
||||
if [ "${ZSH_VERSION-}" ]; then
|
||||
_KUBE_PS1_SHELL_TYPE="zsh"
|
||||
elif [ "${BASH_VERSION-}" ]; then
|
||||
_KUBE_PS1_SHELL_TYPE="bash"
|
||||
fi
|
||||
echo $_KUBE_PS1_SHELL_TYPE
|
||||
}
|
||||
|
||||
_kube_ps1_init() {
|
||||
[[ -f "${KUBE_PS1_DISABLE_PATH}" ]] && KUBE_PS1_ENABLED=off
|
||||
[[ -f "${_KUBE_PS1_DISABLE_PATH}" ]] && KUBE_PS1_ENABLED=off
|
||||
|
||||
case "${KUBE_PS1_SHELL}" in
|
||||
case "$(_kube_ps1_shell_type)" in
|
||||
"zsh")
|
||||
_KUBE_PS1_OPEN_ESC="%{"
|
||||
_KUBE_PS1_CLOSE_ESC="%}"
|
||||
@@ -64,7 +63,7 @@ _kube_ps1_init() {
|
||||
_KUBE_PS1_DEFAULT_FG="%f"
|
||||
setopt PROMPT_SUBST
|
||||
autoload -U add-zsh-hook
|
||||
add-zsh-hook precmd _kube_ps1_update_cache
|
||||
add-zsh-hook precmd _kube_ps1_prompt_update
|
||||
zmodload -F zsh/stat b:zstat
|
||||
zmodload zsh/datetime
|
||||
;;
|
||||
@@ -73,75 +72,75 @@ _kube_ps1_init() {
|
||||
_KUBE_PS1_CLOSE_ESC=$'\002'
|
||||
_KUBE_PS1_DEFAULT_BG=$'\033[49m'
|
||||
_KUBE_PS1_DEFAULT_FG=$'\033[39m'
|
||||
[[ $PROMPT_COMMAND =~ _kube_ps1_update_cache ]] || PROMPT_COMMAND="_kube_ps1_update_cache;${PROMPT_COMMAND:-:}"
|
||||
[[ $PROMPT_COMMAND =~ _kube_ps1_prompt_update ]] || PROMPT_COMMAND="_kube_ps1_prompt_update;${PROMPT_COMMAND:-:}"
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
_kube_ps1_color_fg() {
|
||||
local KUBE_PS1_FG_CODE
|
||||
local _KUBE_PS1_FG_CODE
|
||||
case "${1}" in
|
||||
black) KUBE_PS1_FG_CODE=0;;
|
||||
red) KUBE_PS1_FG_CODE=1;;
|
||||
green) KUBE_PS1_FG_CODE=2;;
|
||||
yellow) KUBE_PS1_FG_CODE=3;;
|
||||
blue) KUBE_PS1_FG_CODE=4;;
|
||||
magenta) KUBE_PS1_FG_CODE=5;;
|
||||
cyan) KUBE_PS1_FG_CODE=6;;
|
||||
white) KUBE_PS1_FG_CODE=7;;
|
||||
black) _KUBE_PS1_FG_CODE=0;;
|
||||
red) _KUBE_PS1_FG_CODE=1;;
|
||||
green) _KUBE_PS1_FG_CODE=2;;
|
||||
yellow) _KUBE_PS1_FG_CODE=3;;
|
||||
blue) _KUBE_PS1_FG_CODE=4;;
|
||||
magenta) _KUBE_PS1_FG_CODE=5;;
|
||||
cyan) _KUBE_PS1_FG_CODE=6;;
|
||||
white) _KUBE_PS1_FG_CODE=7;;
|
||||
# 256
|
||||
[0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-6]) KUBE_PS1_FG_CODE="${1}";;
|
||||
*) KUBE_PS1_FG_CODE=default
|
||||
[0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-6]) _KUBE_PS1_FG_CODE="${1}";;
|
||||
*) _KUBE_PS1_FG_CODE=default
|
||||
esac
|
||||
|
||||
if [[ "${KUBE_PS1_FG_CODE}" == "default" ]]; then
|
||||
KUBE_PS1_FG_CODE="${_KUBE_PS1_DEFAULT_FG}"
|
||||
if [[ "${_KUBE_PS1_FG_CODE}" == "default" ]]; then
|
||||
_KUBE_PS1_FG_CODE="${_KUBE_PS1_DEFAULT_FG}"
|
||||
return
|
||||
elif [[ "${KUBE_PS1_SHELL}" == "zsh" ]]; then
|
||||
KUBE_PS1_FG_CODE="%F{$KUBE_PS1_FG_CODE}"
|
||||
elif [[ "${KUBE_PS1_SHELL}" == "bash" ]]; then
|
||||
elif [[ "$(_kube_ps1_shell_type)" == "zsh" ]]; then
|
||||
_KUBE_PS1_FG_CODE="%F{$_KUBE_PS1_FG_CODE}"
|
||||
elif [[ "$(_kube_ps1_shell_type)" == "bash" ]]; then
|
||||
if tput setaf 1 &> /dev/null; then
|
||||
KUBE_PS1_FG_CODE="$(tput setaf ${KUBE_PS1_FG_CODE})"
|
||||
elif [[ $KUBE_PS1_FG_CODE -ge 0 ]] && [[ $KUBE_PS1_FG_CODE -le 256 ]]; then
|
||||
KUBE_PS1_FG_CODE="\033[38;5;${KUBE_PS1_FG_CODE}m"
|
||||
_KUBE_PS1_FG_CODE="$(tput setaf "${_KUBE_PS1_FG_CODE}")"
|
||||
elif [[ $_KUBE_PS1_FG_CODE -ge 0 ]] && [[ $_KUBE_PS1_FG_CODE -le 256 ]]; then
|
||||
_KUBE_PS1_FG_CODE="\033[38;5;${_KUBE_PS1_FG_CODE}m"
|
||||
else
|
||||
KUBE_PS1_FG_CODE="${_KUBE_PS1_DEFAULT_FG}"
|
||||
_KUBE_PS1_FG_CODE="${_KUBE_PS1_DEFAULT_FG}"
|
||||
fi
|
||||
fi
|
||||
echo ${_KUBE_PS1_OPEN_ESC}${KUBE_PS1_FG_CODE}${_KUBE_PS1_CLOSE_ESC}
|
||||
echo "${_KUBE_PS1_OPEN_ESC}${_KUBE_PS1_FG_CODE}${_KUBE_PS1_CLOSE_ESC}"
|
||||
}
|
||||
|
||||
_kube_ps1_color_bg() {
|
||||
local KUBE_PS1_BG_CODE
|
||||
local _KUBE_PS1_BG_CODE
|
||||
case "${1}" in
|
||||
black) KUBE_PS1_BG_CODE=0;;
|
||||
red) KUBE_PS1_BG_CODE=1;;
|
||||
green) KUBE_PS1_BG_CODE=2;;
|
||||
yellow) KUBE_PS1_BG_CODE=3;;
|
||||
blue) KUBE_PS1_BG_CODE=4;;
|
||||
magenta) KUBE_PS1_BG_CODE=5;;
|
||||
cyan) KUBE_PS1_BG_CODE=6;;
|
||||
white) KUBE_PS1_BG_CODE=7;;
|
||||
black) _KUBE_PS1_BG_CODE=0;;
|
||||
red) _KUBE_PS1_BG_CODE=1;;
|
||||
green) _KUBE_PS1_BG_CODE=2;;
|
||||
yellow) _KUBE_PS1_BG_CODE=3;;
|
||||
blue) _KUBE_PS1_BG_CODE=4;;
|
||||
magenta) _KUBE_PS1_BG_CODE=5;;
|
||||
cyan) _KUBE_PS1_BG_CODE=6;;
|
||||
white) _KUBE_PS1_BG_CODE=7;;
|
||||
# 256
|
||||
[0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-6]) KUBE_PS1_BG_CODE="${1}";;
|
||||
*) KUBE_PS1_BG_CODE=$'\033[0m';;
|
||||
[0-9]|[1-9][0-9]|[1][0-9][0-9]|[2][0-4][0-9]|[2][5][0-6]) _KUBE_PS1_BG_CODE="${1}";;
|
||||
*) _KUBE_PS1_BG_CODE=$'\033[0m';;
|
||||
esac
|
||||
|
||||
if [[ "${KUBE_PS1_BG_CODE}" == "default" ]]; then
|
||||
KUBE_PS1_FG_CODE="${_KUBE_PS1_DEFAULT_BG}"
|
||||
if [[ "${_KUBE_PS1_BG_CODE}" == "default" ]]; then
|
||||
_KUBE_PS1_FG_CODE="${_KUBE_PS1_DEFAULT_BG}"
|
||||
return
|
||||
elif [[ "${KUBE_PS1_SHELL}" == "zsh" ]]; then
|
||||
KUBE_PS1_BG_CODE="%K{$KUBE_PS1_BG_CODE}"
|
||||
elif [[ "${KUBE_PS1_SHELL}" == "bash" ]]; then
|
||||
elif [[ "$(_kube_ps1_shell_type)" == "zsh" ]]; then
|
||||
_KUBE_PS1_BG_CODE="%K{$_KUBE_PS1_BG_CODE}"
|
||||
elif [[ "$(_kube_ps1_shell_type)" == "bash" ]]; then
|
||||
if tput setaf 1 &> /dev/null; then
|
||||
KUBE_PS1_BG_CODE="$(tput setab ${KUBE_PS1_BG_CODE})"
|
||||
elif [[ $KUBE_PS1_BG_CODE -ge 0 ]] && [[ $KUBE_PS1_BG_CODE -le 256 ]]; then
|
||||
KUBE_PS1_BG_CODE="\033[48;5;${KUBE_PS1_BG_CODE}m"
|
||||
_KUBE_PS1_BG_CODE="$(tput setab "${_KUBE_PS1_BG_CODE}")"
|
||||
elif [[ $_KUBE_PS1_BG_CODE -ge 0 ]] && [[ $_KUBE_PS1_BG_CODE -le 256 ]]; then
|
||||
_KUBE_PS1_BG_CODE="\033[48;5;${_KUBE_PS1_BG_CODE}m"
|
||||
else
|
||||
KUBE_PS1_BG_CODE="${DEFAULT_BG}"
|
||||
_KUBE_PS1_BG_CODE="${DEFAULT_BG}"
|
||||
fi
|
||||
fi
|
||||
echo ${OPEN_ESC}${KUBE_PS1_BG_CODE}${CLOSE_ESC}
|
||||
echo "${_KUBE_PS1_OPEN_ESC}${_KUBE_PS1_BG_CODE}${_KUBE_PS1_CLOSE_ESC}"
|
||||
}
|
||||
|
||||
_kube_ps1_binary_check() {
|
||||
@@ -149,38 +148,60 @@ _kube_ps1_binary_check() {
|
||||
}
|
||||
|
||||
_kube_ps1_symbol() {
|
||||
# Exit early if symbol display is disabled
|
||||
[[ "${KUBE_PS1_SYMBOL_ENABLE}" == false ]] && return
|
||||
|
||||
case "${KUBE_PS1_SHELL}" in
|
||||
bash)
|
||||
if ((BASH_VERSINFO[0] >= 4)) && [[ $'\u2388' != "\\u2388" ]]; then
|
||||
KUBE_PS1_SYMBOL="${KUBE_PS1_SYMBOL_DEFAULT}"
|
||||
KUBE_PS1_SYMBOL_IMG=$'\u2638\ufe0f'
|
||||
else
|
||||
KUBE_PS1_SYMBOL=$'\xE2\x8E\x88'
|
||||
KUBE_PS1_SYMBOL_IMG=$'\xE2\x98\xB8'
|
||||
fi
|
||||
local symbol_arg="${KUBE_PS1_SYMBOL_CUSTOM}"
|
||||
|
||||
local symbol=""
|
||||
local symbol_default=$'\u2388'
|
||||
local symbol_img="☸️"
|
||||
local k8s_glyph=$'\Uf10fe'
|
||||
local k8s_symbol_color=blue
|
||||
local oc_glyph=$'\ue7b7'
|
||||
local oc_symbol_color=red
|
||||
local custom_symbol_color="${KUBE_PS1_SYMBOL_COLOR:-$k8s_symbol_color}"
|
||||
|
||||
# Choose the symbol based on the provided argument or environment variable
|
||||
case "${symbol_arg}" in
|
||||
"img")
|
||||
symbol="${symbol_img}"
|
||||
;;
|
||||
"k8s")
|
||||
symbol="$(_kube_ps1_color_fg "${custom_symbol_color}")${k8s_glyph}${KUBE_PS1_RESET_COLOR}"
|
||||
;;
|
||||
"oc")
|
||||
symbol="$(_kube_ps1_color_fg ${oc_symbol_color})${oc_glyph}${KUBE_PS1_RESET_COLOR}"
|
||||
;;
|
||||
zsh)
|
||||
KUBE_PS1_SYMBOL="${KUBE_PS1_SYMBOL_DEFAULT}"
|
||||
KUBE_PS1_SYMBOL_IMG="\u2638";;
|
||||
*)
|
||||
KUBE_PS1_SYMBOL="k8s"
|
||||
case "$(_kube_ps1_shell_type)" in
|
||||
bash)
|
||||
if ((BASH_VERSINFO[0] >= 4)) && [[ $'\u2388' != "\\u2388" ]]; then
|
||||
symbol="$(_kube_ps1_color_fg $custom_symbol_color)${symbol_default}${KUBE_PS1_RESET_COLOR}"
|
||||
symbol_img=$'\u2638\ufe0f'
|
||||
else
|
||||
symbol=$'\xE2\x8E\x88'
|
||||
symbol_img=$'\xE2\x98\xB8'
|
||||
fi
|
||||
;;
|
||||
zsh)
|
||||
symbol="$(_kube_ps1_color_fg $custom_symbol_color)${symbol_default}${KUBE_PS1_RESET_COLOR}"
|
||||
symbol_img="☸️"
|
||||
;;
|
||||
*)
|
||||
symbol="k8s"
|
||||
esac
|
||||
esac
|
||||
|
||||
if [[ "${KUBE_PS1_SYMBOL_USE_IMG}" == true ]]; then
|
||||
KUBE_PS1_SYMBOL="${KUBE_PS1_SYMBOL_IMG}"
|
||||
fi
|
||||
|
||||
# Append padding if enabled
|
||||
if [[ "${KUBE_PS1_SYMBOL_PADDING}" == true ]]; then
|
||||
echo "${KUBE_PS1_SYMBOL} "
|
||||
echo "${symbol} "
|
||||
else
|
||||
echo "${KUBE_PS1_SYMBOL}"
|
||||
echo "${symbol}"
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
_kube_ps1_split() {
|
||||
_kube_ps1_split_config() {
|
||||
type setopt >/dev/null 2>&1 && setopt SH_WORD_SPLIT
|
||||
local IFS=$1
|
||||
echo $2
|
||||
@@ -191,32 +212,21 @@ _kube_ps1_file_newer_than() {
|
||||
local file=$1
|
||||
local check_time=$2
|
||||
|
||||
if [[ "${KUBE_PS1_KUBECONFIG_SYMLINK}" == "true" ]]; then
|
||||
if [[ "${KUBE_PS1_SHELL}" == "zsh" ]]; then
|
||||
mtime=$(zstat -L +mtime "${file}")
|
||||
elif stat -c "%s" /dev/null &> /dev/null; then
|
||||
# GNU stat
|
||||
mtime=$(stat -c %Y "${file}")
|
||||
else
|
||||
# BSD stat
|
||||
mtime=$(stat -f %m "$file")
|
||||
fi
|
||||
if [[ "$(_kube_ps1_shell_type)" == "zsh" ]]; then
|
||||
# Use zstat '-F %s.%s' to make it compatible with low zsh version (eg: 5.0.2)
|
||||
mtime=$(zstat -L +mtime -F %s.%s "${file}")
|
||||
elif stat -c "%s" /dev/null &> /dev/null; then
|
||||
# GNU stat
|
||||
mtime=$(stat -L -c %Y "${file}")
|
||||
else
|
||||
if [[ "${KUBE_PS1_SHELL}" == "zsh" ]]; then
|
||||
mtime=$(zstat +mtime "${file}")
|
||||
elif stat -c "%s" /dev/null &> /dev/null; then
|
||||
# GNU stat
|
||||
mtime=$(stat -L -c %Y "${file}")
|
||||
else
|
||||
# BSD stat
|
||||
mtime=$(stat -L -f %m "$file")
|
||||
fi
|
||||
# BSD stat
|
||||
mtime=$(stat -L -f %m "$file")
|
||||
fi
|
||||
|
||||
[[ "${mtime}" -gt "${check_time}" ]]
|
||||
}
|
||||
|
||||
_kube_ps1_update_cache() {
|
||||
_kube_ps1_prompt_update() {
|
||||
local return_code=$?
|
||||
|
||||
[[ "${KUBE_PS1_ENABLED}" == "off" ]] && return $return_code
|
||||
@@ -225,27 +235,35 @@ _kube_ps1_update_cache() {
|
||||
# No ability to fetch context/namespace; display N/A.
|
||||
KUBE_PS1_CONTEXT="BINARY-N/A"
|
||||
KUBE_PS1_NAMESPACE="N/A"
|
||||
return
|
||||
return $return_code
|
||||
fi
|
||||
|
||||
if [[ "${KUBECONFIG}" != "${KUBE_PS1_KUBECONFIG_CACHE}" ]]; then
|
||||
if [[ "${KUBECONFIG}" != "${_KUBE_PS1_KUBECONFIG_CACHE}" ]]; then
|
||||
# User changed KUBECONFIG; unconditionally refetch.
|
||||
KUBE_PS1_KUBECONFIG_CACHE=${KUBECONFIG}
|
||||
_KUBE_PS1_KUBECONFIG_CACHE=${KUBECONFIG}
|
||||
_kube_ps1_get_context_ns
|
||||
return
|
||||
return $return_code
|
||||
fi
|
||||
|
||||
# kubectl will read the environment variable $KUBECONFIG
|
||||
# otherwise set it to ~/.kube/config
|
||||
local conf
|
||||
for conf in $(_kube_ps1_split : "${KUBECONFIG:-${HOME}/.kube/config}"); do
|
||||
local config_file_cache
|
||||
|
||||
for conf in $(_kube_ps1_split_config : "${KUBECONFIG:-${HOME}/.kube/config}"); do
|
||||
[[ -r "${conf}" ]] || continue
|
||||
if _kube_ps1_file_newer_than "${conf}" "${KUBE_PS1_LAST_TIME}"; then
|
||||
config_file_cache+=":${conf}"
|
||||
if _kube_ps1_file_newer_than "${conf}" "${_KUBE_PS1_LAST_TIME}"; then
|
||||
_kube_ps1_get_context_ns
|
||||
return
|
||||
return $return_code
|
||||
fi
|
||||
done
|
||||
|
||||
if [[ "${config_file_cache}" != "${_KUBE_PS1_CFGFILES_READ_CACHE}" ]]; then
|
||||
_kube_ps1_get_context_ns
|
||||
return $return_code
|
||||
fi
|
||||
|
||||
return $return_code
|
||||
}
|
||||
|
||||
@@ -255,8 +273,8 @@ _kube_ps1_get_context() {
|
||||
# Set namespace to 'N/A' if it is not defined
|
||||
KUBE_PS1_CONTEXT="${KUBE_PS1_CONTEXT:-N/A}"
|
||||
|
||||
if [[ ! -z "${KUBE_PS1_CLUSTER_FUNCTION}" ]]; then
|
||||
KUBE_PS1_CONTEXT=$($KUBE_PS1_CLUSTER_FUNCTION $KUBE_PS1_CONTEXT)
|
||||
if [[ -n "${KUBE_PS1_CLUSTER_FUNCTION}" ]]; then
|
||||
KUBE_PS1_CONTEXT="$("${KUBE_PS1_CLUSTER_FUNCTION}" "${KUBE_PS1_CONTEXT}")"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
@@ -264,27 +282,36 @@ _kube_ps1_get_context() {
|
||||
_kube_ps1_get_ns() {
|
||||
if [[ "${KUBE_PS1_NS_ENABLE}" == true ]]; then
|
||||
KUBE_PS1_NAMESPACE="$(${KUBE_PS1_BINARY} config view --minify --output 'jsonpath={..namespace}' 2>/dev/null)"
|
||||
# Set namespace to 'default' if it is not defined
|
||||
KUBE_PS1_NAMESPACE="${KUBE_PS1_NAMESPACE:-default}"
|
||||
KUBE_PS1_NAMESPACE="${KUBE_PS1_NAMESPACE:-N/A}"
|
||||
|
||||
if [[ ! -z "${KUBE_PS1_NAMESPACE_FUNCTION}" ]]; then
|
||||
KUBE_PS1_NAMESPACE=$($KUBE_PS1_NAMESPACE_FUNCTION $KUBE_PS1_NAMESPACE)
|
||||
if [[ -n "${KUBE_PS1_NAMESPACE_FUNCTION}" ]]; then
|
||||
KUBE_PS1_NAMESPACE="$("${KUBE_PS1_NAMESPACE_FUNCTION}" "${KUBE_PS1_NAMESPACE}")"
|
||||
fi
|
||||
fi
|
||||
}
|
||||
|
||||
_kube_ps1_get_context_ns() {
|
||||
# Set the command time
|
||||
if [[ "${KUBE_PS1_SHELL}" == "bash" ]]; then
|
||||
if [[ "$(_kube_ps1_shell_type)" == "bash" ]]; then
|
||||
if ((BASH_VERSINFO[0] >= 4 && BASH_VERSINFO[1] >= 2)); then
|
||||
KUBE_PS1_LAST_TIME=$(printf '%(%s)T')
|
||||
_KUBE_PS1_LAST_TIME=$(printf '%(%s)T')
|
||||
else
|
||||
KUBE_PS1_LAST_TIME=$(date +%s)
|
||||
_KUBE_PS1_LAST_TIME=$(date +%s)
|
||||
fi
|
||||
elif [[ "${KUBE_PS1_SHELL}" == "zsh" ]]; then
|
||||
KUBE_PS1_LAST_TIME=$EPOCHSECONDS
|
||||
elif [[ "$(_kube_ps1_shell_type)" == "zsh" ]]; then
|
||||
_KUBE_PS1_LAST_TIME=$EPOCHREALTIME
|
||||
fi
|
||||
|
||||
KUBE_PS1_CONTEXT="${KUBE_PS1_CONTEXT:-N/A}"
|
||||
KUBE_PS1_NAMESPACE="${KUBE_PS1_NAMESPACE:-N/A}"
|
||||
|
||||
# Cache which cfgfiles we can read in case they change.
|
||||
local conf
|
||||
_KUBE_PS1_CFGFILES_READ_CACHE=
|
||||
for conf in $(_kube_ps1_split_config : "${KUBECONFIG:-${HOME}/.kube/config}"); do
|
||||
[[ -r $conf ]] && _KUBE_PS1_CFGFILES_READ_CACHE+=":$conf"
|
||||
done
|
||||
|
||||
_kube_ps1_get_context
|
||||
_kube_ps1_get_ns
|
||||
}
|
||||
@@ -298,7 +325,7 @@ Toggle kube-ps1 prompt on
|
||||
|
||||
Usage: kubeon [-g | --global] [-h | --help]
|
||||
|
||||
With no arguments, turn off kube-ps1 status for this shell instance (default).
|
||||
With no arguments, turn oon kube-ps1 status for this shell instance (default).
|
||||
|
||||
-g --global turn on kube-ps1 status globally
|
||||
-h --help print this message
|
||||
@@ -322,7 +349,7 @@ kubeon() {
|
||||
if [[ "${1}" == '-h' || "${1}" == '--help' ]]; then
|
||||
_kubeon_usage
|
||||
elif [[ "${1}" == '-g' || "${1}" == '--global' ]]; then
|
||||
rm -f -- "${KUBE_PS1_DISABLE_PATH}"
|
||||
rm -f -- "${_KUBE_PS1_DISABLE_PATH}"
|
||||
elif [[ "$#" -ne 0 ]]; then
|
||||
echo -e "error: unrecognized flag ${1}\\n"
|
||||
_kubeon_usage
|
||||
@@ -336,8 +363,8 @@ kubeoff() {
|
||||
if [[ "${1}" == '-h' || "${1}" == '--help' ]]; then
|
||||
_kubeoff_usage
|
||||
elif [[ "${1}" == '-g' || "${1}" == '--global' ]]; then
|
||||
mkdir -p -- "$(dirname "${KUBE_PS1_DISABLE_PATH}")"
|
||||
touch -- "${KUBE_PS1_DISABLE_PATH}"
|
||||
mkdir -p -- "$(dirname "${_KUBE_PS1_DISABLE_PATH}")"
|
||||
touch -- "${_KUBE_PS1_DISABLE_PATH}"
|
||||
elif [[ $# -ne 0 ]]; then
|
||||
echo "error: unrecognized flag ${1}" >&2
|
||||
_kubeoff_usage
|
||||
@@ -351,22 +378,29 @@ kubeoff() {
|
||||
kube_ps1() {
|
||||
[[ "${KUBE_PS1_ENABLED}" == "off" ]] && return
|
||||
[[ -z "${KUBE_PS1_CONTEXT}" ]] && [[ "${KUBE_PS1_CONTEXT_ENABLE}" == true ]] && return
|
||||
[[ "${KUBE_PS1_CONTEXT}" == "N/A" ]] && [[ ${KUBE_PS1_HIDE_IF_NOCONTEXT} == true ]] && return
|
||||
|
||||
|
||||
local KUBE_PS1
|
||||
local KUBE_PS1_RESET_COLOR="${_KUBE_PS1_OPEN_ESC}${_KUBE_PS1_DEFAULT_FG}${_KUBE_PS1_CLOSE_ESC}"
|
||||
|
||||
# If background color is set, reset color should also reset the background
|
||||
if [[ -n "${KUBE_PS1_BG_COLOR}" ]]; then
|
||||
KUBE_PS1_RESET_COLOR="${_KUBE_PS1_OPEN_ESC}${_KUBE_PS1_DEFAULT_FG}${_KUBE_PS1_DEFAULT_BG}${_KUBE_PS1_CLOSE_ESC}"
|
||||
fi
|
||||
|
||||
# Background Color
|
||||
[[ -n "${KUBE_PS1_BG_COLOR}" ]] && KUBE_PS1+="$(_kube_ps1_color_bg ${KUBE_PS1_BG_COLOR})"
|
||||
[[ -n "${KUBE_PS1_BG_COLOR}" ]] && KUBE_PS1+="$(_kube_ps1_color_bg "${KUBE_PS1_BG_COLOR}")"
|
||||
|
||||
# Prefix
|
||||
if [[ -z "${KUBE_PS1_PREFIX_COLOR:-}" ]] && [[ -n "${KUBE_PS1_PREFIX}" ]]; then
|
||||
KUBE_PS1+="${KUBE_PS1_PREFIX}"
|
||||
else
|
||||
KUBE_PS1+="$(_kube_ps1_color_fg $KUBE_PS1_PREFIX_COLOR)${KUBE_PS1_PREFIX}${KUBE_PS1_RESET_COLOR}"
|
||||
KUBE_PS1+="$(_kube_ps1_color_fg "${KUBE_PS1_PREFIX_COLOR}")${KUBE_PS1_PREFIX}${KUBE_PS1_RESET_COLOR}"
|
||||
fi
|
||||
|
||||
# Symbol
|
||||
KUBE_PS1+="$(_kube_ps1_color_fg $KUBE_PS1_SYMBOL_COLOR)$(_kube_ps1_symbol)${KUBE_PS1_RESET_COLOR}"
|
||||
KUBE_PS1+="$(_kube_ps1_symbol)"
|
||||
|
||||
if [[ -n "${KUBE_PS1_SEPARATOR}" ]] && [[ "${KUBE_PS1_SYMBOL_ENABLE}" == true ]]; then
|
||||
KUBE_PS1+="${KUBE_PS1_SEPARATOR}"
|
||||
@@ -374,7 +408,14 @@ kube_ps1() {
|
||||
|
||||
# Context
|
||||
if [[ "${KUBE_PS1_CONTEXT_ENABLE}" == true ]]; then
|
||||
KUBE_PS1+="$(_kube_ps1_color_fg $KUBE_PS1_CTX_COLOR)${KUBE_PS1_CONTEXT}${KUBE_PS1_RESET_COLOR}"
|
||||
local ctx_color="${KUBE_PS1_CTX_COLOR:-red}"
|
||||
|
||||
# Allow custom function to override color based on context
|
||||
if [[ -n "${KUBE_PS1_CTX_COLOR_FUNCTION}" ]]; then
|
||||
ctx_color="$("${KUBE_PS1_CTX_COLOR_FUNCTION}" "${KUBE_PS1_CONTEXT}")"
|
||||
fi
|
||||
|
||||
KUBE_PS1+="$(_kube_ps1_color_fg "${ctx_color}")${KUBE_PS1_CONTEXT}${KUBE_PS1_RESET_COLOR}"
|
||||
fi
|
||||
|
||||
# Namespace
|
||||
@@ -382,14 +423,14 @@ kube_ps1() {
|
||||
if [[ -n "${KUBE_PS1_DIVIDER}" ]] && [[ "${KUBE_PS1_CONTEXT_ENABLE}" == true ]]; then
|
||||
KUBE_PS1+="${KUBE_PS1_DIVIDER}"
|
||||
fi
|
||||
KUBE_PS1+="$(_kube_ps1_color_fg ${KUBE_PS1_NS_COLOR})${KUBE_PS1_NAMESPACE}${KUBE_PS1_RESET_COLOR}"
|
||||
KUBE_PS1+="$(_kube_ps1_color_fg "${KUBE_PS1_NS_COLOR:-cyan}")${KUBE_PS1_NAMESPACE}${KUBE_PS1_RESET_COLOR}"
|
||||
fi
|
||||
|
||||
# Suffix
|
||||
if [[ -z "${KUBE_PS1_SUFFIX_COLOR:-}" ]] && [[ -n "${KUBE_PS1_SUFFIX}" ]]; then
|
||||
KUBE_PS1+="${KUBE_PS1_SUFFIX}"
|
||||
else
|
||||
KUBE_PS1+="$(_kube_ps1_color_fg $KUBE_PS1_SUFFIX_COLOR)${KUBE_PS1_SUFFIX}${KUBE_PS1_RESET_COLOR}"
|
||||
KUBE_PS1+="$(_kube_ps1_color_fg "${KUBE_PS1_SUFFIX_COLOR}")${KUBE_PS1_SUFFIX}${KUBE_PS1_RESET_COLOR}"
|
||||
fi
|
||||
|
||||
# Close Background color if defined
|
||||
|
||||
Reference in New Issue
Block a user