#!/usr/bin/perl # HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH # H # H 접속통계 카운타 CGI - "Super Counter" ver-99.08.25 최종수정일 2000.01.14 # H 사용환경 : perl 인터프리터가 설치된 unix, linux, NT, windows 서버 # H Copyright (c) 송은수 # H http://cgitour.net # H http://technote.co.kr # H master@cgitour.net # H 이 소스는 프리웨어입니다. # H "원본형태" 로 누구에게나 재 배포할수 있습니다. # H # H # H 새로운 기능을 추가하거나 기존 기능을 개선하여 수정본을 재 배포하는것은 허용됩니다. # H 그러나 이 경우에도 프로그램명과 원작자의 Copyright(c)는 절대 변경 할 수없으며, # H 수정 당사자의 2차적 Copyright를 붙이는것만 허용 됩니다. # H 단순히 색상이나 모양만을 변경한 수정배포는 허용되지 않습니다. # H 반드시 새로운 기능의 추가나 기존기능의 개선사항이 있어야만 # H 수정본을 배포할 수 있습니다. # H # H 이상, 위의 내용은 어떠한 경우에도 절대 수정, 삭제 할 수 없습니다. # H # HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH ##### 수정항목 ######## # 현재의 기본 설정 상태로도 별도 수정이 없이 정상작동한다. # 그러나 기본설정과 서버 환경이 다르다면 반드시 수정해 주어야만 한다. # 반드시 아래의 수정 사항을 모두 확인하기 바란다. # 우선 위의 첫 라인 perl의 경로를 확인할것. # [필수] - 홈버튼의 링크 url $homebuttn = '/ target=_top'; # [필수] - 관리 패스워드지정 # 일단, 프로그램 설치후 관리password를 입력 했을때 나오는 암호화 문자열을 아래 변수에 넣을것.(readme.txt참조) # 변수대입이 비어 있을때는 기본으로 'cgitour' 가 비밀번호로 적용된다. # 설치후 암호화함수 에러 출력시(crypt error!...)는 이 소스의 최 하단 라인(↓)을 참조 할것) $Adminpass = 'hzPTH8w4rBy86'; # [옵션] - 페이지 바탕색 or 바탕패턴 $bgcolor = 'bgcolor=#ffffff'; # [옵션-배치환경] - 아이콘 이미지의 디렉토리 "URL" # (예, 'http://cgitour.net/test/count/supercounter/img') # 현재는 기본 배치상태(상대패스)로 되어 있다. # cgi-bin 디렉토리가 cgi실행 전용디렉토리로 지정된 경우 이미지 파일을 # cgi-bin 하위에 두면 이미지가 정상 출력되지 않는다. # 이때는 'icon' 디렉토리를 'cgi-bin' 이외의 곳에 위치시킨후 'icon' 디렉토리의 # URL 을 대입해 주면 된다. $img_dir_url = './icon'; # [옵션-배치환경] - "supercounter" 디렉토리의 "URL" # (예, "http://cgitour.net/test/count/supercounter") # 현재는 기본 배치상태(상대패스)로 되어 있다. $thisdirurl = '.'; # [옵션-배치환경] - supercounter 디렉토리의 "절대경로" # (예, " /user/home/cgitour/public_html/cgi-bin/supercounter ") # 현재는 기본 배치상태(상대패스)로 되어 있다. $thisdirpath = '.'; # [옵션-서버환경] - "supercount.cgi" 파일명 # 'cgi' 확장자를 사용할 수 없다면 실제 파일의 이름을 바꾸고 # 아래 변수도 변경된 파일명을 대입 할것(예, " supercount.pl ") $maincginame = 'supercount.cgi'; # [옵션-서버환경] - "count.cgi" 파일명 # 'cgi' 확장자를 사용할 수 없다면 실제 파일의 이름을 바꾸고 # 아래 변수도 변경된 파일명을 대입 할것(예, " count.pl ") $countcginame = 'count.cgi'; # [옵션] - 그래프의 최대 길이(픽셀) $Graplong = 200; # [옵션] - 데이타 저장 파일명(변경가능) # count.cgi 파일의 수정항목과 동일해야 한다. $Data1 = 'count1.txt'; $Data2 = 'count2.txt'; $Data3 = 'backup.txt'; $Data4 = 'ip.txt'; # [옵션] - Main 테이블의 타이틀(목록) 출력수 지정 $howmanyprint = 30; ####################### 이하 수정항목 없음 &get_parse; &appointpage; # Main index sub TotalPrint{ &Mainindexhead; &htmlhead("MAIN INDEX"); opendir(DIR, "$thisdirpath/data"); @readdirs = grep((!/\./), readdir(DIR)); close(DIR); $indexsize = @readdirs; @readdirs = reverse(@readdirs); print <   홈페이지
$comment
END if($indexsize > 0){ &indexprint; } else{ print "\n"; } print <

No

Title ($indexsize)

Date

Print

Set

View

Today

Total

등록된 카운타가 없습니다.

 

++

$TodayAdd

++ $TotalAdd

  ↑Check : 삭제 복구 백업 Reset
    Title 생성:
  PASSWORD:

END &Pagenumber; print "


"; if($passworderror){ print "패스워드가 맞지 않습니다.
패스워드를 변경하려면 $maincginame 파일의 수정항목중
\$Adminpass = ''; 를 수정 하십시오.
지금 입력한 단어 $FORM{'pass'} 를 관리 비밀번호로 변경하려면 $typepass 를 대입해 주면 됩니다.
예, \$Adminpass = '$typepass';


\n"; } &htmlend; exit; } #월-일 sub visit_month_form{ &checkMSIE; if($FORM{'permission'} && $FORM{'pass'}){ $Adminpass = &ch_pass("1000") if(!$Adminpass); if($Adminpass ne &ch_pass("$FORM{'pass'}")){ $errormassage = "관리 비밀번호가 맞지 않습니다.
"; } else{ $months_line[22] = (!$FORM{'percount'}) ? '1' : ''; $months_line[23] = (!$FORM{'percook'}) ? '1' : ''; $months_line[24] = (!$FORM{'perip'}) ? '1' : ''; $months_line[25] = $FORM{'perimg'}; @months_line2 = @months_line; for(0..25){ $months_line2[$_] .= "\n"; } open(WRITEFILE, ">$countfile"); print WRITEFILE @months_line2 ; close(WRITEFILE); $errormassage = "카운트 옵션 설정 변경완료!
"; } } $month +=0; $mday +=0; if(!$FORM{'mon'}){$FORM{'mon'}=$month;} @count_line=split(/\|/ , $months_line[$FORM{'mon'}+2]); $total=$count_line[0]; $ck_x='0'; for(1..31){ @hour_line=split(/\:/, $count_line[$_]); $read_line[$ck_x]=($hour_line[0]); $ck_x += 1; } @high_line=@read_line; @high_line=reverse(sort jangryal(@high_line)); $high_line[0]=1 if($high_line[0]<1); $best_high=300/$high_line[0]; $how_year=$year; if($FORM{'mon'}>$month){$how_year-=1;} &htmlhead("$how_year년 $FORM{'mon'}월 방문통계"); print <   $errormassage [$PageName] 접속통계   Total:$months_line[0] Today:$months_line[1]   $INdex $LKPage $HOMEpage       [월-일]통계  [일-시]통계  시간대별 누산  요일별 누산/OS/BW      

$how_year 년
END print "\n"; for(1..12){ if($FORM{'mon'} != $_){ print "\n"; }else{ print "\n"; } } print "\n"; for(3..14){ @split_mon_hit=split(/\|/,$months_line[$_]); print "\n"; } print "
\n"; print " "; print "$_월$_월
"; print "$split_mon_hit[0]"; print "
\n"; print <

day   [$how_year 년 $FORM{'mon'}월]   아래 날자를 클릭하면 해당날자의 [일-시]통계가 출력됩니다. END for(1..31){ $width_x = $best_high*$read_line[$_-1]; $width_x= 1 if($width_x < 1); print ""; print "\n"; print " $_\n"; print " \n"; print "$read_line[$_-1]\n"; } $checked1 = 'checked' if($months_line[22] != 1); $checked2 = 'checked' if($months_line[23] != 1); $checked3 = 'checked' if($months_line[24] != 1); $checked4 = $months_line[25] ? $months_line[25] : 'blank'; print "

"; print " 
"; print "[$PageName] 카운트 설정
"; print ""; print "카운트 \n"; print "쿠키체크 \n"; print "IP address체크
\n"; print "이미지출력:   \n"; print "password:"; print "\n"; print "

\n"; &htmlend; exit; } #일-시 sub visit_day_form{ $month +=0; $mday +=0; if(!$FORM{'mon'}){$FORM{'mon'}=$month;} if(!$FORM{'day'}){$FORM{'day'}=$mday;} @day_line=split(/\|/ , $months_line[$FORM{'mon'}+2]); @hour_line=split(/\:/ , $day_line[$FORM{'day'}]); $total=$hour_line[0]; @high_line=@hour_line; @high_line=reverse(sort jangryal(@high_line)); $high_line[1]=1 if($high_line[1]<1); $best_high= 300/$high_line[1]; $how_year="$year"; if($FORM{'mon'}>$month){$how_year-=1;} &htmlhead("$how_year년 $FORM{'mon'}월 $FORM{'day'}일 시간별 방문통계"); print <   [$PageName] 접속통계   Total:$months_line[0] Today:$months_line[1]   $INdex $LKPage $HOMEpage       [월-일]통계  [일-시]통계  시간대별 누산  요일별 누산/OS/BW      

$how_year년$FORM{'mon'}월
END print "\n"; for(1..15){ if($FORM{'day'} != $_){ print "\n"; } print "\n"; for(1..15){ @split_count_hour=split(/\:/,$day_line[$_]); print ""; } print "\n"; for(16..31){ if($FORM{'day'} != $_){ print "\n"; } print "\n"; for(16..31){ @split_count_hour=split(/\:/,$day_line[$_]); print "\n"; } print "

날자

"; print "$_\n"; }else{ print ""; print "$_일"; } print "

접속

$split_count_hour[0]
"; print "$_\n"; }else{ print ""; print "$_일"; } print "
$split_count_hour[0]
\n"; print <

hour       [$how_year년 $FORM{'mon'}월 $FORM{'day'}일] 시간대별 접속횟수 END for(1..24){ $width_x=$best_high*$hour_line[$_]; $width_x= 1 if($width_x < 1); $w_t=$_-1; $what_time=$_ < 11 ? "0$w_t" : $w_t ; print "$what_time\n"; print " \n"; print "$hour_line[$_]\n"; } print "

\n"; &htmlend; exit; } #-시 누산 합계 sub hour_total{ $month +=0; $mday +=0; for(3..14){ @month=split(/\|/, $months_line[$_]); for(1..31){ @dates=split(/\:/,$month[$_]); for(0..23){ $com = $_ +1; $HOUR{"hour_$_"} += $dates[$com]; } } } $best_com=0; for(0..23){ $best_com=$HOUR{"hour_$_"} if($HOUR{"hour_$_"} > $best_com); } $best_com=1 if($best_com < 1); $long_size=300/$best_com; &htmlhead("시간대별 누산통계"); print <   [$PageName] 접속통계   Total:$months_line[0] Today:$months_line[1]   $INdex $LKPage $HOMEpage       [월-일]통계  [일-시]통계  시간대별 누산  요일별 누산/OS/BW

  END for(0..23){ $hour_num=$_ < 10?"0$_":$_; $cont_num=$HOUR{"hour_$_"}; $width_num=$long_size * $cont_num; $width_num=1 if($width_num < 1); $cont_num="" if($cont_num < 1); &GrapPrint("$hour_num","grap1.gif","$width_num","$cont_num"); } print "

hour      접속수(시간대별 누산 합계)

"; &htmlend; exit; } # 요일 부라우저 OS sub week_total{ $month +=0; $mday +=0; @week_line=split(/\|/,$months_line[15]); foreach $key(@week_line){$best_long=$key if($key > $best_long);} $best_long=1 if($best_long < 1); $gr_size=300/$best_long; @week_text=("일","월","화","수","목","금","토"); $OSBW = $months_line[0]; $OSBW = 1 if($OSBW < 1); if($months_line[16]){ @OSTM=split(/\|/,$months_line[16]); @OSpercent = ('0',''); $add = 0; foreach $key(@OSTM){ $OSpercent[$add] = int((($key/$OSBW)*100)+0.5); $os_long=$key if($key > $os_long); $add += 1; } $os_long=1 if($os_long < 1); $os_size=300/$os_long; $OS95 = ($os_size*$OSTM[0])+1; $OS98 = ($os_size*$OSTM[1])+1; $OSnt = ($os_size*$OSTM[2])+1; $OSmac = ($os_size*$OSTM[3])+1; $OSunix = ($os_size*$OSTM[4])+1; $OSsun = ($os_size*$OSTM[5])+1; $OSelse = ($os_size*$OSTM[6])+1; } if($months_line[17]){ @BRW=split(/\|/,$months_line[17]); @BWpercent = ('0',''); $add = 0; foreach $key(@BRW){ $BWpercent[$add] = int((($key/$OSBW)*100)+0.5); $brw_long=$key if($key > $brw_long); $add += 1; } $brw_long=1 if($brw_long < 1); $brw_size=300/$brw_long; $BRms4 = ($brw_size*$BRW[0])+1; $BRms5 = ($brw_size*$BRW[1])+1; $BRnets = ($brw_size*$BRW[2])+1; $BRelse = ($brw_size*$BRW[3])+1; } &htmlhead("요일별/OS/BW 누산통계"); print <   [$PageName] 접속통계   Total:$months_line[0] Today:$months_line[1]   $INdex $LKPage $HOMEpage       [월-일]통계  [일-시]통계  시간대별 누산  요일별 누산/OS/BW

  END for(0..6){ $width = ($gr_size * $week_line[$_]) + 1 ; &GrapPrint("$week_text[$_]","grap1.gif","$width","$week_line[$_]"); } print ""; print "\n"; &GrapPrint("WINDOWS 95","grap1.gif","$OS95","$OSTM[0]($OSpercent[0]\%)"); &GrapPrint("WINDOWS 98","grap1.gif","$OS98","$OSTM[1]($OSpercent[1]\%)"); &GrapPrint("WINDOWS NT","grap1.gif","$OSnt","$OSTM[2]($OSpercent[2]\%)"); &GrapPrint("MACintosh","grap1.gif","$OSmac","$OSTM[3]($OSpercent[3]\%)"); &GrapPrint("UNIX/Linux","grap1.gif","$OSunix","$OSTM[4]($OSpercent[4]\%)"); &GrapPrint("Sun OS","grap1.gif","$OSsun","$OSTM[5]($OSpercent[5]\%)"); &GrapPrint("기타 OS","grap1.gif","$OSelse","$OSTM[6]($OSpercent[6]\%)"); print ""; print "\n"; &GrapPrint("익스플러4.x","grap1.gif","$BRms4","$BRW[0]($BWpercent[0]\%)"); &GrapPrint("익스플러5.x","grap1.gif","$BRms5","$BRW[1]($BWpercent[1]\%)"); &GrapPrint("네스케이프","grap1.gif","$BRnets","$BRW[2]($BWpercent[2]\%)"); &GrapPrint("기 타","grap1.gif","$BRelse","$BRW[3]($BWpercent[3]\%)"); print "

  요일     접속수(요일별 누산 합계)
 

  운영체제     접속수
 

  부라우저정보     접속수

"; &htmlend; exit; } sub htmlhead{ local($title) = @_; print "Content-type: text/html\n\n"; print < [수퍼카운타] - $title $Refresh $SendData END exit if($SendData); } # 아래의 Copyright는 삭제,변경 할 수 없슴. sub htmlend{ print "

Modify by JGHEO (jog team) jog.co.kr


"; print "
Supercounter Ver 99.08.xx Copyright songeunsoo cgitour.net
"; print "

 \n"; } sub GrapPrint{ local($title,$gif,$width,$num) = @_; print "

$title\n"; print " "; print " $num\n"; } sub get_parse{ $_ = $ENV{'REQUEST_METHOD'}; if (/POST/) { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); $ENV{'QUERY_STRING'} = $buffer; }else{$buffer = $ENV{'QUERY_STRING'};} @pairs = split(/&/, $buffer); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $FORM{$name} = $value; } } sub count_file_open{ open(VISIT, "$countfile"); @months_line=; close(VISIT); chop(@months_line); $pageurl = $months_line[20]; } sub jangryal{ local($num_a, $num_b); $num_a=$a=~/^[0-9]+/; $num_b=$b=~/^[0-9]+/; $retval=$a<=>$b; $retval; } sub get_time{ ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time); $month=($mon+1); if($year > 100){$year=($year-100)+2000;} elsif($year < 10){$year=2000+$year;} else{$year="2000";} } sub indexprint{ @countindex = ('0',''); $number = $FORM{'number'} ? $FORM{'number'} : '0'; $howmanyprint = $FORM{'howmanyprint'} if($FORM{'howmanyprint'}); $howmanyprint = $indexsize if($howmanyprint > $indexsize); $add = '0'; for($number..(($number + $howmanyprint) -1)){ $key = $readdirs[$_]; open(DIR,"$thisdirpath/data/$key/$Data1"); @get_count =

; close(DIR); chop(@get_count); $Permiss = $get_count[22] ? 'x' : 'C'; $Permiss .= $get_count[23] ? '-x' : '-K'; $Permiss .= $get_count[24] ? '-x' : '-I'; $PTimg = ($get_count[25] && $get_count[25] ne 'blank') ? "$get_count[25]" : 'blank'; $countindex[$add ] = "$key==$get_count[0]==$get_count[1]==$get_count[20]==$get_count[21]==$Permiss==$PTimg"; $Best = $get_count[0] if($get_count[0] > $Best); $add += 1; $key = ''; } $Best = 1 if($Best < 1); $Best = ($Graplong/$Best); $add = $number + 1; foreach $key (@countindex){ @printline = split(/==/,$key); $checkname = 'CHECKED'.$add; $grapwidth = $Best * $printline[1]; $grapwidth = 1 if($grapwidth < 1); $printline[2] = '0' if($printline[2] < 1); $printline[4] = '_' if($printline[4] < 1); if($printline[0]){ print " "; print "$add\n"; print "  "; print "" if($printline[3]); print "$printline[0]"; print "" if($printline[3]); print ""; print "

$printline[4]\n"; print "

$printline[6]"; print "

$printline[5]"; print "

"; print ""; print "

$printline[2]"; print "\n"; print "$printline[1] "; $add += 1; $TodayAdd += $printline[2]; $TotalAdd += $printline[1]; undef(@printline); } } } sub adminaction{ if($FORM{'choice'} == 1){ foreach $key (@checkline){ unlink("$thisdirpath/data/$key/$Data1"); unlink("$thisdirpath/data/$key/$Data2"); unlink("$thisdirpath/data/$key/$Data3"); unlink("$thisdirpath/data/$key/$Data4"); unlink("$thisdirpath/data/$key/lock.txt"); rmdir("$thisdirpath/data/$key"); $comment .= "($key 삭제완료!) "; } }elsif($FORM{'choice'} == 2){ foreach $key (@checkline){ &FileCopy("data/$key/$Data3","data/$key/$Data1"); $comment .= "($key 복구완료!) "; } }elsif($FORM{'choice'} == 3){ foreach $key (@checkline){ &FileCopy("data/$key/$Data1","data/$key/$Data3"); $comment .= "($key 백업완료!) "; } }elsif($FORM{'choice'} == 4){ foreach $key (@checkline){ &FileCopy("","data/$key/$Data1"); &FileCopy("","data/$key/$Data2"); &FileCopy("","data/$key/$Data3"); &FileCopy("","data/$key/$Data4"); $comment .= "($key Reset!) "; } }else{ ""; } } sub FileCopy{ local($file1,$file2) = @_; open(FILE,"$thisdirpath/$file1"); open(FILE2,">$thisdirpath/$file2"); print FILE2 ; close(FILE); close(FILE2); } sub appointpage{ $PageName = "$FORM{'pagename'}"; $countfile = "$thisdirpath/data/$PageName/$Data1"; $mainindex = "$thisdirurl/$maincginame"; $maincgi = "$thisdirurl/$maincginame?pagename=$PageName"; if($PageName){ &get_time; &count_file_open; $INdex = "전체보기"; $LKPage = "카운트타겟페이지" if($pageurl); $HOMEpage = "홈페이지"; if($FORM{'day'}){&visit_day_form;} elsif($FORM{'hour_total'}){&hour_total;} elsif($FORM{'week_total'}){&week_total;} else{&visit_month_form;} } else{ &TotalPrint; } } sub Pagenumber{ $howmanypage = (int($indexsize/$howmanyprint)-1); $howmanypage +=1 if($indexsize % $howmanyprint); for(0..$howmanypage){ $pageover = $_ * $howmanyprint; print "" if($number != $pageover); print '['.($_ + 1).'] '; print "" if($number != $pageover); } } sub Mainindexhead{ if($FORM{'pass'}){ $typepass = &ch_pass($FORM{'pass'}); $Adminpass = &ch_pass('cgitour') if(!$Adminpass); if($Adminpass ne $typepass){ $comment = "PASSWORD ERROR! → $typepass"; $passworderror = 1; } elsif(!$FORM{'choice'} && !$FORM{'newtitle'}){ $comment = "관리명령을 선택 하십시오."; } else{ @checkline = ('0',); $is = '0'; while (($akey,$bkey) = each(%FORM)){ if($akey && $bkey && ($akey =~ /CHECKED/)){ @checkline[$is] = $bkey ; $is += 1; } } if($is < 1 && $FORM{'choice'}){ $comment = "선택한 관리명령을 실행할 대상에 체크하십시오."; } elsif($is >= 1 && $FORM{'choice'}){ &adminaction; } else{"";} if($FORM{'newtitle'} && !$passworderror){ $SendData = ""; $Refresh =""; } } } &checkMSIE; } sub checkMSIE{ if($ENV{'HTTP_USER_AGENT'} =~ /MSIE/i){ $Msie = " STYLE=\"font-family:굴림; font-size:10pt; color:#003333; background-color:#ffffff; border-width:1; border-color:#bbbbbb; border-style:solid;\""; $Msie2 = " STYLE=\"font-family:굴림; font-size:9pt; color:#003333; background-color:#eeeeee; border-width:1; border-color:#dddddd;\""; } } sub ch_pass{ local($inpass_x,)=@_; $inpass_x =~ s/\s//g; return crypt($inpass_x,'hz'); # ← 프로그램을 실행하면 "..crypt() error.." 메시지가 출력된다면 이 라인을 없애고, # return ($inpass_x); # ← 이 라인은 앞에 있는 '#' 를 제거 할것. } ## 일부 PERL버전에서는 cryp함수를 사용할 수 없으며 " error...crypt() " ## 와 같은 에러 메시지가 출력될것이다. ## 이때는 위의 " return crypt($inpass_x,'hz'); " 라인을 삭제하고 ## 그 아래라인, " return ($inpass_x); " 는 앞에 있는 '#' 만 제거해 주면 된다. 1;