LINE Notifyを使ってサーバーのIPアドレス変更時にLINEに通知させる Synology NAS

固定IPアドレスではなく、動的IPアドレスを利用していると、ルータを再起動してしまうと基本的に新しいIPアドレスが割り当てられます。

自宅にNASやサーバを設定している場合はDDNSなどで対応する場合が多いと思いますが、何らかの理由でDDNSがうまく更新されなかった場合、サーバへのアクセスは困難になってしまうことがあります。

どうしてもアクセスしなければならない場合は、自宅のグローバルIPアドレスを入力するほかないのですが、変更されてしまったグローバルIPアドレスを外出先で知ることは難しいです。

そこで、スマホにインストールされているコミュニケーションアプリ「LINE」を使って、NASのグローバルIPアドレスが変更されたときにLINEに通知してくれるスクリプトを使いましょう。

LINE Notifyとは

「LINE」が提供しているWeb連携サービスで、Webサービスからの通知をLINEで受信できます。

例えば、Gmailでメールを受信した際に、LINEに受信したことを通知するメッセージを送ったり、「IFTTT」というサービスと連携することで、天気予報を通知させたりすることができます。

LINE IDが必要です。

LINE Nofityを開く

右上の「ログイン」から登録しているメールアドレスとパスワードを入力

ログイン後、右上から「マイページ」を開きます。

アクセストークンを発行

トークンを発行する前に、通知専用のためのLINEグループを作成します。

グループ名はなんでもOKです。

マイページから「トークンを発行する

\

トークン名を記入

LINEからのメッセージのタイトルになります。
「IP Notify from NAS」など

次に、先程作った新しいグループを選択してください。

「1:1でLINE Notifyからの通知を受け取る」を選択しても特に問題ないです。

アクセストークンが発行されるのでコピー、メモします。

LINEにはLINE Notifyからのメッセージが届くので、作ったグループに
LINE Notifyを招待して追加してください。

次は、スクリプトに発行したアクセストークンを入力していきます。

通知スクリプトを編集

このスクリプトは私が作成したものではありません。

公開していたサイトが見つからなくなってしまったようなので
問題がありましたら、ご連絡頂けますと幸いです。

line_ip.sh

#!/bin/bash

# IPアドレスを保存するテキストファイルのフルパス
readonly FILE_PATH="/volume1/xxx/LINE_Last_Address.txt"
# LINE Notifyのパーソナルアクセストークン
readonly TOKEN="アクセストークン"
# LINEへの通知に追記するURL 不要なら空にしておく
#readonly NOTIFICATION_URL="workflow://run-workflow?name=LINE%20to%20URL&input="
readonly NOTIFICATION_URL=""


readonly URL_ARR=("inet-ip.info" "ipcheck.ieserver.net")
#readonly URL_ARR=("ifconfig.io" "inet-ip.info" "ipcheck.ieserver.net")
#ifconfig.io はIPv6も返す?

function get_address() {
    curl -Ss -f "$1"
}

function post_to_line() {
    for line in "[email protected]"
    do
        local joined_str+="\n$line"
    done
    local body=$(echo -e "$joined_str")
    curl -f -X POST \
        -H "Authorization: Bearer $TOKEN" \
        -F "message=$body" \
        https://notify-api.line.me/api/notify
}

function notify_mac() {
    osascript -e '
        on run argv
            set the_message to (item 1 of argv) & return & (item 2 of argv)
            display notification the_message with title "IPアドレス監視スクリプトより通知" sound name "Basso"
        end run
    ' "$1" "$2"
}

function save_txt() {
    : > "$FILE_PATH"
    for line in "[email protected]"
    do
        echo "$line" >> "$FILE_PATH" 
    done
}

if [ ! -e "$FILE_PATH" ]; then
    save_txt "0.0.0.0" "0"
fi

readonly LAST_ADDRESS=$(sed -n 1p "$FILE_PATH")
error_times=$(sed -n 2p "$FILE_PATH")

for url in "${URL_ARR[@]}"
do
    current_address=$(get_address "$url")
    if [ $? != 0 ] || [ -z "$current_address" ]; then
        current_address="fail"
    else
        break
    fi
done

if [ $LAST_ADDRESS = "0.0.0.0" ]; then
    if [ "$current_address" = "fail" ]; then
        message="IPアドレスの取得に失敗しました。"
        post_to_line "$message"
        if [ $? != 0 ]; then
            message1="IPアドレスの取得に失敗しました。"
            message2="LINEへの通知に失敗しました。"
            notify_mac "$message1" "$message2"
        fi
    else
        message="IPアドレスの監視を開始しました。"
        post_to_line "$message"
        if [ $? != 0 ]; then
            message1="NASNASのIPアドレスの監視を開始しました。"
            message2="LINEへの通知に失敗しました。"
            notify_mac "$message1" "$message2"
        fi
        save_txt "$current_address" "0"
    fi
elif [ "$current_address" = "fail" ]; then
    ((error_times++))
    if [ "$error_times" -ge 5 ]; then
        message="IPアドレスの取得に${error_times}回続けて失敗しました。"
        post_to_line "$message"
        if [ $? != 0 ]; then
            message1="IPアドレスの取得に${error_times}回続けて失敗しました。"
            message2="LINEへの通知に失敗しました。"
            notify_mac "$message1" "$message2"
        fi
        save_txt "$LAST_ADDRESS" "0"
    else
        save_txt "$LAST_ADDRESS" "$error_times"
    fi
elif [ "$current_address" != "$LAST_ADDRESS" ]; then
    if [ -z "$NOTIFICATION_URL" ]; then
        url=""
    elif [ $(echo "$NOTIFICATION_URL" | grep -E '^workflow') ]; then
        url="$NOTIFICATION_URL$current_address"
    else
        url="$NOTIFICATION_URL"
    fi
    message_arr=("NASNASのIPアドレスが変更されています。" "前のアドレス" \
        "$LAST_ADDRESS" "現在のアドレス" "$current_address" "$url")
    post_to_line "${message_arr[@]}"
    if [ $? != 0 ]; then
        message1="IPアドレスが変更されています。LINEへの通知に失敗しました。"
        message2="[新しいアドレス]$current_address"
        notify_mac "$message1" "$message2"
    fi
    save_txt "$current_address" "0"
else
    save_txt "$current_address" "0"
fi

変更する場所

1. IPアドレスを保存するテキストファイルのフルパス

readonly FILE_PATH="[ログファイルまでのフルパス]"

例)
readonly FILE_PATH="/volume1/tmp/script/ip-notify.txt"

2. LINE Notifyのパーソナルアクセストークン
先程作成したアクセストークンを入力します。

readonly TOKEN="[アクセストークン]"

サーバにアップロード

NASにスクリプトを配置します。

/volume1/tmp/script/ip-notify.sh

タスクスケージューラーで自動通知させる

Synology NASのDSMからコントロールパネルを開きます。

タスクスケジューラーの「作成」、「予約されたタスク」、「ユーザー指定のスクリプト」を選択

「タスク設定」タブを開いて、「コマンドを実行」欄にスクリプトのフルパスを記入。

/volume1/tmp/script/ip-notify.sh

「スケジュール」タブを開いて

次の期間実行を「毎日

初回実行時間 「00:00

スケジュールサイクルを「15分ごと」 (環境によって変えてください)

最終実行時間を「23:45

「全般」タブで適当なタスク名を設定する

スクリプト実行

スクリプト一覧画面からスクリプトを選んで「実行」する

初回実行時は現在のグローバルIPアドレスがtxtで保存され、LINEに「IPアドレスの監視を開始しました」というメッセージが届けばOKです。

ログファイルの「/volume1/tmp/script/ip-notify.txt」を開いてみるとIPアドレスが保存されているのが分かります。これを少し変更して、IPアドレス変更時の挙動を確認します。

適当に数字を少し変更して保存したあとまたスクリプトを「実行」

すると、LINEからすぐに「IPアドレスが変更されています」とメッセージが届くはずです。

もちろん、IPアドレスが変わらなければメッセージは送られません。

Synology NASでなくてもCronなどに登録すれば利用できると思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です