#!/bin/bash # Little monitoring script to check the readiness of a Gitlab instance. # # Remember that you have to whitelist the IP of your monitoring system : # gitlab.rb: # gitlab_rails['monitoring_whitelist'] = ['127.0.0.0/8', '::1/128', ...] # See https://docs.gitlab.com/ee/administration/monitoring/health_check.html # # Licence: WTFPL # Copyright: chl-dev@bugness.org 2024 PROGPATH=$( echo $0 | sed -e 's,[\\/][^\\/][^\\/]*$,,' ) REVISION="0.1" # Default values GITLAB_HOSTNAME="localhost" GITLAB_URL="" GITLAB_URL_PROTOCOL="https" NB_CHECKS_RANGE="15:20" # Include check_range() and STATE_OK, STATE_WARNING, ... variables . $PROGPATH/utils.sh # Output OUTPUT_CPT_CHECKS=0 OUTPUT_EXIT_STATUS=0 OUTPUT_DETAIL_OK="" OUTPUT_DETAIL_WARNING="" OUTPUT_DETAIL_CRITICAL="" OUTPUT_DETAIL_UNKNOWN="" OUTPUT_PERFDATA="" # Stop at first uncaught error set -eu # Wrapper to use whatever is available to make HTTP queries fetch_with_curl_wget_or_whatever () { if which "wget" >/dev/null 2>&1; then wget -q -O - "$1" elif which "curl" >/dev/null 2>&1 ; then curl -s "$1" else echo "UNKNOWN: no wget/curl/whatever available to make HTTP queries." exit $STATE_UNKNOWN fi } check_http_status_200() { if which "wget" >/dev/null 2>&1; then wget -q --spider "$1" elif which "curl" >/dev/null 2>&1 ; then test "$( curl -s -o /dev/null -I -w "%{http_code}" "$1" )" == "200" else echo "UNKNOWN: no wget/curl/whatever available to make HTTP queries." exit $STATE_UNKNOWN fi } print_full_url() { if [ -n "$GITLAB_URL" ]; then echo "$GITLAB_URL" else echo "$GITLAB_URL_PROTOCOL://$GITLAB_HOSTNAME/-/readiness?all=1" fi } # Help function usage() { cat </dev/null; then echo "UNKNOWN command 'jq' not available." exit $STATE_UNKNOWN fi # First, let's check that the URL responds with 200/OK #if ! check_http_status_200 "$( print_full_url )"; then # echo TODO later. Since it needs 2 queries, it could lead to inconsistencies if we get a 200 now and an error later. # Would the best way be to set another probe ? # check_https!-H $HOSTNAME$ -f warning -u /-/readiness?all=1 # check_https!-H $HOSTNAME$ -f warning -u /-/health -s "GitLab OK" #fi if ! JSONDATA="$( fetch_with_curl_wget_or_whatever "$( print_full_url )" )"; then echo "UNKNOWN error fetching the URL '$( print_full_url )'" exit $STATE_UNKNOWN fi while read KEY; do OUTPUT_CPT_CHECKS=$(( $OUTPUT_CPT_CHECKS + 1 )) if [ "$KEY" == "status" ]; then STATUS="$( printf "%s\n" "$JSONDATA" | jq ".$KEY" )" else STATUS="$( printf "%s\n" "$JSONDATA" | jq ".$KEY[0].status" )" fi if [ "$STATUS" != '"ok"' ]; then OUTPUT_DETAIL_CRITICAL="$( printf "%s Status for key '$KEY': %s" "$OUTPUT_DETAIL_CRITICAL" "$STATUS" )" OUTPUT_EXIT_STATUS=$STATE_CRITICAL fi done <