#! /usr/local/bin/perl # #========================================================================================== # # 多機能(?)掲示板システム 『SSBoard』 : 過去ログ表示スクリプト # # Copyright Shinobu Suzuki 1998. All rights reserved. #----------------------------------------------------------------------------------------- # HomePage : http://www.aikis.or.jp/~s-suzuki/cgilabo/ # E-mail : s-suzuki@aikis.or.jp #========================================================================================== # # makelog.cgiで作成された過去ログを表示するスクリプト # # ・過去ログデータはSSBoardの設置ディレクトリ下の oldlog ディレクトリに格納される # ・過去ログファイルは、ベース名に000〜999までの連番が付加されている # ・過去ログファイルの拡張子は .bkl となる # ・画面の配色等は、ボード定義ファイルがあれば、その値を優先する # ・CGIの呼び出しは以下のように行う # viewlog.cgi?bordname=ボード名 # #----------------------------------------------------------------------------------------- # 初期設定 #----------------------------------------------------------------------------------------- $version = '1.3'; # 本スクリプトのバージョン $base_name = 'ssboard'; # 過去ログファイルのベース名 $indexname = '掲示板に戻る'; # viewlog.cgiからの戻り先 $index = './ssboard.cgi'; # viewlog.cgiからの戻り先(URL) #---------------------------------------------------------- # ボード情報定義ファイル名 # 例) $cfg_name = "ssboard.cfg"; #---------------------------------------------------------- $cfg_name = ""; #--------------------------------------------------------------------- # ボード定義情報:デフォルト値 # ・定義ファイルを使用する場合は、そちらが優先されます。 # ・定義ファイルににない項目は、ここでは設定する値が使用されます。 # ・定義ファイルを使用する場合は、この項目は削除してもかまいませんが # 削除しない方がなにかと安全です。 #--- こ こ か ら ----------------------------------------------------- $max = '50'; # 最大ログ数(0で無制限に保存) $page = '20'; # 1ページあたりのメッセージ数(0でページ処理をしない) $user_name = ''; # ボードの主催者名 $user_email = ''; # 主催者のE-mailアドレス $title = "SSBoard v$version"; # 掲示板のタイトル $title_image = ''; # タイトル画像(URL:省略可) $bg_col = '#f0f0f0'; # 背景色 $bg_image = ''; # 背景画像(URL:省略可) $title_col = '#000090'; # タイトルの色 $text_col = '#000000'; # テキストの色 $link_col = '#0000ff'; # リンクの色 $alink_col = '#ff0000'; # リンク中の色 $vlink_col = '#900090'; # 既リンクの色 $subject_col = '#ff0000'; # 題名の色 $name_col = '#009000'; # 投稿者名の色 $linkname1 = ''; # 外部リンク その1 $link1 = ''; # 外部リンク その1(URL) $linkname2 = ''; # 外部リンク その2 $link2 = ''; # 外部リンク その2(URL) $linkname3 = ''; # 外部リンク その3 $link3 = ''; # 外部リンク その3(URL) $readme = ''; # 掲示板の説明文 $readme2 = ''; # 書き込み画面の説明文 #--- こ こ ま で ----------------------------------------------------- #---------------------------------------------------------- # ファイル入出力時にファイルロックを行う設定。これにより、 # 同時アクセス時の問題が多少マシになる(?) # サーバーが flock()関数を使える設定の場合のみ利用できる。 # 0:ファイルロックを行わない # 1:flock()でファイルロックを行う #---------------------------------------------------------- $lockmode = 0; #---------------------------------------------------------- # CERN HTTPDなどのサーバーの場合で、ファイル関係のエラーが # 出る場合、設置するディレクトリのフルパスを指定してみて下 # さい。なお、最後は / で終わること。 # $path = "/home/users/s-suzuki/public_html/bbs/"; #---------------------------------------------------------- $path = ''; #---------------------------------------------------------- # 日本語コード変換ライブラリの指定 #---------------------------------------------------------- require "$path"."jcode.pl"; #========================================================================================= # これより、処理の開始 #========================================================================================= &form; # フォーム入力された値の分解 &read_cfg; # ボード定義ファイルの読み込み #---------------------------------------------------------- # スクリプトの動作を決定($FORM{'task'}で判定) #---------------------------------------------------------- # if ( $FORM{'task'} eq 'view' ) { # 過去ログ表示ルーチンへ &view_log; } else { # 通常の画面表示 &html; } #---------------------------------------------------------------------- # 通常の画面表示ルーチン #---------------------------------------------------------------------- # sub html { if ( $path ne "" ) { opendir(DIR,"$path/oldlog/"); } else { opendir(DIR,"./oldlog/"); } @readlist = grep(/$base_name[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)。"); } if( $lockmode == 1 ) { eval { flock( DB, 2 );}; if ( $@ ne "" ) { &error("flock()がサポートされていません。"); } @lines = ; flock( DB, 8 ); # ロック解除 } else { @lines = ; } 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,$rhost) = 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"; if( $CFG_DATA{'user_email'} eq "" ) { print "主催者:"; if( $CFG_DATA{'user_name'} eq "" ) { print "名無しの権兵衛\n"; } else { print "$CFG_DATA{'user_name'}\n"; } } else { 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; #-------------------------------------------------- # 記録するデータの半角カナを全角カナに変換する # これを利用するには、jcode.plのv2.0以降を使うこと #-------------------------------------------------- &jcode'h2z_sjis(*value); #-------------------------------------------------- # 記録するデータはsjisに統一する #-------------------------------------------------- &jcode'convert(*value,'sjis'); $FORM{$name} = $value; } } #----------------------------------------------------------------- # ボード定義ファイルの読み込み #----------------------------------------------------------------- # sub read_cfg { $CFG_DATA{'max'} = $max; $CFG_DATA{'page'} = $page; $CFG_DATA{'user_name'} = $user_name; $CFG_DATA{'user_email'} = $user_email; $CFG_DATA{'security'} = $security; $CFG_DATA{'title'} = $title; $CFG_DATA{'title_image'} = $title_image; $CFG_DATA{'bg_col'} = $bg_col; $CFG_DATA{'bg_image'} = $bg_image; $CFG_DATA{'title_col'} = $title_col; $CFG_DATA{'text_col'} = $text_col; $CFG_DATA{'link_col'} = $link_col; $CFG_DATA{'alink_col'} = $alink_col; $CFG_DATA{'vlink_col'} = $vlink_col; $CFG_DATA{'subject_col'} = $subject_col; $CFG_DATA{'name_col'} = $name_col; $CFG_DATA{'linkname1'} = $linkname1; $CFG_DATA{'link1'} = $link1; $CFG_DATA{'linkname2'} = $linkname2; $CFG_DATA{'link2'} = $link2; $CFG_DATA{'linkname3'} = $linkname3; $CFG_DATA{'link3'} = $link3; $CFG_DATA{'readme'} = $readme; $CFG_DATA{'readme2'} = $readme2; $CFG_DATA{'max_size'} = $max_size; $CFG_DATA{'max_subject'} = $max_subject; $CFG_DATA{'max_name'} = $max_name; $CFG_DATA{'max_email'} = $max_email; $CFG_DATA{'max_url'} = $max_url; #--------------------------------------- # 定義ファイルからの読み込み #--------------------------------------- $cfg_file = "$path"."$base_name".".cfg"; if ( open(DB,"$cfg_file")) { if( $lockmode == 1 ) { eval { flock( DB, 2 );}; # ファイルをロック if ( $@ ne "" ) { &error("flock()がサポートされていません。"); } @lines = ; flock( DB, 8 ); # ロック解除 } else { @lines = ; } close(DB); } foreach $line (@lines) { ($name,$value) = split(/\,/,$line); $CFG_DATA{$name} = $value; } } #----------------------------------------------------------------- # エラーメッセージの出力 #----------------------------------------------------------------- # sub error { $error_msg = $_[0]; print "Content-type: text/html\n\n"; print "エラー発生:過去ログの表\示\n"; print '' . "\n"; print '

おしらせ

' . "\n"; print "$error_msg\n"; print '

' . "\n"; exit; }