158 lines
3.9 KiB
Bash
158 lines
3.9 KiB
Bash
#!/usr/bin/env bash
|
|
|
|
REPORT_UI_ONLY="${REPORT_UI_ONLY:-problems}"
|
|
REPORT_UI_DETAILS=false
|
|
REPORT_UI_JSON=false
|
|
# shellcheck disable=SC2034
|
|
REPORT_UI_VERBOSE=false
|
|
REPORT_UI_ROWS_FILE=""
|
|
|
|
report_ui_usage_flags() {
|
|
cat <<'EOF'
|
|
Report UI flags:
|
|
--all Show ok, skip, warning, and failing items.
|
|
--details Show the compact report plus detail fields.
|
|
--json Print structured JSON.
|
|
--verbose Use the older full diagnostic output when supported.
|
|
EOF
|
|
}
|
|
|
|
report_ui_parse_args() {
|
|
REPORT_UI_ONLY="${REPORT_UI_ONLY:-problems}"
|
|
REPORT_UI_DETAILS=false
|
|
REPORT_UI_JSON=false
|
|
REPORT_UI_VERBOSE=false
|
|
while (($# > 0)); do
|
|
case "$1" in
|
|
--all)
|
|
REPORT_UI_ONLY="all"
|
|
shift
|
|
;;
|
|
--details)
|
|
REPORT_UI_DETAILS=true
|
|
shift
|
|
;;
|
|
--json)
|
|
REPORT_UI_JSON=true
|
|
shift
|
|
;;
|
|
--verbose)
|
|
# shellcheck disable=SC2034
|
|
REPORT_UI_VERBOSE=true
|
|
shift
|
|
;;
|
|
-h|--help)
|
|
report_ui_usage_flags
|
|
return 2
|
|
;;
|
|
*)
|
|
echo "unknown report option: $1" >&2
|
|
return 1
|
|
;;
|
|
esac
|
|
done
|
|
}
|
|
|
|
report_ui_begin() {
|
|
REPORT_UI_ROWS_FILE="$(mktemp "${TMPDIR:-/tmp}/jeannie-report-rows.XXXXXX")"
|
|
}
|
|
|
|
report_ui_cleanup() {
|
|
if [[ -n "${REPORT_UI_ROWS_FILE:-}" && -f "${REPORT_UI_ROWS_FILE}" ]]; then
|
|
rm -f "${REPORT_UI_ROWS_FILE}"
|
|
fi
|
|
REPORT_UI_ROWS_FILE=""
|
|
}
|
|
|
|
report_ui_one_line() {
|
|
local value="${1:-}"
|
|
value="${value//$'\t'/ }"
|
|
value="${value//$'\r'/ }"
|
|
value="${value//$'\n'/ | }"
|
|
printf '%s' "${value}"
|
|
}
|
|
|
|
report_ui_first_line() {
|
|
awk 'NF && $0 !~ /^\+/ { print; exit }'
|
|
}
|
|
|
|
report_ui_trim_detail() {
|
|
sed -n '1,20p'
|
|
}
|
|
|
|
report_ui_emit() {
|
|
local status="$1"
|
|
local area="$2"
|
|
local check="$3"
|
|
local summary="$4"
|
|
local detail="${5:-}"
|
|
local fix="${6:-}"
|
|
local graph="${7:-}"
|
|
local query="${8:-}"
|
|
|
|
if [[ -z "${REPORT_UI_ROWS_FILE:-}" ]]; then
|
|
echo "report_ui_begin was not called" >&2
|
|
return 1
|
|
fi
|
|
|
|
printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n' \
|
|
"$(report_ui_one_line "${status}")" \
|
|
"$(report_ui_one_line "${area}")" \
|
|
"$(report_ui_one_line "${check}")" \
|
|
"$(report_ui_one_line "${summary}")" \
|
|
"$(report_ui_one_line "${detail}")" \
|
|
"$(report_ui_one_line "${fix}")" \
|
|
"$(report_ui_one_line "${graph}")" \
|
|
"$(report_ui_one_line "${query}")" >>"${REPORT_UI_ROWS_FILE}"
|
|
}
|
|
|
|
report_ui_check() {
|
|
local severity="$1"
|
|
local area="$2"
|
|
local check="$3"
|
|
local fix="${4:-}"
|
|
local graph="${5:-}"
|
|
local query="${6:-}"
|
|
shift 6
|
|
local output
|
|
local status
|
|
local summary
|
|
local detail
|
|
|
|
set +e
|
|
output="$("$@" 2>&1)"
|
|
status=$?
|
|
set -e
|
|
|
|
if [[ "${status}" -eq 0 ]]; then
|
|
report_ui_emit ok "${area}" "${check}" "ok" "${output}"
|
|
return 0
|
|
fi
|
|
|
|
summary="$(printf '%s\n' "${output}" | report_ui_first_line)"
|
|
if [[ -z "${summary}" ]]; then
|
|
summary="check exited with status ${status}"
|
|
fi
|
|
detail="$(printf '%s\n' "${output}" | report_ui_trim_detail)"
|
|
if [[ "${severity}" == "fail" ]]; then
|
|
report_ui_emit fail "${area}" "${check}" "${summary}" "${detail}" "${fix}" "${graph}" "${query}"
|
|
return 1
|
|
fi
|
|
report_ui_emit warn "${area}" "${check}" "${summary}" "${detail}" "${fix}" "${graph}" "${query}"
|
|
return 0
|
|
}
|
|
|
|
report_ui_render() {
|
|
local title="$1"
|
|
local -a args=(--title "${title}" --only "${REPORT_UI_ONLY}")
|
|
|
|
if [[ "${REPORT_UI_DETAILS}" == "true" ]]; then
|
|
args+=(--details)
|
|
fi
|
|
if [[ "${REPORT_UI_JSON}" == "true" ]]; then
|
|
args+=(--json)
|
|
fi
|
|
|
|
"${REPO_ROOT}/scripts/report-render" "${args[@]}" <"${REPORT_UI_ROWS_FILE}"
|
|
}
|