diff --git a/sitechecks.sh b/sitechecks.sh new file mode 100644 index 0000000..f631300 --- /dev/null +++ b/sitechecks.sh @@ -0,0 +1,133 @@ +#!/usr/bin/env bash + +# Dateien +INPUT_FILE="sites.json" +LOG_FILE="sites.log" + +# Curl-Optionen +CURL_OPTS=( + --silent + --max-time 10 + --location + --max-redirs 10 + --fail + --output /dev/null +) + +# Telegram-Bot-Configuration +TELEGRAM_BOT_TOKEN="${TELEGRAM_BOT_TOKEN:-}" +TELEGRAM_CHAT_ID="${TELEGRAM_CHAT_ID:-}" + +# Function: Send Telegram-Messages +send_telegram_message() { + local chat_id="$1" + local message="$2" + curl -s -X POST "https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/sendMessage" \ + -d chat_id="${chat_id}" \ + -d text="$message" \ + > /dev/null +} + +# Function: Describe HTTP-Statuscode +http_status_description() { + local status="$1" + case "$status" in + 200) echo "OK" ;; + 301) echo "Moved Permanently" ;; + 302) echo "Found" ;; + 400) echo "Bad Request" ;; + 401) echo "Unauthorized" ;; + 403) echo "Forbidden" ;; + 404) echo "Not Found" ;; + 408) echo "Request Timeout" ;; + 429) echo "Too Many Requests" ;; + 500) echo "Internal Server Error" ;; + 502) echo "Bad Gateway" ;; + 503) echo "Service Unavailable" ;; + 504) echo "Gateway Timeout" ;; + *) echo "Unknown Status" ;; + esac +} + +# Function: Check Site Status +check_site() { + local site="$1" + curl "${CURL_OPTS[@]}" --write-out "%{http_code}" "$site" 2>/dev/null +} + +# Function: Telegram-Command `/check URL` execution +process_telegram_updates() { + local update_url="https://api.telegram.org/bot${TELEGRAM_BOT_TOKEN}/getUpdates" + local last_update_id=0 + + while true; do + # Check for Updates + response=$(curl -s "${update_url}?offset=${last_update_id}") + messages=$(echo "$response" | jq -c '.result[]') + + for message in $messages; do + # Extract Message Details + update_id=$(echo "$message" | jq -r '.update_id') + chat_id=$(echo "$message" | jq -r '.message.chat.id') + text=$(echo "$message" | jq -r '.message.text') + + # Command `/check URL` run + if [[ "$text" == /check* ]]; then + url=$(echo "$text" | awk '{print $2}') + if [[ -z "$url" ]]; then + send_telegram_message "$chat_id" "❗ Fehler: Please provide a valid URL after /check." + else + status=$(check_site "$url") + description=$(http_status_description "$status") + + send_telegram_message "$chat_id" "🌐 URL: $url +HTTP-Status: $status ($description)" + fi + fi + + # Update-ID Increasing, to avoid double messages + last_update_id=$((update_id + 1)) + done + + # Check Intervall + sleep 5 + done +} + +# Function: Automatic Monitoring +monitor_sites() { + local urls=$(jq -r '.urls[]' "$INPUT_FILE") + + if [[ -z "$urls" ]]; then + echo "Error: No URL set." + exit 1 + fi + + for site in $urls; do + status=$(check_site "$site") + description=$(http_status_description "$status") + + # Show Only The Error + if [[ "$status" != "200" ]]; then + send_telegram_message "$TELEGRAM_CHAT_ID" "❗ Website-Monitoring Error: +🌐 URL: $site +HTTP-Status: $status ($description)" + fi + done +} + +# Hauptteil +case "$1" in + listen) + echo "Start Telegram-Bot-Listeners..." + process_telegram_updates + ;; + monitor) + echo "Start Auto Monitoring..." + monitor_sites + ;; + *) + echo "Usage: $0 {listen|monitor}" + exit 1 + ;; +esac