File wps-office-wrapper.sh of Package wps-office-docker
#!/bin/bash
# Скрипт сборки WPS Office в Docker контейнере
set -e
# Директории
WPS_DIR="/opt/wps-office"
SOURCE_DIR="/var/lib/wps-office-docker/source"
DOCKER_CONTEXT="/var/lib/wps-office-docker/docker-context"
LOG_FILE="/var/log/wps-office-docker/build.log"
STATUS_FILE="/var/lib/wps-office-docker/status"
DOCKERFILE="/etc/wps-office-docker/Dockerfile.rosa"
SRPM_FILE="$SOURCE_DIR/wps-office-12.1.2.23578-46.2.src.rpm"
# Цвета
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# Создаем директории
mkdir -p "$WPS_DIR" "$DOCKER_CONTEXT" "$(dirname "$LOG_FILE")"
# Функция логирования
log() {
echo -e "${BLUE}[$(date '+%Y-%m-%d %H:%M:%S')]${NC} $1" | tee -a "$LOG_FILE"
}
log_success() {
echo -e "${GREEN}[$(date '+%Y-%m-%d %H:%M:%S')] ✅ $1${NC}" | tee -a "$LOG_FILE"
}
log_error() {
echo -e "${RED}[$(date '+%Y-%m-%d %H:%M:%S')] ❌ $1${NC}" | tee -a "$LOG_FILE"
}
# Функция очистки
clean() {
log "Очистка предыдущей сборки..."
rm -rf "$WPS_DIR"/* "$DOCKER_CONTEXT"/* 2>/dev/null || true
docker stop wps-builder 2>/dev/null || true
docker rm wps-builder 2>/dev/null || true
docker rmi wps-builder:latest 2>/dev/null || true
echo "clean" > "$STATUS_FILE"
log_success "Очистка завершена"
}
# Функция проверки исходников
check_sources() {
log "Проверка исходных файлов..."
if [ ! -f "$SRPM_FILE" ]; then
log_error "SRPM файл не найден: $SRPM_FILE"
return 1
fi
local size=$(du -h "$SRPM_FILE" | cut -f1)
log_success "Найден SRPM: $(basename $SRPM_FILE) (размер: $size)"
return 0
}
# Функция подготовки контекста
prepare_context() {
log "Подготовка Docker контекста..."
rm -rf "$DOCKER_CONTEXT"/*
mkdir -p "$DOCKER_CONTEXT"
if [ ! -f "$DOCKERFILE" ]; then
log_error "Dockerfile не найден: $DOCKERFILE"
return 1
fi
# Создаём симлинк, если нужно
if [ ! -f "/etc/wps-office-docker/Dockerfile.wps" ]; then
ln -sf "$DOCKERFILE" "/etc/wps-office-docker/Dockerfile.wps" 2>/dev/null || true
fi
cp "$DOCKERFILE" "$DOCKER_CONTEXT/Dockerfile"
cp "$SRPM_FILE" "$DOCKER_CONTEXT/"
log_success "Контекст подготовлен"
return 0
}
# Функция сборки
build() {
log "Начало сборки Docker образа..."
echo "building" > "$STATUS_FILE"
cd "$DOCKER_CONTEXT"
# Сборка с таймаутом 30 минут
timeout 100m docker build -t wps-builder:latest . 2>&1 | tee -a "$LOG_FILE"
BUILD_STATUS=${PIPESTATUS[0]}
if [ $BUILD_STATUS -eq 124 ]; then
log_error "Таймаут при сборке (100 минут)"
return 1
elif [ $BUILD_STATUS -ne 0 ]; then
log_error "Ошибка при сборке Docker образа"
return 1
fi
log_success "Docker образ собран"
# ===== КОПИРОВАНИЕ БИНАРНИКОВ НА ХОСТ =====
log "Копирование бинарников на хост..."
# Создаём временный контейнер
docker create --name wps-temp wps-builder:latest
# Копируем файлы из правильного места
if docker cp wps-temp:/output/opt/kingsoft /opt/ 2>/dev/null; then
log_success "✅ Бинарники скопированы в /opt/kingsoft"
else
# Если не получилось, пробуем другие пути
log "Пробуем альтернативные пути..."
docker cp wps-temp:/opt/kingsoft /opt/ 2>/dev/null && \
log_success "✅ Бинарники скопированы из /opt/kingsoft"
fi
# Удаляем временный контейнер
docker rm wps-temp >/dev/null 2>&1 || true
# Проверяем результат
if [ -f "/opt/kingsoft/wps-office/office6/wps" ]; then
log_success "✅ WPS успешно установлен в /opt/kingsoft/wps-office/office6/"
chmod -R 755 /opt/kingsoft 2>/dev/null || sudo chmod -R 755 /opt/kingsoft
echo "installed" > "$STATUS_FILE"
return 0
elif [ -f "/opt/kingsoft/wps-office/office6/wps" ]; then
log_success "✅ WPS успешно установлен"
chmod -R 755 /opt/kingsoft 2>/dev/null || sudo chmod -R 755 /opt/kingsoft
echo "installed" > "$STATUS_FILE"
return 0
else
log_error "❌ Бинарники WPS не найдены после сборки!"
# Диагностика: покажем, что есть в /opt
log "Содержимое /opt:"
ls -la /opt/ | while read line; do
log " $line"
done
echo "failed" > "$STATUS_FILE"
return 1
fi
}
# Обработка аргументов
if [ "$1" = "--clean" ]; then
clean
exit 0
fi
# Основная функция
main() {
log "=========================================="
log "Начало сборки WPS Office"
log "=========================================="
# Проверка Docker
if ! command -v docker &>/dev/null; then
log_error "Docker не установлен"
exit 1
fi
if ! docker info &>/dev/null; then
log_error "Docker не запущен"
exit 1
fi
# Проверка исходников
check_sources || exit 1
# Подготовка контекста
prepare_context || exit 1
# Сборка
if build; then
log_success "=========================================="
log_success "WPS Office готов к использованию!"
log_success "Запуск: wps-office"
log_success "=========================================="
exit 0
else
log_error "=========================================="
log_error "Сборка завершилась с ошибкой"
log_error "Проверьте лог: tail -f $LOG_FILE"
log_error "Для очистки: sudo wps-office-build --clean"
log_error "=========================================="
exit 1
fi
}
main "$@"