なかなかまとまらない
サイトのアクセスログをレポートする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へ追記する
cr3.pl
第一引数にIPアドレス (#.#.#.#の形式で)を与えて実行すると
s/IPアドレス/gethostbyaddrの結果/g
を返す
cr.cgi
cr2.shを実施し、知らないIPを逆引きし, nlist.datに記録
cr1.awkを実行してさらにさきほどのこしたnlist.datをsedのコマンドファイルとして読み込み
つくってみた。
使用したのは 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
コメント
コメントを投稿
「コメントを投稿できるユーザー」の範囲は変更される可能性があります。