276 lines
8.8 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 "$@"