[bash] 手持ちのファイルがWEB上で更新されていたらメール通知する


最近、今更ながらにawsで遊んでいる (っ´∀`)っ ゃーですこんにちは。Amazon EC2のAPIを手持ちのノートPCにインストールして遊んでいます。こちらのインストール方法については別途投稿しますが、パッケージのアップデートを監視するほうに夢中になって、EC2-API-TOOLSの更新通知スクリプトなんぞ書いてしまいました。

特徴ですが、変数「FILENAME」にファイル名を、変数「URI」にダウンロード元URI(監視対象)を、変数「MAILTO」にメール通知先を指定してあげるだけです。2回以上このスクリプトをキックすると、最大2世代のファイルを持つことになり、md5値のdiffが異なっていたらメール通知するというものです。ソースは以下の通りです。

 

#!/bin/bash
LANG=C
FILENAME=ec2-api-tools.zip                             # 監視対象ファイル名(ローカル)
URI=http://s3.amazonaws.com/ec2-downloads/${FILENAME}  # 監視対象URI
MAILTO=root@example.com                                # メール通知先
TMPDIR=${HOME}/tmp                                     # md5sumテキスト一時保存先
SRCDIR=${HOME}/src                                     # 監視対象ファイル格納先
OLDDIR=${SRCDIR}/old                                   # 古い監視対象ファイル格納先
NEWFILE=${SRCDIR}/${FILENAME}                          # 新しいファイルのフルパス
OLDFILE=${OLDDIR}/${FILENAME}                          # 古いファイルのフルパス
NEWMD5=${TMPDIR}/$(basename $0)_NEWFILEMD5             # 新しいファイルのmd5値を書き込むファイル
OLDMD5=${TMPDIR}/$(basename $0)_OLDFILEMD5             # 古いファイルのmd5値を書き込むファイル

################################################################################
_WGETCHK_() {
    [ ! 0 = $(which wget > /dev/null 2>&1 ; echo $?) ] && 
    echo "wget command is not found" | 
    mail -s "[FAIL] $(date +%Y/%m/%d) $(basename $0) check" ${MAILTO} && exit 1
}

_MD5CHK_() {
    [ ! 0 = $(which md5sum > /dev/null 2>&1 ; echo $?) ] && 
    echo "md5sum command is not found" | 
    mail -s "[FAIL] $(date +%Y/%m/%d) $(basename $0) check" ${MAILTO} && exit 1
}

_MAILCHK_() {
    [ ! 0 = $(which mail > /dev/null 2>&1 ; echo $?) ] && 
    echo "mail command is not found" && exit 1
}

_DIRCHK_() {
    [ ! -d ${OLDDIR} ] && mkdir -p ${OLDDIR}
    [ ! -d ${TMPDIR} ] && mkdir -p ${TMPDIR}
}

_DOWNLOAD_() {
    wget -O ${NEWFILE} ${URI}
}

_NOTIFY_() {
    echo "${FILENAME} is updated" | 
    mail -s "[EC2] $(date +%Y/%m/%d) $(basename $0) check" ${MAILTO}
}
################################################################################

## CHECK COMMANDS and CHECK DIR
_WGETCHK_
_MD5CHK_
_MAILCHK_
_DIRCHK_

## FILE MOVE && DOWNLOAD
[ -f ${NEWFILE} -a ! -f ${OLDFILE} ] && 
mv ${NEWFILE} ${OLDFILE} && _DOWNLOAD_

## FILE DOWNLOAD
[ ! -f ${OLDFILE} -a ! -f ${NEWFILE} ] && _DOWNLOAD_

## OLDFILE md5sum check
[ ! -f ${OLDFILE} ] &&  
md5sum ${OLDFILE} | awk '{print $1}' > ${OLDMD5}

## NEWFILE md5sum check
[ ! -f ${NEWFILE} ] &&  
md5sum ${NEWFILE} | awk '{print $1}' > ${NEWMD5}

## DIFF FILES check
[ ! -f ${OLDMD5} -o ! -f ${NEWMD5} ] && 
echo "MD5 DIFF is FAILED" | 
mail -s "[FAIL] $(date +%Y/%m/%d) $(basename $0) check" ${MAILTO} && exit 1

## DIFF and NOTIFY
[ ! 0 = $(diff ${OLDMD5} ${NEWMD5} > /dev/null 2>&1 ; echo $?) ] && _NOTIFY_

rm -f ${OLDMD5} ${NEWMD5}

いくつかコマンドラインの存在をチェックしてますが、wgetコマンドはCentOS6.3の最小構成インストールではインストールされないのでチェックするようにしています。ifの条件判定を「 -x 」にしても良かったかもですね。mailコマンドの存在確認は、mailxのパッケージがインストールされていないとそもそもメール通知できないので、標準出力にエラーを吐くようにしています。なので、このスクリプトを実行するときは、いきなりメールを確認しようとせずに、ちゃんとターミナルで確認してくださいね(´・ω・`)