#!/usr/bin/perl ;######################## ;#WebPackHP管理システム # ;# ログ蓄積 # ;# Created by Chief # ;# Created at 04/12/22# ;# Modified at 05/02/11# ;######################## ;#●共通スクリプト読込 require 'include.cgi'; ;#●アクセスライブラリ require $hp_value::DIR_LIB.'/'.$hp_value::LIB_ACCESS; ;#●フォーム処理 %FORM=&webpack'decode(); ;#●ログ設定読み込み ($FLAG,$MODE,$CULUM,$EXPIRE) = &hp_lib'logConfGet($FORM{'ClientName'}); ;#●機能分割 if($FORM{'mode'} eq 'count'){ #解析用ログの追加(カウンタ表示あり) &count(); }elsif($FORM{'mode'} eq 'count_no_show'){ &count(); }elsif($FORM{'mode'} eq 'page'){ #解析用ログの追加(ページ用) &page(); } ;#空白出力 @array = ( "47","49","46","38","39","61","01", "00","01","00","80","01","00","00", "00","00","ff","ff","ff","21","f9", "04","01","00","00","01","00","2c", "00","00","00","00","01","00","01", "00","40","02","02","4c","01","00", "3b"); print "Content-type: image/gif\n\n"; foreach (@array) { $data = pack('C*',hex($_)); print $data; } exit; ;#●解析ログ追加&カウンタ表示 sub count{ ;#変数確保 my($count); my($HTTP_REFERER,$HTTP_USER_AGENT,$OS,$REMOTE_HOST,$REMOTE_ADDR); local(@BASE_LOG); ;#現在時刻を取得 my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=&hp_lib'set_date; $Date=sprintf("%04d:%02d:%02d:%02d:%02d:%02d",$year,$mon,$mday,$hour,$min,$sec); ;#ユーザ環境判定 ($REMOTE_HOST,$HTTP_REFERER,$HTTP_USER_AGENT,$OS)=&hp_access'analize(0,$ENV{'HTTP_REFERER'},$ENV{'REMOTE_HOST'},$ENV{'REMOTE_ADDR'},$ENV{'HTTP_USER_AGENT'}); ;#ログの読み込み $count=&hp_disk'load_new($hp_value::DIR_DATA.'/'.$FORM{'ClientName'}.'/'.$hp_value::DIR_LOG.'/'.$hp_value::FILE_ACCESS,$hp_value::DOCS_ACCESS,*BASE_LOG); if($count==0){@BASE_LOG=();} ;#ログを追加 push(@BASE_LOG,",".$Date.",".$REMOTE_HOST.",".$HTTP_USER_AGENT.",".$OS.","."\n"); $count++; ;#ログの記録 &hp_disk'make($hp_value::DIR_DATA.'/'.$FORM{'ClientName'}.'/'.$hp_value::DIR_LOG.'/'.$hp_value::FILE_ACCESS,$hp_value::DOCS_ACCESS,*BASE_LOG); if($FORM{'mode'} eq 'count_no_show'){return;} ;#HTMLを出力 &webpack'html_head(''); print<<"EOF"; EOF print"\t"; if($MODE == 0){ #テキストモード for($i=0;$i<$CULUM-length($count);$i++){ print"0"; } print $count; }elsif($MODE == 1){ #グラフィカルモード for($i=0;$i<$CULUM-length($count);$i++){ print "\"0\""; } foreach (0..length($count)-1) { my($img) = substr($count,$_,1); print "\"".$img."\""; } } print"\n"; print<<"EOF"; EOF exit; } ;#●解析ログ追加 sub page{ ;#変数確保 my($fname); local(@BASE_LOG); my($HTTP_REFERER,$HTTP_USER_AGENT,$OS,$REMOTE_HOST,$REMOTE_ADDR); ;#現在時刻を取得 my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=&hp_lib'set_date; $Date=sprintf("%04d:%02d:%02d:%02d:%02d:%02d",$year,$mon,$mday,$hour,$min,$sec); ;#ユーザ環境判定 ($REMOTE_HOST,$HTTP_REFERER,$HTTP_USER_AGENT,$OS)=&hp_access'analize(1,$ENV{'HTTP_REFERER'},$ENV{'REMOTE_HOST'},$ENV{'REMOTE_ADDR'},$ENV{'HTTP_USER_AGENT'}); ;#ログファイル名の生成 $fname = sprintf("%04d%02d%02d.cgi",$year,$mon,$mday); ;#ログの読み込み $i=&hp_disk'load_new($hp_value::DIR_DATA.'/'.$FORM{'ClientName'}.'/'.$hp_value::DIR_LOG.'/'.$fname,"日別ログファイル",*BASE_LOG); ;#ログを追加 push(@BASE_LOG,",".$Date.",".$REMOTE_HOST.",'','',".$FORM{'Contents'}.":".$FORM{'Page'}."\n"); ;#ログの読み込み &hp_disk'make($hp_value::DIR_DATA.'/'.$FORM{'ClientName'}.'/'.$hp_value::DIR_LOG.'/'.$fname,"日別ログファイル",*BASE_LOG); return; } ;#アクセス元解析 sub analize{ ;#変数を確保 my($HTTP_REFERER,$HTTP_USER_AGENT,$REMOTE_HOST,$REMOTE_ADDR,$OS); ;#引数取得 my($mode)=@_; ;#参照元を判定 $HTTP_REFERER = $ENV{'HTTP_REFERER'}; $HTTP_REFERER =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; if ($HTTP_REFERER =~ /^file:/i || $HTTP_REFERER =~ /^bookmark/i) { $HTTP_REFERER = ""; } ;#リモートホスト名判定 $REMOTE_HOST = $ENV{'REMOTE_HOST'}; $REMOTE_ADDR = $ENV{'REMOTE_ADDR'}; if ($REMOTE_HOST eq '') { $REMOTE_HOST = $REMOTE_ADDR; } if ($REMOTE_HOST eq $REMOTE_ADDR) { $REMOTE_HOST = gethostbyaddr(pack('C4',split(/\./,$REMOTE_HOST)),2) || $REMOTE_ADDR; } if ($REMOTE_HOST =~ /(.*)\.(\d+)$/) { ; } elsif ($REMOTE_HOST =~ /(.*)\.(.*)\.(.*)\.(.*)$/) { $REMOTE_HOST = "\*\.".$2."\.".$3."\.".$4; } elsif ($REMOTE_HOST =~ /(.*)\.(.*)\.(.*)$/) { $REMOTE_HOST = "\*\.".$2."\.".$3; } if(!$mode){ ;#ユーザ環境判定 $HTTP_USER_AGENT = $ENV{'HTTP_USER_AGENT'}; $HTTP_USER_AGENT =~ s//>/g; ($hua,$vers) = split('/',$HTTP_USER_AGENT,2); ;#OSの判定 $hua=~s/ //; if ($vers =~ /Win(.*)4\.90/i){ $OS = "WinME"; }elsif ($vers =~ /Win(.*)(95|98|NT|XP)\s?([.0-9]*)[;)]/i){ if($3 eq '5.0'){ $OS ='2K'; }elsif($3 eq '5.1'){ $OS ='XP'; }else{ $OS = $2; $OS =~ y/a-z/A-Z/; } $OS = "Win".$OS; }elsif($vers =~ /Macintosh/i) { $OS = "Macintosh"; } elsif ($vers =~ /Mac_PowerPC/i) { $OS = "Mac_PowerPC"; } elsif ($vers =~ /X11/i) { $OS = "X11"; } elsif ($vers =~ /Linux/i) { $OS = "Linux"; } elsif ($vers =~ /SunOS/i) { $OS = "SunOS"; } elsif ($vers =~ /FreeBSD/i) { $OS = "FreeBSD"; } elsif ($vers =~ /WebTV/i) { $OS = "WebTV"; } elsif ($vers =~ /AIX/i) { $OS = "AIX"; } elsif ($vers =~ /OSF1/i) { $OS = "OSF1"; } elsif ($vers =~ /NEWS-OS/i) { $OS = "NEWS-OS"; } elsif ($vers =~ /IRIX/i) { $OS = "IRIX"; } elsif ($vers =~ /HP-UX/i) { $OS = "HP-UX"; } elsif ($vers =~ /BSD\/OS/i) { $OS = "BSD/OS"; } else {$OS = "Etc."; } ;#ブラウザの判定 if ( $vers =~ /OPERA/i){ #Opera cloak as other browser $vers =~ /OPERA\s?([.0-9]*)/i; $HTTP_USER_AGENT = "Opera\/".$1; }elsif ($vers =~ /netscape/i ){ #Netscape6/7 $vers =~/netscape[\s\d]?\/([.0-9]*)/i; $HTTP_USER_AGENT = "Netscape\/".$1; }elsif ($vers =~ /firefox/i ){ #FireFox $vers=~/firefox\d?\/([.0-9]*)/i; $HTTP_USER_AGENT = "FireFox\/".$1; }elsif ($vers =~ /safari/i ){ #Safari $vers=~/safari\d?\/([.0-9]*)/i; $HTTP_USER_AGENT = "Safari\/".$1; }elsif ($vers =~ /MSIE/) { #Internet Explorer ($hua1,$dummy) = split(/MSIE /,$vers); ($hua2,$dummy) = split(/\;/,$dummy); ($hua3,$dummy) = split(/\./,$hua2); ($hua4,$dummy) = split(/\(/,$vers); ($hua5,$dummy) = split(/\./,$hua4); $HTTP_USER_AGENT ="MSIE\/".$hua2." (Mozilla\/".$hua5." compatible)"; }elsif( $hua =~ /opera/i ) { #Opera not cloaked $vers =~/(.*) \(/; $HTTP_USER_AGENT = "Opera\/".$1; }elsif ($hua eq "Mozilla") { if($vers=~/gecko/i){ $vers=~/\((.*)\)/; $1=~ /rv\:(.*)/i; $HTTP_USER_AGENT ="Mozilla\/".$1; }elsif($vers!~/compatible/i){ $vers=~/([.0-9]*)/; $HTTP_USER_AGENT ="Netscape\/".$1; } } }else{ $OS=''; $HTTP_USER_AGENT=''; } return ($REMOTE_HOST,$HTTP_REFERER,$HTTP_USER_AGENT,$OS); } 1;