bbs.cgi再開発プロジェクト 3
■ このスレッドは過去ログ倉庫に格納されています
変更してみる
#ログのカキコ数を取得
$lognum = @logdat;
if($lognum > 1010)#念のため暴走ストッパー
{
chmod(0555, $dattemp);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
if($lognum > 999)
{
if(open(OUT,">>$dattemp"))
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
$lognum++;
}
chmod(0555, $dattemp);
}
else
{
#パーミッション調整
umask(0);
chmod(0666, $dattemp);
}
close(OUT);
chmod(0555, $dattemp);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
のほうがいいかも (´-`).。oO(いつdatに書き込んでるんだろう…) >>537
(´-`).。oO(たぶん別の場所でやってて、そこは今大人の都合で書いてないだけなんだよ、とか言ってみるテスト。) >>539
ご苦労様です。
お茶でもどうぞ。
ζ
旦 ⊆⊇ んで
現状は 1,000行ったスレッドは
dat = 1,001 まである
index.html = 1,000 までしか出ない(以前と使用違うけど、がまんの方向で)
subject.txt = 1,001 まである
今回の改修の目的は
2,000 とか 3,000 まで書き込めてしまうのを 1,000 近辺で止める。
なのでどうなるか観察しよう。 >>541
>2,000 とか 3,000 まで書き込めてしまうのを 1,000 近辺で止める。
何が何でも1,000ぴったりで止めるのか
1050ぐらいまで放置するか決めよう
>>542
1,000 「近辺」というぐらいだから1050でもアリじゃないかな……。 ちょっとくらいはオーバーしてもいいという方針だったと思うのだが、、
過去ログorソースコード読んだ? 1000を書いたbbs.cgiさんが、責任持って1000ストッパーを書いて、
chmod/fchmodしてから終わる、というのはどうなんでしょう。 それに挑戦したのが >>255 あたりからだったりして、 >>545
それだと「999を書いたbbs.cgiさん×2+1001以降を書くbbs.cgiさん」な場合に
ストッパーが効かなくなる気がするです。 >>548
そっか。当然そうだよね。
なんだか、某DJBに「フーン」って笑われそうな議論だよなぁ。ここでのあがきって。
もちろん、私も含めて。 1000 近くになると
my @logdat = <OUT>;
のコストがバカにならないんだよね
読み進めてる間に他のプロセスがガンガン書いてる
やっぱ 1 レスにつき 1 バイト追記するレス数ファイルを
持つのがいいんじゃなかろうか *.datでなんでもかんでもやろうとしないで、専用ロックファイルに任せたほうがかえって早くなるに一票。
大改造しているところ大変申し訳ないのだが、
単純に最初のソースの
#パーミッション調整
umask(0);
chmod(0666, $DATAFILE);
の部分を
if($FORM{'subject'} ne ""){#新規スレ立て時
#パーミッション調整
umask(0);
chmod(0666, $DATAFILE);
}
とすればいいような気がする。 >>559
>>534 かと。
それなら一回555にしたパーミッションが戻ることもないし。
とPerlよく知らないけど口出ししてみる。 >>558
なるほど。パーミッション調整って新規作成したときのものだったのか。 >>558
もとのソースだと書きこみが失敗したときでもchmod(0666,)が実行されてたみたい?なので、
if (open(OUT, ">>$DATAFILE"))
print OUT "$outdat\n";
close(OUT);
} else {
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
これだけでもいいかもしれない。 DATファイル作成後、DATファイルが666で変わらなければ、レス追加時に666を
設定するのは意味が無いし、>>357 >>508にもあるように、555にしたファイル
が666に戻るのは元々想定していないと思います。
DATファイルが666で変わらないことは、実際のDATファイルや全てのソースを
見ないと分からないので、分かる方お願いします。 >>563
FTP で入って chmod 555 しようとおもったら
permition ないって怒られた。
だれの持ち物になっているんだ?
良く起こることなのか?
たまたまなのか? 1000を超えていることを示すファイルを別に作るのは駄目ですか?
if (1000越ファイルアリ)
{
}
else
{
if (1000超えた) {
1000越ファイル作成
}
}
1000超えファイルを物凄い勢いで更新する悪寒(素) >>567
cgiから作成されたファイルはcgi経由でないと変更出来ない場合ありです。 >>562は{が抜けてた。
if (open(OUT, ">>$DATAFILE"))
{
print OUT "$outdat\n";
close(OUT);
}
else
{
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
} CGI のプロセス ID 付き書き込みデータを、書き込みやさんに渡す。
書き込みやさんから、その結果を SIGNAL として呼ばれるのを待つ。
成功したら SIGUSR1 とか失敗したら SIGTERM とか。(現状の bbs.cgi では SIGNAL は単純に exit; ですよね?)
でもって 10 秒以上経過しても結果が帰ってこなかったら、DispError("ERROR!","ERROR! (゚∀゚)アヒャヒャヒャヒャ")
せっかくのうに環境なんだから。。。 >>573
OJDでテストしてみたら、書けちゃいました・・・
これを試してみてくれないかなぁ。。。
----
#ログのカキコ数を取得
$lognum = @logdat;
if($lognum > 1010)#念のため暴走ストッパー
{
chmod(0555, $dattemp);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
chmod(0555, $dattemp);#←ここに、これ入れたらどですか
}
if($lognum > 999)
{
if(open(OUT,">>$dattemp"))
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
$lognum++;
}
chmod(0555, $dattemp);
}
else
{
#パーミッション調整
if($lognum < 1000)#666は1000以下で
{
umask(0);
chmod(0666, $dattemp);
}
} >>578
DispErrorはexitするので、2つ目のchmodは実行されないです……。 >>579
あらら直前にあるのに今気がついた。。。
もう少し考えてみますです。。 if($FORM{'subject'} ne ''){#新規スレ立て時
#パーミッション調整
umask(0);
chmod(0666, $DATAFILE);
}
これも組み込んだらいいかと >>558でいいと思うんだけど、通常の書きこみ時にsubjectが送られたときのことを考えて、
>>562と合わせて、
if(!-e $DATAFILE){
1の書きこみ&パーミッション調整
}elsif(open(OUT,">>$DATAFILE")){
通常の書きこみ
}else{
エラー
}
でどうか。
ところで、今どれが入っているの? if($lognum > 1010)#念のため暴走ストッパー
{
chmod(0555, $dattemp) or DispError("ERROR!", "ERROR:chmodできないよ?緊急緊急緊急!!");
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
chmod(0555, $dattemp)が失敗してるのか、
それともどこかで666にchmodされてるのか調べてみるとか >>567
suexecって、たまに「抜けてくる」ことがあります。
ひょっとして、chmod()できないのって、それが原因? うーん
実況の各板たらーっと見てきたけど 1,001 で止まっているなぁ
>>563
のスレッドだけの問題なのかどうなのか。 もちろんまずは自分を疑えってことで
それは見てみたのでしたー >>590
もしかしてnews6/news7配り忘れていない どうだろ、、
自動で配布しているからなぁ
version 番号付けて配ってみるです < こんど 警察板
ERROR:このスレッドには書き込めません。緊急緊急緊急!!
のエラーはでますが、いくらでも書けますよ
>>567
oyster100/200/900番台ならroot師におながいしてchownしてもらえばいいのではないかと。 if (-e $DATFILE && (!-w $DATFILE || -s _ > 512 * 1024)) {
DispError("ERROR!", "ERROR:このスレッドには書き込めません。");
}
#中略
my $lognum = 0;
if (open(IN, "< $DATFILE")) {
$lognum = (join('', <IN>)) =~ tr/\n/\n/;
close(IN);
}
if ($lognum > 1010) {
chmod(0555, $DATFILE);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}else{
if (-w $DATFILE && open(OUT, ">>$DATFILE")) {
print OUT "$outdat\n";
++$lognum;
if ($lognum > 999) {
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
++$lognum;
close(OUT);
chmod(0555, $DATFILE);
}
close(OUT);
}elsif (!-e $DATFILE) {
# スレ立て処理
chmod(0666, $DATFILE);
}else{
DispError("ERROR!", "ERROR:このスレッドには書き込めません。");
}
}
#(´-`).。oO(テストまでしちゃったよ…) >>534
http://society.2ch.net/test/read.cgi/police/990121724/
>"ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!"
↑これが出ているのに上のスレに書き込めるということは bbs.cgi の序盤のここ↓を通り抜けているということなので
パーミッションがどこかで再変更されているはず。
>#.datが存在してないか書けないならばいばい
>unless(-w $DATAFILE){
>DispError("ERROR!","ERROR:このスレッドには書けません!");
>}
----
http://society.2ch.net/test/read.cgi/police/1040783990/
このスレは現在パーミッションではなくてここ↓で止まっているもよう。
>unless( -s $DATAFILE <= 512000){
>DispError("ERROR!","ERROR:このスレッドは512kを超えているので書けません!");
>}
なので一番ぁゃιぃここをこの↓ように追加修正すれば現在書き込めるものも含めて
再度パーミッション変更されるので書き込み出来なくなるはず。
#パーミッション調整
umask(0);
chmod(0666, $dattemp);
}
if($lognum > 1010)#1011以上なのに666の暴走ストッパー
{
chmod(0555, $dattemp);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。禁止禁止禁止!!");
}
#禁止と表示されればここ↑で再設定されたはずなので書き込めていないはず。。 WebProg板だと「情報を小出しにするな」って怒られるんだな
規制とかクリティカルな部分を除いて公開、でもダメ? まぁ普通はブラックボックス部分は除いて公開するのが良いよね。
規制のあたりはサブルーチン化してパラメーターと返り値だけ提示すりゃいいんじゃないの。 一応転載。
467 :動け動けウゴウゴ2ちゃんねる [] :04/03/03 03:44 ID:rxiuKiD1
http://pc.2ch.net/test/read.cgi/mac/1057421491
1000を越えても止まらないので対応をよろしくお願いします。 現在の bbs.cgi の version
20040301
どこがどう変わったのか変更点がよくわからないですがまだ書き込めます そうですか。。
ではまたしばらく待機しておきます。。。 >>606
そこで確認できる範囲では、news7だけ更新されませんね。
live5はまた別だろうし。 おおーっ
news7 も配布先リストに加えました。 >>606
そこ新しくできたnews10が入ってないね。 >596
みたいにdatに書き出すタイミングを考慮しないとだめぽ? datディレクトリをls -lで見てみたらなにか分かるかしらん。 ∧_∧
( ・∀・) <忙しそうだし、催促せずに待ちますね。。
( つ旦)
と__)__) ギコナビでレスを2325まで確認。
WinXP+IE6SP1では1001 :1001 :Over 1000 Threadが出て終わり。
山本寛斎の制服でPC自作できたよ〜♪
http://pc3.2ch.net/test/read.cgi/jisaku/1055561893/l50
ためしになつかしドラマ板の1000近いスレをいくつか埋めてみたんだけど
どれも1000突破した。もしかして板、というか鯖によって突破したり突破しなかったりするのか? sub MakeWorkFile{
に最後の手段を追加してみた。
my $key = @_[0];
my $workfile = $TEMPPATH . $key . ".html";
my $dattemp = $DATPATH . $key . ".dat";
my (@messx,@content,@logdat);
my ($lognum,$mailto,$time,$brmax,$topnum,$firstlog,$name,$mail,$subject,$message);
open(RDAT,"<$dattemp");
@logdat=<RDAT>;#ログを配列に読み込む
close(RDAT);
#ログのカキコ数を取得
$lognum = @logdat;
if($lognum > 1020)#最後の手段
{
if(-w $dattemp){
my $datdat = $DATPATH . $key;
my $tmpdat = $DATPATH . $key . ".tmp";
my $success;
open(COPY, "cp $dattemp $datdat |");
close(COPY);
$success = 0;
until($success){ $success = rename($datdat, $dattemp); }
chmod(0555, $dattemp);
unlink($tmpdat);
}
DispError("ERROR!", "ERROR:このスレッドには書き込めません。最後の手段!!");
}
if($lognum > 1010)#念のため暴走ストッパー
{
umask(0);
chmod(0555, $dattemp);
DispError("ERROR!", "ERROR:このスレッドには書き込めません。緊急緊急緊急!!");
}
if($lognum > 999)
{
if(open(OUT,">>$dattemp"))
{
print OUT "1001<><>Over 1000 Thread<>このスレッドは1000を超えました。 <br> もう書けないので、新しいスレッドを立ててくださいです。。。 <>\n";
close(OUT);
$lognum++;
}
umask(0);
chmod(0555, $dattemp);
}
else
{
#パーミッション調整
umask(0);
chmod(0666, $dattemp);
}
>>626
これのこと?
http://qb3.2ch.net/test/read.cgi/operate/1069525567/
479 名前:動け動けウゴウゴ2ちゃんねる[] 投稿日:04/03/05 18:09 ID:Oh96gKaq
1000を超えても延々と書き込めるようです
http://bubble.2ch.net/test/read.cgi/natsudora/1040055595/
481 名前:サザン ★[sage] 投稿日:04/03/05 18:37 ID:???
>>479
とめましたー 何故か bubble サーバは、
昔立てられたスレッドの所有者が nobody になっているもより。
ということは・・・
↓ この↓あたりも変更直後くらいからパーミッションが変わって書き込めなくなっているもよん
【TBS】うちの子にかぎって・・・【田村正和】
http://bubble.2ch.net/test/read.cgi/natsudora/1047211834/
【チュー】マウススレ【チュー】
http://pc.2ch.net/test/read.cgi/mac/1057421491/
----
ERROR!
ERROR:このスレッドには書けません!
>>628
chmodは一切効いてなかったってことね… 引越し時に chmod で 777 にするんじゃなく
chown(でしたっけ?) 後 666 にすべきなのか?
ということは、引越し後の正しい呪文は
↓ chown("ch2あぼんあぼん");
chmod($filename,0666); 一般ユーザ(にsuexecされたCGI)がchownなんてできないと思うなぁ。 ■ このスレッドは過去ログ倉庫に格納されています