#!/bin/bash set -ue LANG=C LC_ALL=C ##--@--## 引数が3つでなければ異常終了させる [ ! 3 = $# ] && exit 1 URI=$1 # URL CHAIN=$2 # チェーン名識別子 STORE=$3 # 店舗名識別子 MAILTO=${USER} # メール通知先 PROGNAME=$(basename $0) FQDN=$(echo ${URI} | awk 'BEGIN {FS="/"} {print $3}') TODAY=$(date +%Y%m%d) YDAY=$(date +%Y%m%d --date="1 days ago") THISMON=$(date +%Y%m) LASTMON=$(date +%Y%m --date="1 month ago") FULLDATE="$(date "+%Y/%m/%d %H:%M:%S")" TMPDIR=${HOME}/tmp TMPHEADER=${TMPDIR}/${PROGNAME}_${FQDN}_HEADER_$$ TMPHTML=${TMPDIR}/${PROGNAME}_${FQDN}_HTML_$$ UPDIR=${HOME}/Dropbox/${PROGNAME}/${CHAIN}/${STORE} UPFILE=${UPDIR}/${TODAY}_${CHAIN}_${STORE}.pdf LOGDIR=${HOME}/Dropbox/${PROGNAME}/logs NOWLOG=${LOGDIR}/${PROGNAME}_${THISMON}.log OLDLOG=${LOGDIR}/${PROGNAME}_${LASTMON}.log FLAGDIR=${HOME}/Dropbox/${PROGNAME}/flags/${CHAIN}/${STORE} FLAGFILE=${FLAGDIR}/LASTMSG.txt ##--@--## ログディレクトリと一時ファイル用ディレクトリとフラグディレクトリがなければ作成する mkdir -p ${LOGDIR} ${TMPDIR} ${FLAGDIR} ##--@--## 先月ぶんのログがあればgzip圧縮する [ -f ${OLDLOG} ] && gzip ${OLDLOG} ##--@--## 変数URIがhttpで始まっていなければ異常終了させる [ ! http:// = $(echo ${URI} | cut -b -7) ] && exit 1 ##--@--## 取得対象URIのステータスコードが[23]xx以外だったら異常終了させる STATUS=$(curl -LIs -w %{http_code} -o /dev/null ${URI}) [ ${STATUS} -ge 200 -a ${STATUS} -le 399 ] || exit 1 ##--@--## PDFへリンクしているページのヘッダーとコンテンツを一時ファイルに取得する curl -LIs ${URI} > ${TMPHEADER} curl -Ls ${URI} > ${TMPHTML} if [ 0 = $(grep ^Last-Modified: ${TMPHEADER} > /dev/null ; echo $?) ]; then ##--@--## PDFへリンクしているページのLast-Modifiedの日時が取得できれば、これをUNIXTIMEに変換して変数LASTMODに格納する LASTMOD=$(date +%s "--date=$(cat ${TMPHEADER} | \ grep ^Last-Modified: | \ awk '{print $5"/"$4"/"$3,$6,$7}' | \ sed -e "s/Jan/01/;s/Feb/02/;s/Mar/03/;\ s/Apr/04/;s/May/05/;s/Jun/06/;\ s/Jul/07/;s/Aug/08/;s/Sep/09/;\ s/Oct/10/;s/Nov/11/;s/Dec/12/")") ##--@--## 取得対象URIの更新日時をログに記録する echo -e "\ $(LANG=C date "+%Y/%m/%d\t%H:%M:%S")\t\ ${HOSTNAME}\t\ ${PROGNAME}[${$}]:\t\ ${CHAIN}\t\ ${STORE}\t\ ${URI}\t\ Last-Modified\t\ $(echo ${LASTMOD} | \ awk '{print strftime("%Y-%m-%d""\t""%H:%M:%S",$1)}')\t\ ${LASTMOD}" | tee -a ${NOWLOG} else ##--@--## PDFへリンクしているページのLast-Modifiedの日時が取得できない場合は、ファイル TMPHTML のmd5sum値を変数LASTMODに格納する LASTMOD=$(md5sum ${TMPHTML} | awk '{print $1}') ##--@--## 取得対象URIのmd5sumをログに記録する echo -e "\ $(LANG=C date "+%Y/%m/%d\t%H:%M:%S")\t\ ${HOSTNAME}\t\ ${PROGNAME}[${$}]:\t\ ${CHAIN}\t\ ${STORE}\t\ ${URI}\t\ md5sum\t\ ${LASTMOD}" | tee -a ${NOWLOG} fi ##--@--## 前回実行時のLASTMODを変数LAST0に格納する LAST0=$(cat ${NOWLOG} | grep ${URI} | tail -n 2 | head -n 1 | awk '{print $NF}') ##--@--## 今回実行時のLASTMODを変数LAST1に格納する LAST1=$(cat ${NOWLOG} | grep ${URI} | tail -n 1 | awk '{print $NF}') ##--@--## 一時ファイルを削除する rm -f ${TMPHEADER} ${TMPHTML} ##--@--## 前回実行時と更新日時が合致しなければ(更新を検知すれば)、PDFにリンクしているページの更新をメール通知し、フラグファイルを生成する。更新を検知しなければ特に何もしない。 if [ ! ${LAST0} = ${LAST1} ]; then LANG=ja_JP.utf8 ; export LANG # gmailのnoname対策で文字コードを一時的に日本語にする LC_ALL=ja_JP.utf8 ; export LC_ALL # gmailのnoname対策で文字コードを一時的に日本語にする echo -e "${CHAIN} ${STORE} のページが更新されました\n${FULLDATE}\n${URI}\n" | tee ${FLAGFILE} | \ mail -s "[${PROGNAME}] ${FULLDATE} Notification" ${MAILTO} LANG=C ; export LANG # 文字コードを元に戻す LC_ALL=C ; export LC_ALL # 文字コードを元に戻す fi ##--@--## 巡回先にチラシPDFがリンクされていなければ異常終了させる [ ! 0 = $(curl -s ${URI} | grep -iv adobe | grep -i href | grep -i pdf > /dev/null ; echo $?) ] && exit 1 ##--@--## すでにまとめチラシが生成されていれば異常終了させる [ -f ${UPFILE} ] && exit 1 ##--@--## PDFのURIを変数に格納する DIRNAME=$(dirname $(dirname ${URI}) | sed -e "s/\//\\\\\//g") PDFURI=() PDFURI=($(curl -s ${URI} | \ nkf -w | \ grep -i pdf | \ grep -iv adobe | \ awk '{for (i=1;i<=NF;i++) {if ($i ~ /pdf/) IGNORECASE = 1; {print $i}}}' | \ grep -i "href" | \ sed -e "s/href=\"\.\./${DIRNAME}/i;s/\"//i" )) ##--@--## リンクされたPDFのURIごとにループさせて巡回取得する for A in ${PDFURI[@]} do ##--@--## PDF格納ディレクトリ名に日付を加えたものを ${HOME}/tmp 配下に作成する DATEDIR=$(dirname ${A} | \ sed -e "s/$/\/${TODAY}/" | \ sed -e "s/http:\//$(echo ${HOME} | \ sed -e "s/\//\\\\\//g")\/tmp/") mkdir -p ${DATEDIR} ##--@--## ファイル名を取り出し、${DATEDIR} 配下に保存する BASENAME=$(basename ${A}) TODAYPDF=${DATEDIR}/${BASENAME} YDAYPDF=$(echo ${DATEDIR} | sed -e "s/${TODAY}/${YDAY}/")/${BASENAME} curl -o ${TODAYPDF} ${A} TODAYPDFSUM=$(md5sum ${TODAYPDF} | awk '{print $1}') YDAYPDFSUM=$(md5sum ${YDAYPDF} | awk '{print $1}') ##--@--## 前日のPDFがなければ ${UPDIR}/プロセスID を作成し、ダウンロードしたPDFファイルをコピーする if [ ! -f ${YDAYPDF} ]; then FILETYPE=$(file ${DATEDIR}/${BASENAME} | grep "PDF document" | awk '{print $2}') mkdir -p ${UPDIR}/${$} if [ ${FILETYPE} = PDF ]; then cp -p ${DATEDIR}/${BASENAME} ${UPDIR}/${$}/ fi else if [ ! ${TODAYPDFSUM} = ${YDAYPDFSUM} ]; then FILETYPE=$(file ${DATEDIR}/${BASENAME} | grep "PDF document" | awk '{print $2}') mkdir -p ${UPDIR}/${$} if [ ${FILETYPE} = PDF ]; then cp -p ${DATEDIR}/${BASENAME} ${UPDIR}/${$}/ fi fi fi done ##--@--## もし${UPDIR}/プロセスID ができていればPDFを1枚にまとめる if [ -d ${UPDIR}/${$} ]; then pdftk ${UPDIR}/${$}/* cat output ${UPFILE} fi ##--@--## ${UPFILE} 生成結果をログに記録し、メール送信と後処理を行う if [ -f ${UPFILE} ]; then ##--@--## PDFまとめ結果をログに格納する echo -e "\ $(LANG=C date "+%Y/%m/%d\t%H:%M:%S")\t\ ${HOSTNAME}\t\ ${PROGNAME}[${$}]:\t\ ${CHAIN}\t\ ${STORE}\t\ $(basename $(dirname ${UPFILE}))/$(basename ${UPFILE})\t\ PDF Created\t\ $(md5sum ${UPFILE} | awk '{print $1}')" | tee -a ${NOWLOG} ##--@--## PDFまとめ結果をメール送信する LANG=ja_JP.utf8 ; export LANG # gmailのnoname対策で文字コードを一時的に日本語にする LC_ALL=ja_JP.utf8 ; export LC_ALL # gmailのnoname対策で文字コードを一時的に日本語にする echo -e "${CHAIN} ${STORE} のチラシが更新されました\n${FULLDATE}\n" | \ mail -s "[${PROGNAME}] ${FULLDATE} PDF Created" ${MAILTO} LANG=C ; export LANG # 文字コードを元に戻す LC_ALL=C ; export LC_ALL # 文字コードを元に戻す ##--@--## テンポラリディレクトリを削除する rm -fr ${UPDIR}/${$} fi