Добавление встроенного ccomp
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
# Calista components manager
|
||||
|
||||
Менеджер системных компонентов для операционной системы Calista.
|
||||
Занимается установкой разных компонентов в систему без гемороя, является преведением
|
||||
кодовой базы Calista в целостность. Позволяет пользователю установить нужный компонент
|
||||
из командной строки, указав всего лишь его идентификатор.
|
||||
|
||||
Компоненты будут распространяться в виде локальных файлов в формате архивов
|
||||
виртуальной файловой системы quantumfs. В будущем будет сделана графическая обертка
|
||||
данного менеджера для удобной пользователю установки компонентов.
|
||||
|
||||
В данном репозитории распространяется версия для разработчиков.
|
||||
Отличие данной версии в том, что кроме установки пакетов из локальных архивов
|
||||
версия для разработчиков позволяет устанавливать пакеты из внешних репозиториев
|
||||
(в частности gitlab репозиторий svsp technologies). Для возможности установки из
|
||||
внешних репозиториев используется программка gproxy, которая требует установленного git.
|
||||
Отдельная программа существует для разделения лицензий, так как git распространяется под GPL,
|
||||
и эта программка разделяет закрытый код операционной системы от GPL компонентов, не заражая
|
||||
систему лицензией GPL. Авторизация производится на уровне гит, все внешние пакеты устанавливаются
|
||||
через ssh. То есть в gitlab должен быть установлен публичный ключ разработчика, который
|
||||
устанавливает компоненты из этого gitlab.
|
||||
|
||||
# Команда help программы ccomp (calista components manager)
|
||||
|
||||
```
|
||||
Calista Component Manager
|
||||
=========================
|
||||
Команды:
|
||||
install <id> [version] [source] - Установить компонент (source: git или local, по умолчанию git)
|
||||
list - Показать установленные компоненты
|
||||
info <id> - Информация об установленном компоненте
|
||||
remove <id> - Удалить компонент (заглушка)
|
||||
update - Обновить список компонентов из репозитория
|
||||
versions <id> - Показать доступные версии компонента
|
||||
help - Показать эту справку
|
||||
|
||||
Примеры:
|
||||
ccomp install cpm v1.0.0 git
|
||||
ccomp install calista-graphics-legacy latest
|
||||
ccomp list
|
||||
ccomp info cpm
|
||||
ccomp remove cpm
|
||||
|
||||
Для работы с репозиторием компонентов сначала настройте gproxy:
|
||||
gproxy set-repo <ваш-git-репозиторий>
|
||||
ccomp update
|
||||
```
|
||||
|
||||
# Команда help программы gproxy (git proxy for calista components manager)
|
||||
|
||||
```
|
||||
Calista Component Proxy
|
||||
=======================
|
||||
Команды:
|
||||
set-repo <git-url> - Установить ссылку на репозиторий компонентов
|
||||
update - Обновить список компонентов
|
||||
list - Показать список доступных компонентов
|
||||
get <id> [version] - Получить компонент (version может быть тегом или 'latest')
|
||||
clean - Очистить кэш склонированных репозиториев
|
||||
set-cache <path> - Установить путь к хранилищу
|
||||
help - Показать эту справку
|
||||
|
||||
Примеры:
|
||||
gproxy set-repo git@github.com:user/components.git
|
||||
gproxy update
|
||||
gproxy get cpm v1.0.0
|
||||
gproxy get calista-graphics-legacy latest
|
||||
```
|
||||
|
||||
Ссылка на внутренний репозиторий компонентов - git@gitlab.svsptech.ru:svsptech/calista-components.git
|
||||
|
||||
|
||||
Executable
+27
@@ -0,0 +1,27 @@
|
||||
#!/bin/sh
|
||||
|
||||
REPO_CONF_DIR="${PWD}"
|
||||
REPO_CONF_NAME="pkg.conf"
|
||||
|
||||
# Проверка и установка git в FreeBSD
|
||||
if ! command -v git >/dev/null 2>&1; then
|
||||
cat > pkg.conf << EOF
|
||||
xserver_dep_repo: {
|
||||
url: "file://${PWD}/packages",
|
||||
enabled: yes,
|
||||
priority: 100
|
||||
}
|
||||
EOF
|
||||
|
||||
pkg -o REPOS_DIR="$REPO_CONF_DIR" -o repositories_conf="$REPO_CONF_NAME" install -y git || { echo "Ошибка установки git"; exit 1; }
|
||||
fi
|
||||
|
||||
cp ./ccomp /usr/local/bin/ccomp
|
||||
cp ./gproxy /usr/local/bin/gproxy
|
||||
|
||||
mkdir /calista/config/ccomp
|
||||
mkdir /calista/cache/gproxy
|
||||
mkdir /calista/config/gproxy
|
||||
|
||||
pkg register -M ccomp.pkg
|
||||
pkg register -M gproxy.pkg
|
||||
Executable
+530
@@ -0,0 +1,530 @@
|
||||
#!/bin/sh
|
||||
# calista-manager - Менеджер компонентов Calista OS
|
||||
|
||||
# Конфигурация
|
||||
SYSTEM_DIR="/calista"
|
||||
REGISTRY_FILE="$SYSTEM_DIR/registry.db"
|
||||
GPROXY_SCRIPT="/usr/local/bin/gproxy" # Путь к gproxy скрипту
|
||||
GPROXY_CACHE=/calista/cache/gproxy/
|
||||
|
||||
# Цвета
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Логирование
|
||||
log() {
|
||||
echo -e "${GREEN}[+]${NC} $1"
|
||||
}
|
||||
|
||||
error() {
|
||||
echo -e "${RED}[!]${NC} $1" >&2
|
||||
}
|
||||
|
||||
warn() {
|
||||
echo -e "${YELLOW}[*]${NC} $1"
|
||||
}
|
||||
|
||||
info() {
|
||||
echo -e "${BLUE}[i]${NC} $1"
|
||||
}
|
||||
|
||||
# Запись в лог реестра
|
||||
log_to_registry() {
|
||||
TYPE="$1"
|
||||
USER="${SUDO_USER:-$USER}"
|
||||
DETAILS="$2"
|
||||
|
||||
sqlite3 "$REGISTRY_FILE" "INSERT INTO calista_log (type, user, details) VALUES ('$TYPE', '$USER', '$DETAILS');" 2>/dev/null
|
||||
}
|
||||
|
||||
# Проверка инициализации реестра
|
||||
check_init() {
|
||||
if [ ! -f "$REGISTRY_FILE" ]; then
|
||||
error "Реестр не найден: $REGISTRY_FILE"
|
||||
error "Сначала инициализируйте реестр Calista"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ ! -x "$GPROXY_SCRIPT" ]; then
|
||||
error "Не найден gproxy скрипт: $GPROXY_SCRIPT"
|
||||
error "Поместите calista-proxy.sh в текущий каталог"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Проверка наличия компонента в реестре
|
||||
is_installed() {
|
||||
COMP_ID="$1"
|
||||
RESULT=$(sqlite3 "$REGISTRY_FILE" "SELECT COUNT(*) FROM components WHERE name = '$COMP_ID';" 2>/dev/null)
|
||||
[ "$RESULT" -gt 0 ] 2>/dev/null
|
||||
}
|
||||
|
||||
# Добавление компонента в реестр
|
||||
add_to_registry() {
|
||||
COMP_ID="$1"
|
||||
VERSION="$2"
|
||||
SOURCE="$3"
|
||||
DESCRIPTION="$4"
|
||||
INSTALLED_AT=$(date '+%Y-%m-%d %H:%M:%S')
|
||||
|
||||
# Проверяем, существует ли уже компонент
|
||||
EXISTS=$(sqlite3 "$REGISTRY_FILE" "SELECT COUNT(*) FROM components WHERE name = '$COMP_ID';" 2>/dev/null)
|
||||
|
||||
if [ "$EXISTS" -gt 0 ] 2>/dev/null; then
|
||||
# Обновляем существующий компонент
|
||||
sqlite3 "$REGISTRY_FILE" "UPDATE components SET
|
||||
version = '$VERSION',
|
||||
source = '$SOURCE',
|
||||
description = '$DESCRIPTION',
|
||||
installed_at = '$INSTALLED_AT'
|
||||
WHERE name = '$COMP_ID';" 2>/dev/null
|
||||
|
||||
log_to_registry "info" "Компонент $COMP_ID обновлен до версии $VERSION"
|
||||
info "Компонент '$COMP_ID' обновлен в реестре"
|
||||
else
|
||||
# Добавляем новый компонент
|
||||
sqlite3 "$REGISTRY_FILE" "INSERT INTO components (name, version, source, description, installed_at)
|
||||
VALUES ('$COMP_ID', '$VERSION', '$SOURCE', '$DESCRIPTION', '$INSTALLED_AT');" 2>/dev/null
|
||||
|
||||
log_to_registry "info" "Компонент $COMP_ID версии $VERSION установлен"
|
||||
info "Компонент '$COMP_ID' добавлен в реестр"
|
||||
fi
|
||||
}
|
||||
|
||||
# Удаление компонента из реестра
|
||||
remove_from_registry() {
|
||||
COMP_ID="$1"
|
||||
|
||||
sqlite3 "$REGISTRY_FILE" "DELETE FROM components WHERE name = '$COMP_ID';" 2>/dev/null
|
||||
log_to_registry "info" "Компонент $COMP_ID удален из реестра"
|
||||
}
|
||||
|
||||
# Получение информации о компоненте из gproxy
|
||||
get_component_info() {
|
||||
COMP_ID="$1"
|
||||
VERSION="$2"
|
||||
|
||||
# Получаем компонент через gproxy
|
||||
if [ "$VERSION" = "latest" ]; then
|
||||
"$GPROXY_SCRIPT" get "$COMP_ID"
|
||||
else
|
||||
"$GPROXY_SCRIPT" get "$COMP_ID" "$VERSION"
|
||||
fi
|
||||
}
|
||||
|
||||
# Установка из Git
|
||||
install_from_git() {
|
||||
COMP_ID="$1"
|
||||
VERSION="$2"
|
||||
|
||||
log "Установка компонента '$COMP_ID' версии '$VERSION' из Git"
|
||||
|
||||
# Проверяем не установлен ли уже
|
||||
if is_installed "$COMP_ID"; then
|
||||
warn "Компонент '$COMP_ID' уже установлен"
|
||||
# Получаем текущую версию
|
||||
CURRENT_VERSION=$(sqlite3 "$REGISTRY_FILE" "SELECT version FROM components WHERE name = '$COMP_ID';" 2>/dev/null)
|
||||
info "Текущая версия: $CURRENT_VERSION"
|
||||
echo "Переустановить? (y/N): "
|
||||
read -r answer
|
||||
if [ "$answer" != "y" ] && [ "$answer" != "Y" ]; then
|
||||
echo "Установка отменена"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Получаем компонент через gproxy
|
||||
info "Загрузка компонента через gproxy..."
|
||||
gproxy set-repo ssh://git@gitlab.svsptech.ru:5598/svsptech/calista-components.git
|
||||
OUTPUT=$(get_component_info "$COMP_ID" "$VERSION")
|
||||
|
||||
if echo "$OUTPUT" | grep -q "склонирован в:"; then
|
||||
# Извлекаем путь из вывода gproxy
|
||||
REPO_PATH="$GPROXY_CACHE$COMP_ID"
|
||||
|
||||
if [ -d "$REPO_PATH" ]; then
|
||||
log "Компонент загружен в: $REPO_PATH"
|
||||
|
||||
# Ищем файл build
|
||||
if [ -x "$REPO_PATH/build" ]; then
|
||||
info "Запуск скрипта сборки..."
|
||||
cd "$REPO_PATH"
|
||||
if ./build; then
|
||||
log "Сборка завершена успешно"
|
||||
|
||||
# Получаем описание компонента
|
||||
DESC="Компонент $COMP_ID"
|
||||
if [ -f "README.md" ]; then
|
||||
DESC=$(head -1 "README.md" 2>/dev/null | cut -c -100)
|
||||
elif [ -f "description.txt" ]; then
|
||||
DESC=$(head -1 "description.txt" 2>/dev/null | cut -c -100)
|
||||
fi
|
||||
|
||||
# Экранируем кавычки для SQL
|
||||
DESC=$(echo "$DESC" | sed "s/'/''/g")
|
||||
|
||||
# Добавляем в реестр
|
||||
add_to_registry "$COMP_ID" "$VERSION" "git" "$DESC"
|
||||
|
||||
# Очищаем кэш gproxy
|
||||
info "Очистка кэша gproxy..."
|
||||
"$GPROXY_SCRIPT" clean
|
||||
|
||||
log "Компонент '$COMP_ID' успешно установлен"
|
||||
else
|
||||
error "Ошибка сборки компонента"
|
||||
log_to_registry "error" "Ошибка сборки компонента $COMP_ID"
|
||||
cd - >/dev/null
|
||||
return 1
|
||||
fi
|
||||
cd - >/dev/null
|
||||
else
|
||||
warn "Файл build не найден или не исполняемый"
|
||||
info "Попытка найти альтернативные скрипты..."
|
||||
|
||||
# Проверяем другие возможные скрипты
|
||||
INSTALLED=false
|
||||
for script in install.sh setup.sh configure.sh; do
|
||||
if [ -x "$REPO_PATH/$script" ]; then
|
||||
info "Найден скрипт: $script"
|
||||
cd "$REPO_PATH"
|
||||
if ./"$script"; then
|
||||
log "Установка завершена успешно"
|
||||
|
||||
# Получаем описание
|
||||
DESC="Компонент $COMP_ID"
|
||||
if [ -f "README.md" ]; then
|
||||
DESC=$(head -1 "README.md" 2>/dev/null | cut -c -100)
|
||||
fi
|
||||
|
||||
# Экранируем кавычки для SQL
|
||||
DESC=$(echo "$DESC" | sed "s/'/''/g")
|
||||
|
||||
add_to_registry "$COMP_ID" "$VERSION" "git" "$DESC"
|
||||
"$GPROXY_SCRIPT" clean
|
||||
log "Компонент '$COMP_ID' успешно установлен"
|
||||
INSTALLED=true
|
||||
cd - >/dev/null
|
||||
break
|
||||
fi
|
||||
cd - >/dev/null
|
||||
fi
|
||||
done
|
||||
|
||||
if [ "$INSTALLED" = false ]; then
|
||||
error "Не найден скрипт установки"
|
||||
return 1
|
||||
fi
|
||||
fi
|
||||
else
|
||||
error "Не удалось определить путь к загруженному компоненту"
|
||||
log_to_registry "error" "Не удалось определить путь к компоненту $COMP_ID"
|
||||
return 1
|
||||
fi
|
||||
else
|
||||
error "Не удалось загрузить компонент через gproxy"
|
||||
echo "Вывод gproxy: $OUTPUT"
|
||||
log_to_registry "error" "Не удалось загрузить компонент $COMP_ID через gproxy"
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Установка локального компонента (заглушка)
|
||||
install_local() {
|
||||
COMP_ID="$1"
|
||||
VERSION="$2"
|
||||
|
||||
warn "Локальная установка компонентов пока не реализована"
|
||||
echo "Идентификатор: $COMP_ID"
|
||||
echo "Версия: $VERSION"
|
||||
echo "Функционал в разработке..."
|
||||
return 1
|
||||
}
|
||||
|
||||
# Команда установки
|
||||
cmd_install() {
|
||||
if [ -z "$1" ]; then
|
||||
echo "Использование: $0 install <component-id> [version] [source]" >&2
|
||||
echo " source: git (по умолчанию) или local" >&2
|
||||
echo " version: номер версии или 'latest' (по умолчанию)" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
check_init
|
||||
|
||||
COMP_ID="$1"
|
||||
VERSION="${2:-latest}"
|
||||
SOURCE="${3:-git}"
|
||||
|
||||
case "$SOURCE" in
|
||||
git)
|
||||
install_from_git "$COMP_ID" "$VERSION"
|
||||
;;
|
||||
local)
|
||||
install_local "$COMP_ID" "$VERSION"
|
||||
;;
|
||||
*)
|
||||
error "Неизвестный источник: $SOURCE"
|
||||
echo "Допустимые значения: git, local" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Команда списка установленных компонентов
|
||||
cmd_list() {
|
||||
check_init
|
||||
|
||||
# Проверяем количество компонентов
|
||||
COUNT=$(sqlite3 "$REGISTRY_FILE" "SELECT COUNT(*) FROM components;" 2>/dev/null)
|
||||
|
||||
if [ "$COUNT" -eq 0 ] 2>/dev/null; then
|
||||
echo "Нет установленных компонентов"
|
||||
return 0
|
||||
fi
|
||||
|
||||
echo "Установленные компоненты:"
|
||||
echo "========================="
|
||||
echo ""
|
||||
|
||||
# Получаем и выводим список компонентов
|
||||
sqlite3 "$REGISTRY_FILE" "SELECT name, version, source, description, installed_at FROM components ORDER BY name;" 2>/dev/null | while IFS='|' read -r id version source desc installed; do
|
||||
if [ -n "$id" ]; then
|
||||
echo "Компонент: $id"
|
||||
echo " Версия: ${version:-не указана}"
|
||||
echo " Описание: ${desc:-нет описания}"
|
||||
echo " Источник: ${source:-не указан}"
|
||||
echo " Установлен: ${installed:-неизвестно}"
|
||||
echo ""
|
||||
fi
|
||||
done
|
||||
|
||||
echo "Всего компонентов: $COUNT"
|
||||
}
|
||||
|
||||
# Команда информации о компоненте
|
||||
cmd_info() {
|
||||
if [ -z "$1" ]; then
|
||||
echo "Использование: $0 info <component-id>" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
check_init
|
||||
COMP_ID="$1"
|
||||
|
||||
if is_installed "$COMP_ID"; then
|
||||
echo "Информация о компоненте: $COMP_ID"
|
||||
echo "================================"
|
||||
|
||||
# Получаем информацию из реестра
|
||||
sqlite3 "$REGISTRY_FILE" "SELECT name, version, source, description, installed_at FROM components WHERE name = '$COMP_ID';" 2>/dev/null | while IFS='|' read -r id version source desc installed; do
|
||||
echo "Идентификатор: $id"
|
||||
echo "Версия: ${version:-не указана}"
|
||||
echo "Описание: ${desc:-нет описания}"
|
||||
echo "Источник: ${source:-не указан}"
|
||||
echo "Дата установки: ${installed:-неизвестно}"
|
||||
done
|
||||
else
|
||||
echo "Компонент '$COMP_ID' не установлен"
|
||||
|
||||
# Предлагаем установить
|
||||
echo ""
|
||||
info "Для установки компонента используйте:"
|
||||
echo " $0 install $COMP_ID"
|
||||
fi
|
||||
}
|
||||
|
||||
# Команда обновления списка компонентов
|
||||
cmd_update() {
|
||||
check_init
|
||||
log "Обновление списка компонентов через gproxy..."
|
||||
"$GPROXY_SCRIPT" update
|
||||
log_to_registry "info" "Список компонентов обновлен через gproxy"
|
||||
}
|
||||
|
||||
# Команда показа версий компонента из репозитория
|
||||
cmd_versions() {
|
||||
if [ -z "$1" ]; then
|
||||
echo "Использование: $0 versions <component-id>" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
check_init
|
||||
COMP_ID="$1"
|
||||
|
||||
# Проверяем, установлен ли компонент
|
||||
if is_installed "$COMP_ID"; then
|
||||
CURRENT_VERSION=$(sqlite3 "$REGISTRY_FILE" "SELECT version FROM components WHERE name = '$COMP_ID';" 2>/dev/null)
|
||||
info "Текущая установленная версия: $CURRENT_VERSION"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
warn "Получение доступных версий для $COMP_ID..."
|
||||
info "Для просмотра доступных версий используйте gproxy напрямую:"
|
||||
echo " $GPROXY_SCRIPT list"
|
||||
echo ""
|
||||
info "Или установите последнюю версию:"
|
||||
echo " $0 install $COMP_ID latest"
|
||||
}
|
||||
|
||||
# Команда удаления компонента
|
||||
cmd_remove() {
|
||||
if [ -z "$1" ]; then
|
||||
echo "Использование: $0 remove <component-id>" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
check_init
|
||||
COMP_ID="$1"
|
||||
|
||||
if is_installed "$COMP_ID"; then
|
||||
# Получаем информацию о компоненте
|
||||
info "Информация о компоненте:"
|
||||
cmd_info "$COMP_ID"
|
||||
echo ""
|
||||
|
||||
warn "Вы уверены, что хотите удалить компонент '$COMP_ID'?"
|
||||
echo "Это действие удалит запись из реестра (файлы компонента останутся)"
|
||||
echo "Продолжить? (y/N): "
|
||||
read -r answer
|
||||
|
||||
if [ "$answer" = "y" ] || [ "$answer" = "Y" ]; then
|
||||
remove_from_registry "$COMP_ID"
|
||||
log "Компонент '$COMP_ID' удален из реестра"
|
||||
warn "Файлы компонента не были удалены"
|
||||
else
|
||||
echo "Удаление отменено"
|
||||
fi
|
||||
else
|
||||
echo "Компонент '$COMP_ID' не установлен"
|
||||
fi
|
||||
}
|
||||
|
||||
# Команда очистки логов
|
||||
cmd_clean_logs() {
|
||||
check_init
|
||||
|
||||
DAYS="${1:-30}"
|
||||
info "Очистка логов старше $DAYS дней..."
|
||||
|
||||
sqlite3 "$REGISTRY_FILE" "DELETE FROM calista_log WHERE timestamp < datetime('now', '-$DAYS days');" 2>/dev/null
|
||||
|
||||
DELETED=$(sqlite3 "$REGISTRY_FILE" "SELECT changes();" 2>/dev/null)
|
||||
log "Удалено $DELETED записей из лога"
|
||||
log_to_registry "info" "Очищены логи старше $DAYS дней"
|
||||
}
|
||||
|
||||
# Команда просмотра логов
|
||||
cmd_logs() {
|
||||
check_init
|
||||
|
||||
LIMIT="${1:-20}"
|
||||
|
||||
echo "Последние $LIMIT записей лога:"
|
||||
echo "==============================="
|
||||
echo ""
|
||||
|
||||
sqlite3 "$REGISTRY_FILE" "SELECT timestamp, type, user, details FROM calista_log ORDER BY timestamp DESC LIMIT $LIMIT;" 2>/dev/null | while IFS='|' read -r timestamp type user details; do
|
||||
case "$type" in
|
||||
"error")
|
||||
echo -e "${RED}[$timestamp]${NC} [$type] $user: $details"
|
||||
;;
|
||||
"info")
|
||||
echo -e "${GREEN}[$timestamp]${NC} [$type] $user: $details"
|
||||
;;
|
||||
*)
|
||||
echo "[$timestamp] [$type] $user: $details"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
# Команда помощи
|
||||
cmd_help() {
|
||||
echo "Calista Component Manager"
|
||||
echo "========================="
|
||||
echo "Команды:"
|
||||
echo " install <id> [version] [source] - Установить компонент"
|
||||
echo " (source: git или local, по умолчанию git)"
|
||||
echo " list - Показать установленные компоненты"
|
||||
echo " info <id> - Информация об установленном компоненте"
|
||||
echo " remove <id> - Удалить компонент из реестра"
|
||||
echo " update - Обновить список компонентов из репозитория"
|
||||
echo " versions <id> - Показать доступные версии компонента"
|
||||
echo " logs [limit] - Показать последние записи лога (по умолчанию 20)"
|
||||
echo " clean-logs [days] - Очистить старые логи (по умолчанию старше 30 дней)"
|
||||
echo " help - Показать эту справку"
|
||||
echo ""
|
||||
echo "Примеры:"
|
||||
echo " $0 install cpm v1.0.0 git"
|
||||
echo " $0 install calista-graphics-legacy latest"
|
||||
echo " $0 list"
|
||||
echo " $0 info cpm"
|
||||
echo " $0 remove cpm"
|
||||
echo " $0 logs 50"
|
||||
echo " $0 clean-logs 60"
|
||||
echo ""
|
||||
echo "Путь к реестру: $REGISTRY_FILE"
|
||||
echo ""
|
||||
echo "Для работы с репозиторием компонентов сначала настройте gproxy:"
|
||||
echo " $GPROXY_SCRIPT set-repo <ваш-git-репозиторий>"
|
||||
echo " $0 update"
|
||||
}
|
||||
|
||||
# Главная функция
|
||||
main() {
|
||||
case "$1" in
|
||||
install)
|
||||
cmd_install "$2" "$3" "$4"
|
||||
;;
|
||||
list)
|
||||
cmd_list
|
||||
;;
|
||||
info)
|
||||
cmd_info "$2"
|
||||
;;
|
||||
remove)
|
||||
cmd_remove "$2"
|
||||
;;
|
||||
update)
|
||||
cmd_update
|
||||
;;
|
||||
versions)
|
||||
cmd_versions "$2"
|
||||
;;
|
||||
logs)
|
||||
cmd_logs "$2"
|
||||
;;
|
||||
clean-logs)
|
||||
cmd_clean_logs "$2"
|
||||
;;
|
||||
help|--help|-h)
|
||||
cmd_help
|
||||
;;
|
||||
*)
|
||||
if [ -z "$1" ]; then
|
||||
cmd_help
|
||||
else
|
||||
error "Неизвестная команда: $1"
|
||||
echo "Используйте: $0 help" >&2
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Проверка root прав для установки
|
||||
if [ "$(id -u)" -ne 0 ] && [ "$1" = "install" ]; then
|
||||
warn "Для установки компонентов рекомендуется запускать от root"
|
||||
echo "Продолжить? (y/N): "
|
||||
read -r answer
|
||||
if [ "$answer" != "y" ] && [ "$answer" != "Y" ]; then
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Запуск
|
||||
main "$@"
|
||||
@@ -0,0 +1,12 @@
|
||||
name: ccomp
|
||||
version: 1.0.0
|
||||
origin: calista/ccomp
|
||||
comment: Calista components manager
|
||||
desc: Calista components manager
|
||||
arch: freebsd:$(uname -m)
|
||||
maintainer: svsp@svsptech.ru
|
||||
www: svsptech.ru
|
||||
prefix: /usr/local
|
||||
|
||||
#files:
|
||||
# /usr/local/bin/ccomp: "886c659d5b6d606bafb6b08b593f8a39f7b39635031376f0355f406634815b99"
|
||||
Executable
+275
@@ -0,0 +1,275 @@
|
||||
#!/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 "$@"
|
||||
@@ -0,0 +1,13 @@
|
||||
name: gproxy
|
||||
version: 1.0.0
|
||||
origin: calista/gproxy
|
||||
comment: Git proxy for Calista components manager
|
||||
desc: Git proxy for Calista components manager
|
||||
arch: freebsd:$(uname -m)
|
||||
maintainer: svsp@svsptech.ru
|
||||
www: svsptech.ru
|
||||
prefix: /usr/local
|
||||
|
||||
#files:
|
||||
# /usr/local/bin/gproxy: '780b36deaddfd4e63008022d2a78e7334c8d1c3f93993b8797100b631134c875'
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,7 @@
|
||||
version = 2;
|
||||
packing_format = "tzst";
|
||||
manifests = "packagesite.yaml";
|
||||
data = "data";
|
||||
filesite = "filesite.yaml";
|
||||
manifests_archive = "packagesite";
|
||||
filesite_archive = "filesite";
|
||||
@@ -0,0 +1,7 @@
|
||||
version = 2;
|
||||
packing_format = "tzst";
|
||||
manifests = "packagesite.yaml";
|
||||
data = "data";
|
||||
filesite = "filesite.yaml";
|
||||
manifests_archive = "packagesite";
|
||||
filesite_archive = "filesite";
|
||||
Binary file not shown.
+5
-6
@@ -3,16 +3,15 @@
|
||||
mkdir /calista/config
|
||||
mkdir /calista/cache
|
||||
|
||||
unzip ccomp.zip
|
||||
|
||||
./calista-component-manager/build
|
||||
./ccomp/build
|
||||
./reginit
|
||||
./init_device_demon
|
||||
|
||||
ccomp install ccomp
|
||||
ccomp install cgl
|
||||
|
||||
rm -rf ./calista-component-manager
|
||||
rm ./reginit
|
||||
rm ./init_device_demon
|
||||
#rm -rf ./ccomp
|
||||
#rm ./reginit
|
||||
#rm ./init_device_demon
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user