###############################################################################
#
# ログファイルを管理するモジュール
#
###############################################################################
package plugin::admin::AdminLogHandler;
use strict;
use HTTP::Status;
#==============================================================================
# コンストラクタ
#==============================================================================
sub new {
	my $class = shift;
	my $self = {};
	return bless $self,$class;
}

#==============================================================================
# アクションハンドラメソッド
#==============================================================================
sub do_action {
	my $self  = shift;
	my $wiki  = shift;
	my $cgi   = $wiki->get_CGI;
	my $login = $wiki->get_login_info();
	
	if($cgi->param("delete")){
		return $self->delete_log($wiki);
		
	} elsif($cgi->param("download")){
		$self->download_log($wiki);
		
	} elsif($cgi->param("deletecache")){
		return $self->delete_cache($wiki);
		
	} else {
		return $self->log_info($wiki);
	}
}

#==============================================================================
# ログファイルの情報を表示
#==============================================================================
sub log_info {
	my $self = shift;
	my $wiki = shift;
	my $buf  = "";
	
	$wiki->set_title("ログファイルの管理");
	
	$buf .= $self->make_log_form($wiki,"アクセスログ","access");
	$buf .= $self->make_log_form($wiki,"添付ファイルのログ","attach");
	$buf .= $self->make_log_form($wiki,"添付ファイルダウンロード数のログ","download");
	$buf .= "<p>※このログファイルを削除すると添付ファイルのダウンロード数がクリアされます。</p>\n";
	$buf .= $self->make_log_form($wiki,"ページ凍結のログ","freeze");
	$buf .= "<p>※このログファイルを削除すると全てのページ凍結が解除されます。</p>\n";
	
	# キャッシュファイルの情報
	$buf .= "<h2>キャッシュファイル</h2>\n";
	my @cachefiles = ();
	if($wiki->config("log_dir") ne ""){
		opendir(DIR,$wiki->config("log_dir")) or die $wiki->config("log_dir")."のオープンに失敗しました。";
		while(my $entry = readdir(DIR)){
			if($entry =~ /\.cache$/){
				push(@cachefiles,$entry);
			}
		}
		closedir(DIR);
	}
	
	if($#cachefiles==-1){
		$buf .= "<p>キャッシュファイルはありません。</p>\n";
	} else {
		$buf .= "<ul>\n";
		@cachefiles = sort(@cachefiles);
		foreach(@cachefiles){
			my @status = stat($wiki->config("log_dir")."/".$_);
			my $size = @status[7] / 1024;
			$size = ($size==int($size) ? $size : int($size + 1));
			
			$buf .= "<li>".&Util::escapeHTML($_)."(".$size."KB)</li>\n";
		}
		$buf .= "</ul>\n";
		$buf .= "<form action=\"\" method=\"POST\">\n".
		        "  <input type=\"submit\" name=\"deletecache\" value=\"キャッシュを削除\">\n".
		        "  <input type=\"hidden\" name=\"action\" value=\"ADMINLOG\">\n".
		        "</form>\n";
	}
	
	return $buf;
}

#==============================================================================
# ログファイルの情報表示と操作を行うフォームを出力する関数
#==============================================================================
sub make_log_form {
	my $self   = shift;
	my $wiki   = shift;
	my $name   = shift;
	my $target = shift;
	my $file   = $self->get_filename_from_target($wiki,$target);
	
	my $buf .= "<h2>".&Util::escapeHTML($name)."</h2>\n";
	
	if(-e $wiki->config('log_dir')."/$file"){
		my @status = stat($wiki->config('log_dir')."/$file");
		my $size = @status[7] / 1024;
		# 整数に切り上げ
		$size = ($size==int($size) ? $size : int($size + 1));
		$buf .= "<p>".&Util::escapeHTML($file)."(".$size."KB)</p>\n".
		        "<form action=\"".$wiki->create_url()."\" method=\"POST\">\n".
		        "  <input type=\"submit\" name=\"download\" value=\"ダウンロード\">\n".
		        "  <input type=\"submit\" name=\"delete\" value=\"ファイル削除\">\n".
		        "  <input type=\"hidden\" name=\"target\" value=\"$target\">\n".
		        "  <input type=\"hidden\" name=\"action\" value=\"ADMINLOG\">\n".
		        "</form>\n";
	} else {
		$buf .= "<p>ログファイルはありません。</p>\n";
	}
	
	return $buf;
}

#==============================================================================
# ログファイルを削除
#==============================================================================
sub delete_log {
	my $self = shift;
	my $wiki = shift;
	my $target = $wiki->get_CGI->param("target");
	my $file   = $self->get_filename_from_target($wiki,$target);
	
	if($file eq ""){
		return $wiki->error(RC_BAD_REQUEST, "パラメータが不正です。");
	}
	
	unlink($wiki->config('log_dir')."/$file") or die $file."の削除に失敗しました。";
	
	return $wiki->redirectURL( $wiki->create_url({ action=>"ADMINLOG"}) );
	
	#$wiki->set_title("ログファイルの管理");
	#return "<p>ログファイルを削除しました。</p>\n".
	#       "<p>[<a href=\"".$wiki->config('script_name')."?action=ADMINLOG\">戻る</a>]</p>\n";
}

#==============================================================================
# ログファイルをダウンロード
#==============================================================================
sub download_log {
	my $self = shift;
	my $wiki = shift;
	my $target = $wiki->get_CGI->param("target");
	my $file   = $self->get_filename_from_target($wiki,$target);
	
	if($file eq ""){
		return $wiki->error(RC_BAD_REQUEST, "パラメータが不正です。");
	}
	
	print "Content-Type: text/plain\n";
	print "Content-Disposition: inline;filename=\"".&Jcode::convert($file,"sjis")."\"\n\n";
	open(LOG,$wiki->config('log_dir')."/$file") or die $file."のオープンに失敗しました。";
	binmode(LOG);
	while(<LOG>){ print $_; }
	close(LOG);
	
	exit();
}

#==============================================================================
# ログファイルのファイル名を取得する関数
#==============================================================================
sub get_filename_from_target {
	my $self   = shift;
	my $wiki   = shift;
	my $target = shift;
	if($target eq "access"){
		return $wiki->config('access_log_file');
	} elsif($target eq "attach"){
		return $wiki->config('attach_log_file');
	} elsif($target eq "freeze"){
		return $wiki->config('freeze_file');
	} elsif($target eq "download"){
		return $wiki->config('download_count_file');
	} else {
		return "";
	}
}

#==============================================================================
# キャッシュファイルを削除
#==============================================================================
sub delete_cache {
	my $self = shift;
	my $wiki = shift;
	
	unlink glob($wiki->config("log_dir")."/*.cache") or die "キャッシュファイルの削除に失敗しました。";
	
	return $wiki->redirectURL( $wiki->create_url({ action=>"ADMINLOG"}) );
	
	#$wiki->set_title("ログファイルの管理");
	#return "<p>キャッシュファイルを削除しました。</p>\n".
	#       "<p>[<a href=\"".$wiki->config('script_name')."?action=ADMINLOG\">戻る</a>]</p>\n";
}

1;
