62 lines
2.2 KiB
Bash
62 lines
2.2 KiB
Bash
#!/usr/bin/env zsh
|
|
|
|
# The operator-facing table is also the runtime source of diagnostic wording.
|
|
planet_error_record() {
|
|
local message="$1"
|
|
local evidence_file="${2:-/dev/null}"
|
|
local catalog="$SCRIPT_DIR/docs/technical/zh/ops-runbook.md"
|
|
[ -r "$catalog" ] || return 1
|
|
[ -r "$evidence_file" ] || evidence_file=/dev/null
|
|
|
|
awk -F '|' -v message="$message" '
|
|
function trim(value) {
|
|
sub(/^[[:space:]]+/, "", value)
|
|
sub(/[[:space:]]+$/, "", value)
|
|
return value
|
|
}
|
|
NR == FNR {
|
|
if ($0 == "<!-- planet-error-catalog:start -->") active = 1
|
|
if ($0 == "<!-- planet-error-catalog:end -->") active = 0
|
|
if (active && trim($2) ~ /^P_[A-Z_]+$/) {
|
|
count++
|
|
codes[count] = trim($2)
|
|
signals[count] = tolower(trim($3))
|
|
reasons[count] = trim($4)
|
|
actions[count] = trim($5)
|
|
if (codes[count] == "P_UNKNOWN") fallback = count
|
|
}
|
|
next
|
|
}
|
|
{ evidence = evidence "\n" tolower($0) }
|
|
END {
|
|
evidence = tolower(message) "\n" evidence
|
|
selected = fallback
|
|
for (i = 1; i <= count; i++) {
|
|
if (i == fallback) continue
|
|
size = split(signals[i], patterns, ";")
|
|
for (j = 1; j <= size; j++) {
|
|
pattern = trim(patterns[j])
|
|
if (length(pattern) && index(evidence, pattern)) {
|
|
selected = i
|
|
break
|
|
}
|
|
}
|
|
if (selected != fallback) break
|
|
}
|
|
if (!selected) exit 1
|
|
printf "%s\t%s\t%s\n", codes[selected], reasons[selected], actions[selected]
|
|
}
|
|
' "$catalog" "$evidence_file"
|
|
}
|
|
|
|
report_error_reason() {
|
|
local record code reason action
|
|
if ! record="$(planet_error_record "$1" "${2:-/dev/null}")"; then
|
|
log_note "无法读取运维错误对照表,请检查 docs/technical/zh/ops-runbook.md"
|
|
return 0
|
|
fi
|
|
IFS=$'\t' read -r code reason action <<< "$record"
|
|
log_note "原因 [${code}]: ${reason}"
|
|
log_note "处理: ${action}"
|
|
}
|