276 lines
8.8 KiB
Bash
Executable File
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 "$@"
|