#! /usr/bin/perl
##
##★★★★ ↑ は、プロバイダーもしくはレンタルサーバー会社から指定された path を指定してください。
##	開発時：	#!c:/perl/bin/perl.exe
##	転送時：	#! /usr/local/bin/perl
##	転送時：	#! /usr/bin/perl
##
#############################################################################
##  履歴 
#############################################################################
##
##	実行テスト開始		2005/02/28
##	β版完成			2005/02/28
##	開発開始			2005/02/21
##
#############################################################################
## 固定値定義 
#############################################################################
require './jcode.pl';
require './mimew.pl';

$kanjicode = 'sjis';							# ↓保存されるファイルの漢字コード（ windows='sjis' linux,unix='euc' 'jis' のいずれか）

##メール関連の定義 
$sendmail		= '/usr/sbin/sendmail';
$fromAddress	= "demand\@k-systemtrading.com";
$mailTitle		= "【語ろう】アクセスログ削除連絡　−　リンク";

@toAddress    = ( 
#############################################
##	ここに転送先のアドレスを登録していく 
#############################################
## 受け取るアドレス @マークの前には'\'が必要 
	"contact\@k-systemtrading.com",
);

#　データ保存ファイル
$visitorFile	= "./link.log";
$lnkFile		= "./link.csv";

&main();
exit(0);

#############################################################################
## ここからプログラム ( わからない人は触ってはダメ ) 
#############################################################################
sub main
{
	###########################################
	#### 初期処理 
	###########################################
	( $browser , $tmp ) = &getBrowser();
	( $today , $nowtime , $weekstr ) = &getLocalTime();
	( $host , $addr ) = &getHost( $ENV{'REMOTE_HOST'} , $ENV{'REMOTE_ADDR'} );
	&initForm( $kanjicode );

	###########################################
	#### ログ参照指示 
	###########################################
###	if ( $form{'logdisp'} eq 'on' ){
###		goto log_disp;
###	}

	###########################################
	#### ファイルサイズを調べて大きくなっているならメールする 
	###########################################
	$maxsize = 1024 * 256;
	if ( -s $visitorFile > $maxsize || $form{'mailsend'} eq 'on' ){
		## ファイルがサイズmaxに達している場合 
		&hostMail();
		## 削除 
		unlink( $visitorFile );
	}

	##########################
	# ログファイル更新
	# 基本的なログ 
	##########################
	&addFile( $visitorFile );

	##########################
	## アドレスjump 
	##########################
	$orderURL  = "http://www.k-systemtrading.com";			# jump先URL 

	##########################
	# ライセンスファイルを調べる 
	##########################
	@usrList = &filePaser( $lnkFile );
	for ( $i = 0 ; $i <= $#usrList ; $i++ ){
		($lno,$seo,$url) = split( /,/ , $usrList[$i] );
		if ( $seo eq 'on' ){
			if ( $form{'n'} eq $lno ){
				$orderURL = $url;
			}
		}else{
			if ( $ENV{'HTTP_REFERER'} =~ /k-systemtrading.com/ ){
				if ( $form{'n'} eq $lno ){
					$orderURL = $url;
				}
			}
		}
	}
	print "Location: $orderURL\n\n";
	exit( 0 );

log_disp:
	&setContentType( $kanjicode );
	&dispLog();
##	print "aaaaaaaaaa<br>";
##	print "$ENV{'HTTP_REFERER'}<br>";
##	print "aaaaaaaaaa<br>";
##	print "$orderURL<br>";
	exit( 0 );
}

#############################################################################
# ファイルの解体汎用
# use:
#	&filePaser();
#############################################################################
sub filePaser
{
	local( $filename ) = @_;
	local( $i );
	undef @tmpdata;
	if ( open( TMPFILE , "<$filename" )){
		@tmpdata = <TMPFILE>;
		close( TMPFILE );
		for ( $i = 0 ; $i <= $#tmpdata ; $i++ ){
			$tmpdata[$i] =~ s/\n//g;				#改行を抜く 
		}
	}
	return @tmpdata;
}

#############################################################################
#	&dispLog()
#############################################################################
sub dispLog
{
	local( $i , $olddate , $count );
	local( $indate , $intime , $domain , $ip , $afeno , $uri , $ref , $link );

	#####################
	# ヘッダ 
	#####################
	print <<"_HTML_";
	<html>
	<head>
	<title></title>
	</head>
	<body bgcolor="#fefefe" text="#404040">
	<div align="center">
	<center>
	<table border="0" width="780" cellspacing="0" cellpadding="4" bordercolor="#404040">
_HTML_

	undef @filedata;
	if ( open( FILE , "<$visitorFile" )){
		@filedata = <FILE>;
		close( FILE );
		$olddate = 0;
		$count   = 0;
		for ( $i = $#filedata ; $i > -1  ; $i-- ){
			( $indate , $intime , $domain , $ip , $afeno , $uri , $ref ) = split(/,/, $filedata[ $i ] );
			if ( $indate eq '' ){
				next;
			}
			$link = $ref;
			if ( length( $ref ) > 72 ){
				$ref  = substr( $ref , 0 , 72 );
				$ref .= "...";
			}
			$col1 = "16%";
			$col2 = "9%";
			$col3 = "75%";

			#####################
			# 日付変更線 
			#####################
			if ( $olddate ne $indate ){
				if ( $olddate ne 0 ){
					print <<"_HTML_";
					<tr><td colspan="3" >合計：$count</td></tr>
_HTML_
				}
				print <<"_HTML_";
				<tr><td colspan="3" ><hr size="1" color="#404040"></td></tr>
_HTML_
				$count = 0;
			}

			#####################
			# 内容 
			#####################
			print <<"_HTML_";
			<tr>
			    <td width="$col1" valign="top">
			    $indate $intime
			    </td>
			    <td width="$col2" valign="top">
				$afeno
			    </td>
			    <td width="$col3" valign="top">
				$domain ($ip)
			    </td>
			</tr>
			<tr>
			    <td width="$col1" valign="top">
			    </td>
			    <td width="$col2" valign="top">
			    </td>
			    <td width="$col3" valign="top">
			    $uri
			    </td>
			</tr>
			<tr>
			    <td width="$col1" valign="top">
			    </td>
			    <td width="$col2" valign="top">
			    </td>
			    <td width="$col3" valign="top">
				    <a href="$link">$ref</a>
			    </td>
			</tr>
			<tr><td colspan="3" height="12"></td></tr>
_HTML_
			$olddate = $indate;
			$count++;
		}
	}

	#####################
	# フッタ 
	#####################
	print <<"_HTML_";
	</table>
	</center>
	</div>
	</body>
	</html>
_HTML_
}

#############################################################################
# 漢字コード処理
# use:
#	&setContentType( 'sjis' );
#############################################################################
sub setContentType
{
	local( $code ) = @_;
####漢字コードをあわせる 
	if ( $code eq 'sjis' ){
		print "Content-type: text/html; charset=shift_jis\n\n";
	}elsif ( $code eq 'euc' ){
		print "Content-type: text/html; charset=euc-jp\n\n";
	} elsif ( $code eq 'jis' ){
		print "Content-type: text/html; charset=iso-2022-jp\n\n";
	}
}

#############################################################################
# 確認ファイルにデータを追加
# use:
#	&addFile();
#############################################################################
sub addFile
{
	local( $addFileName ) = @_;

	if ( !( -e "$addFileName" )){				# ファイルが無い場合は新規で作成する 
		open( FILE , ">$addFileName" );
		close( FILE );
		chmod( 0600 , "$addFileName" );
	}
	if ( open( FILE , ">>$addFileName" )){		# 追加モードで開く 
		#######################
		#今回のデータを追加 
		print FILE "$today,";					# 0:日付 
		print FILE "$nowtime,";					# 1:時間 
		print FILE "$host,";					# 2:ドメイン 
		print FILE "$addr,";					# 3:IP 

		$data = $form{'a'};
		$data =~ s/\,/&#44;/g;
		print FILE "$data,";					# 4:アフェリエイト番号 

		$data = $ENV{'REQUEST_URI'};
		$data =~ s/\,/&#44;/g;
		print FILE "$data,";					# 5:どんな指示できたのか？ 

		$data = $ENV{'HTTP_REFERER'};
		$data =~ s/\,/&#44;/g;
		print FILE "$data,";					# 6:どこから来たのか？ 

		print FILE "\n";						# 改行 
		close( FILE );
	}
}

#############################################################################
# ユーザーへのメール送信 
# use:
#	&hostMail
#############################################################################
sub hostMail
{
	local( $ii );

	#############################
	# 管理者に送るメール 
	#############################
	undef @upFile;
	$subject     = $mailTitle;
	$message	 = "";
	$message	.= "■アクセス者\n";
	$message	.= "$host $addr\n\n";
	$message	.= "■日時\n";
	$message	.= "$today $nowtime\n\n";
	$message	.= "━━━━━━━━\n";
	$message	.= "このメールはシステムより自動配信されています。\n";
	$message	.= "このメールへの返信は絶対に行わないで下さい。\n";
	$message	.= "\n\n";
	$upFile[0]   = $visitorFile;
	for ( $ii = 0 ; $ii <= $#toAddress ; $ii++ ){
		&sendMailEx( $fromAddress , $toAddress[$ii] , $subject , $message , @upFile );
	}
}

#############################################################################
# use:
#	&sendMailEx();
#############################################################################
sub sendMailEx
{
	local( $fromAddress , $toAddr , $subject , $message , @upFile ) = @_;
	local( $i , $header , $body );

	$bound = '3IwuWmML';		# 適当な文字列 
	undef @base64Data;
	for ( $i = 0 ; $i <= $#upFile ; $i++ ){
		if ( open( TMPFILE , "<$upFile[$i]" )){
			$sdata = join('',<TMPFILE>); 
			close( TMPFILE );
			$base64Data[$i] = &bodyencode($sdata, "b64"); 
			$base64Data[$i] .= &benflush("b64"); 
		}
		@datas = split(/\//,$upFile[$i]);
		$upFile[$i] = $datas[ $#datas ];
		$upFile[$i] =~ tr/A-Z/a-z/;
	}

	###########################
	$header  = "";
##	$header .= "FormMailer: FormMail\n";
	$header .= "Return-Path: $fromAddress\n";
	$header .= "To: $toAddr\n";
	$header .= "From: $fromAddress\n";
	$header .= "Subject: $subject\n";
	$header .= "MIME-Version: 1.0\n";
	$header .= "Content-Type: multipart/mixed; boundary=\"$bound\"\n";

	$body    = "";
	$body   .= "--$bound\n";
	$body   .= "Content-Type: text/plain; charset=\"iso-2022-jp\"\n";
	$body   .= "Content-Transfer-Encoding: 7bit\n\n";
	$body   .= "$message\n";
	$body   .= "\n";
	for ( $i = 0 ; $i <= $#upFile ; $i++ ){
		$body   .= "--$bound\n";
		$body   .= "Content-Type: application/octet-stream;	name=\"$upFile[$i]\"\n";
		$body   .= "Content-Transfer-Encoding: base64\n";
		$body   .= "Content-Disposition: attachment; filename=\"$upFile[$i]\"\n";
		$body   .= "\n";
		$body   .= "$base64Data[$i]\n";
		$body   .= "\n";
	}
	$body   .= "--$bound--\n\n\n";
	&jcode::convert(*header,'jis');
	&jcode::convert(*body,'jis');
	$header .= "Content-length: " . length($body) . "\n\n";
	if ( $ENV{ 'HTTP_HOST' } ne 'localhost' ){
		if ( !open( MAIL , "| $sendmail -t")){
			goto sendMailEx_end;
		}
		print MAIL "$header\n$body";
		close(MAIL);
	}else{
		if ( !open( MAIL , "|C:/bin/sendmail -t")){
			goto sendMailEx_end;
		}
		print MAIL "From: $fromAddress\n";
		print MAIL "To: $toAddr\n";
		print MAIL "Subject: $subject\n\n";
		print MAIL "$message\n";
		for ( $i = 0 ; $i <= $#upFile ; $i++ ){
			print MAIL "$upFile[$i]\n";
		}
		print MAIL "\n\n";
		close(MAIL);
	}
	return 1;
sendMailEx_end:
####print "<$fonttype $fontstyleE>メール送信に失敗しました</$fonttype>\n";
	return 0;
}

#############################################################################
# 時間を得る 
# use:
#	( $today , $nowtime , $weekstr ) = &getLocalTime();
#############################################################################
sub getLocalTime
{
	local( @week ) = ( "日" , "月" , "火" , "水" , "木" , "金" , "土" );
	local( $sec , $min , $hour , $day , $mon , $year , $weekday );

	$ENV{'TZ'} = "JST-9";
	( $sec , $min , $hour , $day , $mon , $year , $weekday ) = localtime( time );
	$mon++;
	$year += 1900;
	if ( $mon <= 9 ){
		$mon = "0$mon";
	}
	if ( $day <= 9 ){
		$day = "0$day";
	}
	if ( $hour <= 9 ){
		$hour = "0$hour";
	}
	if ( $min <= 9 ){
		$min = "0$min";
	}
	return( "$year.$mon.$day" , "$hour:$min" , $week[ $weekday ] );
}

#############################################################################
# ホスト名を得る
# use:
#	( $host , $addr ) = &host( $ENV{'REMOTE_HOST'} , $ENV{'REMOTE_ADDR'} );
#############################################################################
sub getHost
{
	local( $host , $addr ) = @_;
	if ($host eq "" || $host eq $addr) {
		$host = gethostbyaddr(pack("C4",split(/\./,$addr)),2) || $addr;
	}
	if ($host =~ /(.*)\.(\d+)$/) { ; }
	elsif ($host =~ /(.*)\.(.*)\.(.*)\.(.*)$/) { $host = "\*\.$2\.$3\.$4"; }
	elsif ($host =~ /(.*)\.(.*)\.(.*)$/) { $host = "\*\.$2\.$3"; }
	return( $host , $addr );
}

#############################################################################
# ヘッダ表示
# use:
#	&getBrowser();
#############################################################################
sub getBrowser
{
	local( $agent2 , $agent , $group );
	$agent2 = $agent = $ENV{'HTTP_USER_AGENT'};
	if ($agent =~ /AOL/)								{ $group = ''	; $agent = 'AOL'; }
	elsif ($agent =~ /Opera/i)							{ $group = ''	; $agent = 'Opera'; }
	elsif ($agent =~ /MSIE 3/i)							{ $group = 'IE'	; $agent = 'MSIE3'; }
	elsif ($agent =~ /MSIE 4/i)							{ $group = 'IE'	; $agent = 'MSIE4'; }
	elsif ($agent =~ /MSIE 5/i)							{ $group = 'IE'	; $agent = 'MSIE5'; }
	elsif ($agent =~ /MSIE 6/i)							{ $group = 'IE'	; $agent = 'MSIE6'; }
	elsif ($agent =~ /MSIE 7/i)							{ $group = 'IE'	; $agent = 'MSIE7'; }
	elsif ($agent =~ /MSIE 8/i)							{ $group = 'IE'	; $agent = 'MSIE8'; }
	elsif ($agent =~ /Mozilla\/2/i)						{ $group = 'NS'	; $agent = 'Netscape 2'; }
	elsif ($agent =~ /Mozilla\/3/i)						{ $group = 'NS'	; $agent = 'Netscape 3'; }
	elsif ($agent =~ /Mozilla\/4/i)						{ $group = 'NS'	; $agent = 'Netscape 4'; }
	elsif ($agent =~ /Netscape ?6/i)					{ $group = 'NS'	; $agent = 'Netscape 6'; }
	elsif ($agent =~ /Netscape\/7/i)					{ $group = 'NS'	; $agent = 'Netscape 7'; }
	elsif ($agent =~ /Netscape\/8/i)					{ $group = 'NS'	; $agent = 'Netscape 8'; }
	elsif ($agent =~ /Mozilla\/5/i)						{ $group = ''	; $agent = 'Mozilla'; }
	elsif ($agent =~ /Netscape/i && $agent =~ /Gecko/i)	{ $group = ''	; $agent = 'Mozilla'; }
	elsif ($agent =~ /Lynx/i)							{ $group = ''	; $agent = 'Lynx'; }
	elsif ($agent =~ /Cuam/i)							{ $group = ''	; $agent = 'Cuam'; }
	elsif ($agent =~ /Ninja/i)							{ $group = ''	; $agent = 'Ninja'; }
	elsif ($agent =~ /WWWC/i)							{ $group = ''	; $agent = 'WWWC'; }
	elsif ($agent =~ /DoCoMo/i)							{ $group = ''	; $agent = 'DoCoMo'; }
	elsif ($agent =~ /J-PHONE/i)						{ $group = ''	; $agent = 'J-PHONE'; }
	elsif ($agent =~ /UP\.Browser/i)					{ $group = ''	; $agent = 'EZweb'; }
	elsif ($agent =~ /L\-mode/i)						{ $group = ''	; $agent = 'L-mode'; }
	elsif ($agent =~ /ASTEL/i)							{ $group = ''	; $agent = 'ASTEL'; }
	elsif ($agent =~ /PDXGW/i)							{ $group = ''	; $agent = 'H&quot;'; }
	return( $group , $agent );
}

#############################################################################
# フォームからの情報を連想配列 %form に入れる
# &initForm('euc');
#############################################################################
sub initForm
{
    local($query, @assocarray, $assoc, $property, $value, $charcode, $method);
    $charcode = $_[0];
    $method = $ENV{'REQUEST_METHOD'};
    $method =~ tr/A-Z/a-z/;
    if ($method eq 'post') {
		read(STDIN, $query, $ENV{'CONTENT_LENGTH'});
    } else {
###		「GET」はセキュリティの為非対応にする 
		$query = $ENV{'QUERY_STRING'};
    }
    @assocarray = split(/&/, $query);
    foreach $assoc (@assocarray) {
        ($property, $value) = split(/=/, $assoc);
		if ( $property ne 'ls' ){		## しかし ls の場合は+を使いたいのでspaceは困る 
	        $value =~ tr/+/ /;			## 文章入力時に必要になるのではずせない… 
	    }
        $value =~ s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C", hex($1))/eg;
        &jcode'convert(*value, $charcode);
        $form{$property} = $value;
    }
}

#############################################################################
# 排他制御 解除
# use:
#	&lockExecute( ファイル名 );
#############################################################################
sub lockExecute
{
	local( $filename ) = @_;
	if ( $lockuse eq 1 ){
		if ( open( LOCKFILE, ">$filename")){		# 新規で作成 
			flock( LOCKFILE , 2 );
			print LOCKFILE "lock!";
			$locksts = 1;
		}
	}
}

#############################################################################
# 排他制御 解除
# use:
#	&unlockExecute();
#############################################################################
sub unlockExecute
{
	if ( $lockuse eq 1 ){
		if ( $locksts eq 1 ){
			close( LOCKFILE );
			flock( LOCKFILE , 8 );
			$locksts = 0;
		}
	}
}
