#!/usr/bin/env bash set -euo pipefail NAMESPACE="${ARGOCD_NAMESPACE:-argocd}" LOG_PATTERN="${GITOPS_LOG_PATTERN:-error|failed|denied|timeout|authentication|unauthorized}" section() { printf '\n== %s ==\n' "$1" } have() { command -v "$1" >/dev/null 2>&1 } kubectl_ok() { have kubectl && kubectl version --client >/dev/null 2>&1 } print_if_available() { local description="$1" shift if "$@"; then return 0 fi printf '%s unavailable or returned no data.\n' "$description" } if ! kubectl_ok; then echo "kubectl is required for gitops-status." >&2 exit 1 fi if ! kubectl get namespace "$NAMESPACE" >/dev/null 2>&1; then echo "Argo CD namespace '$NAMESPACE' was not found or the Kubernetes API is unreachable." >&2 exit 1 fi section "Argo CD Applications" if ! kubectl -n "$NAMESPACE" get applications.argoproj.io \ -o custom-columns='NAME:.metadata.name,SYNC:.status.sync.status,HEALTH:.status.health.status,REVISION:.status.sync.revision,PATH:.spec.source.path' \ --no-headers 2>/dev/null; then echo "No Argo CD Applications were found." fi section "Out Of Sync Or Degraded" apps_report="$( kubectl -n "$NAMESPACE" get applications.argoproj.io \ -o custom-columns='NAME:.metadata.name,SYNC:.status.sync.status,HEALTH:.status.health.status,MESSAGE:.status.conditions[-1].message' \ --no-headers 2>/dev/null || true )" if [ -z "$apps_report" ]; then echo "No application status data available." else printf '%s\n' "$apps_report" | awk '$2 != "Synced" || $3 != "Healthy" { print }' fi section "Repository Secrets" print_if_available "Repository secrets" \ kubectl -n "$NAMESPACE" get secrets -l argocd.argoproj.io/secret-type=repository \ -o custom-columns='NAME:.metadata.name,TYPE:.metadata.labels.argocd\.argoproj\.io/secret-type' \ --no-headers section "Recent Argo CD Warnings" print_if_available "Argo CD events" \ sh -c "kubectl -n '$NAMESPACE' get events --sort-by=.lastTimestamp 2>/dev/null | tail -40" section "Recent Repo Server Errors" if kubectl -n "$NAMESPACE" get deployment argocd-repo-server >/dev/null 2>&1; then kubectl -n "$NAMESPACE" logs deployment/argocd-repo-server --tail=120 2>/dev/null | grep -Ei "$LOG_PATTERN" || echo "No recent repo-server errors matched '$LOG_PATTERN'." else echo "argocd-repo-server deployment not found." fi section "Recent Application Controller Errors" if kubectl -n "$NAMESPACE" get statefulset argocd-application-controller >/dev/null 2>&1; then kubectl -n "$NAMESPACE" logs statefulset/argocd-application-controller --tail=120 2>/dev/null | grep -Ei "$LOG_PATTERN" || echo "No recent application-controller errors matched '$LOG_PATTERN'." else echo "argocd-application-controller statefulset not found." fi