#!/usr/bin/env bash set -euo pipefail REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" failures=0 warnings=0 score() { local label="$1" local severity="$2" shift 2 local output local summary local status printf '%-28s ' "$label" set +e output="$("$@" 2>&1)" status=$? set -e if [ "$status" -eq 0 ]; then printf 'pass\n' return 0 fi if [ "$severity" = "fail" ]; then failures=$((failures + 1)) printf 'fail' else warnings=$((warnings + 1)) printf 'warn' fi summary="$( printf '%s\n' "$output" | awk 'NF && $0 !~ /^\+/ { print; exit }' )" if [ -z "$summary" ]; then summary="check exited with status ${status}" fi printf ' - %s' "$summary" printf '\n' } docs_fresh() { "${REPO_ROOT}/scripts/render-docs" --check >/dev/null } inventory_ok() { "${REPO_ROOT}/scripts/validate-homelab-inventory" "${HOMELAB_INVENTORY_FILE:-${REPO_ROOT}/homelab.yml}" >/dev/null } security_static_ok() { "${REPO_ROOT}/scripts/validate-tailnet-policy" >/dev/null } printf 'Homelab scorecard\n' printf '=================\n\n' score "Inventory" fail inventory_ok score "Documentation freshness" warn docs_fresh score "Backup readiness" fail "${REPO_ROOT}/scripts/backup-status" score "GitOps health" warn "${REPO_ROOT}/scripts/gitops-status" score "DNS and RPi health" fail "${REPO_ROOT}/jeannie" doctor-rpi score "Cluster health" fail "${REPO_ROOT}/jeannie" doctor-cluster score "Edge health" fail "${REPO_ROOT}/jeannie" doctor-edge score "Capacity pressure" warn "${REPO_ROOT}/scripts/resource-budget" score "Security posture" warn security_static_ok score "Public certificates" warn "${REPO_ROOT}/scripts/cert-check" printf '\nSummary: failures=%s warnings=%s\n' "$failures" "$warnings" if [ "$failures" -gt 0 ]; then printf 'Focus on the failed categories first, then clear warnings.\n' exit 1 fi if [ "$warnings" -gt 0 ]; then printf 'No blocking failures, but warnings need cleanup.\n' exit 0 fi printf 'Scorecard passed.\n'