Гость
Map
Форумы / Вопросы по IT [закрыт для гостей] / Простая проверка доступности веб-сервера. Проверка кода состояния сервера. Создание базового телеграм-бота. Отправка уведомления через Telegram / 1 сообщений из 1, страница 1 из 1
18.04.2022, 11:48
    #17914
basename
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Простая проверка доступности веб-сервера. Проверка кода состояния сервера. Создание базового телеграм-бота. Отправка уведомления через Telegram
Полезные ссылки:
https://developer.mozilla.org/ru/docs/Web/HTTP/Status
https://www.w3.org/Protocols/HTTP/HTRESP.html
https://core.telegram.org/bots/api

На примере данного форума я выполняю элементарную проверку кода состояния веб-сервера по запрошенным url с другого хоста. Код ответа "200 - OK" является успешным ответом для метода GET и в данном случае отсутствия полноценной системы мониторинга вроде Zabbix проверка кода состояния веб-сервера позволит получить минимальное понимание о работоспособности сервера в текущий момент времени. Разумеется, проверить функционирование непосредственно поддерживаемого веб-сайта таким образом не получится, код ответа 200 говорит только о том, что веб-сервер успешно ответил на запрос GET. Нет подключения к базе данных у веб-приложения и веб-сайт сообщает об ошибке? Всё-равно 200 ОК.

#####

Скрипт проверки кода ответа веб-сервера.
Код: BASH
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
[root@andromeda scripts]# cat check_http_status.sh
#!/bin/bash
#

ch=$(curl -m 2 -I -o /dev/null -s -w '%{http_code}\n' $1)
#echo $ch

if [ $ch == 200 ]; then exit 0; else exit 1; fi

[root@andromeda scripts]#
Следует обратить внимание на параметр "-m 2" в запросе curl. Это время ожидания ответа на запрос в секундах. В случае ложных срабатываний при частых проверках по расписанию имеет смысл увеличить время ожидания.

#####

Скрипт отправки уведомления через телеграм.
Код: BASH
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
[root@andromeda scripts]# cat tg_send_msg.sh
#!/bin/bash
#

TOKEN='12345667890'
CHAT_ID="@it_works_org"
SUBJECT="$1"
MESSAGE="$2"

curl -s --header 'Content-Type: application/json' --request 'POST' --data "{\"chat_id\":\"${CHAT_ID}\",\"text\":\"${SUBJECT}\n${MESSAGE}\"}" "https://api.telegram.org/bot${TOKEN}/sendMessage" | grep -q '"ok":false,'
#curl -s --header 'Content-Type: application/json' --request 'POST' --data "{\"chat_id\":\"${CHAT_ID}\",\"text\":\"${SUBJECT}\n${MESSAGE}\"}" "https://api.telegram.org/bot${TOKEN}/sendMessage" | grep -q '"ok":false,'
#if [ $? -eq 0 ] ; then exit 1 ; fi

[root@andromeda scripts]#
Предварительно необходимо создать базового телеграм-бота и получить токен для аутентификации. Сделать это можно в приложении Telegram, вызвав бота @BotFather и следуя его указаниям.

Телеграм-бот может отправлять уведомления только в телеграм-канал, при этом, необходимо добавить бота в администраторы канала, предоставив право на отправку сообщений (остальные права администратора можно отобрать).

Соответственно, при вызове скрипта передаются в качестве позиционных параметров тема сообщения и текст сообщения. Бот отправляет переданную информацию в указанный канал (можно указывать канал по имени, не обязательно id), пройдя аутентификацию с указанным токеном.

#####

Скрипт проверки url по списку и вызов скрипта отправки уведомления.
Код: BASH
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
[root@andromeda scripts]# cat do_check_url.sh
#!/bin/bash
#

scdir="/opt/itwrks/scripts"
url_src="$scdir/url.txt"
sc_check_http_status="$scdir/check_http_status.sh"
sc_tg_send_msg="$scdir/tg_send_msg.sh"

[ -f $url_src ] || { echo "$url_src does not exist!"; exit 1; }

do_check_url() {
    while read url; do
        domain=$(echo $url | sed 's/http:\/\/\|https:\/\///g')
        flag="/tmp/check_url_$domain"

        $sc_check_http_status $url
        if [ $? == 0 ]; then
            [ -f $flag ] && rm -f $flag
        elif [ $? == 1 ]; then
            [ -f $flag ] || { touch $flag; $sc_tg_send_msg "Check the HTTP 200 OK status response code" "$(date) - $url - the request did not succeed"; }
            #[ -f $flag ] || { touch $flag; echo "Check the HTTP 200 OK status response code"; echo "$(date) - $url - the request did not succeed"; }
        fi
    done < $url_src
}

#####

case "$1" in
    --check-url)
        do_check_url
       ;;
    *)
        echo "Usage: $0 --check-url"
esac

[root@andromeda scripts]#
Скрипт последовательно проверяет коды ответа веб-сервера по url из списка:
Код
1.
2.
3.
4.
5.
6.
7.
8.
9.
[root@andromeda scripts]# cat url.txt
https://itwrks.org
https://www.itwrks.org
https://nosql.itwrks.org
https://n0sql.com
https://www.n0sql.com
https://sqlz.ru
https://www.sqlz.ru
[root@andromeda scripts]#
Следует обратить внимание, если осуществляется перенаправление со стороны веб-сервера с http на https, необходимо указывать конечный адрес запроса с https, иначе запрос на http получит ответ 301, что в данном случае будет идентифицировано как проблема.

Алгоритм проверки и отправки уведомления:
- если код ответа 200 - проверить, существует ли файл-указатель об ошибке, если существует, то удалить и ничего не делать;
- если код ответа не 200 - проверить, существует ли файл-указатель об ошибке, если существует, то ничего не делать, если не существует, то создать файл-указатель об ошибке и передать информацию в скрипт отправки уведомлений.

Файл-указатель об ошибке нужен, чтобы не дублировать сообщения в случае длительного, преднамеренного или аварийного простоя веб-сервера.

#####

Вызов по расписанию каждые 5 минут:
Код
1.
2.
# Check urls
*/5 * * * * /opt/itwrks/scripts/do_check_url.sh --check-url
...
Рейтинг: 0 / 0
Форумы / Вопросы по IT [закрыт для гостей] / Простая проверка доступности веб-сервера. Проверка кода состояния сервера. Создание базового телеграм-бота. Отправка уведомления через Telegram / 1 сообщений из 1, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]