321 lines
9.0 KiB
Bash
321 lines
9.0 KiB
Bash
# config Editor 一键构建脚本
|
||
set -e
|
||
|
||
# 配置变量
|
||
PACKAGE_NAME="config-editor"
|
||
VERSION="1.0"
|
||
ARCHITECTURE="amd64"
|
||
MAINTAINER="hjy <hjy@pw.com>"
|
||
|
||
echo "=========================================="
|
||
echo "Config Editor 构建脚本 (虚拟环境版)"
|
||
echo "版本: $VERSION"
|
||
echo "架构: $ARCHITECTURE"
|
||
echo "=========================================="
|
||
|
||
# 检查依赖
|
||
echo "检查构建依赖..."
|
||
if ! command -v dpkg-deb &> /dev/null; then
|
||
echo "错误: 需要 dpkg-deb,请安装: sudo apt install dpkg-dev"
|
||
exit 1
|
||
fi
|
||
|
||
# 检查源代码是否存在
|
||
echo "检查源代码..."
|
||
if [ ! -f "config_editor.py" ]; then
|
||
echo "错误: 未找到主程序文件 config_editor.py"
|
||
echo "请确保在项目根目录运行此脚本,且包含 config_editor.py 文件"
|
||
exit 1
|
||
fi
|
||
|
||
# 创建构建目录
|
||
BUILD_DIR="/tmp/${PACKAGE_NAME}-build"
|
||
echo "创建构建目录: $BUILD_DIR"
|
||
rm -rf "$BUILD_DIR"
|
||
mkdir -p "$BUILD_DIR/DEBIAN"
|
||
mkdir -p "$BUILD_DIR/usr/share/applications"
|
||
mkdir -p "$BUILD_DIR/usr/share/config-editor"
|
||
mkdir -p "$BUILD_DIR/usr/bin"
|
||
|
||
# 复制应用文件
|
||
echo "复制应用文件..."
|
||
echo "复制主程序 config_editor.py"
|
||
cp config_editor.py "$BUILD_DIR/usr/share/config-editor/"
|
||
|
||
# 复制配置文件
|
||
if [ -f "config_editor_rules.json" ]; then
|
||
echo "复制配置文件 config_editor_rules.json"
|
||
cp config_editor_rules.json "$BUILD_DIR/usr/share/config-editor/"
|
||
else
|
||
echo "警告: 未找到 config_editor_rules.json 文件"
|
||
fi
|
||
|
||
if [ -f "config_editor_settings.json" ]; then
|
||
echo "复制配置文件 config_editor_settings.json"
|
||
cp config_editor_settings.json "$BUILD_DIR/usr/share/config-editor/"
|
||
else
|
||
echo "警告: 未找到 config_editor_settings.json 文件"
|
||
fi
|
||
|
||
# 复制所有Python文件
|
||
echo "复制其他Python文件..."
|
||
find . -maxdepth 1 -name "*.py" ! -name "build.sh" -exec cp {} "$BUILD_DIR/usr/share/config-editor/" \; 2>/dev/null || true
|
||
|
||
# 显示复制的文件
|
||
echo "已复制的文件:"
|
||
ls -la "$BUILD_DIR/usr/share/config-editor/"
|
||
|
||
# 检查是否复制了真实的应用文件
|
||
if [ ! -f "$BUILD_DIR/usr/share/config-editor/config_editor.py" ]; then
|
||
echo "错误: 未成功复制 config_editor.py 文件"
|
||
exit 1
|
||
fi
|
||
|
||
# 创建桌面文件
|
||
echo "创建桌面文件..."
|
||
cat > "$BUILD_DIR/usr/share/applications/config-editor.desktop" << EOF
|
||
[Desktop Entry]
|
||
Version=1.1
|
||
Type=Application
|
||
Name=Config Editor
|
||
Comment=Configuration Management System
|
||
Exec=config-editor
|
||
Icon=config-editor
|
||
Categories=Development;Settings;
|
||
Terminal=false
|
||
StartupWMClass=ConfigEditor
|
||
EOF
|
||
|
||
# 创建虚拟环境安装脚本(已修复权限问题)
|
||
echo "创建虚拟环境安装脚本..."
|
||
cat > "$BUILD_DIR/usr/share/config-editor/setup_venv.sh" << 'EOF'
|
||
#!/bin/bash
|
||
# 虚拟环境安装脚本
|
||
|
||
APP_DIR="/usr/share/config-editor"
|
||
VENV_DIR="$APP_DIR/venv"
|
||
|
||
echo "设置Config Editor虚拟环境..."
|
||
|
||
# 检查是否使用sudo
|
||
if [ "$EUID" -ne 0 ]; then
|
||
echo "错误: 请使用sudo运行此脚本"
|
||
echo "命令: sudo $0"
|
||
exit 1
|
||
fi
|
||
|
||
# 检查虚拟环境是否存在
|
||
if [ ! -d "$VENV_DIR" ]; then
|
||
echo "创建虚拟环境..."
|
||
python3 -m venv --system-site-packages "$VENV_DIR"
|
||
|
||
if [ $? -ne 0 ]; then
|
||
echo "错误: 无法创建虚拟环境"
|
||
echo "请确保已安装 python3-venv: sudo apt install python3-venv"
|
||
exit 1
|
||
fi
|
||
fi
|
||
|
||
# 激活虚拟环境并安装依赖
|
||
echo "激活虚拟环境并安装依赖..."
|
||
source "$VENV_DIR/bin/activate"
|
||
|
||
# 修复权限问题
|
||
echo "修复虚拟环境权限..."
|
||
chmod -R 755 "$VENV_DIR"
|
||
chmod +x "$VENV_DIR/bin"/* 2>/dev/null || true
|
||
chmod +x "$VENV_DIR/bin/python" 2>/dev/null || true
|
||
chmod +x "$VENV_DIR/bin/pip" 2>/dev/null || true
|
||
|
||
# 升级pip
|
||
echo "升级pip..."
|
||
python -m pip install --upgrade pip
|
||
|
||
# 安装PyQt6
|
||
echo "安装PyQt6..."
|
||
pip install PyQt6 -i https://pypi.tuna.tsinghua.edu.cn/simple/
|
||
|
||
# 如果有requirements.txt,安装其他依赖
|
||
if [ -f "$APP_DIR/requirements.txt" ]; then
|
||
echo "安装其他依赖..."
|
||
pip install -r "$APP_DIR/requirements.txt" -i https://pypi.tuna.tsinghua.edu.cn/simple/
|
||
fi
|
||
|
||
# 再次确保权限正确
|
||
echo "设置最终权限..."
|
||
chmod -R 755 "$VENV_DIR"
|
||
chmod +x "$VENV_DIR/bin"/* 2>/dev/null || true
|
||
|
||
echo "虚拟环境设置完成"
|
||
echo "安装在虚拟环境中的包:"
|
||
pip list
|
||
EOF
|
||
|
||
chmod +x "$BUILD_DIR/usr/share/config-editor/setup_venv.sh"
|
||
|
||
# 创建启动脚本 - 使用虚拟环境(已修复权限检查)
|
||
echo "创建启动脚本..."
|
||
cat > "$BUILD_DIR/usr/bin/config-editor" << 'EOF'
|
||
#!/bin/bash
|
||
# Config Editor 启动脚本 - 虚拟环境版本
|
||
|
||
# 应用目录
|
||
APP_DIR="/usr/share/config-editor"
|
||
VENV_DIR="$APP_DIR/venv"
|
||
LOG_FILE="${HOME}/.config/config-editor/log.txt"
|
||
|
||
# 创建日志目录
|
||
mkdir -p "$(dirname "$LOG_FILE")"
|
||
|
||
# 记录启动日志
|
||
echo "$(date): 启动Config Editor" >> "$LOG_FILE"
|
||
|
||
# 设置环境变量
|
||
export DISPLAY=":${XDG_SESSION_DISPLAY:-1}"
|
||
export XAUTHORITY="${HOME}/.Xauthority"
|
||
|
||
# 尝试多种方法设置DBUS
|
||
if [ -f "/run/user/$(id -u)/bus" ]; then
|
||
export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/$(id -u)/bus"
|
||
elif [ -n "$DBUS_SESSION_BUS_ADDRESS" ]; then
|
||
: # 保持已有设置
|
||
else
|
||
# 尝试从进程获取
|
||
DBUS_ADDR=$(ps -u $(id -u) -o command | grep -o 'dbus-daemon.*address=unix:path=[^ ]*' | head -1 | sed 's/.*address=//')
|
||
if [ -n "$DBUS_ADDR" ]; then
|
||
export DBUS_SESSION_BUS_ADDRESS="$DBUS_ADDR"
|
||
fi
|
||
fi
|
||
|
||
# 修复X11权限
|
||
if [ -f "${HOME}/.Xauthority" ]; then
|
||
export XAUTHORITY="${HOME}/.Xauthority"
|
||
fi
|
||
|
||
# 检查虚拟环境
|
||
if [ ! -d "$VENV_DIR" ]; then
|
||
echo "错误: 虚拟环境未找到。请先运行:"
|
||
echo " sudo /usr/share/config-editor/setup_venv.sh"
|
||
exit 1
|
||
fi
|
||
|
||
# 检查并修复权限(如果需要)
|
||
if [ ! -x "$VENV_DIR/bin/python" ] || [ ! -x "$VENV_DIR/bin/pip" ]; then
|
||
echo "警告: 虚拟环境权限问题,请重新运行安装脚本:"
|
||
echo " sudo /usr/share/config-editor/setup_venv.sh"
|
||
exit 1
|
||
fi
|
||
|
||
# 检查PyQt6是否安装
|
||
if ! "$VENV_DIR/bin/python" -c "import PyQt6" 2>/dev/null; then
|
||
echo "错误: PyQt6未在虚拟环境中安装。请运行:"
|
||
echo " sudo /usr/share/config-editor/setup_venv.sh"
|
||
exit 1
|
||
fi
|
||
|
||
# 切换到应用目录
|
||
cd "$APP_DIR"
|
||
|
||
# 记录环境信息
|
||
echo "DISPLAY: $DISPLAY" >> "$LOG_FILE"
|
||
echo "XAUTHORITY: $XAUTHORITY" >> "$LOG_FILE"
|
||
|
||
# 使用虚拟环境运行Python应用
|
||
exec "$VENV_DIR/bin/python" config_editor.py "$@" >> "$LOG_FILE" 2>&1
|
||
EOF
|
||
|
||
chmod +x "$BUILD_DIR/usr/bin/config-editor"
|
||
|
||
# 创建控制文件
|
||
echo "创建DEBIAN控制文件..."
|
||
cat > "$BUILD_DIR/DEBIAN/control" << EOF
|
||
Package: $PACKAGE_NAME
|
||
Version: $VERSION
|
||
Architecture: $ARCHITECTURE
|
||
Depends: python3, python3-venv
|
||
Recommends: libnotify-bin, x11-xserver-utils
|
||
Maintainer: $MAINTAINER
|
||
Description: Configuration Management System (VirtualEnv)
|
||
A PyQt6-based configuration management editor using virtual environment.
|
||
Provides grouping management, validation rules, and auto-grouping features.
|
||
This version uses virtual environment for PyQt6.
|
||
EOF
|
||
|
||
# 创建安装后脚本
|
||
echo "创建安装后脚本..."
|
||
cat > "$BUILD_DIR/DEBIAN/postinst" << 'EOF'
|
||
#!/bin/bash
|
||
# 安装后脚本
|
||
set -e
|
||
|
||
echo "Config Editor 安装完成!"
|
||
echo ""
|
||
echo "更新桌面数据库..."
|
||
update-desktop-database /usr/share/applications 2>/dev/null || true
|
||
|
||
echo ""
|
||
echo "重要: 需要设置虚拟环境才能运行应用"
|
||
echo "请执行以下命令完成安装:"
|
||
echo " sudo /usr/share/config-editor/setup_venv.sh"
|
||
echo ""
|
||
echo "使用说明:"
|
||
echo "1. 设置虚拟环境: sudo /usr/share/config-editor/setup_venv.sh"
|
||
echo "2. 在终端运行: config-editor"
|
||
|
||
# 设置文件权限
|
||
chmod 755 /usr/bin/config-editor
|
||
chmod 755 /usr/share/config-editor/setup_venv.sh
|
||
|
||
# 设置应用文件权限
|
||
chmod -R 644 /usr/share/config-editor/* 2>/dev/null || true
|
||
chmod 755 /usr/share/config-editor/*.py 2>/dev/null || true
|
||
chmod 755 /usr/share/config-editor/*.sh 2>/dev/null || true
|
||
|
||
# 为虚拟环境目录预留权限
|
||
mkdir -p /usr/share/config-editor/venv 2>/dev/null || true
|
||
chmod 755 /usr/share/config-editor/venv 2>/dev/null || true
|
||
|
||
exit 0
|
||
EOF
|
||
|
||
chmod +x "$BUILD_DIR/DEBIAN/postinst"
|
||
|
||
# 构建deb包
|
||
echo "构建deb包..."
|
||
dpkg-deb --build "$BUILD_DIR" "${PACKAGE_NAME}_${VERSION}_${ARCHITECTURE}.deb"
|
||
|
||
# 验证包
|
||
echo "验证deb包..."
|
||
if dpkg -I "${PACKAGE_NAME}_${VERSION}_${ARCHITECTURE}.deb" > /dev/null; then
|
||
echo "✓ 包验证成功"
|
||
else
|
||
echo "✗ 包验证失败"
|
||
exit 1
|
||
fi
|
||
|
||
# 清理构建目录
|
||
echo "清理构建目录..."
|
||
rm -rf "$BUILD_DIR"
|
||
|
||
echo ""
|
||
echo "=========================================="
|
||
echo "构建成功完成!"
|
||
echo "生成的deb包: ${PACKAGE_NAME}_${VERSION}_${ARCHITECTURE}.deb"
|
||
echo ""
|
||
echo "安装步骤:"
|
||
echo "1. 安装deb包: sudo dpkg -i ${PACKAGE_NAME}_${VERSION}_${ARCHITECTURE}.deb"
|
||
echo "2. 安装依赖(如有需要): sudo apt install -f"
|
||
echo "3. 设置虚拟环境: sudo /usr/share/config-editor/setup_venv.sh"
|
||
echo ""
|
||
echo "此版本特点:"
|
||
echo "✓ 修复了虚拟环境权限问题"
|
||
echo "✓ 使用 --system-site-packages 参数"
|
||
echo "✓ 自动使用清华PyPI镜像"
|
||
echo "✓ 简化了依赖和脚本"
|
||
echo "=========================================="
|
||
|
||
# 显示包信息
|
||
echo ""
|
||
echo "包信息:"
|
||
dpkg -I "${PACKAGE_NAME}_${VERSION}_${ARCHITECTURE}.deb"
|