Добавление встроенного ccomp
This commit is contained in:
parent
23c5cfeb3d
commit
b6948ef69c
72
ccomp/README.md
Normal file
72
ccomp/README.md
Normal file
@ -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
|
||||
|
||||
|
||||
27
ccomp/build
Executable file
27
ccomp/build
Executable file
@ -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
|
||||
530
ccomp/ccomp
Executable file
530
ccomp/ccomp
Executable file
@ -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 "$@"
|
||||
12
ccomp/ccomp.pkg
Normal file
12
ccomp/ccomp.pkg
Normal file
@ -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"
|
||||
275
ccomp/gproxy
Executable file
275
ccomp/gproxy
Executable file
@ -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 "$@"
|
||||
13
ccomp/gproxy.pkg
Normal file
13
ccomp/gproxy.pkg
Normal file
@ -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'
|
||||
|
||||
BIN
ccomp/packages/All/All/Hashed/brotli-1.2.0,1~9ad5bbca4f.pkg
Normal file
BIN
ccomp/packages/All/All/Hashed/brotli-1.2.0,1~9ad5bbca4f.pkg
Normal file
Binary file not shown.
BIN
ccomp/packages/All/All/Hashed/curl-8.17.0~517a2452ea.pkg
Normal file
BIN
ccomp/packages/All/All/Hashed/curl-8.17.0~517a2452ea.pkg
Normal file
Binary file not shown.
BIN
ccomp/packages/All/All/Hashed/expat-2.7.3~8012c4078c.pkg
Normal file
BIN
ccomp/packages/All/All/Hashed/expat-2.7.3~8012c4078c.pkg
Normal file
Binary file not shown.
Binary file not shown.
BIN
ccomp/packages/All/All/Hashed/git-2.52.0~fd8baf935e.pkg
Normal file
BIN
ccomp/packages/All/All/Hashed/git-2.52.0~fd8baf935e.pkg
Normal file
Binary file not shown.
BIN
ccomp/packages/All/All/Hashed/indexinfo-0.3.1_1~2c29163daf.pkg
Normal file
BIN
ccomp/packages/All/All/Hashed/indexinfo-0.3.1_1~2c29163daf.pkg
Normal file
Binary file not shown.
BIN
ccomp/packages/All/All/Hashed/libffi-3.5.1~cf2254cd5a.pkg
Normal file
BIN
ccomp/packages/All/All/Hashed/libffi-3.5.1~cf2254cd5a.pkg
Normal file
Binary file not shown.
BIN
ccomp/packages/All/All/Hashed/libidn2-2.3.8~5b078f8ed4.pkg
Normal file
BIN
ccomp/packages/All/All/Hashed/libidn2-2.3.8~5b078f8ed4.pkg
Normal file
Binary file not shown.
BIN
ccomp/packages/All/All/Hashed/libnghttp2-1.68.0~bda8ada07c.pkg
Normal file
BIN
ccomp/packages/All/All/Hashed/libnghttp2-1.68.0~bda8ada07c.pkg
Normal file
Binary file not shown.
BIN
ccomp/packages/All/All/Hashed/libpsl-0.21.5_2~0d376a2f76.pkg
Normal file
BIN
ccomp/packages/All/All/Hashed/libpsl-0.21.5_2~0d376a2f76.pkg
Normal file
Binary file not shown.
BIN
ccomp/packages/All/All/Hashed/libssh2-1.11.1,3~d68facc45f.pkg
Normal file
BIN
ccomp/packages/All/All/Hashed/libssh2-1.11.1,3~d68facc45f.pkg
Normal file
Binary file not shown.
BIN
ccomp/packages/All/All/Hashed/libunistring-1.4.1~738cb65219.pkg
Normal file
BIN
ccomp/packages/All/All/Hashed/libunistring-1.4.1~738cb65219.pkg
Normal file
Binary file not shown.
BIN
ccomp/packages/All/All/Hashed/mpdecimal-4.0.1~f774e949d8.pkg
Normal file
BIN
ccomp/packages/All/All/Hashed/mpdecimal-4.0.1~f774e949d8.pkg
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
ccomp/packages/All/All/Hashed/p5-Digest-HMAC-1.05~60d3cf3195.pkg
Normal file
BIN
ccomp/packages/All/All/Hashed/p5-Digest-HMAC-1.05~60d3cf3195.pkg
Normal file
Binary file not shown.
BIN
ccomp/packages/All/All/Hashed/p5-Error-0.17030~291facff41.pkg
Normal file
BIN
ccomp/packages/All/All/Hashed/p5-Error-0.17030~291facff41.pkg
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
ccomp/packages/All/All/Hashed/p5-MIME-Base64-3.16~dda8d6e8b4.pkg
Normal file
BIN
ccomp/packages/All/All/Hashed/p5-MIME-Base64-3.16~dda8d6e8b4.pkg
Normal file
Binary file not shown.
Binary file not shown.
BIN
ccomp/packages/All/All/Hashed/p5-Net-SSLeay-1.94~825538c087.pkg
Normal file
BIN
ccomp/packages/All/All/Hashed/p5-Net-SSLeay-1.94~825538c087.pkg
Normal file
Binary file not shown.
BIN
ccomp/packages/All/All/Hashed/p5-URI-5.34~2dde06330f.pkg
Normal file
BIN
ccomp/packages/All/All/Hashed/p5-URI-5.34~2dde06330f.pkg
Normal file
Binary file not shown.
BIN
ccomp/packages/All/All/Hashed/pcre2-10.47_1~272aa65125.pkg
Normal file
BIN
ccomp/packages/All/All/Hashed/pcre2-10.47_1~272aa65125.pkg
Normal file
Binary file not shown.
BIN
ccomp/packages/All/All/Hashed/perl5-5.42.0_1~f3be220b12.pkg
Normal file
BIN
ccomp/packages/All/All/Hashed/perl5-5.42.0_1~f3be220b12.pkg
Normal file
Binary file not shown.
BIN
ccomp/packages/All/All/Hashed/python311-3.11.14_1~ae2d531880.pkg
Normal file
BIN
ccomp/packages/All/All/Hashed/python311-3.11.14_1~ae2d531880.pkg
Normal file
Binary file not shown.
BIN
ccomp/packages/All/All/Hashed/readline-8.3.3~b497baa5cc.pkg
Normal file
BIN
ccomp/packages/All/All/Hashed/readline-8.3.3~b497baa5cc.pkg
Normal file
Binary file not shown.
BIN
ccomp/packages/All/All/Hashed/zstd-1.5.7_1~6e1adfa4b5.pkg
Normal file
BIN
ccomp/packages/All/All/Hashed/zstd-1.5.7_1~6e1adfa4b5.pkg
Normal file
Binary file not shown.
BIN
ccomp/packages/data.pkg
Normal file
BIN
ccomp/packages/data.pkg
Normal file
Binary file not shown.
7
ccomp/packages/meta
Normal file
7
ccomp/packages/meta
Normal file
@ -0,0 +1,7 @@
|
||||
version = 2;
|
||||
packing_format = "tzst";
|
||||
manifests = "packagesite.yaml";
|
||||
data = "data";
|
||||
filesite = "filesite.yaml";
|
||||
manifests_archive = "packagesite";
|
||||
filesite_archive = "filesite";
|
||||
7
ccomp/packages/meta.conf
Normal file
7
ccomp/packages/meta.conf
Normal file
@ -0,0 +1,7 @@
|
||||
version = 2;
|
||||
packing_format = "tzst";
|
||||
manifests = "packagesite.yaml";
|
||||
data = "data";
|
||||
filesite = "filesite.yaml";
|
||||
manifests_archive = "packagesite";
|
||||
filesite_archive = "filesite";
|
||||
BIN
ccomp/packages/packagesite.pkg
Normal file
BIN
ccomp/packages/packagesite.pkg
Normal file
Binary file not shown.
11
init_calista
11
init_calista
@ -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
|
||||
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user