#!/bin/bash # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color # 日志函数 log_info() { echo -e "${GREEN}[INFO]${NC} $1" } log_warn() { echo -e "${YELLOW}[WARN]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # 检查是否为 root 用户 if [ "$EUID" -ne 0 ]; then log_error "请使用 root 用户运行此脚本" exit 1 fi # 检查系统版本 if [ ! -f /etc/centos-release ]; then log_error "此脚本仅支持 CentOS 系统" exit 1 fi # 检查是否存在离线安装包目录 OFFLINE_PACKAGES="./packages" if [ -d "$OFFLINE_PACKAGES" ]; then log_info "检测到离线安装包目录,使用离线安装模式..." # 安装离线包 log_info "安装离线依赖包..." if [ -f "$OFFLINE_PACKAGES/offline-deps.txt" ]; then while IFS= read -r pkg; do if [ -f "$OFFLINE_PACKAGES/$pkg" ]; then log_info "正在安装: $pkg" rpm -ivh "$OFFLINE_PACKAGES/$pkg" || { log_error "安装包失败: $pkg" exit 1 } else log_error "找不到安装包: $pkg" exit 1 fi done < "$OFFLINE_PACKAGES/offline-deps.txt" else log_error "找不到离线依赖包列表文件: offline-deps.txt" exit 1 fi else # 在线安装依赖 log_info "使用在线安装模式..." log_info "正在安装依赖包..." yum groupinstall -y "Development Tools" yum install -y cmake3 git nlohmann-json-devel boost-devel openssl-devel fi # 创建工作目录 WORK_DIR="/opt/collision_avoidance" log_info "创建工作目录: $WORK_DIR" mkdir -p $WORK_DIR cd $WORK_DIR || { log_error "无法进入工作目录" exit 1 } # 编译项目 log_info "开始编译项目..." mkdir -p build cd build || { log_error "无法进入构建目录" exit 1 } cmake .. make -j4 if [ $? -ne 0 ]; then log_error "编译失败" exit 1 fi # 创建配置目录 CONFIG_DIR="/etc/collision_avoidance" log_info "创建配置目录: $CONFIG_DIR" mkdir -p $CONFIG_DIR # 复制配置文件 log_info "复制配置文件..." cp ../config/* $CONFIG_DIR/ || { log_error "复制配置文件失败" exit 1 } # 复制可执行文件 log_info "安装可执行文件..." cp collision_avoidance /usr/local/bin/ || { log_error "复制可执行文件失败" exit 1 } # 创建服务文件 log_info "创建系统服务..." cat > /etc/systemd/system/collision-avoidance.service << EOL [Unit] Description=Collision Avoidance Service After=network.target [Service] Type=simple ExecStart=/usr/local/bin/collision_avoidance WorkingDirectory=/usr/local/bin User=root Restart=always RestartSec=3 Environment=CONFIG_PATH=/etc/collision_avoidance [Install] WantedBy=multi-user.target EOL # 配置防火墙 log_info "配置防火墙..." if command -v firewall-cmd &> /dev/null; then firewall-cmd --permanent --add-port=8010/tcp firewall-cmd --reload else log_warn "未检测到 firewalld,请手动配置防火墙" fi # 启动服务 log_info "启动服务..." systemctl daemon-reload systemctl enable collision-avoidance systemctl start collision-avoidance # 检查服务状态 if systemctl is-active --quiet collision-avoidance; then log_info "服务启动成功" else log_error "服务启动失败,请检查日志" journalctl -u collision-avoidance -n 50 exit 1 fi # 显示服务状态 log_info "部署完成,服务状态:" systemctl status collision-avoidance # 显示使用说明 echo -e "\n${GREEN}部署完成!${NC}" echo "使用以下命令管理服务:" echo " 启动服务:systemctl start collision-avoidance" echo " 停止服务:systemctl stop collision-avoidance" echo " 重启服务:systemctl restart collision-avoidance" echo " 查看状态:systemctl status collision-avoidance" echo " 查看日志:journalctl -u collision-avoidance -f" echo -e "\n配置文件位置:${CONFIG_DIR}" echo "WebSocket 服务端口:8010"