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

feat(service-monitor): P2级检测模块移植-系统类型识别/平台服务检测/配置IP检测/Console配置检测

新增 4 个检测模块(阶段三):
- 50_system_profile.sh:系统类型识别(平台/容器/ujava变体)
- 51_service_check.sh:平台服务检测(服务进程+端口监听)
- 52_config_ip_check.sh:配置IP检测(未授权IP扫描)
- 53_config_console_check.sh:Console配置检测(只检测不修复)

配套更新:
- check_modules.py 追加 4 个模块注册
- display_names.py 追加 35 个 KEY 映射
- parser.py 追加 2 个状态词映射
- config.sh.template 追加服务匹配模式+端口列表配置

文档:PRD_需求文档_P2级移植.md + PRD_计划执行_P2级移植.md + HANDOFF更新
Co-Authored-By: 's avatarClaude <noreply@anthropic.com>
上级 5400a91f
此差异已折叠。
......@@ -117,3 +117,30 @@ resolve_container() {
[ -z "$pattern" ] && return 1
docker ps --format '{{.Names}}' 2>/dev/null | grep -iE "$pattern" | head -1
}
# ==================== 平台服务检测配置 ====================
# 格式: key:pattern,key:pattern(51_service_check.sh 使用)
# ujava 服务匹配模式(新平台容器内)
UJAVA_SERVICES="${UJAVA_SERVICES:-auth:ubains-auth.jar,gateway:ubains-gateway.jar,system:ubains-modules-system.jar,meeting:ubains-meeting-inner-api-1.0-SNAPSHOT.jar,mqtt:ubains-meeting-mqtt-1.0-SNAPSHOT.jar,quartz:ubains-meeting-quartz-1.0-SNAPSHOT.jar,message:ubains-meeting-message-scheduling-1.0-SNAPSHOT.jar}"
# ujava 宿主机服务(新平台)
UJAVA_HOST_SERVICES="${UJAVA_HOST_SERVICES:-extapi:ubains-meeting-api-1.0-SNAPSHOT.jar}"
# 传统平台 ujava 容器服务
UJAVA_OLD_CONTAINER_SERVICES="${UJAVA_OLD_CONTAINER_SERVICES:-nginx:nginx: master process,meeting:ubains-meeting-inner-api-1.0-SNAPSHOT.jar}"
# 传统平台 ujava 宿主机服务
UJAVA_OLD_HOST_SERVICES="${UJAVA_OLD_HOST_SERVICES:-extapi:ubains-meeting-api-1.0-SNAPSHOT.jar}"
# upython 端口列表(新平台,格式: port:process,port:process)
UPYTHON_PORTS_NEW="${UPYTHON_PORTS_NEW:-8000:uwsgi,11211:memcached}"
# upython_voice 端口列表(新平台)
UPYTHON_VOICE_PORTS_NEW="${UPYTHON_VOICE_PORTS_NEW:-8000:uwsgi,11211:memcached,8080:nginx,1883:mosquitto,9001:mosquitto}"
# upython 端口列表(传统平台)
UPYTHON_PORTS_OLD="${UPYTHON_PORTS_OLD:-8000:uwsgi,11211:memcached,8081:nginx,8443:nginx,8002:httpd}"
# ==================== 配置IP检测配置 ====================
# 服务器IP(运行时注入,用于IP允许列表)
SERVER_IP="${SERVER_IP:-}"
#!/bin/bash
################################################################################
# 51_service_check.sh — 平台服务检测
# 功能: 检测核心业务服务进程状态(auth/gateway/system/meeting/mqtt/quartz/message/extapi)
# + upython/upython_voice 容器端口监听
# 参考: ServiceCheck.psm1, check_server_health.sh
# 日期: 2026-07-22
# 说明: 服务进程检测优先用 ps grep 匹配 jar 文件名;端口检测用进程检查代替 ss
# (避免容器内无 ss/netstat 导致误判,详见 HANDOFF 坑 9)
################################################################################
# 获取脚本所在目录并加载依赖
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="${LIB_DIR:-/tmp/check_modules}"
# 加载配置文件和通用函数库
if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/lib/config.sh"
else
echo "ERROR: 配置文件不存在: $LIB_DIR/lib/config.sh"
exit 1
fi
if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/lib/common.sh"
else
echo "ERROR: 通用函数库不存在: $LIB_DIR/lib/common.sh"
exit 1
fi
# 服务匹配模式(从 config.sh 读取或使用默认值,格式: key:pattern,key:pattern)
UJAVA_SERVICES="${UJAVA_SERVICES:-auth:ubains-auth.jar,gateway:ubains-gateway.jar,system:ubains-modules-system.jar,meeting:ubains-meeting-inner-api-1.0-SNAPSHOT.jar,mqtt:ubains-meeting-mqtt-1.0-SNAPSHOT.jar,quartz:ubains-meeting-quartz-1.0-SNAPSHOT.jar,message:ubains-meeting-message-scheduling-1.0-SNAPSHOT.jar}"
UJAVA_HOST_SERVICES="${UJAVA_HOST_SERVICES:-extapi:ubains-meeting-api-1.0-SNAPSHOT.jar}"
UJAVA_OLD_CONTAINER_SERVICES="${UJAVA_OLD_CONTAINER_SERVICES:-nginx:nginx: master process,meeting:ubains-meeting-inner-api-1.0-SNAPSHOT.jar}"
UJAVA_OLD_HOST_SERVICES="${UJAVA_OLD_HOST_SERVICES:-extapi:ubains-meeting-api-1.0-SNAPSHOT.jar}"
# 端口列表(格式: port:process,port:process)
UPYTHON_PORTS_NEW="${UPYTHON_PORTS_NEW:-8000:uwsgi,11211:memcached}"
UPYTHON_VOICE_PORTS_NEW="${UPYTHON_VOICE_PORTS_NEW:-8000:uwsgi,11211:memcached,8080:nginx,1883:mosquitto,9001:mosquitto}"
UPYTHON_PORTS_OLD="${UPYTHON_PORTS_OLD:-8000:uwsgi,11211:memcached,8081:nginx,8443:nginx,8002:httpd}"
# 将服务名转为大写用于 KEY(兼容 bash 3.x macOS / bash 4+ 都用 tr)
to_upper() {
echo "$1" | tr '[:lower:]' '[:upper:]'
}
# ==================== 平台/容器类型识别(内部实现,不依赖 50 模块) ====================
detect_platform_type() {
[ -d "/data/services" ] && echo "new" || echo "old"
}
detect_container_type() {
local containers
containers=$(docker ps --format '{{.Names}}' 2>/dev/null)
if echo "$containers" | grep -qE '^ujava[0-9]*$'; then
echo "ujava"
elif echo "$containers" | grep -qE '^upython_voice[0-9]*$'; then
echo "upython_voice"
elif echo "$containers" | grep -qE '^upython[0-9]*$'; then
echo "upython"
else
echo "unknown"
fi
}
# ==================== 服务进程检测 ====================
# 检测容器内服务进程
# 参数: container pattern key_prefix
check_service_in_container() {
local container="$1"
local pattern="$2"
local key_prefix="$3"
if [ -z "$container" ]; then
output_result "${key_prefix}_STATUS" "未检测到容器"
output_result "${key_prefix}_STATUS_LEVEL" "跳过"
return
fi
local count
count=$(docker exec "$container" ps aux 2>/dev/null | grep -F "$pattern" | grep -v grep | wc -l)
if [ "$count" -gt 0 ]; then
output_result "${key_prefix}_STATUS" "运行中"
output_result "${key_prefix}_STATUS_LEVEL" "正常"
else
output_result "${key_prefix}_STATUS" "未运行"
output_result "${key_prefix}_STATUS_LEVEL" "严重"
fi
}
# 检测宿主机服务进程
# 参数: pattern key_prefix [path_hint]
check_service_on_host() {
local pattern="$1"
local key_prefix="$2"
local path_hint="$3"
local count
if [ -n "$path_hint" ]; then
count=$(ps aux 2>/dev/null | grep -F "$pattern" | grep -F "$path_hint" | grep -v grep | wc -l)
else
count=$(ps aux 2>/dev/null | grep -F "$pattern" | grep -v grep | wc -l)
fi
if [ "$count" -gt 0 ]; then
output_result "${key_prefix}_STATUS" "运行中"
output_result "${key_prefix}_STATUS_LEVEL" "正常"
else
output_result "${key_prefix}_STATUS" "未运行"
output_result "${key_prefix}_STATUS_LEVEL" "严重"
fi
}
# ==================== 端口监听检测(用进程检查代替 ss) ====================
# 检测容器内端口对应的进程
# 参数: container port process
check_port_in_container() {
local container="$1"
local port="$2"
local process="$3"
local key_prefix="SVC_CHECK_PORT_${port}"
if [ -z "$container" ]; then
output_result "${key_prefix}_STATUS" "未检测到容器"
output_result "${key_prefix}_STATUS_LEVEL" "跳过"
return
fi
local count
count=$(docker exec "$container" ps aux 2>/dev/null | grep "$process" | grep -v grep | wc -l)
if [ "$count" -gt 0 ]; then
output_result "${key_prefix}_STATUS" "监听"
output_result "${key_prefix}_STATUS_LEVEL" "正常"
else
output_result "${key_prefix}_STATUS" "未监听"
output_result "${key_prefix}_STATUS_LEVEL" "严重"
fi
}
# ==================== 服务列表遍历辅助 ====================
# 遍历 "key:pattern,key:pattern" 字符串,对每个服务在容器内检测
# 参数: services_str container key_suffix
check_services_in_container_list() {
local services_str="$1"
local container="$2"
local key_suffix="$3"
local IFS_save="$IFS"
IFS=','
local services=($services_str)
IFS="$IFS_save"
for svc in "${services[@]}"; do
[ -z "$svc" ] && continue
local key pattern
key="${svc%%:*}"
pattern="${svc#*:}"
[ -z "$key" ] || [ -z "$pattern" ] && continue
check_service_in_container "$container" "$pattern" "SVC_CHECK_$(to_upper "$key")${key_suffix}"
done
}
# 遍历 "key:pattern,..." 字符串,对每个服务在宿主机检测
# 参数: services_str key_suffix [path_hint]
check_services_on_host_list() {
local services_str="$1"
local key_suffix="$2"
local path_hint="$3"
local IFS_save="$IFS"
IFS=','
local services=($services_str)
IFS="$IFS_save"
for svc in "${services[@]}"; do
[ -z "$svc" ] && continue
local key pattern
key="${svc%%:*}"
pattern="${svc#*:}"
[ -z "$key" ] || [ -z "$pattern" ] && continue
if [ -n "$path_hint" ]; then
check_service_on_host "$pattern" "SVC_CHECK_$(to_upper "$key")${key_suffix}" "$path_hint"
else
check_service_on_host "$pattern" "SVC_CHECK_$(to_upper "$key")${key_suffix}"
fi
done
}
# 遍历 "port:process,..." 字符串,对每个端口在容器内检测
# 参数: ports_str container
check_ports_in_container_list() {
local ports_str="$1"
local container="$2"
local IFS_save="$IFS"
IFS=','
local ports=($ports_str)
IFS="$IFS_save"
for pp in "${ports[@]}"; do
[ -z "$pp" ] && continue
local port process
port="${pp%%:*}"
process="${pp#*:}"
[ -z "$port" ] || [ -z "$process" ] && continue
check_port_in_container "$container" "$port" "$process"
done
}
# ==================== 主检测流程 ====================
main() {
log_info "开始平台服务检测..."
set +e
local platform_type container_type
platform_type=$(detect_platform_type)
container_type=$(detect_container_type)
# 获取容器名
local ujava_container upython_container
ujava_container=$(docker ps --format '{{.Names}}' 2>/dev/null | grep -E '^ujava[0-9]*$' | head -1)
upython_container=$(docker ps --format '{{.Names}}' 2>/dev/null | grep -E '^upython' | head -1)
if [ "$platform_type" = "new" ]; then
# 新平台:ujava 容器内服务
if [ "$container_type" = "ujava" ]; then
check_services_in_container_list "$UJAVA_SERVICES" "$ujava_container" ""
fi
# 新平台:宿主机 extapi
check_services_on_host_list "$UJAVA_HOST_SERVICES" ""
# 新平台:upython/upython_voice 端口
if [ "$container_type" = "upython" ]; then
check_ports_in_container_list "$UPYTHON_PORTS_NEW" "$upython_container"
elif [ "$container_type" = "upython_voice" ]; then
check_ports_in_container_list "$UPYTHON_VOICE_PORTS_NEW" "$upython_container"
fi
else
# 传统平台:ujava 容器内服务(nginx + meeting)
if [ "$container_type" = "ujava" ]; then
check_services_in_container_list "$UJAVA_OLD_CONTAINER_SERVICES" "$ujava_container" "_OLD"
fi
# 传统平台:宿主机 extapi(匹配路径)
check_services_on_host_list "$UJAVA_OLD_HOST_SERVICES" "_OLD" "/var/www/java/external-meeting-api"
# 传统平台:upython 端口
if [ "$container_type" = "upython" ] || [ "$container_type" = "upython_voice" ]; then
check_ports_in_container_list "$UPYTHON_PORTS_OLD" "$upython_container"
fi
fi
log_info "平台服务检测完成"
}
main
#!/bin/bash
################################################################################
# 50_system_profile.sh — 系统类型识别
# 功能: 检测平台类型(新/旧)、容器类型(ujava/upython/upython_voice)、ujava变体
# 参考: ServerProfile.psm1(PowerShell 移植)
# 日期: 2026-07-22
################################################################################
# 获取脚本所在目录并加载依赖
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="${LIB_DIR:-/tmp/check_modules}"
# 加载配置文件和通用函数库
if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/lib/config.sh"
else
echo "ERROR: 配置文件不存在: $LIB_DIR/lib/config.sh"
exit 1
fi
if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/lib/common.sh"
else
echo "ERROR: 通用函数库不存在: $LIB_DIR/lib/common.sh"
exit 1
fi
# ==================== 平台类型检测 ====================
detect_platform_type() {
# 新统一平台:存在 /data/services 目录
if [ -d "/data/services" ]; then
output_result "SYS_PROFILE_PLATFORM_TYPE" "new"
else
output_result "SYS_PROFILE_PLATFORM_TYPE" "old"
fi
output_result "SYS_PROFILE_PLATFORM_TYPE_LEVEL" "正常"
}
# ==================== 容器类型检测 ====================
detect_container_type() {
local containers
containers=$(docker ps --format '{{.Names}}' 2>/dev/null)
# 注意匹配顺序:upython_voice 须在 upython 之前,否则 upython 会先匹配
if echo "$containers" | grep -qE '^ujava[0-9]*$'; then
output_result "SYS_PROFILE_CONTAINER_TYPE" "ujava"
elif echo "$containers" | grep -qE '^upython_voice[0-9]*$'; then
output_result "SYS_PROFILE_CONTAINER_TYPE" "upython_voice"
elif echo "$containers" | grep -qE '^upython[0-9]*$'; then
output_result "SYS_PROFILE_CONTAINER_TYPE" "upython"
else
output_result "SYS_PROFILE_CONTAINER_TYPE" "unknown"
fi
output_result "SYS_PROFILE_CONTAINER_TYPE_LEVEL" "正常"
}
# ==================== ujava 变体检测 ====================
detect_ujava_variant() {
# 仅 ujava 容器有效:通过目录区分 unified / meeting
local ujava_container
ujava_container=$(docker ps --format '{{.Names}}' 2>/dev/null | grep -E '^ujava[0-9]*$' | head -1)
if [ -n "$ujava_container" ]; then
if [ -d "/var/www/java/unifiedPlatform" ]; then
output_result "SYS_PROFILE_UJAVA_VARIANT" "unified"
else
output_result "SYS_PROFILE_UJAVA_VARIANT" "meeting"
fi
else
output_result "SYS_PROFILE_UJAVA_VARIANT" "none"
fi
output_result "SYS_PROFILE_UJAVA_VARIANT_LEVEL" "正常"
}
# ==================== 主检测流程 ====================
main() {
log_info "开始系统类型识别..."
set +e
detect_platform_type 2>/dev/null || true
detect_container_type 2>/dev/null || true
detect_ujava_variant 2>/dev/null || true
log_info "系统类型识别完成"
}
main
#!/bin/bash
################################################################################
# 52_config_ip_check.sh — 配置IP检测
# 功能: 扫描配置文件中的未授权 IP 地址
# 参考: ConfigIPCheck.psm1, config_check.sh
# 日期: 2026-07-22
# 说明: 遍历平台配置目录,提取 IP 与允许列表对比,输出未授权 IP 明细
# 允许列表 = 服务器IP + 127.0.0.1 + 172.17.0.1
################################################################################
# 获取脚本所在目录并加载依赖
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="${LIB_DIR:-/tmp/check_modules}"
# 加载配置文件和通用函数库
if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/lib/config.sh"
else
echo "ERROR: 配置文件不存在: $LIB_DIR/lib/config.sh"
exit 1
fi
if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/lib/common.sh"
else
echo "ERROR: 通用函数库不存在: $LIB_DIR/lib/common.sh"
exit 1
fi
# IP 正则
IP_REGEX='([0-9]{1,3}\.){3}[0-9]{1,3}'
# 允许列表(SERVER_IP 从 config.sh 注入,默认为空)
ALLOWED_IPS="${SERVER_IP} 127.0.0.1 172.17.0.1"
# ==================== 配置目录定义 ====================
# 新平台配置目录
NEW_PLATFORM_CONFIG_DIRS=(
"/data/services/api/auth/auth-sso-auth/config"
"/data/services/api/auth/auth-sso-gateway/config"
"/data/services/api/auth/auth-sso-system/config"
"/data/services/api/java-meeting/java-meeting2.0/config"
"/data/services/api/java-meeting/java-meeting-extapi/config"
"/data/services/api/java-meeting/java-message-scheduling/config"
"/data/services/api/java-meeting/java-mqtt/config"
"/data/services/api/java-meeting/java-quartz/config"
"/data/services/api/python-cmdb"
"/data/services/web/pc/pc-vue2-ai/static"
"/data/services/web/mobile/mobile-vue2/static"
"/data/middleware/nginx/config"
)
# 传统平台配置目录
OLD_PLATFORM_CONFIG_DIRS=(
"/var/www/java/api-java-meeting2.0/config"
"/var/www/java/external-meeting-api/config"
"/var/www/java/ubains-web-2.0/static"
"/var/www/java/ubains-web-admin/static"
"/var/www/java/ubains-web-h5/static/h5"
"/var/www/java/nginx-conf.d"
)
# ==================== 平台类型识别 ====================
detect_platform_type() {
[ -d "/data/services" ] && echo "new" || echo "old"
}
# ==================== IP 扫描 ====================
scan_config_ips() {
local platform_type="$1"
local -a config_dirs
if [ "$platform_type" = "new" ]; then
config_dirs=("${NEW_PLATFORM_CONFIG_DIRS[@]}")
else
config_dirs=("${OLD_PLATFORM_CONFIG_DIRS[@]}")
fi
local total_files=0
local unauthorized_count=0
local unauthorized_lines=""
for dir in "${config_dirs[@]}"; do
if [ ! -d "$dir" ]; then
continue
fi
while IFS= read -r file; do
[ -z "$file" ] && continue
[ ! -r "$file" ] && continue
total_files=$((total_files + 1))
local line_num=0
while IFS= read -r line; do
line_num=$((line_num + 1))
# 提取行中的 IP
local ips
ips=$(echo "$line" | grep -oE "$IP_REGEX" 2>/dev/null)
for ip in $ips; do
# 检查是否在允许列表
if ! echo " $ALLOWED_IPS " | grep -qF " $ip "; then
unauthorized_count=$((unauthorized_count + 1))
# 转义文件路径中的特殊字符
local escaped_file
escaped_file=$(echo "$file" | sed 's/"/\\"/g')
if [ -n "$unauthorized_lines" ]; then
unauthorized_lines="${unauthorized_lines},"
fi
unauthorized_lines="${unauthorized_lines}{\"file\":\"${escaped_file}\",\"line\":${line_num},\"ip\":\"${ip}\"}"
fi
done
done < "$file"
done < <(find "$dir" -type f \( -name "*.yml" -o -name "*.properties" -o -name "config.js" -o -name "config.json" -o -name "*.conf" \) 2>/dev/null)
done
# 输出结果
if [ "$unauthorized_count" -eq 0 ]; then
output_result "CFG_IP_STATUS" "OK"
output_result "CFG_IP_STATUS_LEVEL" "正常"
else
output_result "CFG_IP_STATUS" "WARN"
output_result "CFG_IP_STATUS_LEVEL" "警告"
fi
output_result "CFG_IP_TOTAL_FILES" "$total_files"
output_result "CFG_IP_UNAUTHORIZED_COUNT" "$unauthorized_count"
# JSON 数组输出
if [ -n "$unauthorized_lines" ]; then
output_result "CFG_IP_UNAUTHORIZED_LINES" "[${unauthorized_lines}]"
else
output_result "CFG_IP_UNAUTHORIZED_LINES" "[]"
fi
}
# ==================== 主检测流程 ====================
main() {
log_info "开始配置IP检测..."
set +e
local platform_type
platform_type=$(detect_platform_type)
scan_config_ips "$platform_type"
log_info "配置IP检测完成"
}
main
#!/bin/bash
################################################################################
# 53_config_console_check.sh — Console配置检测
# 功能: 检测 console=true 配置项未关闭问题(只检测不修复)
# 参考: check_server_health.sh (第1582-1708行)
# 日期: 2026-07-22
# 说明: 扫描配置文件中 console[:=]true 的行,发现则标记为异常
# 不执行备份和 sed 替换,由人工确认后修复
################################################################################
# 获取脚本所在目录并加载依赖
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
LIB_DIR="${LIB_DIR:-/tmp/check_modules}"
# 加载配置文件和通用函数库
if [ -f "$LIB_DIR/lib/config.sh" ]; then
source "$LIB_DIR/lib/config.sh"
else
echo "ERROR: 配置文件不存在: $LIB_DIR/lib/config.sh"
exit 1
fi
if [ -f "$LIB_DIR/lib/common.sh" ]; then
source "$LIB_DIR/lib/common.sh"
else
echo "ERROR: 通用函数库不存在: $LIB_DIR/lib/common.sh"
exit 1
fi
# console 正则(不区分大小写,匹配 console=true 或 console: true)
CONSOLE_REGEX='console[[:space:]]*[:=][[:space:]]*true'
# ==================== 配置目录定义 ====================
# 新平台配置目录
NEW_PLATFORM_CONFIG_DIRS=(
"/data/services/api/auth/auth-sso-auth/config"
"/data/services/api/auth/auth-sso-gateway/config"
"/data/services/api/auth/auth-sso-system/config"
"/data/services/api/java-meeting/java-meeting2.0/config"
"/data/services/api/java-meeting/java-meeting-extapi/config"
"/data/services/api/java-meeting/java-message-scheduling/config"
"/data/services/api/java-meeting/java-mqtt/config"
"/data/services/api/java-meeting/java-quartz/config"
"/data/services/api/python-cmdb"
"/data/services/web/pc/pc-vue2-ai/static"
"/data/services/web/mobile/mobile-vue2/static"
"/data/middleware/nginx/config"
)
# 传统平台配置目录
OLD_PLATFORM_CONFIG_DIRS=(
"/var/www/java/api-java-meeting2.0/config"
"/var/www/java/external-meeting-api/config"
"/var/www/java/ubains-web-2.0/static"
"/var/www/java/ubains-web-admin/static"
"/var/www/java/ubains-web-h5/static/h5"
"/var/www/java/nginx-conf.d"
)
# ==================== 平台类型识别 ====================
detect_platform_type() {
[ -d "/data/services" ] && echo "new" || echo "old"
}
# ==================== Console 配置扫描 ====================
scan_console_config() {
local platform_type="$1"
local -a config_dirs
if [ "$platform_type" = "new" ]; then
config_dirs=("${NEW_PLATFORM_CONFIG_DIRS[@]}")
else
config_dirs=("${OLD_PLATFORM_CONFIG_DIRS[@]}")
fi
local total_files=0
local found_count=0
local found_files=""
for dir in "${config_dirs[@]}"; do
if [ ! -d "$dir" ]; then
continue
fi
while IFS= read -r file; do
[ -z "$file" ] && continue
[ ! -r "$file" ] && continue
total_files=$((total_files + 1))
if grep -qiE "$CONSOLE_REGEX" "$file" 2>/dev/null; then
found_count=$((found_count + 1))
# 转义文件路径中的特殊字符
local escaped_file
escaped_file=$(echo "$file" | sed 's/"/\\"/g')
if [ -n "$found_files" ]; then
found_files="${found_files},"
fi
found_files="${found_files}\"${escaped_file}\""
fi
done < <(find "$dir" -type f \( -name "*.yml" -o -name "*.properties" -o -name "config.js" -o -name "config.json" \) 2>/dev/null)
done
# 输出结果
if [ "$found_count" -eq 0 ]; then
output_result "CFG_CONSOLE_STATUS" "OK"
output_result "CFG_CONSOLE_STATUS_LEVEL" "正常"
else
output_result "CFG_CONSOLE_STATUS" "WARN"
output_result "CFG_CONSOLE_STATUS_LEVEL" "警告"
fi
output_result "CFG_CONSOLE_TOTAL_FILES" "$total_files"
output_result "CFG_CONSOLE_FOUND_COUNT" "$found_count"
# JSON 数组输出
if [ -n "$found_files" ]; then
output_result "CFG_CONSOLE_FOUND_FILES" "[${found_files}]"
else
output_result "CFG_CONSOLE_FOUND_FILES" "[]"
fi
}
# ==================== 主检测流程 ====================
main() {
log_info "开始Console配置检测..."
set +e
local platform_type
platform_type=$(detect_platform_type)
scan_console_config "$platform_type"
log_info "Console配置检测完成"
}
main
......@@ -81,6 +81,12 @@ ALL_MODULES: List[CheckModule] = [
{SUITE_FULL}, "45_time_sync.sh"),
CheckModule("46_security_deep", "安全合规深度检测", "system",
{SUITE_FULL}, "46_security_deep.sh"),
CheckModule("50_system_profile", "系统类型识别", "system",
{SUITE_FULL}, "50_system_profile.sh"),
CheckModule("52_config_ip_check", "配置IP检测", "system",
{SUITE_FULL}, "52_config_ip_check.sh"),
CheckModule("53_config_console_check", "Console配置检测", "system",
{SUITE_FULL}, "53_config_console_check.sh"),
# ---- service 类 ----
CheckModule("20_docker_basic", "Docker基础", "service",
{SUITE_QUICK, SUITE_FULL}, "20_docker_basic.sh"),
......@@ -118,6 +124,8 @@ ALL_MODULES: List[CheckModule] = [
{SUITE_FULL}, "38_utracker_check.sh"),
CheckModule("39_middleware_conn", "中间件连接检测", "service",
{SUITE_FULL}, "39_middleware_conn.sh"),
CheckModule("51_service_check", "平台服务检测", "service",
{SUITE_FULL}, "51_service_check.sh"),
]
_BY_ID: Dict[str, CheckModule] = {m.id: m for m in ALL_MODULES}
......
......@@ -701,4 +701,60 @@ DISPLAY_NAMES: Dict[str, str] = {
"PROCESSES_python": "Python进程数",
"PROCESSES_ustorage": "UStorage进程数",
"PROCESSES_utracker": "UTracker进程数",
# ---- 50 系统类型识别 ----
"SYS_PROFILE_PLATFORM_TYPE": "平台类型",
"SYS_PROFILE_PLATFORM_TYPE_LEVEL": "平台类型状态等级",
"SYS_PROFILE_CONTAINER_TYPE": "容器类型",
"SYS_PROFILE_CONTAINER_TYPE_LEVEL": "容器类型状态等级",
"SYS_PROFILE_UJAVA_VARIANT": "ujava变体",
"SYS_PROFILE_UJAVA_VARIANT_LEVEL": "ujava变体状态等级",
# ---- 51 平台服务检测 ----
"SVC_CHECK_AUTH_STATUS": "认证服务状态",
"SVC_CHECK_AUTH_STATUS_LEVEL": "认证服务状态等级",
"SVC_CHECK_GATEWAY_STATUS": "网关服务状态",
"SVC_CHECK_GATEWAY_STATUS_LEVEL": "网关服务状态等级",
"SVC_CHECK_SYSTEM_STATUS": "系统服务状态",
"SVC_CHECK_SYSTEM_STATUS_LEVEL": "系统服务状态等级",
"SVC_CHECK_MEETING_STATUS": "会议服务状态",
"SVC_CHECK_MEETING_STATUS_LEVEL": "会议服务状态等级",
"SVC_CHECK_MQTT_STATUS": "MQTT服务状态",
"SVC_CHECK_MQTT_STATUS_LEVEL": "MQTT服务状态等级",
"SVC_CHECK_QUARTZ_STATUS": "定时任务服务状态",
"SVC_CHECK_QUARTZ_STATUS_LEVEL": "定时任务服务状态等级",
"SVC_CHECK_MESSAGE_STATUS": "消息调度服务状态",
"SVC_CHECK_MESSAGE_STATUS_LEVEL": "消息调度服务状态等级",
"SVC_CHECK_EXTAPI_STATUS": "对外API服务状态",
"SVC_CHECK_EXTAPI_STATUS_LEVEL": "对外API服务状态等级",
# 传统平台服务
"SVC_CHECK_NGINX_OLD_STATUS": "Nginx服务状态(传统)",
"SVC_CHECK_NGINX_OLD_STATUS_LEVEL": "Nginx服务状态等级(传统)",
"SVC_CHECK_MEETING_OLD_STATUS": "会议服务状态(传统)",
"SVC_CHECK_MEETING_OLD_STATUS_LEVEL": "会议服务状态等级(传统)",
"SVC_CHECK_EXTAPI_OLD_STATUS": "对外API服务状态(传统)",
"SVC_CHECK_EXTAPI_OLD_STATUS_LEVEL": "对外API服务状态等级(传统)",
# 端口检测
"SVC_CHECK_PORT_8000_STATUS": "uWSGI端口8000状态",
"SVC_CHECK_PORT_8000_STATUS_LEVEL": "uWSGI端口8000状态等级",
"SVC_CHECK_PORT_11211_STATUS": "Memcached端口11211状态",
"SVC_CHECK_PORT_11211_STATUS_LEVEL": "Memcached端口11211状态等级",
"SVC_CHECK_PORT_8080_STATUS": "Nginx端口8080状态",
"SVC_CHECK_PORT_8080_STATUS_LEVEL": "Nginx端口8080状态等级",
"SVC_CHECK_PORT_1883_STATUS": "MQTT端口1883状态",
"SVC_CHECK_PORT_1883_STATUS_LEVEL": "MQTT端口1883状态等级",
# ---- 52 配置IP检测 ----
"CFG_IP_STATUS": "配置IP检测状态",
"CFG_IP_STATUS_LEVEL": "配置IP检测状态等级",
"CFG_IP_TOTAL_FILES": "扫描文件数",
"CFG_IP_UNAUTHORIZED_COUNT": "未授权IP数",
"CFG_IP_UNAUTHORIZED_LINES": "未授权IP明细",
# ---- 53 Console配置检测 ----
"CFG_CONSOLE_STATUS": "Console配置检测状态",
"CFG_CONSOLE_STATUS_LEVEL": "Console配置检测状态等级",
"CFG_CONSOLE_TOTAL_FILES": "扫描文件数",
"CFG_CONSOLE_FOUND_COUNT": "发现问题数",
"CFG_CONSOLE_FOUND_FILES": "问题文件列表",
}
......@@ -40,6 +40,8 @@ _VALUE_STATUS_MAP = {
"未检测到容器": CRITICAL, "容器未运行": CRITICAL,
"无密码": CRITICAL, "弱密码": CRITICAL, "使用默认密码": CRITICAL,
"查询失败": WARNING, "无法读取": WARNING,
# 平台服务检测 / 端口检测状态词
"监听": NORMAL, "未监听": CRITICAL,
}
# 无效值/未安装占位符(这些值表示服务未安装或检测失败,不作为正常检测项)
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论