diff --git a/cmd/root.go b/cmd/root.go index 6429d980..8a1045a6 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -28,6 +28,7 @@ var ( version, commit, date = "dev", "dev", "n/a" k9sFlags *config.Flags k8sFlags *genericclioptions.ConfigFlags + demoMode = new(bool) rootCmd = &cobra.Command{ Use: appName, @@ -38,8 +39,8 @@ var ( ) func init() { - const falseFlag = "false" rootCmd.AddCommand(versionCmd(), infoCmd()) + initTransientFlags() initK9sFlags() initK8sFlags() @@ -51,10 +52,10 @@ func init() { if err := flag.Set("stderrthreshold", "fatal"); err != nil { log.Error().Err(err) } - if err := flag.Set("alsologtostderr", falseFlag); err != nil { + if err := flag.Set("alsologtostderr", "false"); err != nil { log.Error().Err(err) } - if err := flag.Set("logtostderr", falseFlag); err != nil { + if err := flag.Set("logtostderr", "false"); err != nil { log.Error().Err(err) } } @@ -105,6 +106,10 @@ func loadConfiguration() *config.Config { log.Warn().Msg("Unable to locate K9s config. Generating new configuration...") } + log.Debug().Msgf("DEMO MODE %#v", demoMode) + if demoMode != nil { + k9sCfg.SetDemoMode(*demoMode) + } if *k9sFlags.RefreshRate != config.DefaultRefreshRate { k9sCfg.K9s.OverrideRefreshRate(*k9sFlags.RefreshRate) } @@ -161,6 +166,15 @@ func parseLevel(level string) zerolog.Level { } } +func initTransientFlags() { + rootCmd.Flags().BoolVar( + demoMode, + "demo", + false, + "Enable demo mode to show keyboard commands", + ) +} + func initK9sFlags() { k9sFlags = config.NewFlags() rootCmd.Flags().IntVarP( diff --git a/internal/client/gvr.go b/internal/client/gvr.go index fe1898e2..0c49b652 100644 --- a/internal/client/gvr.go +++ b/internal/client/gvr.go @@ -79,7 +79,16 @@ func (g GVR) GV() schema.GroupVersion { } } -// GVR returns a a full schema representation. +// GVK returns a full schema representation. +func (g GVR) GVK() schema.GroupVersionKind { + return schema.GroupVersionKind{ + Group: g.G(), + Version: g.V(), + Kind: g.R(), + } +} + +// GVR returns a full schema representation. func (g GVR) GVR() schema.GroupVersionResource { return schema.GroupVersionResource{ Group: g.G(), @@ -88,7 +97,7 @@ func (g GVR) GVR() schema.GroupVersionResource { } } -// GR returns a a full schema representation. +// GR returns a full schema representation. func (g GVR) GR() *schema.GroupResource { return &schema.GroupResource{ Group: g.G(), diff --git a/internal/client/metrics.go b/internal/client/metrics.go index dcc30091..0d66f00a 100644 --- a/internal/client/metrics.go +++ b/internal/client/metrics.go @@ -206,15 +206,12 @@ func (m *MetricsServer) FetchPodMetrics(fqn string) (*mv1beta1.PodMetrics, error return mx, err } - var key = FQN(ns, "pods") - if entry, ok := m.cache.Get(key); ok { - if list, ok := entry.(*mv1beta1.PodMetricsList); ok && list != nil { - for _, m := range list.Items { - if FQN(m.Namespace, m.Name) == fqn { - return &m, nil - } - } + if entry, ok := m.cache.Get(fqn); ok { + pmx, ok := entry.(*mv1beta1.PodMetrics) + if !ok { + return nil, fmt.Errorf("expecting podmetrics but got %T", entry) } + return pmx, nil } client, err := m.MXDial() @@ -225,7 +222,7 @@ func (m *MetricsServer) FetchPodMetrics(fqn string) (*mv1beta1.PodMetrics, error if err != nil { return mx, err } - m.cache.Add(key, mx, mxCacheExpiry) + m.cache.Add(fqn, mx, mxCacheExpiry) return mx, nil } diff --git a/internal/config/config.go b/internal/config/config.go index e2ebb4b7..e06fef6c 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -49,6 +49,7 @@ type ( K9s *K9s `yaml:"k9s"` client client.Connection settings KubeSettings + demoMode bool } ) @@ -57,6 +58,16 @@ func NewConfig(ks KubeSettings) *Config { return &Config{K9s: NewK9s(), settings: ks} } +// DemoMode returns true if demo mode is active, false otherwise. +func (c *Config) DemoMode() bool { + return c.demoMode +} + +// SetDemoMode sets the demo mode. +func (c *Config) SetDemoMode(b bool) { + c.demoMode = b +} + // Refine the configuration based on cli args. func (c *Config) Refine(flags *genericclioptions.ConfigFlags) error { cfg, err := flags.ToRawKubeConfigLoader().RawConfig() diff --git a/internal/dao/node.go b/internal/dao/node.go index 27628b7b..5ea1cfae 100644 --- a/internal/dao/node.go +++ b/internal/dao/node.go @@ -3,6 +3,7 @@ package dao import ( "context" "fmt" + "io" "github.com/derailed/k9s/internal" "github.com/derailed/k9s/internal/client" @@ -12,11 +13,15 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/client-go/kubernetes" + "k8s.io/kubectl/pkg/drain" + "k8s.io/kubectl/pkg/scheme" mv1beta1 "k8s.io/metrics/pkg/apis/metrics/v1beta1" ) var ( - _ Accessor = (*Node)(nil) + _ Accessor = (*Node)(nil) + _ NodeMaintainer = (*Node)(nil) ) // NodeMetricsFunc retrieves node metrics. @@ -27,6 +32,75 @@ type Node struct { Resource } +// ToggleCordon toggles cordon/uncordon a node. +func (n *Node) ToggleCordon(path string, cordon bool) error { + o, err := n.Get(context.Background(), path) + if err != nil { + return err + } + + h, err := drain.NewCordonHelperFromRuntimeObject(o, scheme.Scheme, n.gvr.GVK()) + if err != nil { + return err + } + + if !h.UpdateIfRequired(cordon) { + if cordon { + return fmt.Errorf("node is already cordoned") + } + return fmt.Errorf("node is already uncordoned") + } + err, patchErr := h.PatchOrReplace(n.Factory.Client().DialOrDie()) + if patchErr != nil { + return patchErr + } + if err != nil { + return err + } + + return nil +} + +func (o DrainOptions) toDrainHelper(k kubernetes.Interface, w io.Writer) drain.Helper { + return drain.Helper{ + Client: k, + GracePeriodSeconds: o.GracePeriodSeconds, + Timeout: o.Timeout, + DeleteLocalData: o.DeleteLocalData, + IgnoreAllDaemonSets: o.IgnoreAllDaemonSets, + Out: w, + ErrOut: w, + } +} + +// Drain drains a node. +func (n *Node) Drain(path string, opts DrainOptions, w io.Writer) error { + _ = n.ToggleCordon(path, true) + + h := opts.toDrainHelper(n.Factory.Client().DialOrDie(), w) + dd, errs := h.GetPodsForDeletion(path) + if len(errs) != 0 { + for _, e := range errs { + if _, err := h.ErrOut.Write([]byte(e.Error() + "\n")); err != nil { + return err + } + } + return errs[0] + } + + if err := h.DeleteOrEvictPods(dd.Pods()); err != nil { + return err + } + fmt.Fprintf(h.Out, "Node %s drained!", path) + + return nil +} + +// Get returns a node resource. +func (n *Node) Get(_ context.Context, path string) (runtime.Object, error) { + return FetchNode(n.Factory, path) +} + // List returns a collection of node resources. func (n *Node) List(ctx context.Context, ns string) ([]runtime.Object, error) { labels, ok := ctx.Value(internal.KeyLabels).(string) @@ -66,15 +140,27 @@ func (n *Node) List(ctx context.Context, ns string) ([]runtime.Object, error) { // ---------------------------------------------------------------------------- // Helpers... -// FetchNodes retrieves all nodes. -func FetchNodes(f Factory, labelsSel string) (*v1.NodeList, error) { - var list v1.NodeList - auth, err := f.Client().CanI("", "v1/nodes", []string{client.ListVerb}) +// FetchNode retrieves a node. +func FetchNode(f Factory, path string) (*v1.Node, error) { + auth, err := f.Client().CanI("", "v1/nodes", []string{"get"}) if err != nil { - return &list, err + return nil, err } if !auth { - return &list, fmt.Errorf("user is not authorized to list nodes") + return nil, fmt.Errorf("user is not authorized to list nodes") + } + + return f.Client().DialOrDie().CoreV1().Nodes().Get(path, metav1.GetOptions{}) +} + +// FetchNodes retrieves all nodes. +func FetchNodes(f Factory, labelsSel string) (*v1.NodeList, error) { + auth, err := f.Client().CanI("", "v1/nodes", []string{client.ListVerb}) + if err != nil { + return nil, err + } + if !auth { + return nil, fmt.Errorf("user is not authorized to list nodes") } return f.Client().DialOrDie().CoreV1().Nodes().List(metav1.ListOptions{ diff --git a/internal/dao/pod.go b/internal/dao/pod.go index de561f43..16eba902 100644 --- a/internal/dao/pod.go +++ b/internal/dao/pod.go @@ -227,7 +227,7 @@ func tailLogs(ctx context.Context, logger Logger, c chan<- []byte, opts LogOptio Container: opts.Container, Follow: true, TailLines: &opts.Lines, - Timestamps: opts.ShowTimestamp, + Timestamps: false, Previous: opts.Previous, } req, err := logger.Logs(opts.Path, &o) diff --git a/internal/dao/registry.go b/internal/dao/registry.go index c3f1975d..2486f550 100644 --- a/internal/dao/registry.go +++ b/internal/dao/registry.go @@ -40,6 +40,7 @@ func AccessorFor(f Factory, gvr client.GVR) (Accessor, error) { client.NewGVR("portforwards"): &PortForward{}, client.NewGVR("v1/services"): &Service{}, client.NewGVR("v1/pods"): &Pod{}, + client.NewGVR("v1/nodes"): &Node{}, client.NewGVR("apps/v1/deployments"): &Deployment{}, client.NewGVR("apps/v1/daemonsets"): &DaemonSet{}, client.NewGVR("extensions/v1beta1/daemonsets"): &DaemonSet{}, diff --git a/internal/dao/types.go b/internal/dao/types.go index ccddbb8e..0a62f0f7 100644 --- a/internal/dao/types.go +++ b/internal/dao/types.go @@ -2,6 +2,8 @@ package dao import ( "context" + "io" + "time" "github.com/derailed/k9s/internal/client" "github.com/derailed/k9s/internal/watch" @@ -70,6 +72,24 @@ type Accessor interface { GVR() string } +// DrainOptions tracks drain attributes. +type DrainOptions struct { + GracePeriodSeconds int + Timeout time.Duration + IgnoreAllDaemonSets bool + DeleteLocalData bool + Force bool +} + +// NodeMaintainer performs node maintenance operations. +type NodeMaintainer interface { + // ToggleCordon toggles cordon/uncordon a node. + ToggleCordon(path string, cordon bool) error + + // Drain drains the given node. + Drain(path string, opts DrainOptions, w io.Writer) error +} + // Loggable represents resources with logs. type Loggable interface { // TaiLogs streams resource logs. diff --git a/internal/model/log.go b/internal/model/log.go index 8ffee8d7..14e22632 100644 --- a/internal/model/log.go +++ b/internal/model/log.go @@ -275,7 +275,6 @@ func applyFilter(q string, lines []string) ([]string, error) { } func (l *Log) fireLogBuffChanged(lines []string) { - log.Debug().Msgf("FIRE-BUFF-CHNGED") filtered, err := applyFilter(l.filter, lines) if err != nil { l.fireLogError(err) @@ -307,7 +306,7 @@ func (l *Log) fireLogCleared() { // ---------------------------------------------------------------------------- // Helpers... -// BOZO!! Log timestamps. +// BOZO!! // func showTimes(lines []string, show bool) []string { // filtered := make([]string, 0, len(lines)) // for _, l := range lines { diff --git a/internal/model/table.go b/internal/model/table.go index d6f72ad5..3d06edc3 100644 --- a/internal/model/table.go +++ b/internal/model/table.go @@ -224,6 +224,10 @@ func (t *Table) list(ctx context.Context, a dao.Accessor) ([]runtime.Object, err } func (t *Table) reconcile(ctx context.Context) error { + defer func(ti time.Time) { + log.Debug().Msgf("Elapsed %v %v", t.gvr, time.Since(ti)) + }(time.Now()) + meta := t.resourceMeta() var ( oo []runtime.Object diff --git a/internal/render/node.go b/internal/render/node.go index 77c9b397..bf0a3d67 100644 --- a/internal/render/node.go +++ b/internal/render/node.go @@ -107,13 +107,25 @@ func (Node) diagnose(ss []string) error { if len(ss) == 0 { return nil } + + var ready bool for _, s := range ss { + if s == "" { + continue + } + if s == "SchedulingDisabled" { + return errors.New("node is cordoned") + } if s == "Ready" { - return nil + ready = true } } - return errors.New("node is not ready") + if !ready { + return errors.New("node is not ready") + } + + return nil } // ---------------------------------------------------------------------------- diff --git a/internal/ui/dialog/confirm.go b/internal/ui/dialog/confirm.go index 315496c2..cc269cf1 100644 --- a/internal/ui/dialog/confirm.go +++ b/internal/ui/dialog/confirm.go @@ -31,7 +31,7 @@ func ShowConfirm(pages *ui.Pages, title, msg string, ack confirmFunc, cancel can cancel() }) - modal := tview.NewModalForm(" <"+title+"> ", f) + modal := tview.NewModalForm("<"+title+">", f) modal.SetText(msg) modal.SetDoneFunc(func(int, string) { dismissConfirm(pages) diff --git a/internal/ui/flash.go b/internal/ui/flash.go index d401fe7e..5bcafcd4 100644 --- a/internal/ui/flash.go +++ b/internal/ui/flash.go @@ -31,6 +31,7 @@ func NewFlash(app *App) *Flash { TextView: tview.NewTextView(), } f.SetTextColor(tcell.ColorAqua) + f.SetDynamicColors(true) f.SetTextAlign(tview.AlignCenter) f.SetBorderPadding(0, 0, 1, 1) f.app.Styles.AddListener(&f) diff --git a/internal/view/app.go b/internal/view/app.go index ac099b95..215752ae 100644 --- a/internal/view/app.go +++ b/internal/view/app.go @@ -104,9 +104,9 @@ func (a *App) Init(version string, rate int) error { main := tview.NewFlex().SetDirection(tview.FlexRow) main.AddItem(a.statusIndicator(), 1, 1, false) + main.AddItem(flash, 1, 1, false) main.AddItem(a.Content, 0, 10, true) main.AddItem(a.Crumbs(), 1, 1, false) - main.AddItem(flash, 1, 1, false) a.Main.AddPage("main", main, true, false) a.Main.AddPage("splash", ui.NewSplash(a.Styles, version), true, true) @@ -116,6 +116,7 @@ func (a *App) Init(version string, rate int) error { } func (a *App) keyboard(evt *tcell.EventKey) *tcell.EventKey { + displayKey(a, a.InCmdMode(), evt) key := evt.Key() if key == tcell.KeyRune { if a.CmdBuff().IsActive() && evt.Modifiers() == tcell.ModNone { @@ -154,7 +155,7 @@ func (a *App) toggleHeader(flag bool) { } if a.showHeader { flex.RemoveItemAtIndex(0) - flex.AddItemAtIndex(0, a.buildHeader(), 8, 1, false) + flex.AddItemAtIndex(0, a.buildHeader(), 7, 1, false) } else { flex.RemoveItemAtIndex(0) flex.AddItemAtIndex(0, a.statusIndicator(), 1, 1, false) diff --git a/internal/view/browser.go b/internal/view/browser.go index cbb72cd7..eaf0e797 100644 --- a/internal/view/browser.go +++ b/internal/view/browser.go @@ -192,7 +192,6 @@ func (b *Browser) resetCmd(evt *tcell.EventKey) *tcell.EventKey { } cmd := b.SearchBuff().String() - b.App().Flash().Info("Clearing filter...") b.SearchBuff().Reset() if ui.IsLabelSelector(cmd) { diff --git a/internal/view/details.go b/internal/view/details.go index a468fa1b..01fd7106 100644 --- a/internal/view/details.go +++ b/internal/view/details.go @@ -128,6 +128,7 @@ func (d *Details) bindKeys() { } func (d *Details) keyboard(evt *tcell.EventKey) *tcell.EventKey { + displayKey(d.app, d.cmdBuff.InCmdMode(), evt) key := evt.Key() if key == tcell.KeyUp || key == tcell.KeyDown { return evt @@ -248,7 +249,6 @@ func (d *Details) activateCmd(evt *tcell.EventKey) *tcell.EventKey { if d.app.InCmdMode() { return evt } - d.app.Flash().Info("Filter mode activated.") d.cmdBuff.SetActive(true) return nil @@ -281,7 +281,6 @@ func (d *Details) resetCmd(evt *tcell.EventKey) *tcell.EventKey { if d.cmdBuff.String() != "" { d.model.ClearFilter() } - d.app.Flash().Info("Clearing filter...") d.cmdBuff.SetActive(false) d.cmdBuff.Reset() d.updateTitle() diff --git a/internal/view/drain_dialog.go b/internal/view/drain_dialog.go new file mode 100644 index 00000000..0df3b0a5 --- /dev/null +++ b/internal/view/drain_dialog.go @@ -0,0 +1,103 @@ +package view + +import ( + "strconv" + "time" + + "github.com/derailed/k9s/internal/dao" + "github.com/derailed/k9s/internal/ui" + "github.com/derailed/tview" +) + +const drainKey = "drain" + +// DrainFunc represents a drain callback function. +type DrainFunc func(v ResourceViewer, path string, opts dao.DrainOptions) + +// ShowDrain pops a node drain dialog. +func ShowDrain(view ResourceViewer, path string, defaults dao.DrainOptions, okFn DrainFunc) { + styles := view.App().Styles + + f := tview.NewForm() + f.SetItemPadding(0) + f.SetButtonsAlign(tview.AlignCenter). + SetButtonBackgroundColor(styles.BgColor()). + SetButtonTextColor(styles.FgColor()). + SetLabelColor(styles.K9s.Info.FgColor.Color()). + SetFieldTextColor(styles.K9s.Info.SectionColor.Color()) + + var opts dao.DrainOptions + f.AddInputField("GracePeriod:", strconv.Itoa(defaults.GracePeriodSeconds), 0, nil, func(v string) { + a, err := asIntOpt(v) + if err != nil { + view.App().Flash().Err(err) + return + } + view.App().Flash().Clear() + opts.GracePeriodSeconds = a + }) + f.AddInputField("Timeout:", defaults.Timeout.String(), 0, nil, func(v string) { + a, err := asDurOpt(v) + if err != nil { + view.App().Flash().Err(err) + return + } + view.App().Flash().Clear() + opts.Timeout = a + }) + f.AddCheckbox("Ignore DaemonSets:", defaults.IgnoreAllDaemonSets, func(v bool) { + opts.IgnoreAllDaemonSets = v + }) + f.AddCheckbox("Delete Local Data:", defaults.DeleteLocalData, func(v bool) { + opts.DeleteLocalData = v + }) + f.AddCheckbox("Force:", defaults.Force, func(v bool) { + opts.Force = v + }) + + pages := view.App().Content.Pages + f.AddButton("Cancel", func() { + DismissDrain(view, pages) + }) + f.AddButton("OK", func() { + DismissDrain(view, pages) + okFn(view, path, opts) + }) + + modal := tview.NewModalForm("", f) + modal.SetText(path) + modal.SetDoneFunc(func(_ int, b string) { + DismissDrain(view, pages) + }) + + pages.AddPage(drainKey, modal, false, true) + pages.ShowPage(drainKey) + view.App().SetFocus(pages.GetPrimitive(drainKey)) +} + +// DismissDrain dismiss the port forward dialog. +func DismissDrain(v ResourceViewer, p *ui.Pages) { + p.RemovePage(drainKey) + v.App().SetFocus(p.CurrentPage().Item) +} + +// ---------------------------------------------------------------------------- +// Helpers... + +func asDurOpt(v string) (time.Duration, error) { + d, err := time.ParseDuration(v) + if err != nil { + return 0, err + } + + return d, nil +} + +func asIntOpt(v string) (int, error) { + i, err := strconv.Atoi(v) + if err != nil { + return 0, err + } + + return i, nil +} diff --git a/internal/view/helpers.go b/internal/view/helpers.go index ca871959..acc94ed6 100644 --- a/internal/view/helpers.go +++ b/internal/view/helpers.go @@ -50,6 +50,7 @@ func generalEnv(a *App) K9sEnv { } func defaultK9sEnv(a *App, sel string, row render.Row) K9sEnv { + log.Debug().Msgf("ROW %#v", row) ns, n := client.Namespaced(sel) env := generalEnv(a) diff --git a/internal/view/log.go b/internal/view/log.go index 09fe4a49..62bd566e 100644 --- a/internal/view/log.go +++ b/internal/view/log.go @@ -185,6 +185,7 @@ func (l *Log) bindKeys() { } func (l *Log) keyboard(evt *tcell.EventKey) *tcell.EventKey { + displayKey(l.app, l.cmdBuff.InCmdMode(), evt) key := evt.Key() if key == tcell.KeyUp || key == tcell.KeyDown { return evt @@ -265,7 +266,6 @@ func (l *Log) activateCmd(evt *tcell.EventKey) *tcell.EventKey { if l.app.InCmdMode() { return evt } - l.app.Flash().Info("Filter mode activated.") l.cmdBuff.SetActive(true) return nil @@ -293,7 +293,6 @@ func (l *Log) resetCmd(evt *tcell.EventKey) *tcell.EventKey { if l.cmdBuff.String() != "" { l.model.ClearFilter() } - l.app.Flash().Info("Clearing filter...") l.cmdBuff.SetActive(false) l.cmdBuff.Reset() l.updateTitle() @@ -330,6 +329,7 @@ func saveData(cluster, name, data string) (string, error) { if err != nil { log.Error().Err(err).Msgf("LogFile create %s", path) return "", nil + } defer func() { if err := file.Close(); err != nil { @@ -344,7 +344,6 @@ func saveData(cluster, name, data string) (string, error) { } func (l *Log) clearCmd(*tcell.EventKey) *tcell.EventKey { - l.app.Flash().Info("Clearing logs...") l.model.Clear() return nil } @@ -355,7 +354,7 @@ func (l *Log) textWrapCmd(*tcell.EventKey) *tcell.EventKey { return nil } -// BOZO! Log timestamps. +// BOZO!! Log timestamps. // func (l *Log) toggleTimestampCmd(evt *tcell.EventKey) *tcell.EventKey { // l.model.Clear() // l.indicator.ToggleTimestamp() diff --git a/internal/view/log_indicator.go b/internal/view/log_indicator.go index dc714ef3..d5be3820 100644 --- a/internal/view/log_indicator.go +++ b/internal/view/log_indicator.go @@ -16,8 +16,7 @@ type LogIndicator struct { scrollStatus int32 fullScreen bool textWrap bool - // BOZO!! timestamp - // showTime bool + showTime bool } // NewLogIndicator returns a new indicator. @@ -40,11 +39,10 @@ func (l *LogIndicator) AutoScroll() bool { return atomic.LoadInt32(&l.scrollStatus) == 1 } -// BOZO!! Timestamp -// // Timestamp reports the current timestamp mode. -// func (l *LogIndicator) Timestamp() bool { -// return l.showTime -// } +// Timestamp reports the current timestamp mode. +func (l *LogIndicator) Timestamp() bool { + return l.showTime +} // TextWrap reports the current wrap mode. func (l *LogIndicator) TextWrap() bool { @@ -56,11 +54,10 @@ func (l *LogIndicator) FullScreen() bool { return l.fullScreen } -// BOZO!! Timestamp -// // TextWrap reports the current wrap mode. -// func (l *LogIndicator) ToggleTimestamp() { -// l.showTime = !l.showTime -// } +// TextWrap reports the current wrap mode. +func (l *LogIndicator) ToggleTimestamp() { + l.showTime = !l.showTime +} // ToggleFullScreen toggles the screen mode. func (l *LogIndicator) ToggleFullScreen() { diff --git a/internal/view/node.go b/internal/view/node.go index 106f46b8..7f09cff9 100644 --- a/internal/view/node.go +++ b/internal/view/node.go @@ -1,9 +1,15 @@ package view import ( + "bytes" + "fmt" + "strings" + "time" + "github.com/derailed/k9s/internal/client" "github.com/derailed/k9s/internal/dao" "github.com/derailed/k9s/internal/ui" + "github.com/derailed/k9s/internal/ui/dialog" "github.com/gdamore/tcell" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -28,6 +34,9 @@ func (n *Node) bindKeys(aa ui.KeyActions) { aa.Delete(ui.KeySpace, tcell.KeyCtrlSpace, tcell.KeyCtrlD) aa.Add(ui.KeyActions{ ui.KeyY: ui.NewKeyAction("YAML", n.viewCmd, true), + ui.KeyC: ui.NewKeyAction("Cordon", n.toggleCordonCmd(true), true), + ui.KeyU: ui.NewKeyAction("Uncordon", n.toggleCordonCmd(false), true), + ui.KeyD: ui.NewKeyAction("Drain", n.drainCmd, true), ui.KeyShiftC: ui.NewKeyAction("Sort CPU", n.GetTable().SortColCmd(cpuCol, false), false), ui.KeyShiftM: ui.NewKeyAction("Sort MEM", n.GetTable().SortColCmd(memCol, false), false), ui.KeyShiftX: ui.NewKeyAction("Sort CPU%", n.GetTable().SortColCmd("%CPU", false), false), @@ -39,6 +48,84 @@ func (n *Node) showPods(app *App, _ ui.Tabular, _, path string) { showPods(app, n.GetTable().GetSelectedItem(), "", "spec.nodeName="+path) } +func (n *Node) drainCmd(evt *tcell.EventKey) *tcell.EventKey { + path := n.GetTable().GetSelectedItem() + if path == "" { + return evt + } + + defaults := dao.DrainOptions{ + GracePeriodSeconds: -1, + Timeout: 5 * time.Second, + DeleteLocalData: false, + IgnoreAllDaemonSets: false, + } + ShowDrain(n, path, defaults, drainNode) + + return nil +} + +func drainNode(v ResourceViewer, path string, opts dao.DrainOptions) { + res, err := dao.AccessorFor(v.App().factory, v.GVR()) + if err != nil { + v.App().Flash().Err(err) + return + } + m, ok := res.(dao.NodeMaintainer) + if !ok { + v.App().Flash().Err(fmt.Errorf("expecting a maintainer for %q", v.GVR())) + return + } + + buff := bytes.NewBufferString("") + if err := m.Drain(path, opts, buff); err != nil { + v.App().Flash().Err(err) + return + } + lines := strings.Split(buff.String(), "\n") + for _, l := range lines { + if len(l) > 0 { + v.App().Flash().Info(l) + } + } + v.Refresh() +} + +func (n *Node) toggleCordonCmd(cordon bool) func(evt *tcell.EventKey) *tcell.EventKey { + return func(evt *tcell.EventKey) *tcell.EventKey { + path := n.GetTable().GetSelectedItem() + if path == "" { + return evt + } + + title, msg := "Confirm ", "" + if cordon { + title, msg = title+"Cordon", "Cordon " + } else { + title, msg = title+"Uncordon", "Uncordon " + } + msg += path + "?" + dialog.ShowConfirm(n.App().Content.Pages, title, msg, func() { + res, err := dao.AccessorFor(n.App().factory, n.GVR()) + if err != nil { + n.App().Flash().Err(err) + return + } + m, ok := res.(dao.NodeMaintainer) + if !ok { + n.App().Flash().Err(fmt.Errorf("expecting a maintainer for %q", n.GVR())) + return + } + if err := m.ToggleCordon(path, cordon); err != nil { + n.App().Flash().Err(err) + } + n.Refresh() + }, func() {}) + + return nil + } +} + func (n *Node) viewCmd(evt *tcell.EventKey) *tcell.EventKey { path := n.GetTable().GetSelectedItem() if path == "" { diff --git a/internal/view/pulse.go b/internal/view/pulse.go index 147ea186..6b9e73e8 100644 --- a/internal/view/pulse.go +++ b/internal/view/pulse.go @@ -208,6 +208,7 @@ func (p *Pulse) bindKeys() { } func (p *Pulse) keyboard(evt *tcell.EventKey) *tcell.EventKey { + displayKey(p.app, false, evt) key := evt.Key() if key == tcell.KeyRune { key = tcell.Key(evt.Rune()) diff --git a/internal/view/restart_extender.go b/internal/view/restart_extender.go index 2f891908..e2b4b001 100644 --- a/internal/view/restart_extender.go +++ b/internal/view/restart_extender.go @@ -42,7 +42,7 @@ func (r *RestartExtender) restartCmd(evt *tcell.EventKey) *tcell.EventKey { if len(paths) > 1 { msg = fmt.Sprintf("Restart %d deployments?", len(paths)) } - dialog.ShowConfirm(r.App().Content.Pages, "", msg, func() { + dialog.ShowConfirm(r.App().Content.Pages, "Confirm Restart", msg, func() { for _, path := range paths { if err := r.restartRollout(path); err != nil { r.App().Flash().Err(err) diff --git a/internal/view/table.go b/internal/view/table.go index d5054b41..27ff6fa6 100644 --- a/internal/view/table.go +++ b/internal/view/table.go @@ -2,6 +2,7 @@ package view import ( "context" + "strings" "time" "github.com/atotto/clipboard" @@ -55,7 +56,25 @@ func (t *Table) SendKey(evt *tcell.EventKey) { t.keyboard(evt) } +func displayKey(a *App, isCmd bool, evt *tcell.EventKey) { + if !a.Config.DemoMode() || a.InCmdMode() || isCmd { + a.Flash().Clear() + return + } + a.Flash().Clear() + + key, ok := tcell.KeyNames[evt.Key()] + if !ok { + key = string(evt.Rune()) + } + if evt.Modifiers() == tcell.ModCtrl { + key = "⌃" + strings.Replace(key, "Ctrl-", "", 1) + } + a.Flash().Infof("Pressed[:springgreen:b]%s", key) +} + func (t *Table) keyboard(evt *tcell.EventKey) *tcell.EventKey { + displayKey(t.app, t.SearchBuff().InCmdMode(), evt) key := evt.Key() if key == tcell.KeyUp || key == tcell.KeyDown { return evt @@ -233,7 +252,6 @@ func (t *Table) activateCmd(evt *tcell.EventKey) *tcell.EventKey { if t.app.InCmdMode() { return evt } - t.app.Flash().Info("Filter mode activated.") t.SearchBuff().SetActive(true) return nil diff --git a/internal/view/xray.go b/internal/view/xray.go index abfb09c7..eb8e665a 100644 --- a/internal/view/xray.go +++ b/internal/view/xray.go @@ -417,7 +417,6 @@ func (x *Xray) activateCmd(evt *tcell.EventKey) *tcell.EventKey { if x.app.InCmdMode() { return evt } - x.app.Flash().Info("Filter mode activated.") x.CmdBuff().SetActive(true) return nil @@ -448,8 +447,6 @@ func (x *Xray) resetCmd(evt *tcell.EventKey) *tcell.EventKey { x.CmdBuff().Reset() return x.app.PrevCmd(evt) } - - x.app.Flash().Info("Clearing filter...") x.CmdBuff().Reset() x.model.ClearFilter() x.Start() diff --git a/xray.yml b/xray.yml deleted file mode 100644 index 0a4fafb5..00000000 --- a/xray.yml +++ /dev/null @@ -1,313 +0,0 @@ -# The configurations that used for the recording, feel free to edit them -config: - - # Specify a command to be executed - # like `/bin/bash -l`, `ls`, or any other commands - # the default is bash for Linux - # or powershell.exe for Windows - command: bash -l - - # Specify the current working directory path - # the default is the current working directory path - cwd: /Users/fernand/go_wk/derailed/src/github.com/derailed/k9s - - # Export additional ENV variables - env: - recording: true - - # Explicitly set the number of columns - # or use `auto` to take the current - # number of columns of your shell - cols: 164 - - # Explicitly set the number of rows - # or use `auto` to take the current - # number of rows of your shell - rows: 37 - - # Amount of times to repeat GIF - # If value is -1, play once - # If value is 0, loop indefinitely - # If value is a positive number, loop n times - repeat: 0 - - # Quality - # 1 - 100 - quality: 100 - - # Delay between frames in ms - # If the value is `auto` use the actual recording delays - frameDelay: auto - - # Maximum delay between frames in ms - # Ignored if the `frameDelay` isn't set to `auto` - # Set to `auto` to prevent limiting the max idle time - maxIdleTime: 2000 - - # The surrounding frame box - # The `type` can be null, window, floating, or solid` - # To hide the title use the value null - # Don't forget to add a backgroundColor style with a null as type - frameBox: - type: floating - title: Terminalizer - style: - border: 0px black solid - # boxShadow: none - # margin: 0px - - # Add a watermark image to the rendered gif - # You need to specify an absolute path for - # the image on your machine or a URL, and you can also - # add your own CSS styles - watermark: - imagePath: null - style: - position: absolute - right: 15px - bottom: 15px - width: 100px - opacity: 0.9 - - # Cursor style can be one of - # `block`, `underline`, or `bar` - cursorStyle: block - - # Font family - # You can use any font that is installed on your machine - # in CSS-like syntax - fontFamily: "Monaco, Lucida Console, Ubuntu Mono, Monospace" - - # The size of the font - fontSize: 12 - - # The height of lines - lineHeight: 1 - - # The spacing between letters - letterSpacing: 0 - - # Theme - theme: - background: "transparent" - foreground: "#afafaf" - cursor: "#c7c7c7" - black: "#232628" - red: "#fc4384" - green: "#b3e33b" - yellow: "#ffa727" - blue: "#75dff2" - magenta: "#ae89fe" - cyan: "#708387" - white: "#d5d5d0" - brightBlack: "#626566" - brightRed: "#ff7fac" - brightGreen: "#c8ed71" - brightYellow: "#ebdf86" - brightBlue: "#75dff2" - brightMagenta: "#ae89fe" - brightCyan: "#b1c6ca" - brightWhite: "#f9f9f4" - -# Records, feel free to edit them -records: - - delay: 945 - content: "\e]133;C;\a\e]1337;RemoteHost=fernand@MacBook-Pro.domain\a\e]1337;CurrentDir=/Users/fernand/go_wk/derailed/src/github.com/derailed/k9s\a" - - delay: 6 - content: "\e]" - - delay: 5 - content: "1337;SetUserVar=gitBranch=bm9uc19jcmQ=\a\e[?1034h\e]133;D;0\a\e]133;A\a\e[38;5;39mk9s\e[0;33m (nons_crd) \e[0;36mδ\e[0m\e[0;36m+\e[0m \e[1;31m>\e[1;30m>\e[1;32m>\e[0m \e]133;B\a" - - delay: 1716 - content: . - - delay: 202 - content: / - - delay: 1620 - content: k - - delay: 180 - content: '9' - - delay: 270 - content: 's ' - - delay: 473 - content: "\r\n" - - delay: 14 - content: "\e]133;C;\a" - - delay: 248 - content: "\e[?1049h\e[22;0;0t\e[?25l\e[H\e[2J\e[?25l\e[1;1H\e(B\e[m\e[48;2;0;0;0m \e[2;1H \e[3;1H \e(B\e[m\e[38;2;255;165;0;48;2;0;0;0m\e[1m ____ __.________ _________ .____ .___ \e(B\e[m\e[48;2;0;0;0m \e[4;1H \e(B\e[m\e[38;2;255;165;0;48;2;0;0;0m\e[1m| |/ _/ __ \\_____\\_ ___ \\| | | |\e(B\e[m\e[48;2;0;0;0m \e[5;1H \e(B\e[m\e[38;2;255;165;0;48;2;0;0;0m\e[1m| < \\____ / ___/ \\ \\/| | | |\e(B\e[m\e[48;2;0;0;0m \e[6;1H \e(B\e[m\e[38;2;255;165;0;48;2;0;0;0m\e[1m| | \\ / /\\___ \\\\ \\___| |___| |\e(B\e[m\e[48;2;0;0;0m \e[7;1H \e(B\e[m\e[38;2;255;165;0;48;2;0;0;0m\e[1m|____|__ \\ /____//____ >\\______ /_______ \\___|\e(B\e[m\e[48;2;0;0;0m \e[8;1H \e(B\e[m\e[38;2;255;165;0;48;2;0;0;0m\e[1m \\/ \\/ \\/ \\/ \e(B\e[m\e[48;2;0;0;0m \e[9;1H \e[10;1H \e[11;1H \e(B\e[m\e[38;2;30;144;255;48;2;0;0;0m\e[1mRevision \e(B\e[m\e[38;2;255;0;0;48;2;0;0;0m\e[1mdev\e(B\e[m\e[48;2;0;0;0m \e[12;1H \e[13;1H \e[14;1H \e[15;1H \e[16;1H \e[17;1H \e[18;1H \e[19;1H \e[20;1H \e[21;1H \e[22;1H \e[23;1H \e[24;1H \e[25;1H \e[26;1H \e[27;1H \e[28;1H \e[29;1H \e[30;1H \e[31;1H \e[32;1H \e[33;1H \e[34;1H \e[35;1H \e[36;1H \e[37;1H \e[?25l\e[?25l\e[?25l\e[?25l\e[?25l\e[?25l\e[?25l\e[?25l\e[?25l\e[?25l\e[?25l" - - delay: 509 - content: "\e[?25l\e[?25l\e[?25l\e[?25l" - - delay: 484 - content: "\e[?25l\e[1;2H\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mContext:\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m \e(B\e[m\e[38;2;30;144;255;48;2;0;0;0m\e[1mminikube\e[1;52H\e(B\e[m\e[38;2;30;144;255;48;2;0;0;0m \e(B\e[m\e[38;2;30;144;255;48;2;0;0;0m\e[1m \e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[2mGoto \e[1;138H\e(B\e[m\e[38;2;255;165;0;48;2;0;0;0m\e[1m ____ __.________ \e[2;2H\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mCluster:\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m \e(B\e[m\e[38;2;30;144;255;48;2;0;0;0m\e[1mminikube\e[2;52H\e(B\e[m\e[38;2;30;144;255;48;2;0;0;0m \e(B\e[m\e[38;2;30;144;255;48;2;0;0;0m\e[1m \e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[2mPod logs \e[2;138H\e(B\e[m\e[38;2;255;165;0;48;2;0;0;0m\e[1m| |/ _/ __ \\______\e[3;2H\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mUser:\e[3;10H\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m \e(B\e[m\e[38;2;30;144;255;48;2;0;0;0m\e[1mminikube\e[3;59H\e(B\e[m\e[48;2;0;0;0m \e[3;138H\e(B\e[m\e[38;2;255;165;0;48;2;0;0;0m\e[1m| < \\____ / ___/\e[4;2H\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mK9s Rev:\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m \e(B\e[m\e[38;2;30;144;255;48;2;0;0;0m\e[1mdev\e[4;59H\e(B\e[m\e[48;2;0;0;0m \e[4;138H\e(B\e[m\e[38;2;255;165;0;48;2;0;0;0m\e[1m| | \\ / /\\___ \\ \e[5;2H\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mK8s Rev:\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m \e(B\e[m\e[38;2;30;144;255;48;2;0;0;0m\e[1mv1.17.0\e[5;59H\e(B\e[m\e[48;2;0;0;0m \e[5;138H\e(B\e[m\e[38;2;255;165;0;48;2;0;0;0m\e[1m|____|__ \\ /____//____ >\e[6;2H\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mCPU:\e[6;10H\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m \e(B\e[m\e[38;2;30;144;255;48;2;0;0;0m\e[1m8%\e[6;59H\e(B\e[m\e[48;2;0;0;0m \e[6;138H\e(B\e[m\e[38;2;255;165;0;48;2;0;0;0m\e[1m \\/ \\/ \e[7;2H\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mMEM:\e[7;10H\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m \e(B\e[m\e[38;2;30;144;255;48;2;0;0;0m\e[1m29%\e[7;59H\e(B\e[m\e[48;2;0;0;0m \e[8;1H\e(B\e[m\e[38;2;0;255;255;48;2;0;0;0m\e[1m┌───────────────────────────────────────────────────────────────────── Xray-Pods(\e(B\e[m\e[38;2;255;0;255;48;2;0;0;0m\e[1mdefault\e(B\e[m\e[38;2;0;255;255;48;2;0;0;0m)[\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\e[1m0\e(B\e[m\e[38;2;0;255;255;48;2;0;0;0m] \e(B\e[m\e[38;2;0;255;255;48;2;0;0;0m\e[1m──────────────────────────────────────────────────────────────────────┐\e[9;1H│\e[9;3H\e(B\e[m\e[38;2;0;0;0;48;2;255;239;213m \e(B\e[m\e[38;2;255;255;255;48;2;255;239;213m\e[1mpods\e[9;164H\e(B\e[m\e[38;2;0;255;255;48;2;0;0;0m\e[1m│\e[10;1H│\e[10;164H│\e[11;1H│\e[11;77H\e(B\e[m\e[48;2;0;0;0m \e[11;164H\e(B\e[m\e[38;2;0;255;255;48;2;0;0;0m\e[1m│\e[12;1H│\e[12;164H│\e[13;1H│\e[13;164H│\e[14;1H│\e[14;164H│\e[15;1H│\e[15;164H│\e[16;1H│\e[16;164H│\e[17;1H│\e[17;164H│\e[18;1H│\e[18;164H│\e[19;1H│\e[19;164H│\e[20;1H│\e[20;164H│\e[21;1H│\e[21;164H│\e[22;1H│\e[22;164H│\e[23;1H│\e[23;164H│\e[24;1H│\e[24;164H│\e[25;1H│\e[25;164H│\e[26;1H│\e[26;164H│\e[27;1H│\e[27;164H│\e[28;1H│\e[28;164H│\e[29;1H│\e[29;164H│\e[30;1H│\e[30;164H│\e[31;1H│\e[31;164H│\e[32;1H│\e[32;164H│\e[33;1H└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘\e[34;2H\e(B\e[m\e[38;2;0;0;0;48;2;255;165;0m\e[1m \e[?25l" - - delay: 1519 - content: "\e[?25l\e[9;8H\e(B\e[m\e[38;2;255;255;255;48;2;255;239;213m\e[2m(2\e(B\e[m\e[48;2;255;239;213m\e[2m)\e[10;3H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m├──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m \e(B\e[m\e[38;2;128;128;128;48;2;0;0;0mpod/\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mnginx-5bbc876d89-p6m7b\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[2m(3\e(B\e[m\e[48;2;0;0;0m\e[2m)\e[10;37H\e(B\e[m\e[38;2;250;235;215;48;2;0;0;0m[1/1]\e[11;3H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e[11;6H├──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m \e(B\e[m\e[38;2;128;128;128;48;2;0;0;0mserviceaccount/\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mdefault\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[2m(1\e(B\e[m\e[48;2;0;0;0m\e[2m)\e[12;3H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e[12;6H│\e[12;9H└──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m \e(B\e[m\e[38;2;128;128;128;48;2;0;0;0msecret/\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mdefault-token-f57mg\e[13;3H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e[13;6H├──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m \e(B\e[m\e[38;2;128;128;128;48;2;0;0;0msecret/\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mdefault-token-f57mg\e[14;3H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e[14;6H└──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m \e(B\e[m\e[38;2;128;128;128;48;2;0;0;0mcontainer/\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mnginx\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[2m(1\e(B\e[m\e[48;2;0;0;0m\e[2m)\e[15;3H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e[15;9H└──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m \e(B\e[m\e[38;2;128;128;128;48;2;0;0;0mconfigmap/\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mbusy\e[16;3H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m└──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m \e(B\e[m\e[38;2;128;128;128;48;2;0;0;0mpod/\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mnginx-pv-d544d7649-cjg6h\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[2m(4\e(B\e[m\e[48;2;0;0;0m\e[2m)\e[16;39H\e(B\e[m\e[38;2;250;235;215;48;2;0;0;0m[1/1]\e[17;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m├──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m \e(B\e[m\e[38;2;128;128;128;48;2;0;0;0mcontainer/\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mnginx\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[2m(2\e(B\e[m\e[48;2;0;0;0m\e[2m)\e[18;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e[18;9H├──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m \e(B\e[m\e[38;2;128;128;128;48;2;0;0;0mconfigmap/\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mbusy\e[19;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e[19;9H└──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m \e(B\e[m\e[38;2;128;128;128;48;2;0;0;0mconfigmap/\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mbusy11\e[20;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m├──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m \e(B\e[m\e[38;2;128;128;128;48;2;0;0;0mpersistentvolumeclaim/\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mweb\e[21;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m├──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m \e(B\e[m\e[38;2;128;128;128;48;2;0;0;0mserviceaccount/\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mzorg\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[2m(3\e(B\e[m\e[48;2;0;0;0m\e[2m)\e[21;33H\e(B\e[m\e[38;2;250;235;215;48;2;0;0;0m[automount=true]\e[22;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e[22;9H├──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m \e(B\e[m\e[38;2;128;128;128;48;2;0;0;0msecret/\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mdocker-zorg\e[23;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e[23;9H├──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m \e(B\e[m\e[38;2;128;128;128;48;2;0;0;0msecret/\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mzorg\e[24;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e[24;9H└──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m \e(B\e[m\e[38;2;128;128;128;48;2;0;0;0msecret/\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mzorg-token-rf4pm\e[25;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m└──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m \e(B\e[m\e[38;2;128;128;128;48;2;0;0;0msecret/\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mzorg-token-rf4pm\e[?25l\e[?25l\e[8;91H\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\e[1m2\e[?25l" - - delay: 995 - content: "\e[?25l\e[?25l" - - delay: 791 - content: "\e[?25l\e[8;1H\e(B\e[m\e[38;2;0;255;255;48;2;0;0;0m┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐\e[9;1H│\e[9;3H\e(B\e[m\e[38;2;30;144;255;48;2;0;0;0m\U0001F436\e[9;5H>\e(B\e[m\e[48;2;0;0;0m \e[9;164H\e(B\e[m\e[38;2;0;255;255;48;2;0;0;0m│\e[10;1H└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘\e[11;1H\e(B\e[m\e[38;2;0;255;255;48;2;0;0;0m\e[1m┌───────────────────────────────────────────────────────────────────── Xray-Pods(\e(B\e[m\e[38;2;255;0;255;48;2;0;0;0m\e[1mdefault\e(B\e[m\e[38;2;0;255;255;48;2;0;0;0m)[\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\e[1m2\e(B\e[m\e[38;2;0;255;255;48;2;0;0;0m] \e(B\e[m\e[38;2;0;255;255;48;2;0;0;0m\e[1m──────────────────────────────────────────────────────────────────────┐\e[12;3H\e(B\e[m\e[38;2;0;0;0;48;2;255;239;213m \e(B\e[m\e[38;2;255;255;255;48;2;255;239;213m\e[1mpods\e(B\e[m\e[38;2;255;255;255;48;2;255;239;213m\e[2m(2\e(B\e[m\e[48;2;255;239;213m\e[2m)\e(B\e[m\e[48;2;0;0;0m \e[13;3H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m├──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m \e(B\e[m\e[38;2;128;128;128;48;2;0;0;0mpod/\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mnginx-5bbc876d89-p6m7b\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[2m(3\e(B\e[m\e[48;2;0;0;0m\e[2m)\e[13;37H\e(B\e[m\e[38;2;250;235;215;48;2;0;0;0m[1/1]\e[14;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m├\e[14;10H\e(B\e[m\e[38;2;128;128;128;48;2;0;0;0mserviceaccount/\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mdefault\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[2m(1\e(B\e[m\e[48;2;0;0;0m\e[2m)\e[15;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e[15;13H\e(B\e[m\e[38;2;128;128;128;48;2;0;0;0msecret/\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mdefa\e[15;25Hlt-token-f57mg\e[16;3H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e(B\e[m\e[48;2;0;0;0m \e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m├──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m \e(B\e[m\e[38;2;128;128;128;48;2;0;0;0msecret/\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mdefault-token-f57mg\e(B\e[m\e[48;2;0;0;0m \e[16;39H \e[17;3H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e[17;6H└\e[17;26H\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[2m1\e[18;3H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e[18;6H\e(B\e[m\e[48;2;0;0;0m \e[18;9H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m└\e[19;3H└──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m \e(B\e[m\e[38;2;128;128;128;48;2;0;0;0mpod/\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mnginx-pv-d544d7649-cjg6h\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[2m(4\e(B\e[m\e[48;2;0;0;0m\e[2m)\e[19;39H\e(B\e[m\e[38;2;250;235;215;48;2;0;0;0m[1/1]\e[20;10H\e(B\e[m\e[38;2;128;128;128;48;2;0;0;0mcontain\e[20;18Hr/\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mnginx\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[2m(2\e(B\e[m\e[48;2;0;0;0m\e[2m)\e(B\e[m\e[48;2;0;0;0m \e[21;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e(B\e[m\e[48;2;0;0;0m \e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m├──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m \e(B\e[m\e[38;2;128;128;128;48;2;0;0;0mconfigmap/\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mbusy\e(B\e[m\e[48;2;0;0;0m \e[21;33H \e[22;9H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m└\e[22;13H\e(B\e[m\e[38;2;128;128;128;48;2;0;0;0mconfigmap/\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mbusy11\e(B\e[m\e[48;2;0;0;0m \e[23;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m├──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m \e(B\e[m\e[38;2;128;128;128;48;2;0;0;0mper\e[23;14Hist\e[23;18Hntvolumeclaim/\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mweb\e[24;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m├──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m \e(B\e[m\e[38;2;128;128;128;48;2;0;0;0mservi\e[24;16Heaccount/\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mz\e[24;27Hrg\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[2m(3\e(B\e[m\e[48;2;0;0;0m\e[2m)\e(B\e[m\e[48;2;0;0;0m \e(B\e[m\e[38;2;250;235;215;48;2;0;0;0m[automount=true]\e[25;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e(B\e[m\e[48;2;0;0;0m \e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m├──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m \e(B\e[m\e[38;2;128;128;128;48;2;0;0;0ms\e[25;15Hcret/\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mdocker-zorg\e(B\e[m\e[48;2;0;0;0m \e[26;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e[26;9H├──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m \e(B\e[m\e[38;2;128;128;128;48;2;0;0;0msecret/\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mzorg\e[27;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e[27;9H└──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m \e(B\e[m\e[38;2;128;128;128;48;2;0;0;0msecret/\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mzorg-token-rf4pm\e[28;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m└──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m \e(B\e[m\e[38;2;128;128;128;48;2;0;0;0msecret/\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mzorg-token-rf4pm\e[?25l\e[?25l\e[?25l" - - delay: 199 - content: "\e[?25l\e[9;6H\e(B\e[m\e[38;2;30;144;255;48;2;0;0;0m q\e[?25l" - - delay: 303 - content: "\e[?12l\e[?25h\e(B\e[m\e[H\e[2J\e[?1049l\e[23;0;0t\e[?1l\e>\e[?1000l\e[?1002l\e[?1003l\e[?1006l" - - delay: 10 - content: "\e]1337;RemoteHost=fernand@MacBook-Pro.domain\a\e]1337;CurrentDir=/Users/fernand/go_wk/derailed/src/github.com/derailed/k9s\a" - - delay: 6 - content: "\e]" - - delay: 8 - content: "1337;SetUserVar=gitBranch=bm9uc19jcmQ=\a" - - delay: 55 - content: "\e[38;5;39mk9s\e[0;33m (nons_crd) \e[0;36mδ\e[0m\e[0;36m+\e[0m \e[1;31m>\e[1;30m>\e[1;32m>\e[0m " - - delay: 529 - content: v - - delay: 111 - content: i - - delay: 203 - content: ' ' - - delay: 821 - content: '~' - - delay: 360 - content: / - - delay: 304 - content: . - - delay: 438 - content: k - - delay: 203 - content: '9' - - delay: 214 - content: s - - delay: 449 - content: "\b\b\b\b\b\b/Users/fernand/.k9s/" - - delay: 2352 - content: m - - delay: 136 - content: i - - delay: 134 - content: 'n' - - delay: 187 - content: 'ikube_skin.yml ' - - delay: 555 - content: "\r\n" - - delay: 10 - content: "\e]133;C;\a" - - delay: 130 - content: "\e[?2004h\e[?1049h\e[?1h\e=\e[?2004h\e[1;37r\e[?12h\e[?12l\e[27m\e[29m\e[m\e[H\e[2J\e[?25l\e[37;1H\"~/.k9s/minikube_skin.yml\" 56L, 1142C" - - delay: 5 - content: "\e[2;1H▽\e[6n\e[2;1H \e[1;1H\e[>c\e]10;?\a\e]11;?\a\e[1;1H\e[93m 1 \e[m\e[1m\e[96mk9s\e[m\e[38;5;224m:\e[m\e[75C\e[41m \e[m\r\n\e[93m 2 \e[m \e[1m\e[96mbody\e[m\e[38;5;224m:\e[m\e[72C\e[41m \e[m\r\n\e[93m 3 \e[m \e[1m\e[96mfgColor\e[m\e[38;5;224m:\e[m dodgerblue\e[56C\e[41m \e[m\r\n\e[93m 4 \e[m \e[1m\e[96mbgColor\e[m\e[38;5;224m:\e[m black\e[61C\e[41m \e[m\r\n\e[93m 5 \e[m \e[1m\e[96mlogoColor\e[m\e[38;5;224m:\e[m orange\e[58C\e[41m \e[m\r\n\e[93m 6 \e[m \e[1m\e[96minfo\e[m\e[38;5;224m:\e[m\e[72C\e[41m \e[m\r\n\e[93m 7 \e[m \e[1m\e[96mfgColor\e[m\e[38;5;224m:\e[m white\e[61C\e[41m \e[m\r\n\e[93m 8 \e[m \e[1m\e[96msectionColor\e[m\e[38;5;224m:\e[m dodgerblue\e[51C\e[41m \e[m\r\n\e[93m 9 \e[m \e[1m\e[96mframe\e[m\e[38;5;224m:\e[m\e[71C\e[41m \e[m\r\n\e[93m 10 \e[m \e[1m\e[96mborder\e[m\e[38;5;224m:\e[m\e[68C\e[41m \e[m\r\n\e[93m 11 \e[m \e[1m\e[96mfgColor\e[m\e[38;5;224m:\e[m dodgerblue\e[54C\e[41m \e[m\r\n\e[93m 12 \e[m \e[1m\e[96mfocusColor\e[m\e[38;5;224m:\e[m aqua\e[57C\e[41m \e[m\r\n\e[93m 13 \e[m \e[1m\e[96mmenu\e[m\e[38;5;224m:\e[m\e[70C\e[41m \e[m\r\n\e[93m 14 \e[m \e[1m\e[96mfgColor\e[m\e[38;5;224m:\e[m white\e[59C\e[41m \e[m\r\n\e[93m 15 \e[m \e[1m\e[96mkeyColor\e[m\e[38;5;224m:\e[m dodgerblue\e[53C\e[41m \e[m\r\n\e[93m 16 \e[m \e[1m\e[96mnumKeyColor\e[m\e[38;5;224m:\e[m fuchsia\e[53C\e[41m \e[m\r\n\e[93m 17 \e[m \e[1m\e[96mcrumbs\e[m\e[38;5;224m:\e[m\e[68C\e[41m \e[m\r\n\e[93m 18 \e[m \e[1m\e[96mfgColor\e[m\e[38;5;224m:\e[m black\e[59C\e[41m \e[m\r\n\e[93m 19 \e[m \e[1m\e[96mbgColor\e[m\e[38;5;224m:\e[m steelblue\e[55C\e[41m \e[m\r\n\e[93m 20 \e[m \e[1m\e[96mactiveColor\e[m\e[38;5;224m:\e[m orange\e[54C\e[41m \e[m\r\n\e[93m 21 \e[m \e[1m\e[96mstatus\e[m\e[38;5;224m:\e[m\e[68C\e[41m \e[m\r\n\e[93m 22 \e[m \e[1m\e[96mnewColor\e[m\e[38;5;224m:\e[m lightskyblue\e[51C\e[41m \e[m\r\n\e[93m 23 \e[m \e[1m\e[96mmodifyColor\e[m\e[38;5;224m:\e[m greenyellow\e[49C\e[41m \e[m\r\n\e[93m 24 \e[m \e[1m\e[96maddColor\e[m\e[38;5;224m:\e[m white\e[58C\e[41m \e[m\r\n\e[93m 25 \e[m \e[1m\e[96merrorColor\e[m\e[38;5;224m:\e[m orangered\e[52C\e[41m \e[m\r\n\e[93m 26 \e[m \e[1m\e[96mhighlightcolor\e[m\e[38;5;224m:\e[m aqua\e[53C\e[41m \e[m\r\n\e[93m 27 \e[m \e[1m\e[96mkillColor\e[m\e[38;5;224m:\e[m mediumpurple\e[50C\e[41m \e[m\r\n\e[93m 28 \e[m \e[1m\e[96mcompletedColor\e[m\e[38;5;224m:\e[m gray\e[53C\e[41m \e[m\r\n\e[93m 29 \e[m \e[1m\e[96mtitle\e[m\e[38;5;224m:\e[m\e[69C\e[41m \e[m\r\n\e[93m 30 \e[m \e[1m\e[96mfgColor\e[m\e[38;5;224m:\e[m aqua\e[60C\e[41m \e[m\r\n\e[93m 31 \e[m \e[1m\e[96mbgColor\e[m\e[38;5;224m:\e[m black\e[59C\e[41m \e[m\r\n\e[93m 32 \e[m \e[1m\e[96mhighlightColor\e[m\e[38;5;224m:\e[m fuchsia\e[50C\e[41m \e[m\r\n\e[93m 33 \e[m \e[1m\e[96mcounterColor\e[m\e[38;5;224m:\e[m papayawhip\e[49C\e[41m \e[m\r\n\e[93m 34 \e[m \e[1m\e[96mfilterColor\e[m\e[38;5;224m:\e[m steelblue\e[51C\e[41m \e[m\r\n\e[93m 35 \e[m \e[1m\e[96mxray\e[m\e[38;5;224m:\e[m\e[72C\e[41m \e[m\r\n\e[1m\e[38;5;150m\e[48;5;239m[1] ~/.k9s/minikube_skin.yml [yaml] 1,1-1 Top\e]2;minikube_skin.yml (~/.k9s) - VIM\a\e[1;5H\e[?25h\e[?12$p" - - delay: 1258 - content: "\e[?25l\e[m\e[37;154H/\e[1;5H\e[37;1H\e[K\e[37;1H/\e[?2004h\e[?25h" - - delay: 302 - content: "s\e[?25l\e[1;7H\e[1m\e[7m\e[96ms\e[m\e[38;5;224m:\e[m\e[8;9H\e[1m\e[30m\e[103ms\e[m\e[1m\e[96mectionColor\e[m\e[38;5;224m:\e[m\e[12;15H\e[1m\e[30m\e[103ms\e[m\e[1m\e[96mColor\e[m\e[38;5;224m:\e[m\e[16;28H\e[30m\e[103ms\e[m\e[17;14H\e[1m\e[30m\e[103ms\e[m\e[38;5;224m:\e[m\e[19;20H\e[30m\e[103ms\e[m\e[21;9H\e[1m\e[30m\e[103ms\e[m\e[1m\e[96mtatu\e[m\e[1m\e[30m\e[103ms\e[m\e[38;5;224m:\e[m\e[22;26H\e[30m\e[103ms\e[32;31Hs\e[34;24Hs\e[m\e[36;149H\e[1m\e[38;5;150m\e[48;5;239m3-3 \r\n\e[m/s\e[?25h" - - delay: 233 - content: "h\e[?25l\e[1;35r\e[1;1H\e[8M\e[1;37r\e[4;15H\e[1m\e[96msColor\e[m\e[38;5;224m:\e[m\e[8;28Hs\e[9;14H\e[1m\e[96ms\e[m\e[38;5;224m:\e[m\e[11;20Hs\e[13;9H\e[1m\e[96mstatus\e[m\e[38;5;224m:\e[m\e[14;26Hs\e[24;31Hs\e[26;24Hs\r\n\r\n\e[93m 36 \e[m \e[1m\e[96mfgColor\e[m\e[38;5;224m:\e[m white\e[61C\e[41m \e[m\r\n\e[93m 37 \e[m \e[1m\e[96mbgColor\e[m\e[38;5;224m:\e[m black\e[61C\e[41m \e[m\r\n\e[93m 38 \e[m \e[1m\e[96mcursorColor\e[m\e[38;5;224m:\e[m papayawhip\e[52C\e[41m \e[m\r\n\e[93m 39 \e[m \e[1m\e[96mgraphicColor\e[m\e[38;5;224m:\e[m cadetblue\e[52C\e[41m \e[m\r\n\e[93m 40 \e[m \e[1m\e[7m\e[96msh\e[m\e[1m\e[96mowIcons\e[m\e[38;5;224m:\e[m \e[95mfalse\e[m\e[59C\e[41m \e[m\r\n\e[93m 41 \e[m \e[1m\e[96mtable\e[m\e[38;5;224m:\e[m\e[71C\e[41m \e[m\r\n\e[93m 42 \e[m \e[1m\e[96mfgColor\e[m\e[38;5;224m:\e[m blue\e[62C\e[41m \e[m\r\n\e[93m 43 \e[m \e[1m\e[96mbgColor\e[m\e[38;5;224m:\e[m black\e[61C\e[41m \e[m\e[36;147H\e[1m\e[38;5;150m\e[48;5;239m40,5-5\e[9C38%\e[m\e[37;1H\e[K\e[37;1H/sh\e[?25h" - - delay: 2517 - content: "o\e[?25l\e[32;11H\e[1m\e[7m\e[96mo\e[m\e[1m\e[96mwIcons\e[m\e[38;5;224m:\e[37;5H\e[?25h" - - delay: 289 - content: "\e[m\e[38;5;81m^I\e[?25l\e[1;35r\e[m\e[1;1H\e[8L\e[1;37r\e[1;1H\e[93m 1 \e[m\e[1m\e[96mk9s\e[m\e[38;5;224m:\e[m\e[75C\e[41m \e[m\r\n\e[93m 2 \e[m \e[1m\e[96mbody\e[m\e[38;5;224m:\e[m\e[72C\e[41m \e[m\r\n\e[93m 3 \e[m \e[1m\e[96mfgColor\e[m\e[38;5;224m:\e[m dodgerblue\e[56C\e[41m \e[m\r\n\e[93m 4 \e[m \e[1m\e[96mbgColor\e[m\e[38;5;224m:\e[m black\e[61C\e[41m \e[m\r\n\e[93m 5 \e[m \e[1m\e[96mlogoColor\e[m\e[38;5;224m:\e[m orange\e[58C\e[41m \e[m\r\n\e[93m 6 \e[m \e[1m\e[96minfo\e[m\e[38;5;224m:\e[m\e[72C\e[41m \e[m\r\n\e[93m 7 \e[m \e[1m\e[96mfgColor\e[m\e[38;5;224m:\e[m white\e[61C\e[41m \e[m\r\n\e[93m 8 \e[m \e[1m\e[96msectionColor\e[m\e[38;5;224m:\e[m dodgerblue\e[51C\e[41m \e[m\e[36;147H\e[1m\e[38;5;150m\e[48;5;239m1,1-1 \e[8CTop\e[m\e[37;1H\e[K\e[37;1H/sho\e[38;5;81m^I\e[?25h" - - delay: 1321 - content: "\e[?25l\e[m\e[37;5H\e[K\e[1;35r\e[1;1H\e[8M\e[1;37r\e[28;1H\e[93m 36 \e[m \e[1m\e[96mfgColor\e[m\e[38;5;224m:\e[m white\e[61C\e[41m \e[m\r\n\e[93m 37 \e[m \e[1m\e[96mbgColor\e[m\e[38;5;224m:\e[m black\e[61C\e[41m \e[m\r\n\e[93m 38 \e[m \e[1m\e[96mcursorColor\e[m\e[38;5;224m:\e[m papayawhip\e[52C\e[41m \e[m\r\n\e[93m 39 \e[m \e[1m\e[96mgraphicColor\e[m\e[38;5;224m:\e[m cadetblue\e[52C\e[41m \e[m\r\n\e[93m 40 \e[m \e[1m\e[7m\e[96msho\e[m\e[1m\e[96mwIcons\e[m\e[38;5;224m:\e[m \e[95mfalse\e[m\e[59C\e[41m \e[m\r\n\e[93m 41 \e[m \e[1m\e[96mtable\e[m\e[38;5;224m:\e[m\e[71C\e[41m \e[m\r\n\e[93m 42 \e[m \e[1m\e[96mfgColor\e[m\e[38;5;224m:\e[m blue\e[62C\e[41m \e[m\r\n\e[93m 43 \e[m \e[1m\e[96mbgColor\e[m\e[38;5;224m:\e[m black\e[61C\e[41m \e[m\e[36;147H\e[1m\e[38;5;150m\e[48;5;239m40,5-5\e[9C38%\e[m\e[37;1H\e[K\e[37;1H/sho\e[?25h" - - delay: 673 - content: "\r\e[?25l" - - delay: 5 - content: "\e[32;9H\e[1m\e[30m\e[103msho\e[m\e[1m\e[96mwIcons\e[m\e[38;5;224m:\e[32;9H\e[?25h" - - delay: 400 - content: "\e[?25l\e[m\e[37;154Hw\e[32;9H\e[37;154H \e[32;18H\e[36;150H\e[1m\e[38;5;150m\e[48;5;239m14-14\e[32;18H\e[?25h" - - delay: 124 - content: "\e[?25l\e[m\e[37;154Hw\e[32;18H\e[37;154H \e[32;20H\e[36;151H\e[1m\e[38;5;150m\e[48;5;239m6-16 \e[32;20H\e[?25h" - - delay: 596 - content: "\e[?25l\e[m\e[37;154Hc\e[32;20H\e[?25h" - - delay: 168 - content: "\e[?25l\e[37;154H \e[32;20H\e[?25h\e[?25l\e[37;154Hcw\e[32;20H\e[37;154H \e[32;20H\e[37;1H\e[1m-- INSERT --" - - delay: 5 - content: "\e[m\e[32;20H \e[36;31H\e[1m\e[38;5;150m\e[48;5;239m+][yaml]\e]2;minikube_skin.yml + (~/.k9s) - VIM\a\e[32;20H\e[?25h" - - delay: 795 - content: "\e[?25l\e[mt\e[36;151H\e[1m\e[38;5;150m\e[48;5;239m7-17 \e[32;21H\e[?25h" - - delay: 168 - content: "\e[?25l\e[mr\e[36;151H\e[1m\e[38;5;150m\e[48;5;239m8-18 \e[32;22H\e[?25h" - - delay: 190 - content: "\e[?25l\e[mu\e[36;151H\e[1m\e[38;5;150m\e[48;5;239m9-19 \e[32;23H\e[?25h" - - delay: 82 - content: "\e[?25l\e[m\b\b\b\e[95mtrue\e[m\e[36;150H\e[1m\e[38;5;150m\e[48;5;239m20-20 \e[32;24H\e[?25h" - - delay: 520 - content: "\e[m\e[37;1H\e[K\e[32;23H\e[?25l\e[37;154H^[\e[32;23H\e[?25h" - - delay: 343 - content: "\e[?25l\e[37;154H \e[32;24H" - - delay: 5 - content: "\e[36;150H\e[1m\e[38;5;150m\e[48;5;239m19-19 \e[32;23H\e[?25h\e[?25l\e[m\e[37;154H:\e[32;23H\e[37;154H\e[K\e[37;1H:\e[?2004h\e[?25h" - - delay: 165 - content: "w\e[?25l\e[?25h" - - delay: 78 - content: "q\e[?25l\e[?25h" - - delay: 472 - content: "\r\e[?25l\e[?2004l\"~/.k9s/minikube_skin.yml\" 56L, 1141C written\r\e]2;Thanks for flying Vim\a" - - delay: 105 - content: "\r\r\n\e[?2004l\e[?1l\e>\e[?25h\e[?1049l" - - delay: 8 - content: "\e]1337;RemoteHost=fernand@MacBook-Pro.domain\a\e]1337;CurrentDir=/Users/fernand/go_wk/derailed/src/github.com/derailed/k9s\a" - - delay: 9 - content: "\e]" - - delay: 8 - content: "1337;SetUserVar=gitBranch=bm9uc19jcmQ=\a" - - delay: 53 - content: "\e[38;5;39mk9s\e[0;33m (nons_crd) \e[0;36mδ\e[0m\e[0;36m+\e[0m \e[1;31m>\e[1;30m>\e[1;32m>\e[0m " - - delay: 1569 - content: . - - delay: 215 - content: / - - delay: 1045 - content: k - - delay: 158 - content: '9' - - delay: 135 - content: s - - delay: 361 - content: ' ' - - delay: 471 - content: "\r\n" - - delay: 11 - content: "\e]133;C;\a" - - delay: 243 - content: "\e[?1049h\e[22;0;0t\e[?25l\e[H\e[2J\e[?25l\e[1;1H\e(B\e[m\e[48;2;0;0;0m \e[2;1H \e[3;1H \e(B\e[m\e[38;2;255;165;0;48;2;0;0;0m\e[1m ____ __.________ _________ .____ .___ \e(B\e[m\e[48;2;0;0;0m \e[4;1H \e(B\e[m\e[38;2;255;165;0;48;2;0;0;0m\e[1m| |/ _/ __ \\_____\\_ ___ \\| | | |\e(B\e[m\e[48;2;0;0;0m \e[5;1H \e(B\e[m\e[38;2;255;165;0;48;2;0;0;0m\e[1m| < \\____ / ___/ \\ \\/| | | |\e(B\e[m\e[48;2;0;0;0m \e[6;1H \e(B\e[m\e[38;2;255;165;0;48;2;0;0;0m\e[1m| | \\ / /\\___ \\\\ \\___| |___| |\e(B\e[m\e[48;2;0;0;0m \e[7;1H \e(B\e[m\e[38;2;255;165;0;48;2;0;0;0m\e[1m|____|__ \\ /____//____ >\\______ /_______ \\___|\e(B\e[m\e[48;2;0;0;0m \e[8;1H \e(B\e[m\e[38;2;255;165;0;48;2;0;0;0m\e[1m \\/ \\/ \\/ \\/ \e(B\e[m\e[48;2;0;0;0m \e[9;1H \e[10;1H \e[11;1H \e(B\e[m\e[38;2;30;144;255;48;2;0;0;0m\e[1mRevision \e(B\e[m\e[38;2;255;0;0;48;2;0;0;0m\e[1mdev\e(B\e[m\e[48;2;0;0;0m \e[12;1H \e[13;1H \e[14;1H \e[15;1H \e[16;1H \e[17;1H \e[18;1H \e[19;1H \e[20;1H \e[21;1H \e[22;1H \e[23;1H \e[24;1H \e[25;1H \e[26;1H \e[27;1H \e[28;1H \e[29;1H \e[30;1H \e[31;1H \e[32;1H \e[33;1H \e[34;1H \e[35;1H \e[36;1H \e[37;1H \e[?25l\e[?25l\e[?25l\e[?25l\e[?25l\e[?25l\e[?25l\e[?25l\e[?25l\e[?25l\e[?25l" - - delay: 508 - content: "\e[?25l\e[?25l\e[?25l\e[?25l" - - delay: 483 - content: "\e[?25l\e[1;2H\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mContext:\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m \e(B\e[m\e[38;2;30;144;255;48;2;0;0;0m\e[1mminikube\e[1;52H\e(B\e[m\e[38;2;30;144;255;48;2;0;0;0m \e(B\e[m\e[38;2;30;144;255;48;2;0;0;0m\e[1m \e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[2mGoto \e[1;138H\e(B\e[m\e[38;2;255;165;0;48;2;0;0;0m\e[1m ____ __.________ \e[2;2H\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mCluster:\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m \e(B\e[m\e[38;2;30;144;255;48;2;0;0;0m\e[1mminikube\e[2;52H\e(B\e[m\e[38;2;30;144;255;48;2;0;0;0m \e(B\e[m\e[38;2;30;144;255;48;2;0;0;0m\e[1m \e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[2mPod logs \e[2;138H\e(B\e[m\e[38;2;255;165;0;48;2;0;0;0m\e[1m| |/ _/ __ \\______\e[3;2H\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mUser:\e[3;10H\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m \e(B\e[m\e[38;2;30;144;255;48;2;0;0;0m\e[1mminikube\e[3;59H\e(B\e[m\e[48;2;0;0;0m \e[3;138H\e(B\e[m\e[38;2;255;165;0;48;2;0;0;0m\e[1m| < \\____ / ___/\e[4;2H\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mK9s Rev:\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m \e(B\e[m\e[38;2;30;144;255;48;2;0;0;0m\e[1mdev\e[4;59H\e(B\e[m\e[48;2;0;0;0m \e[4;138H\e(B\e[m\e[38;2;255;165;0;48;2;0;0;0m\e[1m| | \\ / /\\___ \\ \e[5;2H\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mK8s Rev:\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m \e(B\e[m\e[38;2;30;144;255;48;2;0;0;0m\e[1mv1.17.0\e[5;59H\e(B\e[m\e[48;2;0;0;0m \e[5;138H\e(B\e[m\e[38;2;255;165;0;48;2;0;0;0m\e[1m|____|__ \\ /____//____ >\e[6;2H\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mCPU:\e[6;10H\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m \e(B\e[m\e[38;2;30;144;255;48;2;0;0;0m\e[1m8%\e[6;59H\e(B\e[m\e[48;2;0;0;0m \e[6;138H\e(B\e[m\e[38;2;255;165;0;48;2;0;0;0m\e[1m \\/ \\/ \e[7;2H\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mMEM:\e[7;10H\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m \e(B\e[m\e[38;2;30;144;255;48;2;0;0;0m\e[1m29%\e[7;59H\e(B\e[m\e[48;2;0;0;0m \e[8;1H\e(B\e[m\e[38;2;0;255;255;48;2;0;0;0m\e[1m┌───────────────────────────────────────────────────────────────────── Xray-Pods(\e(B\e[m\e[38;2;255;0;255;48;2;0;0;0m\e[1mdefault\e(B\e[m\e[38;2;0;255;255;48;2;0;0;0m)[\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\e[1m0\e(B\e[m\e[38;2;0;255;255;48;2;0;0;0m] \e(B\e[m\e[38;2;0;255;255;48;2;0;0;0m\e[1m──────────────────────────────────────────────────────────────────────┐\e[9;1H│\e[9;3H\e(B\e[m\e[38;2;0;0;0;48;2;255;239;213m\U0001F69B\e[9;5H \e(B\e[m\e[38;2;255;255;255;48;2;255;239;213m\e[1mpods\e[9;164H\e(B\e[m\e[38;2;0;255;255;48;2;0;0;0m\e[1m│\e[10;1H│\e[10;164H│\e[11;1H│\e[11;77H\e(B\e[m\e[48;2;0;0;0m \e[11;164H\e(B\e[m\e[38;2;0;255;255;48;2;0;0;0m\e[1m│\e[12;1H│\e[12;164H│\e[13;1H│\e[13;164H│\e[14;1H│\e[14;164H│\e[15;1H│\e[15;164H│\e[16;1H│\e[16;164H│\e[17;1H│\e[17;164H│\e[18;1H│\e[18;164H│\e[19;1H│\e[19;164H│\e[20;1H│\e[20;164H│\e[21;1H│\e[21;164H│\e[22;1H│\e[22;164H│\e[23;1H│\e[23;164H│\e[24;1H│\e[24;164H│\e[25;1H│\e[25;164H│\e[26;1H│\e[26;164H│\e[27;1H│\e[27;164H│\e[28;1H│\e[28;164H│\e[29;1H│\e[29;164H│\e[30;1H│\e[30;164H│\e[31;1H│\e[31;164H│\e[32;1H│\e[32;164H│\e[33;1H└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘\e[34;2H\e(B\e[m\e[38;2;0;0;0;48;2;255;165;0m\e[1m \e[?25l" - - delay: 1525 - content: "\e[?25l\e[9;10H\e(B\e[m\e[38;2;255;255;255;48;2;255;239;213m\e[2m(2\e(B\e[m\e[48;2;255;239;213m\e[2m)\e[10;3H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m├──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\U0001F69B\e[10;8H \e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mnginx-5bbc876d89-p6m7b\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[2m(3\e(B\e[m\e[48;2;0;0;0m\e[2m)\e[10;35H\e(B\e[m\e[38;2;250;235;215;48;2;0;0;0m[1/1]\e[11;3H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e[11;6H├──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\U0001F4B3\e[11;11H \e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mdefault\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[2m(1\e(B\e[m\e[48;2;0;0;0m\e[2m)\e[12;3H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e[12;6H│\e[12;9H└──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\U0001F512\e[12;14H \e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mdefault-token-f57mg\e[13;3H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e[13;6H├──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\U0001F512\e[13;11H \e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mdefault-token-f57mg\e[14;3H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e[14;6H└──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\U0001F433\e[14;11H \e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mnginx\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[2m(1\e(B\e[m\e[48;2;0;0;0m\e[2m)\e[15;3H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e[15;9H└──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\U0001F5FA\e[15;14H \e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mbusy\e[16;3H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m└──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\U0001F69B\e[16;8H \e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mnginx-pv-d544d7649-cjg6h\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[2m(4\e(B\e[m\e[48;2;0;0;0m\e[2m)\e[16;37H\e(B\e[m\e[38;2;250;235;215;48;2;0;0;0m[1/1]\e[17;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m├──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\U0001F433\e[17;11H \e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mnginx\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[2m(2\e(B\e[m\e[48;2;0;0;0m\e[2m)\e[18;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e[18;9H├──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\U0001F5FA\e[18;14H \e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mbusy\e[19;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e[19;9H└──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\U0001F5FA\e[19;14H \e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mbusy11\e[20;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m├──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\U0001F39F\e[20;11H \e(B\e[m\e[38;2;255;165;0;48;2;0;0;0m\e[1mweb \e(B\e[m\e[38;2;255;255;0;48;2;255;165;0m\e[1mTOAST_REF\e[21;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m├──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\U0001F4B3\e[21;11H \e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mzorg\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[2m(3\e(B\e[m\e[48;2;0;0;0m\e[2m)\e[21;20H\e(B\e[m\e[38;2;250;235;215;48;2;0;0;0m[automount=true]\e[22;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e[22;9H├──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\U0001F512\e[22;14H \e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mdocker-zorg\e[23;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e[23;9H├──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\U0001F512\e[23;14H \e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mzorg\e[24;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e[24;9H└──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\U0001F512\e[24;14H \e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mzorg-token-rf4pm\e[25;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m└──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\U0001F512\e[25;11H \e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mzorg-token-rf4pm\e[?25l\e[?25l\e[8;91H\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\e[1m2\e[?25l" - - delay: 993 - content: "\e[?25l\e[?25l" - - delay: 1011 - content: "\e[?25l\e[20;12H\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mweb\e(B\e[m\e[48;2;0;0;0m \e[?25l\e[?25l\e[?25l" - - delay: 105 - content: "\e[?25l\e[8;1H\e(B\e[m\e[38;2;0;255;255;48;2;0;0;0m┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐\e[9;1H│\e[9;3H\e(B\e[m\e[38;2;30;144;255;48;2;0;0;0m\U0001F436\e[9;5H>\e(B\e[m\e[48;2;0;0;0m \e[9;164H\e(B\e[m\e[38;2;0;255;255;48;2;0;0;0m│\e[10;1H└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘\e[11;1H\e(B\e[m\e[38;2;0;255;255;48;2;0;0;0m\e[1m┌───────────────────────────────────────────────────────────────────── Xray-Pods(\e(B\e[m\e[38;2;255;0;255;48;2;0;0;0m\e[1mdefault\e(B\e[m\e[38;2;0;255;255;48;2;0;0;0m)[\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\e[1m2\e(B\e[m\e[38;2;0;255;255;48;2;0;0;0m] \e(B\e[m\e[38;2;0;255;255;48;2;0;0;0m\e[1m──────────────────────────────────────────────────────────────────────┐\e[12;3H\e(B\e[m\e[38;2;0;0;0;48;2;255;239;213m\U0001F69B\e[12;5H \e(B\e[m\e[38;2;255;255;255;48;2;255;239;213m\e[1mpods\e(B\e[m\e[38;2;255;255;255;48;2;255;239;213m\e[2m(2\e(B\e[m\e[48;2;255;239;213m\e[2m)\e(B\e[m\e[48;2;0;0;0m \e[13;3H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m├──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\U0001F69B\e[13;8H \e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mnginx-5bbc876d89\e[13;26Hp6m7b\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[2m(3\e(B\e[m\e[48;2;0;0;0m\e[2m)\e[13;35H\e(B\e[m\e[38;2;250;235;215;48;2;0;0;0m[1/1]\e[14;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m├\e[14;9H\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\U0001F4B3\e[14;12H\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mdefault\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[2m(1\e(B\e[m\e[48;2;0;0;0m\e[2m)\e[15;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e[15;12H\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\U0001F512\e[15;15H\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mdefault-token-f57mg\e[16;3H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e(B\e[m\e[48;2;0;0;0m \e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m├──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\U0001F512\e[16;11H \e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mdefault-token-f57m\e[16;31H\e(B\e[m\e[48;2;0;0;0m \e[16;37H \e[17;3H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e[17;6H└\e[17;18H\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[2m1\e[18;3H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e[18;6H\e(B\e[m\e[48;2;0;0;0m \e[18;9H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m└\e[19;3H└──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\U0001F69B\e[19;8H \e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mnginx-pv-d544d7649-cjg6h\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[2m(4\e(B\e[m\e[48;2;0;0;0m\e[2m)\e[19;37H\e(B\e[m\e[38;2;250;235;215;48;2;0;0;0m[1/1]\e[20;9H\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\U0001F433\e[20;12H\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mnginx\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[2m(2\e(B\e[m\e[48;2;0;0;0m\e[2m)\e[21;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e(B\e[m\e[48;2;0;0;0m \e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m├──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\U0001F5FA\e[21;14H \e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mbusy\e[21;20H\e(B\e[m\e[48;2;0;0;0m \e[22;9H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m└\e[22;12H\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\U0001F5FA\e[22;15H\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mbusy11\e(B\e[m\e[48;2;0;0;0m \e[23;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m├──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\U0001F39F\e[23;11H \e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mweb\e(B\e[m\e[48;2;0;0;0m \e[24;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m├──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\U0001F4B3\e[24;11H \e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mzorg\e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[2m(3\e(B\e[m\e[48;2;0;0;0m\e[2m)\e(B\e[m\e[48;2;0;0;0m \e(B\e[m\e[38;2;250;235;215;48;2;0;0;0m[automount=true]\e[25;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e(B\e[m\e[48;2;0;0;0m \e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m├──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\U0001F512\e[25;14H \e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mdocker-zorg\e(B\e[m\e[48;2;0;0;0m \e[26;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e[26;9H├──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\U0001F512\e[26;14H \e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mzorg\e[27;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m│\e[27;9H└──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\U0001F512\e[27;14H \e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mzorg-token-rf4pm\e[28;6H\e(B\e[m\e[38;2;95;158;160;48;2;0;0;0m└──\e(B\e[m\e[38;2;255;239;213;48;2;0;0;0m\U0001F512\e[28;11H \e(B\e[m\e[38;2;255;255;255;48;2;0;0;0m\e[1mzorg-token-rf4pm\e[?25l\e[?25l\e[?25l" - - delay: 200 - content: "\e[?25l\e[9;6H\e(B\e[m\e[38;2;30;144;255;48;2;0;0;0m q\e[?25l" - - delay: 198 - content: "\e[?25l\e[?25l" - - delay: 497 - content: "\e[?12l\e[?25h\e(B\e[m\e[H\e[2J\e[?1049l\e[23;0;0t\e[?1l\e>\e[?1000l\e[?1002l\e[?1003l\e[?1006l" - - delay: 9 - content: "\e]1337;RemoteHost=fernand@MacBook-Pro.domain\a\e]1337;CurrentDir=/Users/fernand/go_wk/derailed/src/github.com/derailed/k9s\a" - - delay: 7 - content: "\e]" - - delay: 7 - content: "1337;SetUserVar=gitBranch=bm9uc19jcmQ=\a" - - delay: 52 - content: "\e[38;5;39mk9s\e[0;33m (nons_crd) \e[0;36mδ\e[0m\e[0;36m+\e[0m \e[1;31m>\e[1;30m>\e[1;32m>\e[0m " - - delay: 1534 - content: l - - delay: 167 - content: o - - delay: 125 - content: g - - delay: 102 - content: o - - delay: 933 - content: i - - delay: 653 - content: "\b\e[K" - - delay: 281 - content: u - - delay: 415 - content: t - - delay: 283 - content: "\r\n" - - delay: 14 - content: "\e]133;C;\a"