#!/usr/bin/perl #Kaede Counter CGI Version3.0A #(C)Kaede Otigiri (2000/5/5) $passwd="pass word"; #パスワード(必ず変更してね) $datafile="counter.dat"; #カウンターログ $bakfile="counterb.dat"; #カウンターログバックアップ $tempfile="countert.dat"; #カウンターログテンポラリ $htmname="admin.html"; #管理画面HTML雛形ファイル $maxwait=300; #最大待ち時間 $ENV{'REQUEST_METHOD'} =~ tr/a-z/A-Z/ ; $reqtype = $ENV{'REQUEST_METHOD'}; if($reqtype eq "POST") { read(STDIN, $qstri , $ENV{'CONTENT_LENGTH'}); } #if($reqtype eq "GET") #{ # $qstri = $ENV{'QUERY_STRING'}; #} @qstr = split(/&/,$qstri); foreach $qstrt (@qstr) { ($name, $value) = split(/=/,$qstrt); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $qdata{$name} =$value } $pw = $qdata{'pw'}; $countadd = $qdata{'counter'}; if($countadd == ""){$countadd = 0 ;} $datecntidx = $qdata{'dateidx'}; $datecntadd = $qdata{'dateadd'}; if($datecntadd == ""){$datecntadd = 0 ;} $monthcntidx = $qdata{'monthidx'}; $monthcntadd = $qdata{'monthadd'}; if($monthcntadd == ""){$monthcntadd = 0 ;} ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime ; $time1=(((($mon*31+$mday)*24)+$hour)*60+$min)*60+$sec+$maxwait; $l1=1; if(($passwd eq $pw) || (($countadd == 0) && ($datecntadd == 0) && ($monthcntadd == 0))) { while((-f $tempfile) && ($l1>0)) #テンポラリがいたら時間が来るまでぐるぐるまわりっ☆ { sleep(1); ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime ; $time2=(((($mon*31+$mday)*24)+$hour)*60+$min)*60+$sec; if($time2>$time1) #タイムあっぷ☆ { $l1=0; open(DATA,"$tempfile"); @templines = ; close(DATA); $tmpread = -1; } } open(DATA2,">$tempfile") || die("counter: Unable to open $tempfile"); #テンポラリ作りっ♪ #データ読み読みっ☆ $err = -1 ; $count = 0; $dtn = 0; $mtn = 0; if(-f $datafile) { open(DATA,"$datafile"); @datalines = ; close(DATA); &decordcnt; } if(($err<0) && ($tmpread < 0)) { @datalines = @templines; &decordcnt; } if(($err<0) && (-f $tempfile)) { open(DATA,"$bakfile"); @datalines = ; close(DATA); &decordcnt; } #データ読み読み終わりっ☆ #日にちとか取り取りっ♪ ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime ; ++$mon; $year = $year + 1900; #2000年対応っ☆ $month=$year . "/" . $mon; $today=$mon . "/" . $mday; #カウンター足しっ☆ $count += $countadd; #修正する日カウンター探しっ☆ $dateinc=-1; for($i=0;$i<$dtn;$i++) { if($dateidx[$i] eq $datecntidx){$dateinc = $i;} } if($dateinc<0) { $datecount = "-"; } else { $datecnt[$dateinc] += ($datecntadd) ; if ($datecnt[$dateinc] < 0){$datecnt[$dateinc] = 0;} $datecount = $datecnt[$dateinc]; } #修正する月カウンター探しっ☆ $monthinc = -1; for($i=0;$i<$mtn;$i++) { if($monthidx[$i] eq $monthcntidx){$monthinc = $i;} } if($monthinc<0) { $monthcount = "-"; } else { $monthcnt[$monthinc] += ($monthcntadd) ; if ($monthcnt[$monthinc] < 0){$monthcnt[$monthinc] = 0;} $monthcount = $monthcnt[$monthinc]; } $outdata = $count."\nDATE\n"; for($i=0;$i<$dtn;$i++){$outdata = $outdata.$dateidx[$i]." ".$datecnt[$i]."\n";} $outdata = $outdata."MONTH\n"; for($i=0;$i<$mtn;$i++){$outdata = $outdata.$monthidx[$i]." ".$monthcnt[$i]."\n";} $outdata = $outdata."END\n"; #カウンタ書き書きっ☆(テンポラリっ) print DATA2 $outdata; close(DATA2); #カウンタ書き書きっ☆(サブログっ) open(DATA2,">$bakfile") || die("counter: Unable to open $bakfile"); print DATA2 $outdata; close(DATA2); rename($tempfile,$datafile); #メインログリネームっ☆ #書き書き終わりっ☆ #HTML返しっ♪ open(HTMDATA,"$htmname") || die("counter: Unable to open $htmname"); print "Content-type: text/html\n\n\n"; #くっきーあげないっ☆ while($htmdata = ) { $htmdata =~ s//$count/ig; $htmdata =~ s//$monthcount/ig; $htmdata =~ s//$datecount/ig; $htmdata =~ s//$month/ig; $htmdata =~ s//$today/ig; print "$htmdata"; } close(HTMDATA); } else { #HTML返しっ♪ open(HTMDATA,"$htmname") || die("counter: Unable to open $htmname"); print "Content-type: text/html\n\n\n"; #くっきーあげないっ☆ while($htmdata = ) { $htmdata =~ s///ig; $htmdata =~ s///ig; $htmdata =~ s///ig; $htmdata =~ s///ig; $htmdata =~ s///ig; $htmdata =~ s//"パスワードが違います"/ig; print "$htmdata"; } close(HTMDATA); } exit; sub decordcnt { $phase = 0; $dtn = 0; $mtn = 0; foreach $line (@datalines) { chop $line; if($line eq "DATE"){$phase = 1;} #月カウンタースタート elsif($line eq "MONTH"){$phase = 2;} #月カウンタースタート elsif($line eq "END") #データ正常終了 { $phase = 3; $err = 0 ; } elsif($phase == 0){$count = $line;} #累計 elsif($phase == 1) #日カウンター { @linet = split(/ /,$line); $dateidx[$dtn] = $linet[0]; $datecnt[$dtn] = $linet[1]; ++$dtn; } elsif($phase == 2) #月カウンター { @linet = split(/ /,$line); $monthidx[$mtn] = $linet[0]; $monthcnt[$mtn] = $linet[1]; ++$mtn; } } }#decordcnt END