Files
calista_main/ccomp/gproxy
T

276 lines
8.8 KiB
Bash
Executable File

#!/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 <git-url>" >&2
exit 1
fi
}
# Команда: установка ссылки на репозиторий компонентов
cmd_set_repo() {
if [ -z "$1" ]; then
echo "Использование: $0 set-repo <git-url>" >&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 <component-id> [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 <git-url> - Установить ссылку на репозиторий компонентов"
echo " update - Обновить список компонентов"
echo " list - Показать список доступных компонентов"
echo " get <id> [version] - Получить компонент (version может быть тегом или 'latest')"
echo " clean - Очистить кэш склонированных репозиториев"
echo " set-cache <path> - Установить путь к хранилищу"
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 "$@"