#!/bin/sh # calista-proxy - Calista Component Proxy # Лицензия: GPLv2+ (т.к. вызывает git) CONFIG_DIR="/calista/config/gproxy" CONFIG_FILE="$CONFIG_DIR/config" CACHE_DIR="/calista/cache/gproxy" COMPONENTS_CACHE="$CACHE_DIR/components.json" # Проверяем наличие git check_git() { if ! command -v git >/dev/null 2>&1; then echo "Ошибка: git не установлен" >&2 exit 1 fi } # Инициализация каталогов init_dirs() { mkdir -p "$CONFIG_DIR" "$CACHE_DIR" } # Загрузка конфига load_config() { if [ -f "$CONFIG_FILE" ]; then . "$CONFIG_FILE" else echo "Конфиг не найден. Сначала установите ссылку: $0 set-repo " >&2 exit 1 fi } # Команда: установка ссылки на репозиторий компонентов cmd_set_repo() { if [ -z "$1" ]; then echo "Использование: $0 set-repo " >&2 exit 1 fi init_dirs echo "REPO_URL=\"$1\"" > "$CONFIG_FILE" echo "CACHE_DIR=\"$CACHE_DIR\"" >> "$CONFIG_FILE" echo "Ссылка сохранена: $1" # Обновляем кэш cmd_update } # Команда: обновление списка компонентов cmd_update() { check_git load_config echo "Обновление списка компонентов из $REPO_URL" # Создаем временный каталог для клонирования TMP_DIR="$CACHE_DIR/tmp_repo" rm -rf "$TMP_DIR" # Клонируем репозиторий if git clone --depth 1 "$REPO_URL" "$TMP_DIR" 2>/dev/null; then # Ищем components.json if [ -f "$TMP_DIR/components.json" ]; then cp "$TMP_DIR/components.json" "$COMPONENTS_CACHE" echo "Список компонентов обновлен" elif [ -f "$TMP_DIR/component-list.json" ]; then cp "$TMP_DIR/component-list.json" "$COMPONENTS_CACHE" echo "Список компонентов обновлен" else echo "Ошибка: Не найден файл components.json в репозитории" >&2 fi rm -rf "$TMP_DIR" else echo "Ошибка клонирования. Проверьте SSH ключи и доступ к $REPO_URL" >&2 exit 1 fi } # Поиск компонента в списке find_component() { COMP_ID="$1" if [ ! -f "$COMPONENTS_CACHE" ]; then echo "Список компонентов не найден. Сначала выполните обновление: $0 update" >&2 exit 1 fi # Используем grep для простого парсинга JSON if grep -q "\"id\": \"$COMP_ID\"" "$COMPONENTS_CACHE"; then # Извлекаем репозиторий REPO=$(grep -A 10 "\"id\": \"$COMP_ID\"" "$COMPONENTS_CACHE" | \ grep "\"repo\":" | head -1 | cut -d'"' -f4) echo "$REPO" return 0 else echo "" return 1 fi } # Команда: получение компонента cmd_get() { if [ -z "$1" ]; then echo "Использование: $0 get [version]" >&2 echo " version может быть: конкретный тег или 'latest'" >&2 exit 1 fi check_git load_config COMP_ID="$1" VERSION="${2:-latest}" echo "Поиск компонента: $COMP_ID версия: $VERSION" # Ищем компонент REPO_URL=$(find_component "$COMP_ID") if [ -z "$REPO_URL" ]; then echo "Компонент '$COMP_ID' не найден" >&2 exit 1 fi # Определяем цель клонирования TARGET_DIR="$CACHE_DIR/$COMP_ID" if [ -n "$2" ] && [ "$2" != "latest" ]; then TARGET_DIR="$CACHE_DIR/${COMP_ID}_$2" fi # Удаляем старую копию если существует if [ -d "$TARGET_DIR" ]; then echo "Удаление старой версии..." rm -rf "$TARGET_DIR" fi # Клонируем компонент echo "Клонирование: $REPO_URL" if [ "$VERSION" = "latest" ]; then if git clone "$REPO_URL" "$TARGET_DIR"; then echo "Компонент '$COMP_ID' склонирован в: $TARGET_DIR" else echo "Ошибка клонирования. Проверьте SSH ключи и доступ" >&2 exit 1 fi else # Клонируем с конкретным тегом if git clone --branch "$VERSION" "$REPO_URL" "$TARGET_DIR"; then echo "Компонент '$COMP_ID' версии $VERSION склонирован в: $TARGET_DIR" else echo "Ошибка: Не удалось клонировать версию $VERSION" >&2 echo "Возможно тег не существует или проблемы с доступом" >&2 exit 1 fi fi } # Команда: список доступных компонентов cmd_list() { if [ ! -f "$COMPONENTS_CACHE" ]; then echo "Список компонентов не найден. Сначала выполните: $0 update" >&2 exit 1 fi echo "Доступные компоненты:" echo "=====================" # Простой парсинг для вывода списка grep '"id":' "$COMPONENTS_CACHE" | cut -d'"' -f4 | while read -r id; do name=$(grep -A 2 "\"id\": \"$id\"" "$COMPONENTS_CACHE" | \ grep '"name":' | head -1 | cut -d'"' -f4) echo " $id - $name" done } # Команда: очистка кэша cmd_clean() { load_config echo "Очистка кэша в $CACHE_DIR" # Удаляем все кроме конфига и самого файла components.json find "$CACHE_DIR" -mindepth 1 -maxdepth 1 -type d -exec rm -rf {} + 2>/dev/null rm -f "$COMPONENTS_CACHE" echo "Кэш очищен" } # Команда: установка пути к хранилищу cmd_set_cache() { if [ -z "$1" ]; then echo "Использование: $0 set-cache <путь>" >&2 exit 1 fi NEW_CACHE="$1" if [ ! -d "$NEW_CACHE" ]; then mkdir -p "$NEW_CACHE" || { echo "Не удалось создать каталог: $NEW_CACHE" >&2 exit 1 } fi # Обновляем конфиг if [ -f "$CONFIG_FILE" ]; then grep -v "^CACHE_DIR=" "$CONFIG_FILE" > "$CONFIG_FILE.tmp" echo "CACHE_DIR=\"$NEW_CACHE\"" >> "$CONFIG_FILE.tmp" mv "$CONFIG_FILE.tmp" "$CONFIG_FILE" else echo "CACHE_DIR=\"$NEW_CACHE\"" > "$CONFIG_FILE" fi CACHE_DIR="$NEW_CACHE" COMPONENTS_CACHE="$CACHE_DIR/components.json" echo "Путь к хранилищу установлен: $NEW_CACHE" } # Команда: помощь cmd_help() { echo "Calista Component Proxy" echo "=======================" echo "Команды:" echo " set-repo - Установить ссылку на репозиторий компонентов" echo " update - Обновить список компонентов" echo " list - Показать список доступных компонентов" echo " get [version] - Получить компонент (version может быть тегом или 'latest')" echo " clean - Очистить кэш склонированных репозиториев" echo " set-cache - Установить путь к хранилищу" echo " help - Показать эту справку" echo "" echo "Примеры:" echo " $0 set-repo git@github.com:user/components.git" echo " $0 update" echo " $0 get cpm v1.0.0" echo " $0 get calista-graphics-legacy latest" } # Главная функция main() { case "$1" in set-repo) cmd_set_repo "$2" ;; update) cmd_update ;; get) cmd_get "$2" "$3" ;; list) cmd_list ;; clean) cmd_clean ;; set-cache) cmd_set_cache "$2" ;; help|--help|-h) cmd_help ;; *) if [ -z "$1" ]; then cmd_help else echo "Неизвестная команда: $1" >&2 echo "Используйте: $0 help" >&2 exit 1 fi ;; esac } # Запуск main "$@"