Files
H100PowerManger/scripts/deploy.sh
T
zjk f50c7bd612 数据库:下位机交互数据全量落库,SQLite 封装重构
- 新增 msg_log 原始帧表,RX/TX 双向记录原始字节与校验结果
- SQLite 封装改为描述符驱动的泛化 insert,删除 10 个手写 SQL
- 新增 ccuSetParmCmd/ccuSetParmFb 表,补齐 CCU 参数设定反馈落库
- 错误防崩溃:统一加锁、fail-open 降级、损坏自动重建、析构顺序修复
- WAL/迁移/预编译语句路径,数据库路径支持 mission 配置 dbpath
- 清理未使用的 shell.c/sqlite3ext.h/SQLite.zip
2026-08-19 16:28:41 +08:00

250 lines
9.0 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
#=======================================================================
# FILE: scripts/deploy.sh
# DESC: 部署 pPowerManger / pPowerMangerHost(aarch64 二进制 + mission)
# 到目标板卡 (RK3588 / Ubuntu 22.04),并用三个独立 systemd 服务
# (moosdb / pPowerManger / pPowerMangerHost)管理。
# 只安装服务 + daemon-reload,默认不启动、不自启。
#
# 用法:
# ./scripts/deploy.sh setup-ssh 一次性:生成 ed25519 key + ssh-copy-id
# ./scripts/deploy.sh 默认:推送二进制 + mission + 装 3 个
# systemd 服务 + daemon-reload(不启动)
# ./scripts/deploy.sh --start 部署后按依赖顺序启动服务
# ./scripts/deploy.sh status 板卡 3 个服务状态
# ./scripts/deploy.sh stop 停止 3 个服务
# ./scripts/deploy.sh help 显示帮助
#
# 参数:
# --host <ip> 目标主机(默认 192.168.0.223)
# --user <user> 登录用户(默认 root)
# --board-dir <dir> 板卡部署根目录(默认 /root/work/h100)
# --start 部署后立即启动服务
#
# 板卡布局:
# /root/work/h100/bin/ aarch64 二进制
# /root/work/h100/missions/ 板卡 mission h100.moos
# /root/work/h100/data/ 数据库存储目录 (power_data.db)
# /etc/systemd/system/ moosdb.service / pPowerManger.service /
# pPowerMangerHost.service
#=======================================================================
set -uo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(dirname "${SCRIPT_DIR}")"
HOST="192.168.0.223"
USER="root"
BOARD_DIR="/root/work/h100"
DO_START=0
SERVICES=(moosdb pPowerManger pPowerMangerHost)
info() { printf '\033[1;36m[deploy]\033[0m %s\n' "$*"; }
ok() { printf '\033[1;32m[deploy]\033[0m %s\n' "$*"; }
warn() { printf '\033[1;33m[deploy]\033[0m %s\n' "$*"; }
err() { printf '\033[1;31m[deploy]\033[0m %s\n' "$*"; }
usage() {
sed -n '2,29p' "${BASH_SOURCE[0]}" | sed 's/^# \{0,1\}//'
exit 0
}
#-------------------------------------------------------------------
# 参数解析
#-------------------------------------------------------------------
ACTION=""
while [ $# -gt 0 ]; do
case "$1" in
--host) [ $# -ge 2 ] || { err "--host 需要参数"; exit 1; }; HOST="$2"; shift 2 ;;
--user) [ $# -ge 2 ] || { err "--user 需要参数"; exit 1; }; USER="$2"; shift 2 ;;
--board-dir)[ $# -ge 2 ] || { err "--board-dir 需要参数"; exit 1; }; BOARD_DIR="$2"; shift 2 ;;
--start) DO_START=1; shift ;;
setup-ssh|status|stop|help|-h|--help) ACTION="$1"; shift ;;
"") shift ;;
*) err "未知参数: $1(见 help)"; exit 1 ;;
esac
done
[ -n "${ACTION}" ] || ACTION="deploy"
SSH_TARGET="${USER}@${HOST}"
SSH="ssh -o BatchMode=yes -o ConnectTimeout=5"
SCP="scp -o BatchMode=yes -o ConnectTimeout=5"
#-------------------------------------------------------------------
# 命令: setup-ssh
#-------------------------------------------------------------------
cmd_setup_ssh() {
local key="$HOME/.ssh/id_ed25519"
if [ ! -f "${key}" ]; then
info "未发现 SSH key,生成 ed25519 key ..."
mkdir -p "$HOME/.ssh" && chmod 700 "$HOME/.ssh"
ssh-keygen -t ed25519 -N '' -f "${key}"
fi
info "上传公钥到 ${SSH_TARGET}(会提示输入密码,仅此一次)..."
ssh-copy-id -o ConnectTimeout=5 "${SSH_TARGET}"
ok "免密 SSH 已配置。验证: ssh ${SSH_TARGET}"
}
#-------------------------------------------------------------------
# 前置检查
#-------------------------------------------------------------------
check_local() {
local missing=0
for b in pPowerManger pPowerMangerHost; do
if [ ! -f "${PROJECT_ROOT}/bin/arm64/${b}" ]; then
err "缺少本地 aarch64 二进制: bin/arm64/${b}(先运行 ./scripts/build-arm64.sh)"; missing=1
elif ! file "${PROJECT_ROOT}/bin/arm64/${b}" | grep -q "aarch64"; then
err "bin/arm64/${b} 不是 aarch64 二进制"; missing=1
fi
done
if [ ! -f "${PROJECT_ROOT}/missions/h100.moos" ]; then
err "缺少板卡 mission: missions/h100.moos"; missing=1
fi
[ "${missing}" -eq 0 ] || return 1
ok "本地产物校验通过 (aarch64 + mission)"
}
check_ssh() {
if ! ${SSH} "${SSH_TARGET}" 'true' 2>/dev/null; then
err "无法免密 SSH 到 ${SSH_TARGET}"
err "请先执行: ./scripts/deploy.sh setup-ssh"
return 1
fi
ok "SSH 连接正常: ${SSH_TARGET}"
}
#-------------------------------------------------------------------
# 生成 systemd unit(含板卡绝对路径)
#-------------------------------------------------------------------
gen_moosdb_unit() {
# MOOSDB 路径在板卡探测;探测失败给出提示
local moosdb_bin
moosdb_bin="$(${SSH} "${SSH_TARGET}" 'command -v MOOSDB || true' 2>/dev/null)"
if [ -z "${moosdb_bin}" ]; then
moosdb_bin="$(command -v MOOSDB || true)"
warn "板卡未在 PATH 找到 MOOSDB,回退本机路径 ${moosdb_bin:-"(未找到)"}"
[ -n "${moosdb_bin}" ] || { err "MOOSDB 路径未知,无法生成 moosdb.service"; return 1; }
fi
ok "MOOSDB 路径: ${moosdb_bin}" >&2
cat <<EOF
[Unit]
Description=MOOSDB for H100 Power Manager
After=network.target
[Service]
Type=simple
ExecStart=${moosdb_bin} --moos_no_colour ${BOARD_DIR}/missions/h100.moos
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
}
gen_app_unit() {
local app="$1" deps=""
[ "${app}" = "moosdb" ] || deps="After=moosdb.service\nRequires=moosdb.service"
cat <<EOF
[Unit]
Description=${app} for H100 Power Manager
$(printf '%b' "${deps}")
[Service]
Type=simple
WorkingDirectory=${BOARD_DIR}/bin
ExecStart=${BOARD_DIR}/bin/${app} --alias=${app} ${BOARD_DIR}/missions/h100.moos
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
}
#-------------------------------------------------------------------
# 命令: deploy
#-------------------------------------------------------------------
cmd_deploy() {
check_local || return 1
check_ssh || return 1
# 1. 推送二进制 + mission
info "创建板卡目录 ${BOARD_DIR}/{bin,missions,data} ..."
${SSH} "${SSH_TARGET}" "mkdir -p ${BOARD_DIR}/bin ${BOARD_DIR}/missions ${BOARD_DIR}/data" || { err "创建目录失败"; return 1; }
info "推送 aarch64 二进制 ..."
${SCP} -q "${PROJECT_ROOT}/bin/arm64/pPowerManger" \
"${PROJECT_ROOT}/bin/arm64/pPowerMangerHost" \
"${SSH_TARGET}:${BOARD_DIR}/bin/" || { err "推送二进制失败"; return 1; }
info "推送 mission h100.moos ..."
${SCP} -q "${PROJECT_ROOT}/missions/h100.moos" \
"${SSH_TARGET}:${BOARD_DIR}/missions/" || { err "推送 mission 失败"; return 1; }
${SSH} "${SSH_TARGET}" "chmod +x ${BOARD_DIR}/bin/pPowerManger ${BOARD_DIR}/bin/pPowerMangerHost"
ok "二进制与 mission 已推送"
# 2. 生成并安装 3 个 systemd unit
local unit
for s in "${SERVICES[@]}"; do
info "生成 ${s}.service ..."
if [ "${s}" = "moosdb" ]; then
unit="$(gen_moosdb_unit)" || return 1
else
unit="$(gen_app_unit "${s}")"
fi
printf '%s\n' "${unit}" | ${SSH} "${SSH_TARGET}" "cat > /etc/systemd/system/${s}.service"
ok "${s}.service 已安装"
done
# 3. daemon-reload(不 enable,不自启)
info "systemctl daemon-reload ..."
${SSH} "${SSH_TARGET}" "systemctl daemon-reload && systemctl reset-failed ${SERVICES[*]} 2>/dev/null || true"
ok "服务已安装但未启用自启(systemctl is-enabled 应输出 disabled)"
# 4. 可选启动
if [ "${DO_START}" = "1" ]; then
cmd_start
else
echo ""
info "部署完成。手动启动(或加 --start):"
echo " systemctl start moosdb pPowerManger pPowerMangerHost"
echo " 浏览器: http://${HOST}:18080"
fi
}
#-------------------------------------------------------------------
# 命令: start / status / stop
#-------------------------------------------------------------------
cmd_start() {
info "启动服务 (moosdb -> pPowerManger -> pPowerMangerHost) ..."
${SSH} "${SSH_TARGET}" "systemctl start moosdb && sleep 1 && \
systemctl start pPowerManger pPowerMangerHost" || { err "启动失败"; return 1; }
ok "服务已启动"
cmd_status
}
cmd_status() {
${SSH} "${SSH_TARGET}" "systemctl --no-pager status moosdb pPowerManger pPowerMangerHost" || true
}
cmd_stop() {
${SSH} "${SSH_TARGET}" "systemctl stop pPowerMangerHost pPowerManger moosdb" && \
ok "服务已停止" || err "停止服务失败"
}
#-------------------------------------------------------------------
# 命令入口
#-------------------------------------------------------------------
case "${ACTION}" in
deploy) cmd_deploy ;;
setup-ssh) cmd_setup_ssh ;;
status) cmd_status ;;
stop) cmd_stop ;;
help|-h|--help) usage ;;
*) usage ;;
esac