サイト死活監視スクリプトの機能拡張 – メール通知フラグと多次元配列の導入

前回までの死活監視スクリプトでは、指定したサイトが正常に稼働しているかどうかをチェックし、異常時にメールやChatworkで通知を行っていました。今回は、このスクリプトに メール通知のフラグ を追加し、多次元配列風にサイト情報を管理 するように改修しました。これにより、サイトごとに通知の有無を設定できるようになり、コードもより管理しやすくなっています。

追加した新機能

  1. メール通知のフラグ
    各サイトごとに、メール通知を行うかどうかを決めるフラグを追加しました。このフラグを true に設定するとメールが送信され、false の場合にはメール通知が行われません。これにより、必要なサイトのみメール通知が可能になります。
  2. 多次元配列風のデータ構造
    Bashではネイティブな多次元配列はサポートされていませんが、連想配列のキーに工夫を加えることで擬似的に多次元配列を実現しました。各サイトのデータ(URL、メールアドレス、通知フラグ)をまとめて管理できるようになり、コードの見通しが良くなります。

改修後の設定ファイル構成

新しい設定方法では、サイト情報を多次元配列風にまとめています。以下の例では、サイト名を site_key として使い、各サイトのURL、メールアドレス、通知フラグを格納しています。

# サイト情報の宣言

# 各サイトの設定
site_key="exampleSite1"
sites["$site_key.url"]="https://example1.com/"
sites["$site_key.email"]="contact1@example.com"
sites["$site_key.notify"]="true"

site_key="exampleSite2"
sites["$site_key.url"]="https://example2.com/"
sites["$site_key.email"]="contact2@example.com"
sites["$site_key.notify"]="false"

改修後のスクリプト

以下が、新しい設定を反映した死活監視スクリプトのコードです。

#!/bin/bash

# パラメーターで指定された会社名を取得
company="$1"

# 配列の宣言
declare -A sites

# 設定ファイルのパスを作成
config_file="$(dirname "$0")/config_${company}.sh"

# 設定ファイルが存在するかチェック
if [[ ! -f "$config_file" ]]; then
    echo "エラー: 設定ファイル '${config_file}' が見つかりません。"
    exit 1
fi

# 設定ファイルの読み込み
source "$config_file"

# 実行開始時間の取得
start_time=$(date "+%Y-%m-%d %H:%M:%S")

# メール通知関数
send_email() {
    local site=$1
    local emails=$2
    local status_code=$3
    local status_message=$4
    local subject="【サイト監視】$site は$status_message (HTTPステータスコード: $status_code)"
    local body="【サイト監視結果】\n\n日時: $start_time\n\n対象サイト: $site\n状態: $status_message\nHTTPステータスコード: $status_code\n\nご確認ください。"

    # メール送信 (BCCに当社のメールアドレスを追加)
    echo -e "$body" | mail -s "$subject" -b "$bcc_email" "$emails"
}

# サマリー通知用の変数
summary_subject="【サイト監視サマリー】全サイトの状態レポート"
summary_body="【サイト監視結果サマリー】\n\n日時: $start_time\n\n監視結果:\n\n"
alert_needed=false  # 異常検知のフラグ
alert_summary_body="【サイト監視異常通知】\n\n日時: $start_time\n\n異常検知されたサイト:\n\n"

# サイトの死活監視
declare -A processed

for key in "${!sites[@]}"; do
    # site_keyをキーから抽出
    site_key="${key%%.*}"

    # 同じサイトを一度だけ処理
    if [[ -z "${processed[$site_key]}" ]]; then
        url="${sites[$site_key.url]}"
        emails="${sites[$site_key.email]}"
        email_notify="${sites[$site_key.notify]}"
        processed[$site_key]=1  # 処理済みマークを設定

        # curlを使ってサイトのHTTPステータスコードを取得
        status_code=$(curl -o /dev/null -s -w "%{http_code}" "$url")

        # ステータスコードによる通知内容の判断
        if [[ "$status_code" == "200" || "$status_code" == "301" || "$status_code" == "302" ]]; then
            status_message="正常に稼働中"
            # 正常時の通知
            if [[ "$email_notify" == "true" && -n "$emails" ]]; then
                send_email "$url" "$emails" "$status_code" "$status_message"
            fi
        else
            # 異常時の通知メッセージを設定
            if [[ "$status_code" == "503" ]]; then
                status_message="サービスが一時的に利用できません"
            else
                status_message="ダウンしています"
            fi
            
            # メール通知の条件確認
            if [[ "$email_notify" == "true" && -n "$emails" ]]; then
                send_email "$url" "$emails" "$status_code" "$status_message"
            fi
            alert_needed=true
            alert_summary_body+="$url\n  状態: $status_message\n  ステータスコード: $status_code\n\n"
        fi

        # サマリーの内容を追加
        summary_body+="$url\n  状態: $status_message\n  ステータスコード: $status_code\n\n"
    fi
done

# サマリー通知の送信 (メール)
echo -e "$summary_body" | mail -s "$summary_subject" -b "$bcc_email" "$bcc_email"

# サマリー通知の送信 (Chatwork)
encoded_summary_body=$(echo -e "$summary_body" | sed ':a;N;$!ba;s/\n/%0A/g')
curl -X POST -H "X-ChatWorkToken: $chatwork_api_token" \
    -d "body=$encoded_summary_body" \
    "https://api.chatwork.com/v2/rooms/$chatwork_room_id/messages"

# 異常が検知された場合、追加のChatworkとメール通知を実行
if [ "$alert_needed" = true ]; then
    # 異常通知の送信 (メール)
    echo -e "$alert_summary_body" | mail -s "【サイト監視異常通知】異常が検知されました" "$alert_email"

    # 異常通知の送信 (Chatwork)
    encoded_alert_summary_body=$(echo -e "$alert_summary_body" | sed ':a;N;$!ba;s/\n/%0A/g')
    curl -X POST -H "X-ChatWorkToken: $chatwork_api_token" \
        -d "body=$encoded_alert_summary_body" \
        "https://api.chatwork.com/v2/rooms/$alert_chatwork_room_id/messages"
fi

スクリプトの動作確認

改修したスクリプトは、以下の流れで動作します。

  1. サイトの死活監視を行い、HTTPステータスコードを確認。
  2. 各サイトの通知フラグを確認し、通知フラグが true かつメールアドレスが設定されている場合のみ、異常時にメール通知を実行。
  3. サマリー通知は、個別の通知設定に関係なく、すべてのサイトの状況をまとめてメールとChatworkに送信。

まとめ

今回の改修によって、各サイトごとにメール通知の有無を設定できるようになり、必要なサイトのみ通知を行う柔軟な構成が実現しました。また、サイト情報を多次元配列風に管理することで、スクリプトの可読性と管理性も向上しています。

関連記事

コメント

タイトルとURLをコピーしました