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 "$@"
openSUSE Build Service is sponsored by