XNUMX 分で Web サヌビスを監芖するボット: telegram + bash + cron

XNUMX 分で Web サヌビスを監芖するボット: telegram + bash + cron

新しいサヌビスを監芖する必芁が生じた堎合でも、必芁なむンフラや専門知識が手元にないこずがありたす。このガむドでは、組み蟌みツヌルのみを䜿甚しお、あらゆるWebサヌビスを監芖するツヌルを30分で実装する方法をご玹介したす。 ubuntubash、cron、curlを䜿甚したす。通知の配信にはTelegramを䜿甚したす。

「チェリヌ・オン・ザ・ケヌキ」はナヌザヌの感情的な関䞎になりたす。 人でテストしたずころ、効果がありたした。

遠隔医療サヌビスである Doctor Nearby がナヌザヌのストレス レベルを刀断するチャットボットを䜜成したずき、モニタリングが必芁でした。 数時間で、うたく機胜するだけでなく、ポゞティブなメッセヌゞを加えるミニプロゞェクトが䜜成されたした。

たず、スクリプトを含むリポゞトリを取埗したしょう。

git clone https://github.com/rshekhovtsov/msms.git

msms フォルダヌに移動し、そこで䜜業したす。

テレグラムがブロックされおいる堎合は、プロキシを䜿甚しおください。 最もシンプルで信頌性の高いオプションはトル゜ックスです。

sudo apt install tor
sudo apt install torsocks

䟋ずしお、google.com スタヌト ペヌゞの監芖を XNUMX ぀の手順で蚭定しおみたしょう。

ステップ 1. Telegram でボットを䜜成し、ナヌザヌ ID を取埗したす

  • 電報内の連絡先の怜玢バヌで怜玢したす。 @ボットファヌザヌ:

    XNUMX 分で Web サヌビスを監芖するボット: telegram + bash + cron

  • [スタヌト] ボタンで起動し、/newbot コマンドを入力しお質問に答えたす。 name はナヌザヌに衚瀺されるボットの名前であり、ナヌザヌ名は䞀意であり、「bot」で終わる必芁があるこずに泚意する必芁がありたす。

    XNUMX 分で Web サヌビスを監芖するボット: telegram + bash + cron

    特に、ボットは HTTP API のシヌクレット トヌクンを発行したす。これをコピヌしお、msms フォルダヌ内の telegram-api-key.txt ファむルに保存する必芁がありたす。

  • テレグラムの怜玢バヌにボットの名前を入力し、起動したす。
  • 最埌の仕䞊げずしお、監芖アラヌト受信者のリストに自分自身を远加したしょう。
    sudo chmod +x ./recipients-setup.sh
    torsocks ./recipients-setup.sh

    スクリプトはボットぞの最近の呌び出しのリストを衚瀺したす。テレグラムには ID ず名前が XNUMX 行あるはずです。 この ID を取埗し、ファむル services/google-recipients.txt に保存したす。 ファむル圢匏: 各行が XNUMX ぀の ID です。 䟋

    123456789
    987654321

新しい受信者を远加するには、テレグラムでボットを起動し、recipients-setup.sh を実行しお、ファむルに ID を远加するように䟝頌する必芁がありたす。

ステップ 2. モニタリングを蚭定する

サヌビスは、services フォルダヌに ini ファむルを䜜成するこずで蚘述されたす。 次の XNUMX ぀のパラメヌタを蚭定する必芁がありたす。

  1. MSMS_SERVICE_NAME: サヌビス名 - アラヌトず監芖ログで䜿甚されたす。
  2. MSMS_SERVICE_ENDPOINT:curl で接続するサヌビスの゚ンドポむント。
  3. MSMS_CURL_PARAMS: 远加のカヌル オプション。以䞋の䟋を参照しおください。
  4. MSMS_EXPECTED: サヌビスからの予期される応答。 答えが短い堎合に䜿甚されたす。
  5. MSMS_EXPECTED_FILE: 予期されるサヌビス応答が含たれるファむル名。 指定するず、MSMS_EXPECTED が䞊曞きされたす。
  6. MSMS_RECIPIENTS: 通知受信者のリストを含むファむル。

google.com ぞのリク゚ストはリダむレクト付きの固定 HTML を返したす。これを予想されるサヌバヌ応答ずしお䜿甚したす。

curl google.com > services/google-response.html

services/google.ini ファむルを䜜成したしょう。

MSMS_SERVICE_NAME='google front page'

# service endpoint
MSMS_SERVICE_ENDPOINT='google.com'

# curl parameters
MSMS_CURL_PARAMS='-s --connect-timeout 3 -m 7'

# expected service response
MSMS_EXPECTED_FILE='google-response.html'

# recipients list file
MSMS_RECIPIENTS='google-recipients.txt'

В MSMS_CURL_PARAMS 以䞋を含む、curl で実行できるすべおの蚭定を行うこずができたす。

  1. コン゜ヌルずログが乱雑になるのを避けるために、curl メッセヌゞを無効にしたす。 -s
  2. チェックするサヌビスずの接続タむムアりトを蚭定したす (秒単䜍)。 --connect-timeout 3
  3. 応答タむムアりトを蚭定したす。 -m 7
  4. SSL の蚌明曞怜蚌を無効にしたす (たずえば、自己眲名蚌明曞を䜿甚しおいる堎合)。 --insecure
  5. http リク゚ストのタむプを指定したす。 -X POST
  6. 芋出しを指定したす。 -H "Content-Type: application/json"
  7. リク゚ストの本文を文字列たたはファむルずしお指定したす。 ファむルの䟋: -d @request.json

通知を無効にし、タむムアりトを 3 秒に蚭定したした。 接続するには7秒かかりたす。 サヌビス応答を受信したす。

泚目: 䟋のように、パラメヌタ倀を䞀重匕甚笊で囲んで指定したす。 残念ながら、bash はこの意味で非垞に脆匱であり、間違った匕甚笊を䜿甚した偶発的な蝶は、蚺断が難しい゚ラヌで宇宙の死を招く可胜性がありたす。

モニタリングを蚭眮しおおりたす。 すべおが正垞であるこずを確認しおみたしょう。

sudo chmod +x ./monitoring.sh
torsocks ./monitoring.sh

スクリプトには次のようなメッセヌゞが衚瀺されるはずです。

2020-01-10 12:14:31
health-check "google front page": OK

STEP 3. スケゞュヌルを蚭定する

cron で監芖スケゞュヌルを蚭定したしょう。

sudo crontab -e

google.com を毎分チェックする行を远加したしょう。

*/1 * * * * torsocks <ПУТЬ К ПАПКЕ РЕПОЗИТОРИЯ>/monitoring.sh >> <ПУТЬ К ПАПКЕ РЕПОЗИТОРИЯ>/monitoring.log 2>&1

毎日午前 11.00 時にアラヌトを远加し、監芖自䜓の機胜を確認したす。 これを行うには、DAILY パラメヌタをスクリプトに枡したす。

0 11 * * * torsocks <ПУТЬ К ПАПКЕ РЕПОЗИТОРИЯ>/monitoring.sh DAILY >> <ПУТЬ К ПАПКЕ РЕПОЗИТОРИЯ>/monitoring.log 2>&1

2>&1 - ゚ラヌをメむン出力ストリヌムにリダむレクトする暙準的な手法。 その結果、監芖ログにも蚘録されたす。

倉曎を保存し、次のコマンドで取埗したしょう。

 sudo service cron reload

cron の蚭定に぀いお詳しくは、以䞋を参照しおください。 ここで.

したがっお、毎分監芖スクリプトが起動され、curl 経由で google.com に接続されたす。 受信した応答が予期したものず異なる堎合、スクリプトは受信者のリストに電報通知を送信したす。 監査ログはファむルmonitoring.logに保存されたす。

別のサヌビスを远加する必芁がある堎合は、そのサヌビス甚の新しい ini ファむルを services フォルダヌに䜜成し、必芁に応じお受信者の別のリストを䜜成したす。 それ以倖はすべお自動的に動䜜したす。

チェック䞭のサヌビスが利甚できなくなった堎合、アラヌトが XNUMX 分ごずに送信されたす。 サヌビスをすぐに埩元できない堎合は、ボットのテレグラム プロパティで通知を䞀時的に無効にするこずができたす。

次に、远加機胜ずスクリプトの実装を詳しく芋おみたしょう。

メッセヌゞパタヌンず感情的な関䞎

ボットずのコミュニケヌションをより掻発にするために、ボットに Manechka ずいう名前を付け、適切なアバタヌ画像を远加し、テキスト メッセヌゞを䜜成するためにプロの PR スペシャリストを雇いたした。 私たちの経隓を掻甚するこずも、奜みに合わせお倉曎するこずもできたす。

䟋えば、

XNUMX 分で Web サヌビスを監芖するボット: telegram + bash + cron
たたは次のようにしおも:

XNUMX 分で Web サヌビスを監芖するボット: telegram + bash + cron
なぜでしょうか

ボット名ずアバタヌは次のように蚭定されたす。 @ボットファヌザヌ.
メッセヌゞテンプレヌトはフォルダヌ内にありたす テンプレヌト:

  • カヌル倱敗.txt:curl がれロ以倖の゚ラヌ コヌドを返したずきに送信されるメッセヌゞ。 通垞、サヌビスに到達できないこずに぀いお話したす。
  • デむリヌ.txt: サヌビス監芖が機胜しおいるこずを確認する毎日のメッセヌゞ。
  • サヌビス倱敗.txt: サヌビスの応答が予期したものず異なる堎合に送信されるメッセヌゞ。

䟋ずしお組み蟌みメッセヌゞ テンプレヌトを䜿甚しお、カスタマむズ オプションを芋おみたしょう。
テンプレヌトでは絵文字を䜿甚しおいたす。 残念ながら、habr ではそれらは衚瀺されたせん。
絵文字を遞択するには、怜玢を䜿甚するず䟿利です emojipedia.org:

XNUMX 分で Web サヌビスを監芖するボット: telegram + bash + cron

適切な蚘号をコピヌしおテンプレヌト テキストに貌り付けるだけです (これは通垞の Unicode)。

  1. カヌル倱敗.txt:
    КПтёМПк,  пПЌПгО ЌМе... 
    Не ЌПгу ЎПстучаться ЎП сервОса "$MSMS_SERVICE_NAME" 
    `CURL EXIT CODE: $EXIT_CODE`

    指定したサヌビス名を䜿甚したした (倉数 MSMS_SERVICE_NAME) ず、curl 終了コヌドを含む内郚スクリプト倉数 (EXIT_CODE。 たた、マヌクアップを䜿甚しおメッセヌゞをフォヌマットしたした 電報倀䞋げ: 「`」文字は固定幅テキストを囲みたす。 匕甚笊ずアポストロフィは bash 蚘号であるため、「」で゚スケヌプしたす。 倉数名の前には「$」蚘号が付きたす。

    結果

    XNUMX 分で Web サヌビスを監芖するボット: telegram + bash + cron

  2. サヌビス倱敗.txt:
    КПтёМПк, пПЌПгО ЌМе... 
    СервОс "$MSMS_SERVICE_NAME" ЌеМя расстрПОл
    ОМ рабПтает МеправОльМП, вПт чтП ПМ ЌМе Птвечает:
    `$RESPONSE`

    結果

    XNUMX 分で Web サヌビスを監芖するボット: telegram + bash + cron

    ここでは別のスクリプト倉数を䜿甚したす。 RESPONSE。 これにはサヌビス応答が含たれたす。

  3. デむリヌ.txt:
    Малыш, прОвет!
    У ЌеМя всё хПрПшП, cлежу за сервОсПЌ:
    "$MSMS_SERVICE_NAME" кажЎую ЌОМутку...
    А как у тебя Ўела?
    

    結果

    XNUMX 分で Web サヌビスを監芖するボット: telegram + bash + cron

スクリプトの実装に移りたしょう。

監芖スクリプト

モニタリング.sh 単玔な自動怜出を実行したす。サヌビス フォルダヌからすべおの ini ファむルを取埗し、それぞれに察しおアラヌトの確認ず送信のロゞックを含むメむン スクリプトを実行したす。

#!/bin/bash
cd $(dirname "$0")/services

for service_ini  in $(ls *.ini); do
    bash ../msms.sh "$1" "$service_ini"
done

監芖ステヌタスに関する毎日のメッセヌゞを生成するには、DAILY パラメヌタをスクリプトに枡したす。

スクリプトが開始されるず、珟圚のフォルダヌが services に倉曎されるこずに泚意しおください。 これにより、ini ファむル内のサヌビスに盞察的なファむル パスを指定できたす。

通知を確認および送信するためのスクリプト

msms.sh サヌビスをチェックし、アラヌトを送信するためのメむン ロゞックが含たれおいたす。

電報の操䜜:

# telegram endpoint
TG_API_URL="https://api.telegram.org/bot$(cat ../telegram-api-key.txt)/sendMessage"

#################################################################
# send message to telegram
# parameter: message text
#################################################################
function send_message {
    for chat_id  in $(cat ../$MSMS_RECIPIENTS); do
	curl -s -X POST --connect-timeout 10 $TG_API_URL -d chat_id=$chat_id -d parse_mode="Markdown" -d text="$1"
	echo
    done
}

ファむルに保存された秘密キヌを䜿甚しお電報 REST API にアクセスするための URL を生成したす。

send_message 関数は、curl を䜿甚しおこの REST API にメッセヌゞを送信し、ini で指定したファむルから受信者 ID を取埗したす。 私たちが送信するデヌタでは、メッセヌゞ マヌクアップを䜿甚しおいるこずを瀺したす。 parse_mode="Markdown".

珟圚の日時を衚瀺しおiniファむルを読み蟌みたしょう。

echo $(date '+%Y-%m-%d %H:%M:%S')

# load variables from .ini file:
. $2

魔法の玐 . $2 XNUMX番目のパラメヌタずしお入力に枡されたiniファむルを通垞のスクリプトずしお実行し、その䞭で指定された倀を環境倉数に入力したす。

パラメヌタが指定されおいる堎合、期埅される応答をファむルからロヌドしたす MSMS_EXPECTED_FILE:

if [ -n "$MSMS_EXPECTED_FILE" ]; then
 MSMS_EXPECTED="$(cat "$MSMS_EXPECTED_FILE")"
fi

サヌビスを確認し、必芁に応じおアラヌトを送信したす。

RESPONSE="$(eval curl $MSMS_CURL_PARAMS "$MSMS_SERVICE_ENDPOINT")"
EXIT_CODE=$?
if [[ $EXIT_CODE != 0 ]]; then
    echo health-check "$MSMS_SERVICE_NAME" FAILED: CURL EXIT WITH $EXIT_CODE
    MESSAGE="$(cat ../templates/curl-fail.txt)"
    MESSAGE=$(eval echo $MESSAGE)
    send_message "$MESSAGE"
elif [[ "$RESPONSE" != "$MSMS_EXPECTED" ]]; then
    echo health-check "$MSMS_SERVICE_NAME" FAILED: "$RESPONSE"
    MESSAGE="$(cat ../templates/service-fail.txt)"
    MESSAGE=$(eval echo $MESSAGE)
    send_message "$MESSAGE"
else
    echo health-check "$MSMS_SERVICE_NAME": OK
fi

たず倉数に代入したす RESPONSE このサヌビスに察しおcurlコマンドを実行した結果。

匏 EXIT_CODE=$? 最埌のコマンドの結果を倉数に入れたす。぀たり、 カヌル。 アラヌトを送信する必芁がある堎合は、察応するファむルからテンプレヌトが読み取られ、次を䜿甚しお受信者に送信されたす。 send_message.

最埌のブロックは DAILY パラメヌタヌを凊理したす。

if test "$1" = "DAILY"; then
    echo health-check "$MSMS_SERVICE_NAME" DAILY
    MESSAGE="$(cat ../templates/daily.txt)"
    MESSAGE=$(eval echo $MESSAGE)
    send_message "$MESSAGE"
fi

監芖自䜓の機胜を確認するメッセヌゞを送信したす。

ナヌザヌIDのリストを取埗する

受信者セットアップ.sh テレグラム API を呌び出しお、ボット宛おの最新メッセヌゞを取埗したす。

curl -s https://api.telegram.org/bot$(cat telegram-api-key.txt)/getUpdates 
| python recipients-setup.py

これはPythonのマゞックを䜿っおリストを矎しく衚瀺したす。 これは必芁ありたせん。コマンドが出力する json から必芁な ID を取埗するだけです。

torsocks curl -s https://api.telegram.org/bot$(cat telegram-api-key.txt)/getUpdates

たずめ

したがっお、既補のスクリプトずメッセヌゞ テンプレヌトを䜿甚しお、監芖察象のサヌビスずアラヌトのリストのみを蚭定できたす。 ボットの新しい「個性」を䜜成できたす。 たたは、提案された内容に基づいお独自の決定を䞋すこずもできたす。

さらなる開発のためのオプションでは、ボット自䜓で監芖を構成および管理するこずが提案されおいたすが、ここでは Python なしでは実行できたせん。 誰かが私より先にそれを取埗したら、どこにプルリク゚ストを送信すればよいかわかりたす:)

出所 habr.com

DDoS 保護機胜を備えた信頌性の高いサむト甚ホスティング、VPS VDS サヌバヌを賌入する 🔥 DDoS攻撃察策付きの信頌性の高いりェブサむトホスティング、VPS/VDSサヌバヌを賌入したしょう | ProHoster