Files
planet/scripts/lib/error-diagnostics.zsh
rayd1o 83a10a6c34
Some checks are pending
ci / backend (push) Waiting to run
ci / frontend (push) Waiting to run
ci / delivery (push) Blocked by required conditions
release / images (push) Waiting to run
release: bump version to 0.74.6
2026-09-16 21:05:40 +08:00

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}"
}