#!/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