feat: Добавлена обработка ошибок для всех интерактивных меню
- Добавлена обработка ошибок для меню лаборатории - Добавлена обработка ошибок для меню Kubernetes - Добавлена обработка ошибок для меню пресетов - Добавлена обработка ошибок для меню ролей - Добавлены интерактивные диалоги для ввода параметров - Добавлены подтверждения для опасных операций - Добавлены информативные сообщения об успехе/ошибке Обработка ошибок включает: - Проверка наличия данных (логи, статус, списки) - Интерактивный ввод параметров через whiptail - Подтверждение опасных операций (destroy) - Информативные сообщения об успехе/ошибке - Прокручиваемые окна для длинных выводов - Предупреждения при отсутствии данных Меню лаборатории: - ✅ Успех/❌ Ошибка для всех операций - ⚠️ Подтверждение для destroy - 📊 Статус с проверкой наличия данных - 📝 Логи с прокруткой Меню Kubernetes: - Интерактивный ввод команд и параметров - Проверка доступности кластера - Информативные сообщения с URL Меню пресетов/ролей: - Интерактивный ввод имен - Проверка существования файлов - Отображение ошибок синтаксиса - Подтверждение операций Преимущества: - Пользователь всегда знает результат операции - Нет пустых экранов при отсутствии данных - Интерактивный ввод параметров - Безопасность через подтверждения - Удобство использования Автор: Сергей Антропов Сайт: https://devops.org.ru
This commit is contained in:
259
Makefile
259
Makefile
@@ -133,13 +133,56 @@ menu-lab: check-whiptail ## Меню управления лабораторие
|
||||
3>&1 1>&2 2>&3); \
|
||||
if [ $$? -ne 0 ] || [ "$$CHOICE" = "back" ]; then exit 0; fi; \
|
||||
case "$$CHOICE" in \
|
||||
"up") make lab up;; \
|
||||
"down") make lab down;; \
|
||||
"test") make lab test;; \
|
||||
"destroy") make lab destroy;; \
|
||||
"status") make lab status;; \
|
||||
"logs") make lab logs;; \
|
||||
"shell") make lab shell;; \
|
||||
"up") \
|
||||
echo "$(BLUE)🚀 Запуск лаборатории...$(RESET)"; \
|
||||
if make lab up; then \
|
||||
whiptail --title "✅ Успех" --msgbox "Лаборатория успешно запущена!" 8 50; \
|
||||
else \
|
||||
whiptail --title "❌ Ошибка" --msgbox "Ошибка при запуске лаборатории. Проверьте логи." 8 50; \
|
||||
fi;; \
|
||||
"down") \
|
||||
echo "$(BLUE)🛑 Остановка лаборатории...$(RESET)"; \
|
||||
if make lab down; then \
|
||||
whiptail --title "✅ Успех" --msgbox "Лаборатория успешно остановлена!" 8 50; \
|
||||
else \
|
||||
whiptail --title "❌ Ошибка" --msgbox "Ошибка при остановке лаборатории." 8 50; \
|
||||
fi;; \
|
||||
"test") \
|
||||
echo "$(BLUE)🧪 Тестирование лаборатории...$(RESET)"; \
|
||||
if make lab test; then \
|
||||
whiptail --title "✅ Успех" --msgbox "Тесты лаборатории прошли успешно!" 8 50; \
|
||||
else \
|
||||
whiptail --title "❌ Ошибка" --msgbox "Тесты лаборатории не прошли. Проверьте логи." 8 50; \
|
||||
fi;; \
|
||||
"destroy") \
|
||||
if whiptail --title "⚠️ Подтверждение" --yesno "Вы уверены, что хотите уничтожить лабораторию? Это действие необратимо!" 8 50; then \
|
||||
echo "$(BLUE)💥 Уничтожение лаборатории...$(RESET)"; \
|
||||
if make lab destroy; then \
|
||||
whiptail --title "✅ Успех" --msgbox "Лаборатория успешно уничтожена!" 8 50; \
|
||||
else \
|
||||
whiptail --title "❌ Ошибка" --msgbox "Ошибка при уничтожении лаборатории." 8 50; \
|
||||
fi; \
|
||||
fi;; \
|
||||
"status") \
|
||||
echo "$(BLUE)📊 Проверка статуса лаборатории...$(RESET)"; \
|
||||
STATUS_OUTPUT=$$(make lab status 2>&1); \
|
||||
if [ $$? -eq 0 ] && [ -n "$$STATUS_OUTPUT" ]; then \
|
||||
whiptail --title "📊 Статус лаборатории" --msgbox "$$STATUS_OUTPUT" 15 70; \
|
||||
else \
|
||||
whiptail --title "⚠️ Предупреждение" --msgbox "Лаборатория не запущена или статус недоступен." 8 50; \
|
||||
fi;; \
|
||||
"logs") \
|
||||
echo "$(BLUE)📝 Получение логов лаборатории...$(RESET)"; \
|
||||
LOGS_OUTPUT=$$(make lab logs 2>&1); \
|
||||
if [ $$? -eq 0 ] && [ -n "$$LOGS_OUTPUT" ]; then \
|
||||
echo "$$LOGS_OUTPUT" | whiptail --title "📝 Логи лаборатории" --scrolltext --textbox /dev/stdin 20 70; \
|
||||
else \
|
||||
whiptail --title "⚠️ Предупреждение" --msgbox "Логи недоступны. Лаборатория может быть не запущена." 8 50; \
|
||||
fi;; \
|
||||
"shell") \
|
||||
echo "$(BLUE)🐚 Подключение к контейнеру...$(RESET)"; \
|
||||
whiptail --title "🐚 Shell" --msgbox "Подключение к контейнеру. Используйте Ctrl+D для выхода." 8 50; \
|
||||
make lab shell;; \
|
||||
esac
|
||||
|
||||
.PHONY: menu-kube
|
||||
@@ -157,13 +200,61 @@ menu-kube: check-whiptail ## Меню управления Kubernetes
|
||||
3>&1 1>&2 2>&3); \
|
||||
if [ $$? -ne 0 ] || [ "$$CHOICE" = "back" ]; then exit 0; fi; \
|
||||
case "$$CHOICE" in \
|
||||
"logs") make kube logs;; \
|
||||
"exec") make kube exec;; \
|
||||
"port-forward") make kube port-forward;; \
|
||||
"kiali") make kube kiali;; \
|
||||
"istio") make kube istio;; \
|
||||
"grafana") make kube grafana;; \
|
||||
"prometheus") make kube prometheus;; \
|
||||
"logs") \
|
||||
echo "$(BLUE)📝 Получение логов Kubernetes...$(RESET)"; \
|
||||
KUBE_LOGS=$$(make kube logs 2>&1); \
|
||||
if [ $$? -eq 0 ] && [ -n "$$KUBE_LOGS" ]; then \
|
||||
echo "$$KUBE_LOGS" | whiptail --title "📝 Логи Kubernetes" --scrolltext --textbox /dev/stdin 20 70; \
|
||||
else \
|
||||
whiptail --title "⚠️ Предупреждение" --msgbox "Логи Kubernetes недоступны. Кластер может быть не запущен." 8 50; \
|
||||
fi;; \
|
||||
"exec") \
|
||||
COMMAND=$$(whiptail --inputbox "Введите команду для выполнения в кластере:" 8 50 "kubectl get pods" 3>&1 1>&2 2>&3); \
|
||||
if [ $$? -eq 0 ] && [ -n "$$COMMAND" ]; then \
|
||||
echo "$(BLUE)🐚 Выполнение команды: $$COMMAND$(RESET)"; \
|
||||
EXEC_OUTPUT=$$(make kube exec CMD="$$COMMAND" 2>&1); \
|
||||
if [ $$? -eq 0 ] && [ -n "$$EXEC_OUTPUT" ]; then \
|
||||
echo "$$EXEC_OUTPUT" | whiptail --title "🐚 Результат выполнения" --scrolltext --textbox /dev/stdin 20 70; \
|
||||
else \
|
||||
whiptail --title "❌ Ошибка" --msgbox "Ошибка при выполнении команды в кластере." 8 50; \
|
||||
fi; \
|
||||
fi;; \
|
||||
"port-forward") \
|
||||
SERVICE=$$(whiptail --inputbox "Введите имя сервиса для проброса портов:" 8 50 "kiali" 3>&1 1>&2 2>&3); \
|
||||
PORT=$$(whiptail --inputbox "Введите порт для проброса:" 8 50 "20001" 3>&1 1>&2 2>&3); \
|
||||
if [ $$? -eq 0 ] && [ -n "$$SERVICE" ] && [ -n "$$PORT" ]; then \
|
||||
echo "$(BLUE)🔗 Проброс портов для $$SERVICE:$$PORT$(RESET)"; \
|
||||
whiptail --title "🔗 Port Forward" --msgbox "Проброс портов запущен. Используйте Ctrl+C для остановки." 8 50; \
|
||||
make kube port-forward SERVICE="$$SERVICE" PORT="$$PORT"; \
|
||||
fi;; \
|
||||
"kiali") \
|
||||
echo "$(BLUE)🔍 Запуск Kiali Dashboard...$(RESET)"; \
|
||||
if make kube kiali; then \
|
||||
whiptail --title "✅ Успех" --msgbox "Kiali Dashboard доступен по адресу: http://localhost:20001" 8 50; \
|
||||
else \
|
||||
whiptail --title "❌ Ошибка" --msgbox "Ошибка при запуске Kiali Dashboard." 8 50; \
|
||||
fi;; \
|
||||
"istio") \
|
||||
echo "$(BLUE)🌐 Запуск Istio Gateway...$(RESET)"; \
|
||||
if make kube istio; then \
|
||||
whiptail --title "✅ Успех" --msgbox "Istio Gateway доступен по адресу: http://localhost:8080" 8 50; \
|
||||
else \
|
||||
whiptail --title "❌ Ошибка" --msgbox "Ошибка при запуске Istio Gateway." 8 50; \
|
||||
fi;; \
|
||||
"grafana") \
|
||||
echo "$(BLUE)📊 Запуск Grafana Dashboard...$(RESET)"; \
|
||||
if make kube grafana; then \
|
||||
whiptail --title "✅ Успех" --msgbox "Grafana Dashboard доступен по адресу: http://localhost:3000" 8 50; \
|
||||
else \
|
||||
whiptail --title "❌ Ошибка" --msgbox "Ошибка при запуске Grafana Dashboard." 8 50; \
|
||||
fi;; \
|
||||
"prometheus") \
|
||||
echo "$(BLUE)📈 Запуск Prometheus...$(RESET)"; \
|
||||
if make kube prometheus; then \
|
||||
whiptail --title "✅ Успех" --msgbox "Prometheus доступен по адресу: http://localhost:9090" 8 50; \
|
||||
else \
|
||||
whiptail --title "❌ Ошибка" --msgbox "Ошибка при запуске Prometheus." 8 50; \
|
||||
fi;; \
|
||||
esac
|
||||
|
||||
.PHONY: menu-preset
|
||||
@@ -180,12 +271,62 @@ menu-preset: check-whiptail ## Меню управления пресетами
|
||||
3>&1 1>&2 2>&3); \
|
||||
if [ $$? -ne 0 ] || [ "$$CHOICE" = "back" ]; then exit 0; fi; \
|
||||
case "$$CHOICE" in \
|
||||
"list") make preset list;; \
|
||||
"create") make preset create;; \
|
||||
"edit") make preset edit;; \
|
||||
"test") make preset test;; \
|
||||
"copy") make preset copy;; \
|
||||
"interactive") make preset-create-interactive;; \
|
||||
"list") \
|
||||
echo "$(BLUE)📋 Получение списка пресетов...$(RESET)"; \
|
||||
PRESET_LIST=$$(make preset list 2>&1); \
|
||||
if [ $$? -eq 0 ] && [ -n "$$PRESET_LIST" ]; then \
|
||||
echo "$$PRESET_LIST" | whiptail --title "📋 Список пресетов" --scrolltext --textbox /dev/stdin 20 70; \
|
||||
else \
|
||||
whiptail --title "⚠️ Предупреждение" --msgbox "Пресеты не найдены или недоступны." 8 50; \
|
||||
fi;; \
|
||||
"create") \
|
||||
PRESET_NAME=$$(whiptail --inputbox "Введите имя нового пресета:" 8 50 "my-preset" 3>&1 1>&2 2>&3); \
|
||||
if [ $$? -eq 0 ] && [ -n "$$PRESET_NAME" ]; then \
|
||||
echo "$(BLUE)➕ Создание пресета: $$PRESET_NAME$(RESET)"; \
|
||||
if make preset create NAME="$$PRESET_NAME"; then \
|
||||
whiptail --title "✅ Успех" --msgbox "Пресет $$PRESET_NAME успешно создан!" 8 50; \
|
||||
else \
|
||||
whiptail --title "❌ Ошибка" --msgbox "Ошибка при создании пресета $$PRESET_NAME." 8 50; \
|
||||
fi; \
|
||||
fi;; \
|
||||
"edit") \
|
||||
PRESET_NAME=$$(whiptail --inputbox "Введите имя пресета для редактирования:" 8 50 "" 3>&1 1>&2 2>&3); \
|
||||
if [ $$? -eq 0 ] && [ -n "$$PRESET_NAME" ]; then \
|
||||
echo "$(BLUE)✏️ Редактирование пресета: $$PRESET_NAME$(RESET)"; \
|
||||
if make preset edit NAME="$$PRESET_NAME"; then \
|
||||
whiptail --title "✅ Успех" --msgbox "Пресет $$PRESET_NAME отредактирован!" 8 50; \
|
||||
else \
|
||||
whiptail --title "❌ Ошибка" --msgbox "Ошибка при редактировании пресета $$PRESET_NAME." 8 50; \
|
||||
fi; \
|
||||
fi;; \
|
||||
"test") \
|
||||
PRESET_NAME=$$(whiptail --inputbox "Введите имя пресета для тестирования:" 8 50 "" 3>&1 1>&2 2>&3); \
|
||||
if [ $$? -eq 0 ] && [ -n "$$PRESET_NAME" ]; then \
|
||||
echo "$(BLUE)🧪 Тестирование пресета: $$PRESET_NAME$(RESET)"; \
|
||||
if make preset test NAME="$$PRESET_NAME"; then \
|
||||
whiptail --title "✅ Успех" --msgbox "Пресет $$PRESET_NAME протестирован успешно!" 8 50; \
|
||||
else \
|
||||
whiptail --title "❌ Ошибка" --msgbox "Ошибка при тестировании пресета $$PRESET_NAME." 8 50; \
|
||||
fi; \
|
||||
fi;; \
|
||||
"copy") \
|
||||
SOURCE_NAME=$$(whiptail --inputbox "Введите имя исходного пресета:" 8 50 "" 3>&1 1>&2 2>&3); \
|
||||
TARGET_NAME=$$(whiptail --inputbox "Введите имя нового пресета:" 8 50 "" 3>&1 1>&2 2>&3); \
|
||||
if [ $$? -eq 0 ] && [ -n "$$SOURCE_NAME" ] && [ -n "$$TARGET_NAME" ]; then \
|
||||
echo "$(BLUE)📋 Копирование пресета: $$SOURCE_NAME -> $$TARGET_NAME$(RESET)"; \
|
||||
if make preset copy SOURCE="$$SOURCE_NAME" TARGET="$$TARGET_NAME"; then \
|
||||
whiptail --title "✅ Успех" --msgbox "Пресет скопирован: $$SOURCE_NAME -> $$TARGET_NAME" 8 50; \
|
||||
else \
|
||||
whiptail --title "❌ Ошибка" --msgbox "Ошибка при копировании пресета." 8 50; \
|
||||
fi; \
|
||||
fi;; \
|
||||
"interactive") \
|
||||
echo "$(BLUE)🎯 Интерактивное создание пресета...$(RESET)"; \
|
||||
if make preset-create-interactive; then \
|
||||
whiptail --title "✅ Успех" --msgbox "Пресет создан интерактивно!" 8 50; \
|
||||
else \
|
||||
whiptail --title "❌ Ошибка" --msgbox "Ошибка при интерактивном создании пресета." 8 50; \
|
||||
fi;; \
|
||||
esac
|
||||
|
||||
.PHONY: menu-role
|
||||
@@ -204,14 +345,76 @@ menu-role: check-whiptail ## Меню управления ролями
|
||||
3>&1 1>&2 2>&3); \
|
||||
if [ $$? -ne 0 ] || [ "$$CHOICE" = "back" ]; then exit 0; fi; \
|
||||
case "$$CHOICE" in \
|
||||
"list") make role list;; \
|
||||
"create") make role create;; \
|
||||
"edit") make role edit;; \
|
||||
"test") make role test;; \
|
||||
"lint") make role lint;; \
|
||||
"deploy") make role deploy;; \
|
||||
"playbook") make role playbook;; \
|
||||
"interactive") make role-create-interactive;; \
|
||||
"list") \
|
||||
echo "$(BLUE)📋 Получение списка ролей...$(RESET)"; \
|
||||
ROLE_LIST=$$(make role list 2>&1); \
|
||||
if [ $$? -eq 0 ] && [ -n "$$ROLE_LIST" ]; then \
|
||||
echo "$$ROLE_LIST" | whiptail --title "📋 Список ролей" --scrolltext --textbox /dev/stdin 20 70; \
|
||||
else \
|
||||
whiptail --title "⚠️ Предупреждение" --msgbox "Роли не найдены или недоступны." 8 50; \
|
||||
fi;; \
|
||||
"create") \
|
||||
ROLE_NAME=$$(whiptail --inputbox "Введите имя новой роли:" 8 50 "my-role" 3>&1 1>&2 2>&3); \
|
||||
if [ $$? -eq 0 ] && [ -n "$$ROLE_NAME" ]; then \
|
||||
echo "$(BLUE)➕ Создание роли: $$ROLE_NAME$(RESET)"; \
|
||||
if make role create NAME="$$ROLE_NAME"; then \
|
||||
whiptail --title "✅ Успех" --msgbox "Роль $$ROLE_NAME успешно создана!" 8 50; \
|
||||
else \
|
||||
whiptail --title "❌ Ошибка" --msgbox "Ошибка при создании роли $$ROLE_NAME." 8 50; \
|
||||
fi; \
|
||||
fi;; \
|
||||
"edit") \
|
||||
ROLE_NAME=$$(whiptail --inputbox "Введите имя роли для редактирования:" 8 50 "" 3>&1 1>&2 2>&3); \
|
||||
if [ $$? -eq 0 ] && [ -n "$$ROLE_NAME" ]; then \
|
||||
echo "$(BLUE)✏️ Редактирование роли: $$ROLE_NAME$(RESET)"; \
|
||||
if make role edit NAME="$$ROLE_NAME"; then \
|
||||
whiptail --title "✅ Успех" --msgbox "Роль $$ROLE_NAME отредактирована!" 8 50; \
|
||||
else \
|
||||
whiptail --title "❌ Ошибка" --msgbox "Ошибка при редактировании роли $$ROLE_NAME." 8 50; \
|
||||
fi; \
|
||||
fi;; \
|
||||
"test") \
|
||||
ROLE_NAME=$$(whiptail --inputbox "Введите имя роли для тестирования:" 8 50 "" 3>&1 1>&2 2>&3); \
|
||||
if [ $$? -eq 0 ] && [ -n "$$ROLE_NAME" ]; then \
|
||||
echo "$(BLUE)🧪 Тестирование роли: $$ROLE_NAME$(RESET)"; \
|
||||
if make role test NAME="$$ROLE_NAME"; then \
|
||||
whiptail --title "✅ Успех" --msgbox "Роль $$ROLE_NAME протестирована успешно!" 8 50; \
|
||||
else \
|
||||
whiptail --title "❌ Ошибка" --msgbox "Ошибка при тестировании роли $$ROLE_NAME." 8 50; \
|
||||
fi; \
|
||||
fi;; \
|
||||
"lint") \
|
||||
echo "$(BLUE)🔍 Проверка синтаксиса ролей...$(RESET)"; \
|
||||
LINT_OUTPUT=$$(make role lint 2>&1); \
|
||||
if [ $$? -eq 0 ]; then \
|
||||
whiptail --title "✅ Успех" --msgbox "Проверка синтаксиса ролей прошла успешно!" 8 50; \
|
||||
else \
|
||||
echo "$$LINT_OUTPUT" | whiptail --title "❌ Ошибки синтаксиса" --scrolltext --textbox /dev/stdin 20 70; \
|
||||
fi;; \
|
||||
"deploy") \
|
||||
echo "$(BLUE)🚀 Развертывание ролей...$(RESET)"; \
|
||||
if make role deploy; then \
|
||||
whiptail --title "✅ Успех" --msgbox "Роли успешно развернуты!" 8 50; \
|
||||
else \
|
||||
whiptail --title "❌ Ошибка" --msgbox "Ошибка при развертывании ролей." 8 50; \
|
||||
fi;; \
|
||||
"playbook") \
|
||||
ROLE_NAME=$$(whiptail --inputbox "Введите имя роли для управления playbooks:" 8 50 "" 3>&1 1>&2 2>&3); \
|
||||
if [ $$? -eq 0 ] && [ -n "$$ROLE_NAME" ]; then \
|
||||
echo "$(BLUE)📝 Управление playbooks роли: $$ROLE_NAME$(RESET)"; \
|
||||
if make role playbook NAME="$$ROLE_NAME"; then \
|
||||
whiptail --title "✅ Успех" --msgbox "Playbooks роли $$ROLE_NAME обработаны!" 8 50; \
|
||||
else \
|
||||
whiptail --title "❌ Ошибка" --msgbox "Ошибка при обработке playbooks роли $$ROLE_NAME." 8 50; \
|
||||
fi; \
|
||||
fi;; \
|
||||
"interactive") \
|
||||
echo "$(BLUE)🎯 Интерактивное создание роли...$(RESET)"; \
|
||||
if make role-create-interactive; then \
|
||||
whiptail --title "✅ Успех" --msgbox "Роль создана интерактивно!" 8 50; \
|
||||
else \
|
||||
whiptail --title "❌ Ошибка" --msgbox "Ошибка при интерактивном создании роли." 8 50; \
|
||||
fi;; \
|
||||
esac
|
||||
|
||||
.PHONY: menu-vault
|
||||
|
||||
Reference in New Issue
Block a user