From 68860766c4de8ee7897004d613d18c9a582e4fd0 Mon Sep 17 00:00:00 2001 From: Digital Studium Date: Wed, 24 Apr 2024 20:40:49 +0300 Subject: [PATCH] Add debug key binding --- README.md | 1 + a.out | Bin 0 -> 18248 bytes ccc.c | 200 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ kls | 1 + 4 files changed, 202 insertions(+) create mode 100755 a.out create mode 100644 ccc.c diff --git a/README.md b/README.md index 9834585..9ca6231 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ It is lightweight and easy to customize - `3` - edit resource - `4` - logs of pod - `5` - exec to pod +- `6` - network debug of pod (with nicolaka/netshoot container attached) - `delete` - delete resource You can customize these bindings or add extra bindings in `KEY_BINDINGS` variable of `kls` (in a row #6). diff --git a/a.out b/a.out new file mode 100755 index 0000000000000000000000000000000000000000..c6a6ac726509f34e4bd5d24680789fb28ad541f5 GIT binary patch literal 18248 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 // this includes +#include +#include +#include + +WINDOW *wbody, *inner; +FIELD **field; +FORM *form; + +int nb_field; // how many fields you want (modify it in main()) +int cur_y = 1, cur_x = 1; // current y and x for the inner window +char str_label[7], str_field[6]; +char cur_ch_label = 'A', cur_ch_field = 'a'; +int lines = 21, cur_page = 0; + +/* + ++----------------------------------+ <-- wbody +|+--------------------------------+ <-- inner +|| ^ || +|| | || +|| | || +|| | || +|| | lines || +|| | || +|| | || +|| | || +|| v || +|+--------------------------------+| ++----------------------------------+ + +*/ + +// We free everything here +void quit() { + int i; + + unpost_form(form); + + for (i = 0; i < nb_field; i++) { + free(field_buffer(field[i], 0)); + free_field(field[i]); + } + + free_form(form); + delwin(wbody); + delwin(inner); +} + +char* get_next_str_field() { + int i; + + if (str_field[0] != '\0') + cur_ch_field++; + + for (i = 0; i < 4; i++) + str_field[i] = cur_ch_field; + + str_field[5] = '\0'; + + return str_field; +} + +char* get_next_str_label() { + int i; + + if (str_label[0] != '\0') + cur_ch_label++; + + for (i = 0; i < 5; i++) + str_label[i] = cur_ch_label; + + str_label[5] = ':'; + str_label[6] = '\0'; + + return str_label; +} + +/* + * Create nb_field fields, one as a label, one as an active field e.g.: + * [label]: [field] + */ +void create_nb_fields() { + int i; + + field = calloc(nb_field, sizeof(FIELD *)); + + if (!field) // No memory for you ! + assert(1); + + for (i = 0; i < nb_field-1; i++, cur_y += 2) { + // label + field[i] = new_field(1, 20, cur_y, cur_x, 0, 0); + field_opts_on(field[i], O_VISIBLE); + field_opts_off(field[i], O_EDIT); + field_opts_off(field[i], O_ACTIVE); + set_field_buffer(field[i], 0, get_next_str_label()); + + i++; + + /* + * This is a nasty tric: + * I check if we wrote at the tail of the inner window, + * if so, I move the field where it belongs (head of + * the inner window). + */ + if (cur_y % lines == 0) { + cur_y = 1; + set_new_page(field[i-1], TRUE); + move_field(field[i-1], cur_y, cur_x); + } + + // field + field[i] = new_field(1, 20, cur_y, cur_x + 10, 0, 0); + set_field_back(field[i], A_UNDERLINE); + field_opts_on(field[i], O_VISIBLE); + field_opts_on(field[i], O_ACTIVE); + field_opts_off(field[i], O_EDIT); + set_field_buffer(field[i], 0, get_next_str_field()); + } + + field[nb_field-1] = NULL; +} + +int main() { + int ch; + + initscr(); + cbreak(); + noecho(); + keypad(stdscr, TRUE); + + // This is required to init get_next_str_XXXX + str_label[0] = '\0'; + str_field[0] = '\0'; + + wbody = newwin(lines + 2, 44, 1, 1); + box(wbody, 0, 0); + keypad(wbody, TRUE); + + nb_field = 43; // this is too much fields for the window + create_nb_fields(); + form = new_form(field); + + // Check the doc here: + // http://www.tldp.org/HOWTO/NCURSES-Programming-HOWTO/forms.html#FORMWINDOWS + set_form_win(form, wbody); + inner = derwin(wbody, lines, 42, 1 ,1); + set_form_sub(form, inner); + + post_form(form); + + mvprintw(LINES - 4, 0, "Use F1 to quit"); + mvprintw(LINES - 3, 0, "Use PAGE_UP, PAGE_DOWN to switch between pages"); + mvprintw(LINES - 2, 0, "Use UP, DOWN arrow keys to switch between fields"); + refresh(); + + while ((ch = wgetch(wbody)) != KEY_F(1)) { + switch (ch) { + case KEY_DOWN: + form_driver(form, REQ_NEXT_FIELD); + form_driver(form, REQ_END_LINE); + break; + + case KEY_UP: + form_driver(form, REQ_PREV_FIELD); + form_driver(form, REQ_END_LINE); + break; + + /* + * This is where you want to look to see how + * to "scroll" to the next/previous page. + */ + case KEY_NPAGE: + form_driver(form, REQ_NEXT_PAGE); + set_form_page(form, ++cur_page); + break; + + case KEY_PPAGE: + form_driver(form, REQ_PREV_PAGE); + set_form_page(form, --cur_page); + break; + } + } + + quit(); + endwin(); + return 0; +} diff --git a/kls b/kls index 3afd02a..459f783 100755 --- a/kls +++ b/kls @@ -7,6 +7,7 @@ KEY_BINDINGS = { # can be extended "3": 'kubectl -n {namespace} edit {api_resource} {resource}', "4": 'kubectl -n {namespace} logs {resource} | batcat -l log --paging always --style numbers', "5": 'kubectl -n {namespace} exec -it {resource} sh', + "6": 'kubectl -n {namespace} debug {resource} -it --image=nicolaka/netshoot', "KEY_DC": 'kubectl -n {namespace} delete {api_resource} {resource}' # KEY_DC is the delete key } # which api resources are on the top of menu?