#! /usr/local/bin/perl # ↑この上のPerlのパスを書き換えるのはお約束ですね #========================================================================================== # # マルチボード掲示板システム 『MultiBBS』ver 1.3 : 過去ログ表示スクリプト # # Copyright Shinobu Suzuki 1998. All rights reserved. #------------------------------------------------------------------------------------------ # HomePage : http://www.aikis.or.jp/~s-suzuki/cgilabo/ # E-mail : s-suzuki@aikis.or.jp # Version : 1.32 # Update : 1999/02/27 #------------------------------------------------------------------------------------------ # ■makelog.cgiで作成された過去ログを表示します # ■過去ログデータはMultiBBSの設置ディレクトリ下の oldlog ディレクトリに格納されています # ■過去ログファイルは、ボード名に000〜999までの連番が付加されて作成されています # ■過去ログファイルの拡張子は .bkl となっています # ■過去ログを表示するときの画面の配色等は、ボード定義ファイルより読み込みます # ■このCGIの呼び出しは以下のように行います # viewlog.cgi?bordname=ボード名 # ■ボード名を指定していないときは、表示可能な過去ログの作成されたボードの一覧になります # **** # ■このスクリプトは config.cgi を参照しています #========================================================================================== # 初期設定 #------------------------------------------------------------------------------------------ # CERN HTTPDなどのサーバーの場合で、ファイル関係のエラーが # 出る場合、設置するディレクトリのフルパスを指定してみて下 # さい。なお、最後は / で終わること。 # 例) $path = "/home/users/s-suzuki/public_html/bbs/"; #---------------------------------------------------------- $path = ""; #---------------------------------------------------------- # 共通設定ファイルの指定 #---------------------------------------------------------- require "$path"."config.cgi"; #---------------------------------------------------------- # 日本語コード変換ライブラリの指定 #---------------------------------------------------------- require "$path"."jcode.pl"; #---------------------------------------------------------- # このスクリプトでのみ必要な設定 #---------------------------------------------------------- $indexname = '戻る'; # makelog.cgiからの戻り先 $index = './'; # makelog.cgiからの戻り先(URL) #===================================================================== # これより、処理の開始 #===================================================================== &form; # フォーム入力された値の分解 #---------------------------------------------------------- # ボード名のチェック #---------------------------------------------------------- if ($FORM{'bordname'} eq "" ) { &bordlist; } $bordname = "$FORM{'bordname'}"; &read_cfg; # ボード定義ファイルの読み込み #---------------------------------------------------------- # スクリプトの動作を決定($FORM{'task'}で判定) #---------------------------------------------------------- if ( $FORM{'task'} eq 'view' ) { # 過去ログ表示ルーチンへ &view_log; } else { # 通常の画面表示 &loglist; } #---------------------------------------------------------------------- # 過去ログが作成されているボード名のリスト表示 #---------------------------------------------------------------------- sub bordlist { if ( $path ne "" ) { opendir(DIR,"$path/oldlog/"); } else { opendir(DIR,"./oldlog/"); } @datalist = grep(/bkl/, readdir(DIR)); closedir(DIR); @readlist = sort @datalist; $i = 0; $name1 = ""; $name2 = ""; foreach $fname (@readlist) { $name1 = substr($fname, 0, length($fname)-7); if ( $name1 ne $name2 ) { push( @data, $name1 ); $name2 = $name1; $i++; } } print "Content-type: text/html\n\n"; print "\n\nMultiBBS:過去ログ一覧\n\n"; print "\n\n"; print "MultiBBS:過去ログの一覧
\n"; print "
\n\n"; #------------------------------------------- if ( $i == 0 ) { print "
\n"; print "

過去ログは作成されていません。

\n"; print "
\n"; } else { print "
\n"; print "\n"; print "\n"; print " \n"; print " \n"; print " \n"; print " \n"; foreach $bord (@data) { if ( $path ne "" ) { $cfg = "$path"."log/$bord".".cfg"; } else { $cfg = "./log/$bord".".cfg"; } if( open( DB, $cfg )) { @lines = ; close(DB); foreach $line (@lines) { ($name,$value) = split(/\,/,$line); if( $name eq 'title' ) { $bordtitle = $value; $bordtitle =~ s/<(.*?)>//ig; last; } } print " \n"; print " \n"; print " \n"; print " \n"; print " \n"; } } print "
 \n"; print " ボード名タイトル
 [$bord]  $bordtitle 
\n"; print "
\n"; } #------------------------- # スクリプトの著作権表示 #------------------------- print "
\n
"; print "MultiBBS v$version
\n"; exit; } #---------------------------------------------------------------------- # 過去ログリストの表示 #---------------------------------------------------------------------- sub loglist { if ( $path ne "" ) { opendir(DIR,"$path/oldlog/"); } else { opendir(DIR,"./oldlog/"); } @readlist = grep(/$bordname[0-9]{3}.bkl/, readdir(DIR)); closedir(DIR); print "Content-type: text/html\n\n"; print "\n\n$CFG_DATA{'title'}:過去ログ一覧\n\n"; print "\n\n"; print "$CFG_DATA{'title'}:過去ログの一覧
\n"; print "
\n\n"; #------------------------------------------- print "
\n"; print "\n"; foreach $file (@readlist) { if( open( DB, "$path"."oldlog/"."$file" )) { $logtitle = ; close(DB); $j = $i+1; print " \n"; print " \n"; print " \n"; print " \n"; $i++; } } if ( $i eq 0 ) { print "\n"; print "
$j. "; print "$logtitle 
現在、過去ログはありません。
\n"; } else { print "\n"; } print "
\n
\n"; print "[$indexname]"; exit; } #---------------------------------------------------------------------- # 過去ログの表示 #---------------------------------------------------------------------- sub view_log { #-------------------------------------------------- # 過去ログファイル名のセット #-------------------------------------------------- if ($path eq "" ) { $log_file = "./oldlog/"."$FORM{'file'}"; } else { $log_file = "$path"."oldlog/$FORM{'file'}"; } #-------------------------------------------------- if (!open(DB,"$log_file")) { &error("ファイルの入出力にエラーが発生しました(E001)。"); } eval { flock( DB, 2 );}; # ファイルをロック @lines = ; eval { flock( DB, 8 );}; # ロック解除 close(DB); $logtitle = $lines[0]; shift @lines; #-------------------------------------------------- # HTML(画面)の出力 #-------------------------------------------------- print "Content-type: text/html\n\n"; print "\n\n$CFG_DATA{'title'}:過去ログ\n\n"; print "\n\n"; print "$CFG_DATA{'title'}:$logtitle\n"; print "
一覧に戻る
"; #---------------------------------------------------------- # 記事一覧処理 # 配列<@lines>から1件ずつデータを取り出して処理する #---------------------------------------------------------- $nextline = 1; foreach $line (@lines) { ($count,$date,$editpwd,$name,$email,$url,$value,$subject,$rhost) = split(/\,/,$line); if ( substr($line, 0, 1) eq "@" ) { next; } #--------------------------------------- # nullコード(\0)を半角カンマに変換 #--------------------------------------- $name =~ s/\0/\,/g; $value =~ s/\0/\,/g; $subject =~ s/\0/\,/g; $email =~ s/\0/\,/g; $url =~ s/\0/\,/g; print "
$count $subject"; print " 名前:$name"; if ($email ne "") { print " Mail"; } if ($url ne "") { print " Home"; } print " ($date)

$value"; for (;;) { #--------------------------------------- # 次行がコメントかどうか #--------------------------------------- if ( substr($lines[$nextline], 0, 1) ne "@" ) { last; } ($count,$date,$editpwd,$name,$email,$url,$value,$subject) = split(/\,/,$lines[$nextline]); #--------------------------------------- # nullコード(\0)を半角カンマに変換 #--------------------------------------- $name =~ s/\0/\,/g; $value =~ s/\0/\,/g; $subject =~ s/\0/\,/g; $email =~ s/\0/\,/g; $url =~ s/\0/\,/g; print "
$subject"; print " 名前:$name"; if ($email ne "") { print " Mail"; } if ($url ne "") { print " Home"; } print " ($date)

$value
"; $nextline++; } print"
\n\n"; $nextline++; } print "
\n"; print "
\n"; print "主催者:"; if( $CFG_DATA{'user_name'} eq "" ) { print "$CFG_DATA{'user_email'}\n"; } else { print "$CFG_DATA{'user_name'}\n"; } print "
\n"; print "\n"; exit; } #----------------------------------------------------------------- # フォーム投稿されたデータを解析し、配列にリストする #----------------------------------------------------------------- sub form { #-------------------------------------------------- # フォームから入力されたデータを$bufferに格納 #-------------------------------------------------- if ($ENV{'REQUEST_METHOD'} eq "POST") { read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); } else { $buffer = $ENV{'QUERY_STRING'}; } #-------------------------------------------------- # $bufferに格納されたFORM形式のデータを取り出す #-------------------------------------------------- @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; #-------------------------------------------------- # 処理の都合上、改行コード等を文字列から排除する # 改行コードを
に変換する(97.01.29) #-------------------------------------------------- $value =~ s/\r\n/
/g; $value =~ s/\n/
/g; $value =~ s/\,//g; #-------------------------------------------------- # 記録するデータの半角カナを全角カナに変換する #-------------------------------------------------- &jcode'h2z_sjis(*value); #-------------------------------------------------- # 記録するデータはsjisに統一する #-------------------------------------------------- &jcode'convert(*value,'sjis'); $FORM{$name} = $value; } } #----------------------------------------------------------------- # ボード定義ファイルの読み込み #----------------------------------------------------------------- sub read_cfg { if ( $path ne "" ) { $cfg_file = "$path"."log/$bordname".".cfg"; } else { $cfg_file = "./log/$bordname".".cfg"; } if (!open(DB,"$cfg_file")) { &error("ボード定義ファイルをオープンできません。"); } eval { flock( DB, 2 );}; # ファイルをロック @lines = ; eval {flock( DB, 8 );}; # ロック解除 close(DB); foreach $line (@lines) { ($name,$value) = split(/\,/,$line); $CFG_DATA{$name} = $value; } if ( $CFG_DATA{'max'} > $log_max ) { $CFG_DATA{'max'} = $log_max; } if ( $CFG_DATA{'page'} eq "" ) { $CFG_DATA{'page'} = 0; } else { if( $CFG_DATA{'page'} > $page_max ) { $CFG_DATA{'page'} = $page_max; } } }