Files
AWatch-rus/scripts/detmir-full-diagnostics/detmir-full-diagnostics.sh
T

223 lines
5.9 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
ENV_FILE="${DETMIR_FULL_DIAGNOSTICS_ENV_FILE:-$SCRIPT_DIR/detmir-full-diagnostics.env}"
if [[ -f "$ENV_FILE" ]]; then
set -a
# shellcheck disable=SC1090
. "$ENV_FILE"
set +a
fi
usage() {
cat <<'USAGE'
Usage:
scripts/detmir-full-diagnostics/detmir-full-diagnostics.sh [options]
Options:
--scope daily|weekly|monthly Scope of operational checks (default: daily)
--output-dir PATH Root output directory for all checks
--quick Pass --quick to aw-contour-diag
--skip-windows Skip WinRM checks in aw-contour-diag
--no-support Skip detmir-support-run checks
--no-aw-diagnostic Skip aw-contour-diag
--no-placeholder-check Skip production placeholder guard check
--help Show this help
Examples:
scripts/detmir-full-diagnostics/detmir-full-diagnostics.sh --scope daily
scripts/detmir-full-diagnostics/detmir-full-diagnostics.sh --scope weekly --quick
scripts/detmir-full-diagnostics/detmir-full-diagnostics-daily.sh
USAGE
}
SCOPE="${DETMIR_FULL_DIAGNOSTICS_SCOPE:-daily}"
OUTPUT_DIR="${DETMIR_FULL_DIAGNOSTICS_OUTPUT_DIR:-$REPO_ROOT/output/detmir-full-diagnostics}"
RUN_AW_DIAG=1
RUN_SUPPORT=1
RUN_PLACEHOLDER_GUARD=1
AW_QUICK="${DETMIR_FULL_DIAGNOSTICS_AW_DIAG_QUICK:-0}"
AW_SKIP_WINDOWS="${DETMIR_FULL_DIAGNOSTICS_AW_DIAG_SKIP_WINDOWS:-0}"
AW_DIAG_SCRIPT="${DETMIR_FULL_DIAGNOSTICS_AW_DIAG_SCRIPT:-$SCRIPT_DIR/aw-contour-diag.sh}"
SUPPORT_RUN_SCRIPT="${DETMIR_FULL_DIAGNOSTICS_SUPPORT_RUN:-$SCRIPT_DIR/../detmir-support-run.sh}"
SUPPORT_ENV_FILE="${DETMIR_FULL_DIAGNOSTICS_SUPPORT_ENV:-$SCRIPT_DIR/../detmir-support.env}"
PLACEHOLDER_SCRIPT="${DETMIR_FULL_DIAGNOSTICS_PLACEHOLDER_SCRIPT:-$SCRIPT_DIR/../check_production_inventory_placeholders.sh}"
PLACEHOLDER_GUARD="${DETMIR_FULL_DIAGNOSTICS_PLACEHOLDER_GUARD:-1}"
PLACEHOLDER_PATHS="${DETMIR_FULL_DIAGNOSTICS_PLACEHOLDER_PATHS:-$REPO_ROOT/ansible:$REPO_ROOT/private-config}"
while (( $# > 0 )); do
case "$1" in
--scope)
if (( $# < 2 )); then
usage
echo "error: --scope requires daily|weekly|monthly" >&2
exit 2
fi
SCOPE="$2"
shift 2
;;
--output-dir)
if (( $# < 2 )); then
usage
echo "error: --output-dir requires path" >&2
exit 2
fi
OUTPUT_DIR="$2"
shift 2
;;
--quick)
AW_QUICK=1
shift
;;
--skip-windows)
AW_SKIP_WINDOWS=1
shift
;;
--no-support)
RUN_SUPPORT=0
shift
;;
--no-aw-diagnostic)
RUN_AW_DIAG=0
shift
;;
--no-placeholder-check)
RUN_PLACEHOLDER_GUARD=0
shift
;;
--help)
usage
exit 0
;;
*)
usage
echo "error: unknown arg '$1'" >&2
exit 2
;;
esac
done
if [[ "$SCOPE" != "daily" && "$SCOPE" != "weekly" && "$SCOPE" != "monthly" ]]; then
echo "error: invalid scope '$SCOPE', expected daily|weekly|monthly" >&2
exit 2
fi
if [[ "$RUN_PLACEHOLDER_GUARD" == "1" ]]; then
RUN_PLACEHOLDER_GUARD="$PLACEHOLDER_GUARD"
fi
RUN_DIR="$OUTPUT_DIR/$(date -u +%Y%m%dT%H%M%SZ)"
mkdir -p "$RUN_DIR"
LOG_FILE="$RUN_DIR/full-diagnostics.log"
exec > >(tee -a "$LOG_FILE") 2>&1
TOTAL=0
OK_COUNT=0
FAIL_COUNT=0
log() {
printf '%s %s\n' "$(date -u '+%Y-%m-%dT%H:%M:%SZ')" "$*"
}
run_step() {
local step="$1"
shift
TOTAL=$((TOTAL + 1))
log "----"
log "STEP [$TOTAL]: $step"
if "$@"; then
OK_COUNT=$((OK_COUNT + 1))
log "RESULT: OK"
return 0
fi
FAIL_COUNT=$((FAIL_COUNT + 1))
log "RESULT: FAIL"
return 1
}
log "DetMir full diagnostics started"
log "Repository: $REPO_ROOT"
log "Scope: $SCOPE"
log "Output: $RUN_DIR"
log "Log: $LOG_FILE"
if [[ ! -x "$AW_DIAG_SCRIPT" ]] && (( RUN_AW_DIAG == 1 )); then
log "WARN: aw-contour-diag script not found or not executable: $AW_DIAG_SCRIPT"
log " Диагностика AW-контуром будет пропущена."
RUN_AW_DIAG=0
fi
if [[ ! -x "$SUPPORT_RUN_SCRIPT" ]] && (( RUN_SUPPORT == 1 )); then
log "ERROR: support script not found or not executable: $SUPPORT_RUN_SCRIPT"
exit 2
fi
if [[ ! -f "$SUPPORT_ENV_FILE" ]] && (( RUN_SUPPORT == 1 )); then
log "WARN: support env file not found, defaults will be used from detmir-support-run defaults: $SUPPORT_ENV_FILE"
fi
if [[ ! -f "$PLACEHOLDER_SCRIPT" ]] && (( RUN_PLACEHOLDER_GUARD == 1 )); then
log "WARN: placeholder guard script not found: $PLACEHOLDER_SCRIPT"
RUN_PLACEHOLDER_GUARD=0
fi
if (( RUN_AW_DIAG == 1 )); then
if [[ -x "$AW_DIAG_SCRIPT" ]]; then
AW_ARGS=()
if [[ "$AW_QUICK" == "1" ]]; then
AW_ARGS+=(--quick)
fi
if [[ "$AW_SKIP_WINDOWS" == "1" ]]; then
AW_ARGS+=(--skip-windows)
fi
run_step "aw-contour-diag (scope=$SCOPE)" "$AW_DIAG_SCRIPT" "${AW_ARGS[@]}" || true
fi
fi
if (( RUN_SUPPORT == 1 )); then
run_step "detmir-support-run --scope $SCOPE" \
env \
DETMIR_SUPPORT_ENV_FILE="$SUPPORT_ENV_FILE" \
DETMIR_SUPPORT_OUTPUT_DIR="$RUN_DIR/support" \
"$SUPPORT_RUN_SCRIPT" --scope "$SCOPE" --output-dir "$RUN_DIR/support" || true
fi
if [[ "$RUN_PLACEHOLDER_GUARD" == "1" ]]; then
if [[ -z "${PLACEHOLDER_PATHS// }" ]]; then
log "WARN: DETMIR_FULL_DIAGNOSTICS_PLACEHOLDER_PATHS is empty. Placeholder guard skipped."
else
run_step "check production placeholders" \
env DETMIR_PRODUCTION_CONFIG_PATHS="$PLACEHOLDER_PATHS" \
"$PLACEHOLDER_SCRIPT" --allow-missing || true
fi
fi
SUMMARY_FILE="$RUN_DIR/summary.txt"
{
printf "Scope: %s\n" "$SCOPE"
printf "Total steps: %s\n" "$TOTAL"
printf "OK: %s\n" "$OK_COUNT"
printf "FAIL: %s\n" "$FAIL_COUNT"
if (( FAIL_COUNT == 0 )); then
printf "Result: OK\n"
else
printf "Result: FAIL\n"
fi
} > "$SUMMARY_FILE"
log "Summary: $SUMMARY_FILE"
log "DetMir full diagnostics completed"
if (( FAIL_COUNT > 0 )); then
exit 1
fi
exit 0