Script en Bash que llegeix un llistat d'urls i analitza errors de DNS o de certificats SSL

Script en Bash que llegeix un llistat gran d'urls i analitza si falla algun DNS o algun certificat SSL

Ací en aquest xicotet article deixe un script que llegeix un llistat d'urls i ens detecta si alguna web està fallant per un certificat SSL caducat o mal configurat, o per DNS.

Deixarem el llistat d'urls en el fitxer /root/comprovador_webs_urls.txt, i les escriurem així:

http://www.DOMINI1.es
http://www.DOMINI2.es
http://www.DOMINI3.es
...

El resultat que ens mostrarà serà el següent:
resultat script en terminal

I ara, l'script és així de simple:

#!/usr/bin/env bash
set -u

URLS_FILE="${1:-/root/comprovador_webs_urls.txt}"
TIMEOUT="${TIMEOUT:-20}"
LOGFILE="${LOGFILE:-/var/log/comprovador_webs.log}"

timestamp() { date "+%Y-%m-%d %H:%M:%S"; }

mkdir -p "$(dirname "$LOGFILE")"

classify_curl_error() {
  # https://curl.se/libcurl/c/libcurl-errors.html
  case "$1" in
    28) echo "TIMEOUT" ;;
    6)  echo "DNS_ERROR" ;;
    7)  echo "CONNECT_ERROR" ;;
    35) echo "TLS_HANDSHAKE_ERROR" ;;
    51) echo "CERT_VERIFY_ERROR" ;;
    58) echo "LOCAL_CERT_PROBLEM" ;;
    60)
      # intentem distingir una mica amb el text
      if echo "$2" | grep -qi "expired"; then
        echo "SSL_CERT_EXPIRED"
      elif echo "$2" | grep -qi "issuer is not recognized\|self signed\|unable to get local issuer"; then
        echo "SSL_UNTRUSTED_ISSUER"
      else
        echo "SSL_CERT_INVALID"
      fi
      ;;
    *)  echo "CURL_ERROR_$1" ;;
  esac
}

while IFS= read -r url; do
  [[ -z "$url" ]] && continue
  [[ "$url" =~ ^[[:space:]]*# ]] && continue

  errfile="$(mktemp)"

  # -L segueix redireccions
  # -o /dev/null no descarrega cos
  # -w agafa codi HTTP final (si arriba a tindre’l)
  http_code="$(
    curl -sS -L --max-time "$TIMEOUT" -o /dev/null -w "%{http_code}" \
      "$url" 2>"$errfile"
  )"
  rc=$?
  err_msg="$(tr '\n' ' '  "$errfile" | sed -E 's/[[:space:]]+/ /g' | sed -E 's/[[:space:]]+$//')"
  rm -f "$errfile"

  if [[ $rc -ne 0 ]]; then
    reason="$(classify_curl_error "$rc" "$err_msg")"
    echo "$(timestamp) ALERTA: $url -> $reason (curl_rc=$rc, last_http=${http_code:-000})" | tee -a "$LOGFILE"
    continue
  fi

  # OK per 2xx i 3xx; ALERTA per 4xx/5xx
  if [[ "$http_code" =~ ^[45][0-9][0-9]$ ]]; then
    echo "$(timestamp) ALERTA: $url -> HTTP $http_code" | tee -a "$LOGFILE"
  else
    echo "$(timestamp) OK: $url -> HTTP $http_code" >> "$LOGFILE"
  fi

done  "$URLS_FILE"

Abans d'executar, farem:

sed -i 's/\r$//' comprovador_urls.sh #per a normalitzar els caracters en mode UNIX
$chmod +x comprovador_urls.sh #per a donar-li permissos d'execució

L'he deixat a una Raspbian en una antiga Raspberry que no té sendmail i no puc fer enviaments per correu, només veure el resultat en la terminal o revisar el log que ens deixa a /var/log/comprovador_webs.log.

Etiquetes

Doncs bé això és tot, espere que trobes útil aquest article i que et motive a compartir els teus trucs, els teus coneixements i els teus experiments amb el Programari Lliure. Pensa-ho, va, que la Comunitat del Programari Lliure va creixent gràcies a la documentació, el disseny, la formació o la programació, sigues part de la Comunitat :-)

La cultura i la lliure circulació de les idees és l'arma més efectiva contra les dictadures del pensament i contra la ignorància.

Utilitats

NAVEGACIÓ SENSE RATOLÍ

- Tab següent enllaç.
- Shift+Tab anterior enllaç.
- Enter activa l'enllaç.
- Alt+esquerra anar arrere.

CONTRAST DE COLORS

Accessibilitat - Color Negre
Accessibilitat - Color Groc
Accessibilitat - Color Verd

Accessibilitat - Color Blau
Accessibilitat - Color Crema
Accessibilitat - Color Blanc

 

PORTADES ALTERNATIVES