Reach consistent state
This commit is contained in:
parent
e2607f493c
commit
41e86c49e9
310
kls
310
kls
|
@ -51,7 +51,7 @@ menu1 = Menu("Namespaces", namespaces, 0, SELECTED_WITHOUT_SEARCH)
|
||||||
|
|
||||||
# рисуем второе меню
|
# рисуем второе меню
|
||||||
## готовим контент
|
## готовим контент
|
||||||
api_resources = ["pods", "services", "deployments", "ingresses"]
|
api_resources = ["pods", "services", "deployments", "statefulsets", "ingresses", "configmaps", "secrets"]
|
||||||
## отрисовываем меню
|
## отрисовываем меню
|
||||||
menu2 = Menu("API resources", api_resources, 0 + curses.COLS // 3, NOT_SELECTED_WITHOUT_SEARCH)
|
menu2 = Menu("API resources", api_resources, 0 + curses.COLS // 3, NOT_SELECTED_WITHOUT_SEARCH)
|
||||||
|
|
||||||
|
@ -67,8 +67,11 @@ menu3 = Menu("Resources", pods, 0 + curses.COLS // 3 * 2, NOT_SELECTED_WITHOUT_S
|
||||||
menus = [menu1, menu2, menu3]
|
menus = [menu1, menu2, menu3]
|
||||||
|
|
||||||
|
|
||||||
def run_command(command):
|
def run_command(command, namespace, api_resource, resource):
|
||||||
|
curses.def_shell_mode()
|
||||||
|
curses.endwin()
|
||||||
subprocess.call(eval(command), shell=True)
|
subprocess.call(eval(command), shell=True)
|
||||||
|
curses.reset_shell_mode()
|
||||||
|
|
||||||
|
|
||||||
def update_menu3():
|
def update_menu3():
|
||||||
|
@ -127,64 +130,56 @@ def draw_search_box(menu):
|
||||||
def catch_input(menu):
|
def catch_input(menu):
|
||||||
global running
|
global running
|
||||||
key_pressed = screen.getkey()
|
key_pressed = screen.getkey()
|
||||||
match key_pressed:
|
if key_pressed == "/":
|
||||||
case "/":
|
menu.state = SELECTED_WITH_SEARCH
|
||||||
menu.state = SELECTED_WITH_SEARCH
|
elif key_pressed == "q" and menu.state == SELECTED_WITHOUT_SEARCH:
|
||||||
case "q":
|
running = False
|
||||||
if menu.state == 1:
|
elif key_pressed == "\x1b" and menu.state == SELECTED_WITH_SEARCH: # Escape disables search mode
|
||||||
running = False
|
menu.filter = ""
|
||||||
else:
|
menu.win.clear()
|
||||||
menu.filter += key_pressed
|
draw_rows(menu)
|
||||||
menu.win.clear() # очищаю всё окно потому что лень очищать все строки только в конкретной области окна
|
menu.state = SELECTED_WITHOUT_SEARCH
|
||||||
menu.row = 0
|
elif key_pressed == "KEY_BACKSPACE" and menu.filter:
|
||||||
draw_menu(menu)
|
menu.filter = menu.filter[:-1] # удаляем символ из строки поиска
|
||||||
case "\x1b": # Escape disables search mode
|
menu.win.clear()
|
||||||
if menu.state == SELECTED_WITH_SEARCH:
|
draw_menu(menu)
|
||||||
menu.filter = ""
|
elif key_pressed == "KEY_BACKSPACE" and not menu.filter:
|
||||||
menu.win.clear()
|
menu.state = SELECTED_WITHOUT_SEARCH
|
||||||
draw_rows(menu)
|
elif key_pressed == '\t' or key_pressed == "KEY_RIGHT":
|
||||||
menu.state = SELECTED_WITHOUT_SEARCH
|
navigate_horizontally("right", menu)
|
||||||
case "KEY_BACKSPACE":
|
elif key_pressed == "KEY_BTAB" or key_pressed == "KEY_LEFT":
|
||||||
if menu.filter:
|
navigate_horizontally("left", menu)
|
||||||
menu.filter = menu.filter[:-1] # удаляем символ из строки поиска
|
elif key_pressed == "KEY_DOWN":
|
||||||
menu.win.clear()
|
navigate_vertically("down", menu)
|
||||||
draw_menu(menu)
|
elif key_pressed == "KEY_UP":
|
||||||
else:
|
navigate_vertically("up", menu)
|
||||||
menu.state = SELECTED_WITHOUT_SEARCH
|
elif key_pressed in "gdle" and menu3.state in [1, 2] and menu3.rows and not menu3.rows[menu3.row].startswith("No resources"):
|
||||||
case '\t' | "KEY_RIGHT":
|
menu3_filtered_rows = list(filter(lambda x: (x.startswith(menu3.filter)), menu3.rows)) # фильтруем строки меню 3
|
||||||
navigate_horizontally("right", menu)
|
if not menu3_filtered_rows:
|
||||||
case "KEY_BTAB" | "KEY_LEFT":
|
return
|
||||||
navigate_horizontally("left", menu)
|
menu1_filtered_rows = list(filter(lambda x: (x.startswith(menu1.filter)), menu1.rows)) # фильтруем строки
|
||||||
case "KEY_DOWN":
|
menu2_filtered_rows = list(filter(lambda x: (x.startswith(menu2.filter)), menu2.rows)) # фильтруем строки
|
||||||
navigate_vertically("down", menu)
|
namespace = menu1_filtered_rows[menu1.row]
|
||||||
case "KEY_UP":
|
api_resource = menu2_filtered_rows[menu2.row]
|
||||||
navigate_vertically("up", menu)
|
resource = menu3.rows[menu3.row]
|
||||||
case 'g':
|
if key_pressed == 'g':
|
||||||
if menu3.state in [1, 2]:
|
command = f"f'kubectl -n {namespace} get {api_resource} {resource} -o yaml | batcat -l yaml --paging always --style numbers'"
|
||||||
# update_menu3()
|
elif key_pressed == 'd':
|
||||||
if menu3.rows:
|
command = f"f'kubectl -n {namespace} describe {api_resource} {resource} | batcat -l yaml --paging always --style numbers'"
|
||||||
if not menu3.rows[menu3.row].startswith("No resources"):
|
elif key_pressed == 'l' and api_resource != "pods":
|
||||||
curses.def_shell_mode()
|
return
|
||||||
curses.endwin()
|
elif key_pressed == 'l' and api_resource == "pods":
|
||||||
command = "f'kubectl -n {menu1.rows[menu1.row]} get {menu2.rows[menu2.row]} {menu3.rows[menu3.row]} -o yaml | batcat -l yaml --paging always --style numbers'"
|
command = f"f'kubectl -n {namespace} logs {resource} | batcat -l log --paging always --style numbers'"
|
||||||
run_command(command)
|
if key_pressed == 'e':
|
||||||
curses.reset_shell_mode()
|
command = f"f'kubectl edit {api_resource} -n {namespace} {resource}'"
|
||||||
# case 'd':
|
# raise ValueError(str(menu.state) + ' ' + eval(command))
|
||||||
# if current_menu == 2 and not menus[2].rows[menus[2].row].startswith("No resources"):
|
run_command(command, namespace, api_resource, resource)
|
||||||
# run_command("f'kubectl -n {namespace} describe {api_resource} {resource} | batcat -l yaml --paging always --style numbers'", current_menu)
|
elif (key_pressed.isalpha() or key_pressed == "-") and menu.state == SELECTED_WITH_SEARCH: # объекты в кубе не могут иметь иных символов кроме a-z и -
|
||||||
# case 'l':
|
menu.filter += key_pressed
|
||||||
# if current_menu == 2 and not menus[2].rows[menus[2].row].startswith("No resources") and menus[1].rows[menus[1].row] == "pods":
|
menu.win.clear()
|
||||||
# run_command("f'kubectl -n {namespace} logs {resource} | batcat -l log --paging always --style numbers'", current_menu)
|
menu.row = 0
|
||||||
# case 'e':
|
draw_menu(menu)
|
||||||
# if current_menu == 2 and not menus[2].rows[menus[2].row].startswith("No resources"):
|
if menu != menu3 and not (key_pressed in ["KEY_RIGHT", "KEY_LEFT", "\t", "KEY_BTAB"] ):
|
||||||
# run_command("f'kubectl edit {api_resource} -n {namespace} {resource}'", current_menu)
|
|
||||||
case _:
|
|
||||||
if menu.state == SELECTED_WITH_SEARCH and key_pressed.isalpha() or key_pressed == "-": # объекты в кубе не могут иметь иных символов кроме a-z и -
|
|
||||||
menu.filter += key_pressed
|
|
||||||
menu.win.clear()
|
|
||||||
menu.row = 0
|
|
||||||
draw_menu(menu)
|
|
||||||
if menu3.state not in [1, 2]:
|
|
||||||
menu3.win.clear()
|
menu3.win.clear()
|
||||||
update_menu3()
|
update_menu3()
|
||||||
draw_menu(menu3)
|
draw_menu(menu3)
|
||||||
|
@ -226,192 +221,22 @@ def main(screen):
|
||||||
draw_menu(menu)
|
draw_menu(menu)
|
||||||
while running:
|
while running:
|
||||||
### выбрано первое меню ###
|
### выбрано первое меню ###
|
||||||
menu = menu1
|
if menu1.state in [1, 2]:
|
||||||
if menu1.state == 1 and menu2.state == 3 and menu3.state == 3:
|
draw_header(menu1) # рисуем заголовок
|
||||||
draw_header(menu) # рисуем заголовок
|
draw_search_box(menu1) # рисуем строку поиска
|
||||||
draw_search_box(menu) # рисуем строку поиска
|
catch_input(menu1) # перехватываем нажатия клавиш
|
||||||
catch_input(menu) # перехватываем нажатия клавиш
|
|
||||||
elif menu1.state == 1 and menu2.state == 4 and menu3.state == 3:
|
|
||||||
draw_header(menu) # рисуем заголовок
|
|
||||||
draw_search_box(menu) # рисуем строку поиска
|
|
||||||
catch_input(menu) # перехватываем нажатия клавиш
|
|
||||||
elif menu1.state == 1 and menu2.state == 3 and menu3.state == 4:
|
|
||||||
draw_header(menu) # рисуем заголовок
|
|
||||||
draw_search_box(menu) # рисуем строку поиска
|
|
||||||
catch_input(menu) # перехватываем нажатия клавиш
|
|
||||||
elif menu1.state == 1 and menu2.state == 4 and menu3.state == 4:
|
|
||||||
draw_header(menu) # рисуем заголовок
|
|
||||||
draw_search_box(menu) # рисуем строку поиска
|
|
||||||
catch_input(menu) # перехватываем нажатия клавиш
|
|
||||||
elif menu1.state == 2 and menu2.state == 3 and menu3.state == 3:
|
|
||||||
draw_header(menu) # рисуем заголовок
|
|
||||||
draw_search_box(menu) # рисуем строку поиска
|
|
||||||
catch_input(menu) # перехватываем нажатия клавиш
|
|
||||||
elif menu1.state == 2 and menu2.state == 4 and menu3.state == 3:
|
|
||||||
draw_header(menu) # рисуем заголовок
|
|
||||||
draw_search_box(menu) # рисуем строку поиска
|
|
||||||
catch_input(menu) # перехватываем нажатия клавиш
|
|
||||||
elif menu1.state == 2 and menu2.state == 3 and menu3.state == 4:
|
|
||||||
draw_header(menu) # рисуем заголовок
|
|
||||||
draw_search_box(menu) # рисуем строку поиска
|
|
||||||
catch_input(menu) # перехватываем нажатия клавиш
|
|
||||||
elif menu1.state == 2 and menu2.state == 4 and menu3.state == 4:
|
|
||||||
draw_header(menu) # рисуем заголовок
|
|
||||||
draw_search_box(menu) # рисуем строку поиска
|
|
||||||
catch_input(menu) # перехватываем нажатия клавиш
|
|
||||||
|
|
||||||
### выбрано второе меню ###
|
### выбрано второе меню ###
|
||||||
menu = menu2
|
elif menu2.state in [1, 2]:
|
||||||
if menu1.state == 3 and menu2.state == 1 and menu3.state == 3:
|
draw_header(menu2) # рисуем заголовок
|
||||||
draw_header(menu) # рисуем заголовок
|
draw_search_box(menu2) # рисуем строку поиска
|
||||||
draw_search_box(menu) # рисуем строку поиска
|
catch_input(menu2) # перехватываем нажатия клавиш
|
||||||
catch_input(menu) # перехватываем нажатия клавиш
|
|
||||||
elif menu1.state == 3 and menu2.state == 1 and menu3.state == 4:
|
|
||||||
draw_header(menu) # рисуем заголовок
|
|
||||||
draw_search_box(menu) # рисуем строку поиска
|
|
||||||
catch_input(menu) # перехватываем нажатия клавиш
|
|
||||||
elif menu1.state == 4 and menu2.state == 1 and menu3.state == 3:
|
|
||||||
draw_header(menu) # рисуем заголовок
|
|
||||||
draw_search_box(menu) # рисуем строку поиска
|
|
||||||
catch_input(menu) # перехватываем нажатия клавиш
|
|
||||||
elif menu1.state == 4 and menu2.state == 1 and menu3.state == 4:
|
|
||||||
draw_header(menu) # рисуем заголовок
|
|
||||||
draw_search_box(menu) # рисуем строку поиска
|
|
||||||
catch_input(menu) # перехватываем нажатия клавиш
|
|
||||||
elif menu1.state == 3 and menu2.state == 2 and menu3.state == 3:
|
|
||||||
draw_header(menu) # рисуем заголовок
|
|
||||||
draw_search_box(menu) # рисуем строку поиска
|
|
||||||
catch_input(menu) # перехватываем нажатия клавиш
|
|
||||||
elif menu1.state == 3 and menu2.state == 2 and menu3.state == 4:
|
|
||||||
draw_header(menu) # рисуем заголовок
|
|
||||||
draw_search_box(menu) # рисуем строку поиска
|
|
||||||
catch_input(menu) # перехватываем нажатия клавиш
|
|
||||||
elif menu1.state == 4 and menu2.state == 2 and menu3.state == 3:
|
|
||||||
draw_header(menu) # рисуем заголовок
|
|
||||||
draw_search_box(menu) # рисуем строку поиска
|
|
||||||
catch_input(menu) # перехватываем нажатия клавиш
|
|
||||||
elif menu1.state == 4 and menu2.state == 2 and menu3.state == 4:
|
|
||||||
draw_header(menu) # рисуем заголовок
|
|
||||||
draw_search_box(menu) # рисуем строку поиска
|
|
||||||
catch_input(menu) # перехватываем нажатия клавиш
|
|
||||||
|
|
||||||
### выбрано третье меню ###
|
### выбрано третье меню ###
|
||||||
menu = menu3
|
elif menu3.state in [1, 2]:
|
||||||
if menu1.state == 3 and menu2.state == 3 and menu3.state == 1:
|
draw_header(menu3) # рисуем заголовок
|
||||||
draw_header(menu) # рисуем заголовок
|
draw_search_box(menu3) # рисуем строку поиска
|
||||||
draw_search_box(menu) # рисуем строку поиска
|
catch_input(menu3) # перехватываем нажатия клавиш
|
||||||
catch_input(menu) # перехватываем нажатия клавиш
|
|
||||||
elif menu1.state == 3 and menu2.state == 4 and menu3.state == 1:
|
|
||||||
draw_header(menu) # рисуем заголовок
|
|
||||||
draw_search_box(menu) # рисуем строку поиска
|
|
||||||
catch_input(menu) # перехватываем нажатия клавиш
|
|
||||||
elif menu1.state == 4 and menu2.state == 3 and menu3.state == 1:
|
|
||||||
draw_header(menu) # рисуем заголовок
|
|
||||||
draw_search_box(menu) # рисуем строку поиска
|
|
||||||
catch_input(menu) # перехватываем нажатия клавиш
|
|
||||||
elif menu1.state == 4 and menu2.state == 4 and menu3.state == 1:
|
|
||||||
draw_header(menu) # рисуем заголовок
|
|
||||||
draw_search_box(menu) # рисуем строку поиска
|
|
||||||
catch_input(menu) # перехватываем нажатия клавиш
|
|
||||||
elif menu1.state == 3 and menu2.state == 3 and menu3.state == 2:
|
|
||||||
draw_header(menu) # рисуем заголовок
|
|
||||||
draw_search_box(menu) # рисуем строку поиска
|
|
||||||
catch_input(menu) # перехватываем нажатия клавиш
|
|
||||||
elif menu1.state == 3 and menu2.state == 4 and menu3.state == 2:
|
|
||||||
draw_header(menu) # рисуем заголовок
|
|
||||||
draw_search_box(menu) # рисуем строку поиска
|
|
||||||
catch_input(menu) # перехватываем нажатия клавиш
|
|
||||||
elif menu1.state == 4 and menu2.state == 3 and menu3.state == 2:
|
|
||||||
draw_header(menu) # рисуем заголовок
|
|
||||||
draw_search_box(menu) # рисуем строку поиска
|
|
||||||
catch_input(menu) # перехватываем нажатия клавиш
|
|
||||||
elif menu1.state == 4 and menu2.state == 4 and menu3.state == 2:
|
|
||||||
draw_header(menu) # рисуем заголовок
|
|
||||||
draw_search_box(menu) # рисуем строку поиска
|
|
||||||
catch_input(menu) # перехватываем нажатия клавиш
|
|
||||||
|
|
||||||
|
|
||||||
# if current_menu == 0:
|
|
||||||
# if key_pressed == "/":
|
|
||||||
# search_mode = True
|
|
||||||
# if search_mode:
|
|
||||||
# match key_pressed:
|
|
||||||
# case '\t' | "KEY_RIGHT":
|
|
||||||
# current_menu = navigate_horizontally("right", current_menu)
|
|
||||||
# case "KEY_BTAB" | "KEY_LEFT":
|
|
||||||
# current_menu = navigate_horizontally("left", current_menu)
|
|
||||||
# case "KEY_DOWN":
|
|
||||||
# navigate_vertically("down", current_menu)
|
|
||||||
# case "KEY_UP":
|
|
||||||
# navigate_vertically("up", current_menu)
|
|
||||||
# case "KEY_BACKSPACE":
|
|
||||||
# if filter:
|
|
||||||
# filter = filter[:-1]
|
|
||||||
# else:
|
|
||||||
# search_mode = False
|
|
||||||
# if key_pressed.isalpha() or key_pressed == "-":
|
|
||||||
# filter += key_pressed
|
|
||||||
# elif key_pressed == "/" and filter == "":
|
|
||||||
# pass
|
|
||||||
# else:
|
|
||||||
# continue
|
|
||||||
# init_screen()
|
|
||||||
# for menu in menus:
|
|
||||||
# menu.win.clear() # очищаем окно
|
|
||||||
# menu.win.box()
|
|
||||||
# menu.win.addstr(1, 2, menu.name) # добавляем заголовок окна
|
|
||||||
# if menu.name == "Namespaces":
|
|
||||||
# menu.rows = list(filter(lambda x: (x.startswith(filter)), namespaces)) # меняем строки у окна Namespaces
|
|
||||||
# menu.row = 0
|
|
||||||
# if search_mode:
|
|
||||||
# menu.win.addstr(curses.LINES - 2, 2, f"/{filter}")
|
|
||||||
# else:
|
|
||||||
# menu.win.addstr(curses.LINES - 2, 2, "Press / for search")
|
|
||||||
# elif menu.name == "Resources":
|
|
||||||
# if menus[0].rows:
|
|
||||||
# namespace = menus[0].rows[menus[0].row]
|
|
||||||
# api_resource = menus[1].rows[menus[1].row]
|
|
||||||
# command = "f'kubectl get {api_resource} -n {namespace} --no-headers -o template=\"{{{{range .items}}}}{{{{.metadata.name}}}} {{{{end}}}}\"'"
|
|
||||||
# bytes_list = subprocess.check_output(eval(command), shell=True).split()
|
|
||||||
# resources = [bytes_list[i].decode('utf-8') for i in range(len(bytes_list))]
|
|
||||||
# if not resources:
|
|
||||||
# resources = [f"No resources found in {namespace} namespace.",]
|
|
||||||
# else:
|
|
||||||
# resources = ["No namespace selected",]
|
|
||||||
# menu.rows = resources
|
|
||||||
#
|
|
||||||
# for index, row in enumerate(menu.rows):
|
|
||||||
# menu.win.addstr(index + 3, 2, row)
|
|
||||||
# if menu.rows:
|
|
||||||
# menu.win.addstr(3, 2, menu.rows[menu.row], curses.A_REVERSE | curses.A_ITALIC) # выделяем первую строку
|
|
||||||
# menus[current_menu].win.addstr(1, 2, menus[current_menu].name, curses.A_REVERSE | curses.A_ITALIC) # помечаем выбранное меню
|
|
||||||
# continue
|
|
||||||
#
|
|
||||||
# match key_pressed:
|
|
||||||
# case 'q':
|
|
||||||
# running = False
|
|
||||||
# case '/':
|
|
||||||
# search_mode = True
|
|
||||||
# case 'g':
|
|
||||||
# if current_menu == 2 and not menus[2].rows[menus[2].row].startswith("No resources"):
|
|
||||||
# run_command("f'kubectl -n {namespace} get {api_resource} {resource} -o yaml | batcat -l yaml --paging always --style numbers'", current_menu)
|
|
||||||
# case 'd':
|
|
||||||
# if current_menu == 2 and not menus[2].rows[menus[2].row].startswith("No resources"):
|
|
||||||
# run_command("f'kubectl -n {namespace} describe {api_resource} {resource} | batcat -l yaml --paging always --style numbers'", current_menu)
|
|
||||||
# case 'l':
|
|
||||||
# if current_menu == 2 and not menus[2].rows[menus[2].row].startswith("No resources") and menus[1].rows[menus[1].row] == "pods":
|
|
||||||
# run_command("f'kubectl -n {namespace} logs {resource} | batcat -l log --paging always --style numbers'", current_menu)
|
|
||||||
# case 'e':
|
|
||||||
# if current_menu == 2 and not menus[2].rows[menus[2].row].startswith("No resources"):
|
|
||||||
# run_command("f'kubectl edit {api_resource} -n {namespace} {resource}'", current_menu)
|
|
||||||
# case '\t' | "KEY_RIGHT":
|
|
||||||
# current_menu = navigate_horizontally("right", current_menu)
|
|
||||||
# case "KEY_BTAB" | "KEY_LEFT":
|
|
||||||
# current_menu = navigate_horizontally("left", current_menu)
|
|
||||||
# case "KEY_DOWN":
|
|
||||||
# navigate_vertically("down", current_menu)
|
|
||||||
# case "KEY_UP":
|
|
||||||
# navigate_vertically("up", current_menu)
|
|
||||||
main(screen)
|
main(screen)
|
||||||
# curses.wrapper(main)
|
# curses.wrapper(main)
|
||||||
|
|
||||||
|
@ -420,4 +245,3 @@ screen.keypad(False)
|
||||||
curses.echo()
|
curses.echo()
|
||||||
curses.endwin()
|
curses.endwin()
|
||||||
subprocess.call(["clear"])
|
subprocess.call(["clear"])
|
||||||
#
|
|
||||||
|
|
Loading…
Reference in New Issue