提交 a9335f8f authored 作者: 陈泽健's avatar 陈泽健

feat(monitor): 添加邮件发送功能和依赖检查

- 添加邮件通知配置,支持QQ企业邮箱SMTP
- 实现依赖检查和自动安装mailx功能
- 添加系统包管理器检测(yum/apt)
- 实现邮件配置文件生成到/etc/mail.rc
- 创建send_report_mail函数发送监测报告
- 修改主流程集成邮件发送和依赖检查
- 更新需求文档说明邮件和钉钉发送功能
上级 5ea953f9
...@@ -13,8 +13,20 @@ MYSQL_USER="root" ...@@ -13,8 +13,20 @@ MYSQL_USER="root"
MYSQL_PASSWORD="dNrprU&2S" MYSQL_PASSWORD="dNrprU&2S"
LOG_FILE="./AutomatedServiceMonitoring.sh.log" LOG_FILE="./AutomatedServiceMonitoring.sh.log"
REPORT_DIR="./monitor_reports" REPORT_DIR="./monitor_reports"
WORD_REPORT_DIR="./monitor_reports_word"
HOST_NAME="$(hostname)" HOST_NAME="$(hostname)"
# 邮件通知配置
MAIL_TO="czj@huazhaochina.com,lph@huazhaochina.com,pgy@huazhaochina.com"
MAIL_SUBJECT_PREFIX="自动化服务监测报告"
# SMTP 服务器配置(QQ 企业邮箱)
MAIL_SMTP_HOST="smtp.exmail.qq.com"
MAIL_SMTP_PORT="465"
MAIL_SMTP_SSL_SCHEME="smtps" # s-m-t-p-s 协议
MAIL_SMTP_USER="czj@huazhaochina.com"
MAIL_SMTP_PASS="Ubains@123"
#################### 日志 #################### #################### 日志 ####################
log() { log() {
local level="$1"; shift local level="$1"; shift
...@@ -25,6 +37,120 @@ log() { ...@@ -25,6 +37,120 @@ log() {
echo "$msg" >>"$LOG_FILE" echo "$msg" >>"$LOG_FILE"
} }
#################### 依赖安装 ####################
detect_os_and_pkg_mgr() {
# 简单判断是基于 yum 还是 apt
if command -v yum >/dev/null 2>&1; then
echo "yum"
elif command -v apt-get >/dev/null 2>&1; then
echo "apt"
else
echo "unknown"
fi
}
ensure_mailx_installed() {
if command -v mail >/dev/null 2>&1 || command -v mailx >/dev/null 2>&1; then
log INFO "[依赖检查] mail/mailx 已安装"
return 0
fi
local pkg_mgr
pkg_mgr="$(detect_os_and_pkg_mgr)"
log INFO "[依赖安装] 检测到包管理器:${pkg_mgr}"
if [[ "$pkg_mgr" == "yum" ]]; then
log INFO "[依赖安装] 尝试使用 yum 安装 mailx"
yum install -y mailx >>"$LOG_FILE" 2>&1 || {
log ERROR "[依赖安装] 使用 yum 安装 mailx 失败,请手工检查。"
return 1
}
elif [[ "$pkg_mgr" == "apt" ]]; then
log INFO "[依赖安装] 尝试使用 apt-get 安装 mailutils"
apt-get update >>"$LOG_FILE" 2>&1 || true
apt-get install -y mailutils >>"$LOG_FILE" 2>&1 || {
log ERROR "[依赖安装] 使用 apt-get 安装 mailutils 失败,请手工检查。"
return 1
}
else
log ERROR "[依赖安装] 未识别到可用的包管理器(yum/apt-get),无法自动安装 mailx。"
return 1
fi
if command -v mail >/dev/null 2>&1 || command -v mailx >/dev/null 2>&1; then
log INFO "[依赖安装] mail/mailx 安装完成"
return 0
else
log ERROR "[依赖安装] mail/mailx 安装后仍不可用,请手工检查。"
return 1
fi
}
# ensure_pandoc_installed() {
# if command -v pandoc >/dev/null 2>&1; then
# log INFO "[依赖检查] pandoc 已安装"
# return 0
# fi
# local pkg_mgr
# pkg_mgr="$(detect_os_and_pkg_mgr)"
# log INFO "[依赖安装] 检测到包管理器:${pkg_mgr}"
# if [[ "$pkg_mgr" == "yum" ]]; then
# log INFO "[依赖安装] 使用 yum 安装 pandoc(需要 epel 源)"
# yum install -y epel-release >>"$LOG_FILE" 2>&1 || true
# yum install -y pandoc >>"$LOG_FILE" 2>&1 || {
# log ERROR "[依赖安装] 使用 yum 安装 pandoc 失败,请手工检查。"
# return 1
# }
# elif [[ "$pkg_mgr" == "apt" ]]; then
# log INFO "[依赖安装] 使用 apt-get 安装 pandoc"
# apt-get update >>"$LOG_FILE" 2>&1 || true
# apt-get install -y pandoc >>"$LOG_FILE" 2>&1 || {
# log ERROR "[依赖安装] 使用 apt-get 安装 pandoc 失败,请手工检查。"
# return 1
# }
# else
# log ERROR "[依赖安装] 未识别到可用的包管理器(yum/apt-get),无法自动安装 pandoc。"
# return 1
# fi
# if command -v pandoc >/dev/null 2>&1; then
# log INFO "[依赖安装] pandoc 安装完成"
# return 0
# else
# log ERROR "[依赖安装] pandoc 安装后仍不可用,请手工检查。"
# return 1
# fi
# }
ensure_mailx_smtp_config() {
local cfg_file="/etc/mail.rc"
# 如果已经存在,并且里面已经包含 smtp.exmail.qq.com,可以选择跳过
if [[ -f "$cfg_file" ]] && grep -q "smtp.exmail.qq.com" "$cfg_file" 2>/dev/null; then
log INFO "[邮件配置] 检测到已有 /etc/mail.rc 且包含 smtp.exmail.qq.com,跳过覆盖。"
return 0
fi
log INFO "[邮件配置] 生成 /etc/mail.rc(使用 QQ 企业邮箱 SMTP)"
cat >"$cfg_file" <<EOF
set from="${MAIL_SMTP_USER}"
set smtp="${MAIL_SMTP_SSL_SCHEME}://${MAIL_SMTP_HOST}:${MAIL_SMTP_PORT}"
set smtp-auth=login
set smtp-auth-user="${MAIL_SMTP_USER}"
set smtp-auth-password="${MAIL_SMTP_PASS}"
set ssl-verify=ignore
EOF
# 可选:同步一份到 /etc/nail.rc
cp "$cfg_file" /etc/nail.rc 2>/dev/null || true
log INFO "[邮件配置] /etc/mail.rc 已生成:smtp=${MAIL_SMTP_HOST}:${MAIL_SMTP_PORT} user=${MAIL_SMTP_USER}"
return 0
}
#################### 1. 平台识别 #################### #################### 1. 平台识别 ####################
detect_platform() { detect_platform() {
if [ -d "/data/services" ]; then if [ -d "/data/services" ]; then
...@@ -408,6 +534,53 @@ collect_container_info() { ...@@ -408,6 +534,53 @@ collect_container_info() {
log INFO "[容器检测] 已采集容器信息:running=$(echo \"$CONTAINER_RUNNING_LIST\" | wc -l) 行,exited=$(echo \"$CONTAINER_EXITED_LIST\" | wc -l) 行" log INFO "[容器检测] 已采集容器信息:running=$(echo \"$CONTAINER_RUNNING_LIST\" | wc -l) 行,exited=$(echo \"$CONTAINER_EXITED_LIST\" | wc -l) 行"
} }
#################### 6. 邮件发送 ####################
# 尝试发送邮件,把生成的 MD 报告作为正文发送
send_report_mail() {
local report_file="$1"
if [[ ! -f "$report_file" ]]; then
log ERROR "[邮件发送] 报告文件不存在:${report_file}"
return 1
fi
local subject="${MAIL_SUBJECT_PREFIX} - ${HOST_NAME} - $(date '+%Y-%m-%d %H:%M:%S')"
# 优先使用 mail/mailx,如果没有则尝试 sendmail
if command -v mail >/dev/null 2>&1; then
# mail 命令:正文使用报告内容
log INFO "[邮件发送] 使用 mail 命令发送报告给 ${MAIL_TO}"
mail -s "${subject}" "${MAIL_TO}" < "${report_file}" 2>>"$LOG_FILE" || {
log ERROR "[邮件发送] mail 命令发送失败"
return 1
}
elif command -v mailx >/dev/null 2>&1; then
log INFO "[邮件发送] 使用 mailx 命令发送报告给 ${MAIL_TO}"
mailx -s "${subject}" "${MAIL_TO}" < "${report_file}" 2>>"$LOG_FILE" || {
log ERROR "[邮件发送] mailx 命令发送失败"
return 1
}
elif command -v sendmail >/dev/null 2>&1; then
log INFO "[邮件发送] 使用 sendmail 发送报告给 ${MAIL_TO}"
{
echo "To: ${MAIL_TO}"
echo "Subject: ${subject}"
echo "Content-Type: text/markdown; charset=utf-8"
echo
cat "${report_file}"
} | sendmail -t 2>>"$LOG_FILE" || {
log ERROR "[邮件发送] sendmail 发送失败"
return 1
}
else
log ERROR "[邮件发送] 本机未找到 mail/mailx/sendmail 命令,无法发送邮件,请先安装邮件客户端。"
return 1
fi
log INFO "[邮件发送] 报告邮件已发送:${report_file} -> ${MAIL_TO}"
return 0
}
#################### 5. 报告输出(md) #################### #################### 5. 报告输出(md) ####################
write_md_report() { write_md_report() {
mkdir -p "$REPORT_DIR" 2>/dev/null || true mkdir -p "$REPORT_DIR" 2>/dev/null || true
...@@ -525,13 +698,19 @@ write_md_report() { ...@@ -525,13 +698,19 @@ write_md_report() {
echo echo
} > "$report_file" } > "$report_file"
log INFO "[报告输出] 已生成监测报告:${report_file}" # 将报告文件路径打印到 stdout,便于调用方获取
echo "$report_file"
} }
#################### 主流程:单次执行 #################### #################### 主流程:单次执行 ####################
main_run_once() { main_run_once() {
log INFO "[启动] 自动化服务监测 Shell 脚本(单次执行模式),目标服务器(本机)=${HOST_NAME}" log INFO "[启动] 自动化服务监测 Shell 脚本(单次执行模式),目标服务器(本机)=${HOST_NAME}"
# 0. 环境准备:安装依赖 + 生成邮件配置
ensure_mailx_installed || log ERROR "[启动] mailx 安装失败,后续邮件发送可能不可用。"
# ensure_pandoc_installed || log ERROR "[启动] pandoc 安装失败,将只生成 Markdown 报告。"
ensure_mailx_smtp_config || log ERROR "[启动] mailx SMTP 配置生成失败,后续邮件发送可能不可用。"
detect_platform detect_platform
detect_systems detect_systems
...@@ -557,12 +736,19 @@ main_run_once() { ...@@ -557,12 +736,19 @@ main_run_once() {
monitor_mem_once monitor_mem_once
monitor_mysql_once monitor_mysql_once
# 新增:容器信息检测 # (如已经实现)容器信息检测
collect_container_info collect_container_info
write_md_report # 生成报告,并获取报告文件路径
local report_file
report_file="$(write_md_report)"
# 根据第 6 点需求:发送邮件通知
send_report_mail "$report_file" || {
log ERROR "[主流程] 报告已生成,但邮件发送失败,请检查日志和邮件客户端配置。"
}
log INFO "[结束] 本次监测已完成,报告已生成。" log INFO "[结束] 本次监测已完成,报告已生成并尝试发送邮件。"
} }
#################### 脚本入口 #################### #################### 脚本入口 ####################
......
...@@ -63,9 +63,12 @@ ...@@ -63,9 +63,12 @@
##### 4、监测日志审计(✅ 已实现): ##### 4、监测日志审计(✅ 已实现):
需要丰富日志体系,日志需要用中文打印 需要丰富日志体系,日志需要用中文打印
##### 5、监测报告输出(✅ 已实现): ##### 5、监测报告输出(✅ 已实现):
将本次监测的所有检测项信息输出成md文件报告,内容排版需要优美。 1、将本次监测的所有检测项信息输出成markdown格式报告,内容排版需要优美,markdown格式报告发送于钉钉。
2、将本次监测的所有检测项信息输出成word格式报告,内容排版优美,word格式报告发送于邮件。
##### 6、对接邮件发送:
需要能实现将当前的监测后输出的md文件报告,以邮件的形式发送给czj@huazhaochina.com
##### 5、对接邮件发送: ##### 7、对接钉钉发送:
需要能实现将当前的监测后输出的md文件报告,以邮件的形式发送给czj@huazhaochina.com
\ No newline at end of file \ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论