*はじめに
awstatsを導入して、cronで自動アップデートは行ってます。
Mac OSX付属のsayコマンド使って更新通知を音声で通知するスクリプトを作った。
でも、アクセス頻度は少ないのに定期的に音声通知があると、逆に五月蠅い。
その対策とcronに仕掛けるスクリプトを一本化した。
(複数のアクセスログをアップデートするとcronの記述も複数必要なのが面倒
なのと、アクセス頻度を簡易的にコマンドで見れればとちょい機能を加えた)
Mac OSX (Leopard)のみ動作確認済みです。(動作保証しません)
ー2009.03.19 ${LOG}に保存する日付を変更、${SMZ_LogFile}の更新日付を保存する様にした。
/var/log/awstats_cron.log の設定値を古くするか、ファイル削除が必要。
ー2009.06.17 過去修正を反映:スクリプトやcron実行方法
対策
- リモート側(FreeBSD)から定期的にMac OSX側の対策スクリプトを起動する。
- MacOSX側の対策スクリプト内容は以下の通り。
- < ユーザ名A>はsudoでパスワード入力無しで以下のスクリプトが実行できる状態であること。
- アクセスログの更新日時を保存しておき、今回のアクセスログの更新日時と不一致するならば、awstatsでログ解析をする。
- アクセスログは /var/log/awstats_cron.log に記録。(アクセスログの更新日を記録)
- MacOSXのCronは使用しない。 エラーログが発生するので仕掛け変更する
準備
MacOSX側
- awstats.< 任意>.confへ追加変数(SMZ_LogFile)を追加する。
追加変数 値 備考 SMZ_LogFile ログファイル名 mailのログ解析ではLogFilesの設定が異なるため - SMZ_LogFileの記述例 (awstat.smz.blogdns.com.conf)
SMZ_LogFile="/path/to/httpd.access_log"
- SMZ_LogFileの記述例 (awstat.smz.blogdns.com.conf)
- < ユーザ名A>のパスワード入力無しのsudo設定をする。
FreeBSD側
- Cronで実行するスクリプト準備(例:/root/bin/awstat.sh)
#!/bin/sh ssh <macosx 側ホスト名> sudo /var/root/bin/awstats_update.sh
- Cron 設定(/etc/crontab)
*/10 * * * * < ユーザ名A> /root/bin/awstat.sh > /dev/null 2>&1
MacOSX/FreeBSD側両方
対策スクリプト
- 基本的にrootユーザで実行することを前提としている。
- 一般ユーザで更新状況を参照することのみとする。(以下、実行例)
$ /var/root/bin/awstat_update.sh -l ============================================== Now: 2009年 6月17日 水曜日 15時34分37秒 JST =====[last]======|==========[site]============= 20090617 15:23:36 smz.blogdns.com 20090617 14:55:11 mail 20090607 16:42:47 localhost
[last]:最近のアクセス日時
[site]:該当サイト名
ログ内容(/var/log/awstat_cron.log)
サイト別にawstatで更新した日付を保存する。
checked_localhost=20090607_16:42:47 checked_mail=20090617_14:55:11 checked_smz_blogdns_com=20090617_15:35:51
スクリプト(/var/root/bin/awstats_update.sh)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 | #!/bin/sh # $Id: awstats_update.sh,v 1.6 2009/03/25 19:56:12 shimizu Exp $ #----------------------------- #TMP=${TMP:-/tmp} PATH="/opt/local/bin:$PATH:/sbin" AWSTATSDIR=/opt/local/www/awstats/cgi-bin LOG=/var/log/awstats_cron.log # このスクリプトが更新日付を保存するログ。 LANG=ja_JP.UTF-8 SITELIST="smz.blogdns.com localhost mail" # SITELIST の名前は、awstat.< ここ>.conf を示す。 export PATH export LANG _opt_update="-update" _opt_debug=0 _opt_force=0 _opt_say=1 _opt_view=0 case $1 in -c) # create _opt_update="" ;; -d) # debug _opt_debug=1 ;; -f) # It compulsorily executes it. _opt_force=1 ;; -l) # Refer to the final access situation. _opt_view=1 ;; -ns) # Don't useing say command. _opt_say=0 ;; *) # say Awstat.log being renewed now. ;; esac function decho # ... { if [[ ${_opt_debug} = 1 ]] ; then echo $* fi } unction getDate # <file> <ret> { typeset _file=$1 typeset _isDate=""; if [[ -f ${_file} ]] ; then _isDate=$("ls" -lT ${_file} | awk '{ printf("%04s%02s%02s_%s",$9 ,$6 ,$7,$8) }') fi eval $2=${_isDate} } function changeKeyValue # <file> <key> <val> { typeset _file=$1 typeset _key=$2; typeset _val=$3; typeset _tmp=${TMP}/${_file}.$$ sed "s/^${_key}=\([^.]*\)/${_key}=${_val}/g" ${_file} > ${_tmp} mv ${_tmp} ${_file} } function checkStart # <site> <log> { typeset _site=$1 typeset _log=$2 typeset _key="checked_$(echo ${_site} | sed 's/\./_/g')" typeset _log_date typeset _before_log_date typeset -i _bval typeset -i _aval typeset _ret=0; if [[ ${_opt_force} = 1 ]] ; then return 1 fi eval _before_log_date=\$"${_key}" _bval=$( echo ${_before_log_date} | sed 's/[_:]//g') getDate ${_log} _log_date _aval=$( echo ${_log_date} | sed 's/[_:]//g') decho "START ##########################################" decho "_log=${_log}" decho "_log_date=${_log_date} , _aval=${_aval}" decho "key=${_key}" decho "_before_log_date=${_before_log_date}, _bval=${_bval}" decho "${_bval}(before) =?= ${_aval}(after)" if [[ ${_bval} = 0 ]] ; then echo "${_key}=${_log_date}" >> ${LOG} _ret=1 elif [[ ${_bval} -lt ${_aval} ]] ; then changeKeyValue ${LOG} ${_key} ${_log_date} _ret=1 fi decho "END ##########################################" return ${_ret} } function execSay # <site> { typeset _site=$1 if [[ _opt_say -eq 1 ]] ; then say -v Vicki ${_site} was updated from Awstat Cron. # say -v 'Bad News' ${_site} was updated from Awstat Cron. fi } function viewSite { typeset _site; typeset _date; if [[ -r ${LOG} ]] ; then echo "==============================================" echo "Now: $(date) " echo "=====[last]======|==========[site]=============" IFS='=' (cat ${LOG} | sort -r -t= -k2) | while read _site _date ; do _date=$(echo ${_date} | sed -l 's/_/ /g') _site=$(echo ${_site} | sed 's/^checked_//g' | sed 's/_/\./g') echo "${_date} ${_site}" done else echo "Don't Read ${LOG}" fi } if [[ ${_opt_view} = 1 ]] ; then if [[ -r ${LOG} ]] ; then viewSite fi exit 0; fi if [[ $(id -u) != 0 ]] ; then echo "Don't excecution. Only root user" exit 0; fi if [[ ! -f ${LOG} ]] ; then touch ${LOG} chmod 644 ${LOG} else . ${LOG} fi "cd" ${AWSTATSDIR} for _site in ${SITELIST} ; do eval "$(grep ^SMZ_LogFile awstats.${_site}.conf| sed 's/\"//g')" checkStart ${_site} ${SMZ_LogFile} if [[ $? = 1 ]] ; then if [[ ${_opt_debug} = 1 ]] ; then (./awstats.pl -config=${_site} ${_opt_update}) else (./awstats.pl -config=${_site} ${_opt_update}) > /dev/null 2>&1 # ./awstats.pl -config=${_site} ${_opt_update} fi execSay ${_site} fi done exit 0; |
最近のコメント