#!/bin/bash # # Универсальный скрипт обновления OpenAI Codex CLI # Автоматически скачивает последнюю версию с GitHub Releases # Использует musl версию для совместимости со старыми системами # set -e # Цвета для вывода RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Определяем путь к codex CODEX_PATH=$(which codex 2>/dev/null || echo "/usr/local/bin/codex") CODEX_DIR=$(dirname "$CODEX_PATH") TEMP_DIR="/tmp/codex-update-$$" GITHUB_API="https://api.github.com/repos/openai/codex/releases/latest" # Определяем архитектуру - используем musl для совместимости ARCH=$(uname -m) case "$ARCH" in x86_64) BINARY_SUFFIX="x86_64-unknown-linux-musl" ;; aarch64|arm64) BINARY_SUFFIX="aarch64-unknown-linux-musl" ;; *) echo -e "${RED}Неподдерживаемая архитектура: $ARCH${NC}" exit 1 ;; esac echo -e "${BLUE}========================================${NC}" echo -e "${BLUE} OpenAI Codex CLI Updater${NC}" echo -e "${BLUE}========================================${NC}" echo "" # Функция получения текущей версии get_current_version() { if command -v codex &> /dev/null; then local ver=$(codex --version 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+' | head -1) if [ -n "$ver" ]; then echo "$ver" else echo "не работает" fi else echo "не установлен" fi } # Функция получения последней версии с GitHub get_latest_version() { curl -s "$GITHUB_API" | grep -oP '"tag_name":\s*"rust-v\K[0-9]+\.[0-9]+\.[0-9]+' | head -1 } # Функция сравнения версий (возвращает 0 если нужно обновление) version_gt() { test "$(printf '%s\n' "$1" "$2" | sort -V | tail -n 1)" != "$2" } # Получаем версии echo -e "${YELLOW}Проверка версий...${NC}" CURRENT_VERSION=$(get_current_version) echo -e "Текущая версия: ${BLUE}$CURRENT_VERSION${NC}" LATEST_VERSION=$(get_latest_version) if [ -z "$LATEST_VERSION" ]; then echo -e "${RED}Не удалось получить информацию о последней версии${NC}" exit 1 fi echo -e "Последняя версия: ${GREEN}$LATEST_VERSION${NC}" echo "" # Проверяем нужно ли обновление if [ "$CURRENT_VERSION" = "$LATEST_VERSION" ]; then echo -e "${GREEN}✓ Codex уже обновлён до последней версии!${NC}" exit 0 fi # Если текущая не работает или не установлена - всегда обновляем if [ "$CURRENT_VERSION" != "не установлен" ] && [ "$CURRENT_VERSION" != "не работает" ]; then if ! version_gt "$LATEST_VERSION" "$CURRENT_VERSION"; then echo -e "${GREEN}✓ Текущая версия актуальна или новее${NC}" exit 0 fi fi echo -e "${YELLOW}Требуется обновление: $CURRENT_VERSION → $LATEST_VERSION${NC}" echo "" # Формируем URL для скачивания DOWNLOAD_URL="https://github.com/openai/codex/releases/download/rust-v${LATEST_VERSION}/codex-${BINARY_SUFFIX}.tar.gz" echo -e "${BLUE}Архитектура: $ARCH (${BINARY_SUFFIX})${NC}" echo -e "${BLUE}URL: $DOWNLOAD_URL${NC}" echo "" # Создаём временную директорию mkdir -p "$TEMP_DIR" cd "$TEMP_DIR" # Скачиваем echo -e "${YELLOW}Скачивание...${NC}" if ! curl -L -# -o codex.tar.gz "$DOWNLOAD_URL"; then echo -e "${RED}Ошибка скачивания${NC}" rm -rf "$TEMP_DIR" exit 1 fi # Распаковываем echo -e "${YELLOW}Распаковка...${NC}" tar -xzf codex.tar.gz # Ищем бинарник (может называться codex или codex-$BINARY_SUFFIX) BINARY_FILE="" if [ -f "codex" ]; then BINARY_FILE="codex" elif [ -f "codex-${BINARY_SUFFIX}" ]; then BINARY_FILE="codex-${BINARY_SUFFIX}" else # Ищем любой файл начинающийся с codex (исключая .tar.gz) BINARY_FILE=$(find . -maxdepth 1 -name 'codex*' -type f ! -name '*.gz' | head -1) fi if [ -z "$BINARY_FILE" ] || [ ! -f "$BINARY_FILE" ]; then echo -e "${RED}Бинарник codex не найден в архиве${NC}" ls -la rm -rf "$TEMP_DIR" exit 1 fi echo -e "${GREEN}Найден бинарник: $BINARY_FILE${NC}" # Проверяем запущен ли codex и завершаем if pgrep -x "codex" > /dev/null; then echo -e "${YELLOW}Обнаружен запущенный процесс codex, завершаем...${NC}" pkill -9 -x "codex" 2>/dev/null || true sleep 1 echo -e "${GREEN}✓ Процесс завершён${NC}" fi # Устанавливаем echo -e "${YELLOW}Установка в $CODEX_PATH...${NC}" chmod +x "$BINARY_FILE" # Проверяем нужен ли sudo if [ -w "$CODEX_DIR" ]; then mv -f "$BINARY_FILE" "$CODEX_PATH" else echo -e "${YELLOW}Требуются права sudo для записи в $CODEX_DIR${NC}" sudo mv -f "$BINARY_FILE" "$CODEX_PATH" fi # Очистка cd / rm -rf "$TEMP_DIR" # Обновляем PATH кэш hash -r 2>/dev/null || true # Проверяем результат echo "" NEW_VERSION=$(get_current_version) echo -e "${BLUE}========================================${NC}" echo -e "${GREEN}✓ Обновление завершено!${NC}" echo -e "${BLUE}========================================${NC}" echo -e "Было: ${RED}$CURRENT_VERSION${NC}" echo -e "Стало: ${GREEN}$NEW_VERSION${NC}" echo "" # Финальная проверка if [ "$NEW_VERSION" = "$LATEST_VERSION" ]; then echo -e "${GREEN}✓ Версия успешно обновлена до $LATEST_VERSION${NC}" elif [ "$NEW_VERSION" = "не работает" ]; then echo -e "${RED}✗ Бинарник не запускается! Проверьте зависимости.${NC}" ldd "$CODEX_PATH" 2>&1 | grep "not found" || true else echo -e "${YELLOW}⚠ Версия после установки: $NEW_VERSION (ожидалась $LATEST_VERSION)${NC}" fi