#!/usr/bin/perl
#------------------------------------------------------------------------------
# $Id$
#------------------------------------------------------------------------------
# Show apache logs
#
# Copyright (c) BAYBITS LLC. All rights reserved.
#------------------------------------------------------------------------------

use strict;
use utf8;
use HTML::Template;
use Encode;
use TF::CommonUtils;

binmode(STDOUT, ":utf8");

# global
my $LOCATION         = $ENV{'TF_LOCATION'} || '';
my $BRAND            = $ENV{'TF_BRANDNAME'} || '';
my $USERTYPE         = $ENV{'TF_USERTYPE'} || 'normal';
my $LANGPARAM        = TF::CommonUtils::getLangPriority();
my $TF_LOGACCESS     = $ENV{'TF_LOGACCESS'} || 'off';
my $TEMPLATE_FILE    = './tmpl/loglist.tmpl.' . $LANGPARAM;
my $TF_LOGACCESS     = $ENV{'TF_LOGACCESS'} || 'off';
my $loglisttitle     = $ENV{'TF_FOLDER_LOGACCESS'} || '';
my $dir_pass         = $ENV{'TF_LOGFILE_ROOT'} || '/var/log/teamfile';
my $pagetitle        = $ENV{'TF_FOLDER_LOGACCESS'} || '';
my $PAGETITLE        = TF::CommonUtils::decodeUTF8($pagetitle);
my $PAGEIMG          = $ENV{'TF_FOLDER_LOGACCESS_IMG'} || '';
my $MSGTABLE_ja  = {
					mErrRangeParam  => '「範囲」が正しく指定されておりません。',
					mErrTypeParam   => '「種類」が正しく指定されておりません。',
				};
my $MSGTABLE_en  = {
					mErrRangeParam  => 'Invalid "Range" parameter.',
					mErrTypeParam   => 'Invalid "Type" parameter.',
				};
my $MSGTABLE     = ($LANGPARAM eq 'ja') ? $MSGTABLE_ja : $MSGTABLE_en;

if (!$LOCATION || !$USERTYPE || $USERTYPE ne 'admin' || !$TF_LOGACCESS || $TF_LOGACCESS eq 'off') {
	TF::CommonUtils::showAccessDeny();
	die '';
}

main();

#
# main 
#
sub main {

#POSTデータの受け取り
	my $REQUEST_METHOD = $ENV{'REQUEST_METHOD'} || '';
	my $CONTENT_LENGTH = $ENV{'CONTENT_LENGTH'} || 0;
	my $buf;
	my $value;
	my %form;

	if ($REQUEST_METHOD eq "POST" && $CONTENT_LENGTH >= 0) {
		read(STDIN, $buf, $CONTENT_LENGTH);
		my @pairs = split(/&/,$buf);
		foreach my $pair (@pairs) {
			my ($name, $value) = split(/=/, $pair);
		    $value =~ tr/+/ /;
		    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
		    $form{$name} = $value;
		}
	}

#ログの種類と日付を取得
	my $logtype = $form{'selLogType'}  || '';
	my $logdays = $form{'selLogRange'} || '';

	
#現時間の取得
	my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time);
	$year  = $year+1900;
	$mon   = $mon+1;
	my $lmon  = $mon-1;
	my $lyear = $year;
	if ($lmon == 0){
		$lmon = 12;
		$lyear = $year-1;
	}

#昨日の日付を取得
	my ($ysec, $ymin, $yhour, $yesterday, $ymon, $yyear, $ywday, $yyday, $yisdst) = localtime(time-24*3600);
	$yyear = $yyear+1900;
	$ymon  = $ymon+1;

#前ゼロ
	$mon        = sprintf("%02d",$mon);

	$mday       = sprintf("%02d",$mday);
	
	$yesterday  = sprintf("%02d",$yesterday);
	
    $ymon       = sprintf("%02d",$ymon);

	$lmon       = sprintf("%02d",$lmon);
	
#テンプレートをオープン
	if (!open(LOGLIST,"<$TEMPLATE_FILE")) {
		TF::CommonUtils::showTemplateOpenErr($LANGPARAM);
		return;
	}

	binmode(LOGLIST, ":utf8");
	my $htmltmpl = HTML::Template->new( filehandle => *LOGLIST,
										case_sensitive => 1,
										die_on_bad_params => 0);

#ディレクトリをオープン
	opendir(DIR,"$dir_pass") || die "$!";

	my @filename = readdir(DIR);

	closedir(DIR);

#selectedの初期化
	my $sel_day  = "";
	my $sel_yday = "";
	my $sel_mon  = "";
	my $sel_lmon = "";
	my $sel_rang = "";
	my $sel_acc  = "";
	my $sel_err  = "";
	my $sel_all  = "";

#配列の初期化
	my @loop1 = ();
	my @loop2 = ();
	my $data  = '';

	if($logdays eq "YESTERDAY") {
		$data = "$yyear$ymon$yesterday";
		$sel_yday = "selected";
	}
	elsif($logdays eq "THISMONTH") {
        $data = "$year$mon\\d\\d";
		$sel_mon  = "selected";
    }
	elsif($logdays eq "LASTMONTH") {
        $data = "$lyear$lmon\\d\\d";
		$sel_lmon = "selected";
    }
	elsif($logdays eq "ALLRANGE") {
        $data = "\\d\\d\\d\\d\\d\\d\\d\\d";
		$sel_rang = "selected";
    }
	elsif($logdays eq "TODAY" || $logdays eq "") {
        $data = "$year$mon$mday";
		$sel_day  = "selected";
    }
	else {
		TF::CommonUtils::showErrorPage(	$MSGTABLE->{mErrRangeParam}, $LANGPARAM);
		return;
	}
	
#ファイル名のソート
	my @filename2 = sort @filename;
	@filename2 = reverse(@filename2);
	
#ファイル名、整形ファイル名、更新時刻の格納
	foreach my $logname (@filename2){
		my %fname1;
		my %fname2;
		
#ファイル属性の取得
		my @serch = stat("$dir_pass/$logname");
		my ($sesec, $semin, $sehour, $semday, $semon, $seyear, $sewday, $seyday, $seisdat) = localtime($serch[9]);
	    $seyear = $seyear+1900;
	    $semon = $semon+1;
		
#ファイル名、属性の取得とファイル名変更
		my $chname = $logname;
		my $ymd;
		if ($logname =~/access_log.$data$/){
			$fname1{FILEA} = $logname;
			substr($chname,7,4) = "";
			$chname = "$chname.log";
            $fname1{FILEB} = $chname;
			$ymd = sprintf("%4d/%02d/%02d %02d:%02d:%02d",$seyear,$semon,$semday,$sehour,$semin,$sesec);
			$fname1{FILEC} = $ymd;
            push(@loop1,\%fname1);
        }
        if ($logname =~/error_log.$data$/){
            $fname2{FILEA} = $logname;
            substr($chname,6,4) = "";
            $chname = "$chname.log";
            $fname2{FILEB} = $chname;
		    $ymd = sprintf("%4d/%02d/%02d %02d:%02d:%02d",$seyear,$semon,$semday,$sehour,$semin,$sesec);
			$fname2{FILEC} = $ymd;
            push(@loop2,\%fname2);
		}
    }
	
	if($logtype eq "ALLLOG") {
	    $sel_all = "selected";
	}
	elsif($logtype eq "ERRLOG") {
	    @loop1 = ();
		$sel_err = "selected";
	}
	elsif($logtype eq "ACLOG" || $logtype eq "") {
	    @loop2 = ();
	    $sel_acc = "selected";
	}
	else{
		TF::CommonUtils::showErrorPage(	$MSGTABLE->{mErrTypeParam}, $LANGPARAM);
		return;
	}

#パラメータの受け渡し
	$htmltmpl->param(	LOOP_ACS => \@loop1,
						LOOP_ERR => \@loop2,
						SEL_ACC  => $sel_acc,
						SEL_ERR  => $sel_err,
						SEL_ALL  => $sel_all,
						SEL_DAY  => $sel_day,
						SEL_YDAY => $sel_yday,
						SEL_MON  => $sel_mon,
						SEL_LMON => $sel_lmon,
						SEL_RANG => $sel_rang,
						brandname => $BRAND,
						pagetitle => $PAGETITLE,
						pageimg   => $PAGEIMG,
					);
	print "Content-type: text/html; charset=UTF-8\n\n";
	print $htmltmpl->output;

	close(LOGLIST);
}

