#! /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 #========================================================================================== # # SSBoardのログから、指定したログデータを過去ログとして抽出します。 # # ・過去ログデータはSSBoardの設置ディレクトリ下の oldlog ディレクトリに格納される # ・oldlog ディレクトリのパーミッションは 777 にする事 # ・過去ログファイルは、ベース名に000〜999までの連番が付加される # ・過去ログファイルの拡張子は .bkl となる # ・過去ログファイルの表示は viewlog.cgi にて行う # #----------------------------------------------------------------------------------------- # 初期設定 #----------------------------------------------------------------------------------------- $version = '1.3'; # 本スクリプトのバージョン $script = 'ssboard.cgi'; # 対象となる掲示板スクリプト $log_file = 'ssboard.log'; # 対象となる掲示板ログ $user_pass = '1234'; # 管理用パスワード $basename = 'ssboard'; # 作成するログのベース名 #---------------------------------------------------------- $bg_col = '#e0e0e0'; # 背景色 $title_col = '#000080'; # タイトルの色 $text_col = '#000000'; # テキストの色 $link_col = '#0000ff'; # リンクの色 $alink_col = '#ff0000'; # リンク中の色 $vlink_col = '#800080'; # 既リンクの色 $frame_col = '#000000'; # 罫線の色 $indexname = '戻る'; # makelog.cgiからの戻り先 $index = './'; # makelog.cgiからの戻り先(URL) #---------------------------------------------------------- # ファイル入出力時にファイルロックを行う設定。これにより、 # 同時アクセス時の問題が多少マシになる(?) # サーバーが flock()関数を使える設定の場合のみ利用できる。 # 0:ファイルロックを行わない # 1:flock()でファイルロックを行う #---------------------------------------------------------- $lockmode = 0; #---------------------------------------------------------- # CERN HTTPDなどのサーバーの場合で、ファイル関係のエラーが # 出る場合、設置するディレクトリのフルパスを指定してみて下 # さい。なお、最後は / で終わること。 # $path = "/home/users/s-suzuki/public_html/bbs/"; #---------------------------------------------------------- $path = ''; #---------------------------------------------------------- # 外部からの(イタズラ)書き込みを禁止する場合、以下に、ス # クリプトのURLを記入する。(サーバーやブラウザによっては # うまくいかないこともあります) # 例:$script_url = 'http://www.aikis.or.jp/~s-suzuki/multibbs/multibbs.cgi'; #---------------------------------------------------------- $script_url = ''; #---------------------------------------------------------- # ログ作成のあと File Not Found のエラーがでる場合、CGIス # クリプトを設置するディレクトリ名をURLで指定すると成功す # る場合があるそうです。 # ※この機能については未確認です # ※biglobeでは成功するそうです # ※最後は / で終わること。 # 例:$rerload_url = 'http://www.aikis.or.jp/~s-suzuki/multibbs/'; #---------------------------------------------------------- $reload_url = ''; #---------------------------------------------------------- # 日本語コード変換ライブラリの指定 #---------------------------------------------------------- require "$path"."jcode.pl"; #====================================================================== # これより、処理の開始 #====================================================================== &form; # フォーム入力された値の分解 #---------------------------------------------------------- # スクリプトの動作を決定($FORM{'task'}で判定) #---------------------------------------------------------- if ( $FORM{'task'} eq 'move' ) { &move_log; } else { # 通常の画面表示 &make_log; exit; } #====================================================================== # 処理はここまで(^^;;) #====================================================================== #---------------------------------------------------------------------- # 整理するログの選択リスト #---------------------------------------------------------------------- # sub make_log { #-------------------------------------------------- # ログの読み込み #-------------------------------------------------- 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); #-------------------------------------------------- # HTML(画面)の出力 #-------------------------------------------------- print "Content-type: text/html\n\n"; print "\n\n過去ログの作成\n\n"; print "\n\n"; print "過去ログの作成\n"; print "
\n"; print "\n"; print "過去ログのタイトル
\n"; if ( $FORM{'pwd'} eq $user_pass ) { print "管理パスワード \n
\n"; } else { print "管理パスワード \n
\n"; } print "
\n\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; foreach $line (@lines) { ($count,$date,$editpwd,$name,$email,$url,$value,$subject,$host) = split(/\,/,$line); print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "" } print "
 No.日付投稿者タイトル
$count $date  $name  $subject 
\n"; print "\n\n"; print "\n"; print "\n"; print "\n"; print "\n"; print "\n
\n"; print "
 
\n"; print "\n"; exit; } #----------------------------------------------------------------- # リストアップされたメッセージのデータ削除 #----------------------------------------------------------------- # sub move_log { #-------------------------------------------------- # パスワードのチェック #-------------------------------------------------- if ( $FORM{'passwd'} eq "" ) { &error("パスワードが入力されていません(E002)。"); } else { if ( $FORM{'passwd'} ne $user_pass ) { &error("パスワードが違います(E002)。"); } } #-------------------------------------------------- if( $FORM{'logtitle'} eq "" ) { &error("過去ログのタイトルが入力されていません(E001)。"); } #-------------------------------------------------- # 外部フォームからの書き込みの禁止チェック #-------------------------------------------------- if ($script_url ne "") { $ref = $ENV{'HTTP_REFERER'}; $ref_url = $script_url; $ref_url =~ s/\~/.*/g; if (!($ref =~ /$ref_url/i)) { &error("「$script_url」以外からの投稿は受け付けられません(E001)。"); } } #------------------------------------- # 過去ログファイル名の作成 #------------------------------------- if ( $path ne "" ) { $temp = "$path"."oldlog/"; } else { $temp = "./oldlog/"; } for( $i=0; $i<1000; $i++ ) { $new_log = sprintf "%s%s%03d.bkl", $temp, $basename, $i; if ( -e $new_log ) { if ($i == 999) { &error("これ以上の過去ログを作成できません。"); } next; } else { last; } } #------------------------------------- # 通常ログの読み込み #------------------------------------- if (!open(IN,"$log_file")) { &error("ファイルの入出力にエラーが発生しました(E006)。"); } if( $lockmode == 1 ) { eval { flock( IN, 2 );}; # ファイルをロック if ( $@ ne "" ) { &error("flock()がサポートされていません。"); } @lines = ; flock( IN, 8 ); # ロック解除 } else { @lines = ; } close(IN); #------------------------------------- # ログの分別 #------------------------------------- push (@old, "$FORM{'logtitle'}\n"); # 1行目にタイトルを格納 foreach $line (@lines) { ($count,$date,$editpwd,$name,$email,$url,$value,$subject,$rhost) = split(/\,/,$line); $del = 0; foreach $target (@RM) { if ($target eq $count) { $del = 1; } } if ($del == 0) { push(@new,$line); } else { push(@old,$line); } } #------------------------------------- # 通常ログの出力 #------------------------------------- if (!open(DB,">$log_file")) { &error("ファイルの入出力にエラーが発生しました(E007)。"); } if( $lockmode == 1 ) { eval { flock( DB, 2 );}; # ファイルをロック if ( $@ ne "" ) { &error("flock()がサポートされていません。"); } print DB @new; flock( DB, 8 ); # ロック解除 } else { print DB @new; } close(DB); #------------------------------------- # 過去ログの出力 #------------------------------------- if (!open(DB,">$new_log")) { &error("ファイルの入出力にエラーが発生しました(E007)。"); } if( $lockmode == 1 ) { eval { flock( DB, 2 );}; # ファイルをロック if ( $@ ne "" ) { &error("flock()がサポートされていません。"); } print DB @old; flock( DB, 8 ); # ロック解除 } else { print DB @old; } close(DB); #------------------------------------------------------------ # 記録処理後、再読み込みする #------------------------------------------------------------ print "Location:$reload_url"."makelog.cgi?\n\n"; } #----------------------------------------------------------------- # フォーム投稿されたデータを解析し、配列にリストする #----------------------------------------------------------------- # 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.plのv2.0以降を使うこと #-------------------------------------------------- &jcode'h2z_sjis(*value); #-------------------------------------------------- # 記録するデータはsjisに統一する #-------------------------------------------------- &jcode'convert(*value,'sjis'); #-------------------------------------------------- # 削除するメッセージ番号のリストアップ #-------------------------------------------------- if ($name eq "target") { push(@RM,$value); #---------------------------------------------- # 親メッセージの場合、チェックの有無に関わらず # コメントもリストアップする #---------------------------------------------- if ( substr($value, 0, 1) eq "#" ) { for( $i=0; $i<10; $i++ ) { $temp1 = substr( $value, 1, 4 ); $temp2 = sprintf "@%s%02d", $temp1, $i; push(@RM,$temp2); } } } $FORM{$name} = $value; } if( $FORM{'page'} eq "" ) { $FORM{'page'} = 0; } } #----------------------------------------------------------------- # エラーメッセージの出力 #----------------------------------------------------------------- # 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; }