固定IPアドレスではなく、動的IPアドレスを利用していると、ルータを再起動してしまうと基本的に新しいIPアドレスが割り当てられます。
自宅にNASやサーバを設定している場合はDDNSなどで対応する場合が多いと思いますが、何らかの理由でDDNSがうまく更新されなかった場合、サーバへのアクセスは困難になってしまうことがあります。
どうしてもアクセスしなければならない場合は、自宅のグローバルIPアドレスを入力するほかないのですが、変更されてしまったグローバルIPアドレスを外出先で知ることは難しいです。
そこで、スマホにインストールされているコミュニケーションアプリ「LINE」を使って、NASのグローバルIPアドレスが変更されたときにLINEに通知してくれるスクリプトを使いましょう。
LINE Notifyとは
「LINE」が提供しているWeb連携サービスで、Webサービスからの通知をLINEで受信できます。
例えば、Gmailでメールを受信した際に、LINEに受信したことを通知するメッセージを送ったり、「IFTTT」というサービスと連携することで、天気予報を通知させたりすることができます。
LINE IDが必要です。
右上の「ログイン」から登録しているメールアドレスとパスワードを入力
ログイン後、右上から「マイページ」を開きます。
アクセストークンを発行
トークンを発行する前に、通知専用のためのLINEグループを作成します。
グループ名はなんでもOKです。
マイページから「トークンを発行する」
トークン名を記入
LINEからのメッセージのタイトルになります。
「IP Notify from NAS」など
次に、先程作った新しいグループを選択してください。
「1:1でLINE Notifyからの通知を受け取る」を選択しても特に問題ないです。
アクセストークンが発行されるのでコピー、メモします。
LINEにはLINE Notifyからのメッセージが届くので、作ったグループに
LINE Notifyを招待して追加してください。
次は、スクリプトに発行したアクセストークンを入力していきます。
通知スクリプトを編集
このスクリプトは私が作成したものではありません。
公開していたサイトが見つからなくなってしまったようなので
問題がありましたら、ご連絡頂けますと幸いです。
#!/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 "$@"
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 "$@"
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にスクリプトを配置します。
タスクスケージューラーで自動通知させる
Synology NASのDSMからコントロールパネルを開きます。
タスクスケジューラーの「作成」、「予約されたタスク」、「ユーザー指定のスクリプト」を選択
「タスク設定」タブを開いて、「コマンドを実行」欄にスクリプトのフルパスを記入。
「スケジュール」タブを開いて
次の期間実行を「毎日」
初回実行時間 「00:00」
スケジュールサイクルを「15分ごと」 (環境によって変えてください)
最終実行時間を「23:45」
「全般」タブで適当なタスク名を設定する
スクリプト実行
スクリプト一覧画面からスクリプトを選んで「実行」する
初回実行時は現在のグローバルIPアドレスがtxtで保存され、LINEに「IPアドレスの監視を開始しました」というメッセージが届けばOKです。
ログファイルの「/volume1/tmp/script/ip-notify.txt」を開いてみるとIPアドレスが保存されているのが分かります。これを少し変更して、IPアドレス変更時の挙動を確認します。
適当に数字を少し変更して保存したあとまたスクリプトを「実行」
すると、LINEからすぐに「IPアドレスが変更されています」とメッセージが届くはずです。
もちろん、IPアドレスが変わらなければメッセージは送られません。
Synology NASでなくてもCronなどに登録すれば利用できると思います。