Files
DBLog/setup.sh
QClaw Bot ebc1a2a87c fix: 替换所有中文括号为英文括号
feat: 新增操作审计字段 user/action/target/result 到 syslog 输出
docs: 更新 README 输出格式和配置示例说明
2026-05-13 13:33:45 +08:00

176 lines
6.1 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.
#!/usr/bin/env bash
# ==============================================================================
# db_log_exporter — 安装部署脚本
# ==============================================================================
# 用法:
# sudo ./setup.sh [install | uninstall | status]
#
# 支持: CentOS 7/8, RHEL, Fedora, Debian, Ubuntu
# ==============================================================================
set -euo pipefail
APP_NAME="db_log_exporter"
INSTALL_DIR="/opt/${APP_NAME}"
CONFIG_DIR="/etc/${APP_NAME}"
SYSTEMD_UNIT="${APP_NAME}.service"
LOG_DIR="/var/log/${APP_NAME}"
DATA_DIR="/var/lib/${APP_NAME}"
RUN_DIR="/var/run/${APP_NAME}"
CHECKPOINT_DIR="${DATA_DIR}/checkpoints"
# 颜色
RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'; NC='\033[0m'
info() { echo -e "${GREEN}[INFO]${NC} $*"; }
warn() { echo -e "${YELLOW}[WARN]${NC} $*" >&2; }
error() { echo -e "${RED}[ERROR]${NC} $*" >&2; exit 1; }
need_root() { [ "$(id -u)" -eq 0 ] || error "请用 root 权限运行: sudo $0 $*"; }
# ---------------------------------------------------------------------------
# 检查依赖
# ---------------------------------------------------------------------------
check_deps() {
info "检查依赖..."
local missing=()
if ! command -v python3 &>/dev/null; then
missing+=("python3")
fi
if ! python3 -c "import pymysql" 2>/dev/null; then
missing+=("PyMySQL (pip3 install pymysql)")
fi
if ! python3 -c "import psycopg2" 2>/dev/null; then
missing+=("psycopg2-binary (pip3 install psycopg2-binary)")
fi
if ! python3 -c "import yaml" 2>/dev/null; then
missing+=("PyYAML (pip3 install pyyaml)")
fi
if [ ${#missing[@]} -gt 0 ]; then
error "缺少依赖: ${missing[*]} \n请先安装: pip3 install PyMySQL psycopg2-binary PyYAML"
fi
# 检查 MySQL / PostgreSQL 客户端(仅检查命令是否存在,不强制要求服务运行)
if command -v mysql &>/dev/null || command -v psql &>/dev/null; then
info "数据库客户端已找到"
else
warn "未找到 mysql/psql 客户端(程序使用 Python DB 驱动,不影响运行)"
fi
info "依赖检查通过 ✓"
}
# ---------------------------------------------------------------------------
# 安装
# ---------------------------------------------------------------------------
do_install() {
need_root "$@"
check_deps
info "开始安装 ${APP_NAME}..."
# 1. 创建目录
for d in "${INSTALL_DIR}" "${CONFIG_DIR}" "${LOG_DIR}" "${DATA_DIR}" "${CHECKPOINT_DIR}" "${RUN_DIR}"; do
mkdir -p "$d"
echo " 创建: $d"
done
# 2. 复制文件
cp "$(dirname "$0")/db_log_exporter.py" "${INSTALL_DIR}/"
cp "$(dirname "$0")/config.yaml" "${CONFIG_DIR}/config.yaml.example"
[ -f "$(dirname "$0")/requirements.txt" ] && \
cp "$(dirname "$0")/requirements.txt" "${INSTALL_DIR}/"
info "文件已复制到 ${INSTALL_DIR}${CONFIG_DIR}"
# 3. 创建 config.yaml(如果不存在)
if [ ! -f "${CONFIG_DIR}/config.yaml" ]; then
if [ -f "${CONFIG_DIR}/config.yaml.example" ]; then
cp "${CONFIG_DIR}/config.yaml.example" "${CONFIG_DIR}/config.yaml"
warn "已创建默认配置: ${CONFIG_DIR}/config.yaml"
warn "请编辑配置文件,填入数据库连接信息后再启动服务!"
fi
fi
# 4. 安装 systemd 服务
local systemd_dir="/etc/systemd/system"
cp "$(dirname "$0")/${SYSTEMD_UNIT}" "${systemd_dir}/"
chmod 644 "${systemd_dir}/${SYSTEMD_UNIT}"
systemctl daemon-reload
info "systemd 服务已安装 ✓"
info ""
info "=== 后续步骤 ==="
info "1. 编辑配置: nano ${CONFIG_DIR}/config.yaml"
info "2. 检查连接: python3 ${INSTALL_DIR}/${APP_NAME}.py -c ${CONFIG_DIR}/config.yaml --dry-run"
info "3. 启动服务: systemctl start ${APP_NAME}"
info "4. 开机自启: systemctl enable ${APP_NAME}"
info "5. 查看日志: journalctl -u ${APP_NAME} -f"
info ""
info "安装完成 ✓"
}
# ---------------------------------------------------------------------------
# 卸载
# ---------------------------------------------------------------------------
do_uninstall() {
need_root "$@"
info "停止并禁用服务..."
systemctl stop "${APP_NAME}" 2>/dev/null || true
systemctl disable "${APP_NAME}" 2>/dev/null || true
info "删除 systemd unit..."
rm -f "/etc/systemd/system/${SYSTEMD_UNIT}"
systemctl daemon-reload
info "删除安装目录(确认不再需要)..."
read -rp "是否删除 ${INSTALL_DIR}${CONFIG_DIR}[y/N]: " confirm
if [[ "$confirm" =~ ^[Yy]$ ]]; then
rm -rf "${INSTALL_DIR}" "${CONFIG_DIR}" "${LOG_DIR}" "${DATA_DIR}" "${RUN_DIR}"
info "已删除所有文件 ✓"
else
warn "保留文件,手动清理: rm -rf ${INSTALL_DIR} ${CONFIG_DIR}"
fi
}
# ---------------------------------------------------------------------------
# 状态
# ---------------------------------------------------------------------------
do_status() {
if systemctl is-active --quiet "${APP_NAME}"; then
info "服务状态: 运行中 ✓"
systemctl status "${APP_NAME}" --no-pager
elif systemctl is-enabled --quiet "${APP_NAME}"; then
warn "服务状态: 未运行(已开机自启)"
else
warn "服务状态: 未安装或未启用"
fi
if [ -d "${CHECKPOINT_DIR}" ]; then
echo ""
info "断点文件:"
ls -la "${CHECKPOINT_DIR}" 2>/dev/null | grep -v "^total" || echo " (空)"
fi
if [ -d "${LOG_DIR}" ]; then
echo ""
info "日志文件:"
ls -lh "${LOG_DIR}" 2>/dev/null || echo " (空)"
fi
}
# ---------------------------------------------------------------------------
# 主入口
# ---------------------------------------------------------------------------
ACTION="${1:-install}"
case "$ACTION" in
install) do_install "$@" ;;
uninstall) do_uninstall "$@" ;;
status) do_status "$@" ;;
*) error "未知操作: $ACTION(支持: install | uninstall | status)" ;;
esac