#!/usr/local/bin/perl

# ----------------------------------------------------------------------------------
# Down Load Counter Version 2.00（カウント用）
#
# Script written by Nishiyama
# This script is free
# HomePage http://www.cgi-down.com/
# E-Mail webmaster@cgi-down.com
# (1999/05/20-1999/09/24)
#
# 改変履歴
#
# 1999-09-24 V2.00 集計表にグラフ表示を追加
# 1999-08-22 V1.11 集計表からダウンロードされたページへリンク追加
# 1999-05-29 V1.10 一部修正
# 1999-05-22 V1.00 正式リリース
#
# 再配布禁止
# 使用されたらメールをいただけると光栄です。
# 宜しかったらメールマガジンの朗読に登録をお願いします。
# バージョンアップ等の情報を配信します。
# ----------------------------------------------------------------------------------
#
# **********************************************************************************
#                       オプション設定　↓ここから
# **********************************************************************************
# -------------------------------------------------------
#      ファイル関連設定　※必須
# -------------------------------------------------------

$jcode    = './jcode.pl';        # jcode.plの位置
$datefile = './downcon.dat';     # データー記録ファイル

# **********************************************************************************
#                     オプション設定終わり　↑ここまで
# ----------------------------------------------------------------------------------
# これ以降書き換えをする場合は、個人の責任で行って下さい。
# **********************************************************************************
# [メイン処理]
if (!(-r $jcode)) { &error(bat_jcode); }
require $jcode;
&read_form;
@DATE = &read_file($datefile);
&registry;

# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [ファイルに記録]
sub registry {
  $down = $FORM{'down'};
  $name = $FORM{'name'};
  $hp   = $FORM{'hp'};

# IPアドレスを取得
  $new_addr = $ENV{'REMOTE_ADDR'};

# ホスト名取得
  $new_host = $ENV{'REMOTE_HOST'};

# ブラウザ情報取得
  $new_agent = $ENV{'HTTP_USER_AGENT'};

# 現在時間の取得
  ($new_date,$sc) = &time;

  $m = 0;
  foreach $lines (@DATE) {
    local($date,$cginame,$count,$addr,$host,$agent,$hp) = split(/☆|★/,$lines);
    if ($name eq $cginame) {
      $m = 1;
      $count++;
      $lines = "$new_date☆$name☆$count☆$new_addr☆$new_host☆$new_agent☆$hp★\n";
    }
    push(@NEW,$lines);
  }

# 既存の場合
  if ($m == 1) {
    if (!open(OUT, ">$datefile")) { &error(bat_file); }
    print OUT @NEW;
    close (OUT);
  }

# 新規の場合
  elsif ($m == 0) {
    if (!open(OUT, ">>$datefile")) { &error(bat_file); }
    $count = 1;
    print OUT "$new_date☆$name☆$count☆$new_addr☆$new_host☆$new_agent☆$hp★\n";
    close (OUT);
  }
  print "Location: $down\n\n";
  exit;
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [記録ファイルの読み込み]
sub read_file {
  local($date_file) = $_[0];
  if (!open(IN,$date_file)) { &error(bat_file); }
  local(@date_files) = <IN>;
  close(IN);
  return @date_files;
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [フォームデータを取得し、文字コード統一]
sub read_form {
  local($pair,$form_date);
  if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $form_date, $ENV{'CONTENT_LENGTH'}); }
  else { $form_date = $ENV{'QUERY_STRING'}; }
  local(@pairs) = split(/&/,$form_date);
  foreach $pair (@pairs) {
    local($name,$value) = split(/=/,$pair);
    $value =~ tr/+/ /;
    $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg;
    $value =~ s/"/&quot\;/g;
    $value =~ s/<>/&gt\;&lt\;/g;
    &jcode'convert(*value,'sjis');
    $FORM{$name} = $value;
  }
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [現在時刻を取得]
sub time{
  ($sec,$min,$hour,$mday,$mon,$year,$wday) = localtime(time);
  $year = $year + 1900;
  $mon = sprintf("%.2d",$mon +1);
  $mday = sprintf("%.2d",$mday);
  $hour = sprintf("%.2d",$hour);
  $min = sprintf("%.2d",$min);
  $sec = sprintf("%.2d",$sec);
# 曜日を日本語化
  @week = ('日','月','火','水','木','金','土');
  $wday = $week[$wday];
  local($date) = "$year年$mon月$mday日($wday) $hour時$min分$sec秒";
  $sc = time;
  return ($date,$sc);
}
# ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# [エラー関連]
sub error {
  $error = $_[0];
  if ($error eq "bat_jcode") { $error_message = 'jcode.pl が見つかりません'; }
  elsif ($error eq "bat_file") { $error_message = 'データファイルがありません'; }

  print "Content-type: text/html\n\n";
  print "<html><head><title>$error_message</title></head>\n";
  print "<BODY bgcolor=ffffff text=000000>\n";
  print "<BR><BR><BR><CENTER>\n\n";
  print "<TABLE BORDER=0>\n";
  print "<TR><TD BGCOLOR=#FFCCCC WIDTH=70 ALIGN=center>\n";
  print "<FONT SIZE=4><B>エラー</B></FONT></TD>\n\n";
  print "<TD BGCOLOR=#FFCC99 WIDTH=500 ALIGN=center>\n";
  print "<FONT SIZE=4><B>$error_message</B></FONT></TD></TR>\n";
  print "</CENTER>\n\n";
  print "</BODY></HTML>\n";
  exit;
}
