なかなかまとまらない

サイトのアクセスログをレポートするCGIスクリプトを
つくってみた。

使用したのは sed perl awk grep sh

cgi-bin/cr.cgi

/internalpath/
cr1.awk
cr2.sh
cr3.pl
records.dat
nlist.dat

要件
records.dat には
date¥ENV[REMOTE_ADDRESS]¥ENV[HTTP_REFFERER]
の形でたまっていく。
カウンタ側では収集時には名前の逆引きする機能は持たせず
��REMOTE_HOSTをとれない)、レポート表示時だけ、名前解決させる。
表示するデータ自体は 直近30レコード分もあればよしとしており、
表示する時に名前解決の逆引きをおこなってどこからアクセスしたかを表示させる。
当然毎回逆引きをさせるとDNSへの問い合わせが多数発生して速度もバカバカしくなるので
一時ファイルにキャッシュする。新しいーーしらない ーーIPがレコードに現れたとき
のみ逆引きをして格納する。


cr1.awk
records.datのすべてのレコードから
リファラ アドレス のフィールドのみを
最後から30レコード分をHTML形式で出力する。
cr2.sh
レコードのデータから最後の30行分を読み出し、
そこにでてきたIPでかたっぱしからnlist.datと
grepして、もしマッチしなければcr3.plを呼び出し
IPと逆引き結果をnlist.datへ追記する

#! /bin/sh
DATASTORE=/internalpath/records.dat
NHOSTS=/internalpath/nlist.dat
NLIST=`tail -30 $DATASTORE | awk -F¥¥¥¥ '{print $2 }' `
for remoteip in $NLIST
do
grep $remoteip $NHOSTS >> /dev/null
if [ $? = 0 ]
then
;;
else
/usr/bin/perl /internalpath/cr3.pl $remoteip >> $NHOSTS
fi
done
exit 0;

cr3.pl
第一引数にIPアドレス (#.#.#.#の形式で)を与えて実行すると
s/IPアドレス/gethostbyaddrの結果/g
を返す

#! /usr/bin/perl
use Socket;
$mtarget = $ARGV[0];
$vstr = gethostbyaddr(pack("C4", split(/¥./,$mtarget )), 2) || 'ns-unknown';
print "s/$mtarget/$vstr/g¥n";

cr.cgi
cr2.shを実施し、知らないIPを逆引きし, nlist.datに記録
cr1.awkを実行してさらにさきほどのこしたnlist.datをsedのコマンドファイルとして読み込み

#! /bin/sh
# update hosts cache
/bin/sh /internalpath/cr2.sh
# print text
awk -f /internalpath/cr1.awk | sed -f /internalpath/nlist.dat

コメント

このブログの人気の投稿

4.3.0 Temporary Lookup Failureでドツボってた話

tomcat起動時の環境変数でJRE_HOMEを指定するときに

何が得られて何処へ向かうかだけを問うべき