my-homelab-configs/scripts/report-ui

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