#!/usr/local/bin/perl
require 'jcode.pl';
## remake.cgi ver 2.06 (2001/08/22)(16.zip)
# 使い方
# remake.cgi?bbs=bbs 全復帰
# remake.cgi?bbs=bbs&key=0 復帰なし(index.html再作成)
# remake.cgi?bbs=bbs&key=key keyのスレッドを復帰
#==================================================
# システム関連(タイムゾーン・シグナル)
#==================================================
#タイムゾーンをセットする
{
$ENV{'TZ'} = "JST-9";
}
#シグナル対処関数
sub SigExit {
exit(0);
}
#対応シグナル
{
$SIG{'PIPE'} = $SIG{'INT'} = $SIG{'HUP'} = $SIG{'QUIT'} = $SIG{'TERM'} = "SigExit";
}
#==================================================
# 初期情報の取得(POST)
#==================================================
{
use vars qw(%FORM);
my ($buffer, @pairs, $pair, $name, $value);
if($ENV{'REQUEST_METHOD'} eq 'GET'){$buffer = $ENV{'QUERY_STRING'};}
if($ENV{'REQUEST_METHOD'} eq 'POST'){read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});}
@pairs = split(/&/,$buffer);
foreach $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack('H2',$1)/eg;
$value =~ s/</g;
$value =~ s/>/>/g;
$value =~ s/\r\n|\r|\n/
/g;
$value =~ s/
/
/g;
$FORM{$name} = $value;
}
}
#==================================================
# エラーレスポンス(BBS情報)
#==================================================
#BBS名がない場合ばいばい
#BBS名に不正な文字があった場合もばいばい
{
unless($FORM{'bbs'}){
DispError("ERROR!","BBS名がありません!");
}
# if($FORM{'bbs'} =~ /(\.|\/)/){
# DispError("ERROR!","BBS名が不正です!");
# }
}
#==================================================
# システム関連(ファイル・ディレクトリパス)
#==================================================
#各種PATH生成
{
use vars qw($WWWPATH);
use vars qw($PATH);
use vars qw($DATPATH);
use vars qw($TEMPPATH);
use vars qw($IMODEPATH);
$PATH = "../" . $FORM{'bbs'} . "/";
$DATPATH = $PATH . "dat/";
$TEMPPATH = $PATH . "html/";
$IMODEPATH = $PATH . "i/";
use vars qw($NOWTIME);
$NOWTIME = time;
}
#==================================================
# 初期情報の取得(設定ファイル)
#==================================================
{
use vars qw(@SETTING);
# 設定ファイルを読む
my ($m_pass,$m_key,$m_value);
$m_pass = $PATH . "SETTING.TXT";
if(-e $m_pass){
open(FILE,$m_pass);
foreach (){
chop;
($m_key,$m_value) = split /=/;
$SETTING{$m_key} = $m_value;
}
close(FILE);
}else{
# 設定ファイルがない(ERROR)
DispError("ERROR!","ERROR:ユーザー設定が消失しています!");
}
#欠落情報の補完
unless($SETTING{"BBS_THREAD_NUMBER"}){$SETTING{"BBS_THREAD_NUMBER"} = 20;}
unless($SETTING{"BBS_CONTENTS_NUMBER"}){$SETTING{"BBS_CONTENTS_NUMBER"} = 10;}
unless($SETTING{"BBS_LINE_NUMBER"}){$SETTING{"BBS_LINE_NUMBER"} = 30;}
unless($SETTING{"BBS_MAX_MENU_THREAD"}){$SETTING{"BBS_MAX_MENU_THREAD"}=100;}
unless($SETTING{"BBS_BG_COLOR"}){$SETTING{"BBS_BG_COLOR"}="#FFFFFF";}
unless($SETTING{"BBS_MENU_COLOR"}){$SETTING{"BBS_MENU_COLOR"}="#CCFFCC";}
unless($SETTING{"BBS_MAKETHREAD_COLOR"}){$SETTING{"BBS_MAKETHREAD_COLOR"}="#CCFFCC";}
unless($SETTING{"BBS_THREAD_COLOR"}){$SETTING{"BBS_THREAD_COLOR"}="#EFEFEF";}
unless($SETTING{"BBS_SUBJECT_COLOR"}){$SETTING{"BBS_SUBJECT_COLOR"}="#FF0000";}
unless($SETTING{"BBS_TEXT_COLOR"}){$SETTING{"BBS_TEXT_COLOR"}="#000000";}
unless($SETTING{"BBS_NAME_COLOR"}){$SETTING{"BBS_NAME_COLOR"}="#008800";}
unless($SETTING{"BBS_LINK_COLOR"}){$SETTING{"BBS_LINK_COLOR"}="#0000FF";}
unless($SETTING{"BBS_ALINK_COLOR"}){$SETTING{"BBS_ALINK_COLOR"}="#FF0000";}
unless($SETTING{"BBS_VLINK_COLOR"}){$SETTING{"BBS_VLINK_COLOR"}="#660099";}
unless($SETTING{"BBS_TITLE_COLOR"}){$SETTING{"BBS_TITLE_COLOR"}="#000000";}
unless($SETTING{"BBS_SUBJECT_COUNT"}){$SETTING{"BBS_SUBJECT_COUNT"}="64";}
unless($SETTING{"BBS_NAME_COUNT"}){$SETTING{"BBS_NAME_COUNT"}="64";}
unless($SETTING{"BBS_MAIL_COUNT"}){$SETTING{"BBS_MAIL_COUNT"}="64";}
unless($SETTING{"BBS_MESSAGE_COUNT"}){$SETTING{"BBS_MESSAGE_COUNT"}="4096";}
}
#==================================================
# ファイル操作(サブジェクトファイル読み込み)
#==================================================
#サブジェクトファイルを読み込む
{
my $subject = $PATH . "subject.txt";
use vars qw(@PAGEFILE);
use vars qw(%SUBJECT);
use vars qw($FILENUM);
#サブジェクトファイルを読み込む
open(SUBR,"<$subject"); #SUBJECTを開く
my @SUBJECTLIST = ; #内容を全て読み込む
close(SUBR); #閉じる
#サブジェクト内容をハッシュに格納
foreach(@SUBJECTLIST){
chomp($_);#改行を取る
my ($file, $value) = split(/<>/,$_);
unless($file){next;}
my $filename = $DATPATH . $file;
if(-e $filename){
#datが存在する場合のみ最後に追加
push(@PAGEFILE,$file);
$SUBJECT{$file} = $value;
}
}
### 逝っちゃったログも拾う
if($FORM{'key'} eq ''){
opendir(DIR, $PATH."dat/");
@filelist = readdir(DIR);
closedir(DIR);
foreach(@filelist){
if($_ eq "." || $_ eq ".."){next}
if (-e $PATH."dat/$_" && $PAGEFILE{$_} eq "" && $SUBJECT{$_} eq ""){
unshift(@PAGEFILE,$_);
open(IN,$PATH."dat/$_");
@in=;
close(IN);
$subject=(split /<>/,$in[0])[4];
chomp($subject);$num=@in;
$SUBJECT{$_} = "$subject ($num)";
}
}
}
#サブジェクト数を取得
$FILENUM=@PAGEFILE;
#パーミッション調整
chmod(0666,$subject);
if ($FORM{'key'} eq "") {
foreach (@PAGEFILE) {
open(DAT,"$DATPATH$_");
my @temp=;
close(DAT);
my $num=@temp;
my ($name,$mail,$date,$message,$subject) = split(/<>/,$temp[0]);
chomp($subject);#改行を取る
$SUBJECT{$_} = "$subject ($num)";
}
}elsif ($FORM{'key'} ne 0 && -e "$DATPATH$FORM{'key'}.dat") {
open(DAT,"$DATPATH$FORM{'key'}.dat");
my @temp=;
close(DAT);
my $num=@temp;
my ($name,$mail,$date,$message,$subject) = split(/<>/,$temp[0]);
chomp($subject);#改行を取る
my $fl=0;
foreach(@PAGEFILE){
if($_ eq "$FORM{'key'}.dat"){
$fl=1;last;
}
}
if($fl eq 0){
unshift(@PAGEFILE,"$FORM{'key'}.dat");$FILENUM++;
}
$SUBJECT{"$FORM{'key'}.dat"} = "$subject ($num)";
}
my ($subtt,$subtm,$datfile,$valued,$subval,$subnum);
undef $subtm;
undef $subtt;
$subject = $PATH . "subject.txt";
#サブジェクトテキストを開く
open(SUBW,">$subject");
eval{flock(SUBW,2);};
#一括書き込み
my @temp;
undef @temp;
foreach(@PAGEFILE){
$temp[@temp]=$_;
print SUBW "$_\<>$SUBJECT{$_}\n";
}
@PAGEFILE=@temp;
eval{flock(SUBW,8);};
close(SUBW);
# i-mode用テキストを開く
{
unless(-e $IMODEPATH){
mkdir($IMODEPATH,0777);
}
my $imodeindex = $IMODEPATH . "index.html";
open(SUBW,">$imodeindex");
eval{flock(SUBW,2);};
# 一括書き込み
print SUBW "\n";
print SUBW "\n";
print SUBW "$SETTING{'BBS_TITLE'}\n";
print SUBW "\n";
print SUBW "おんぷちゃんねる i-mode トップ
";
print SUBW "$SETTING{'BBS_TITLE'}
";
my ($count,$key,$end,$subtitle);
if($FILENUM<30){$end=$FILENUM;}else{$end=30;}
for($count=1;$count<=$end;$count++){
@PAGEFILE[$count-1]=~ /(\d*)\.dat/;
$key = $1;
$subtitle = $SUBJECT{@PAGEFILE[$count-1]};
&jcode::z2h_sjis(\$subtitle);
print SUBW "$count: $subtitle
";
}
$count=@PAGEFILE;
if ($count > 30){
print SUBW "
次\n";
}
print SUBW "
\n";
print SUBW <
タイトル:
名前:
mail:
コメント
EOF
print SUBW "