#!/usr/local/bin/perl # Re^9: First aid (レスキューファーストエイド) # $vers = '1.04'; # Copyright © 2001 Acupuncture Point of Happiness. # created: February 01, modified: April 01 #*#*# 用途 #*#*# # MiniBBS タイプ1のログを壊してしまった時、それを修復します。 # バージョン7〜10、およびMiniBBS2000に対応。どのバージョンのログかを自動識別します。 #*#*# 使い方 #*#*# # 1. このファイルの拡張子を、サーバがCGIだと認識できるものに変更して下さい。拡張子以外は任意に変えて大丈夫です。 # 2. 下の初期設定を設定します。上にあるperlのパスも環境に合わせて下さい。 # 3. 通常のCGIと同様に、サーバに転送しパーミッションを設定します。設置場所やパーミッションはプロバイダの指示に従って下さい。特に指示がない場合は755です。 # 4. 対象ファイルのバックアップを作ります。対象ファイルのパーミッションが、CGIで読み書きできるようになっていることを確認して下さい。 # 5. ブラウザからこのCGIを呼び出します。 # 6. 画面の指示に従って対象ファイルを指定し、祈りながら「修復」ボタンを押します。 # 7. 元のMiniBBSにアクセスし、修復されているか確認して下さい。 #*#*# 初期設定 #*#*# # 簡易パスワード(必須) # 安全のためパスワードを設定する # ※このスクリプトは修復終了後速やかにサーバから削除すること $password = '任意のパスワード'; # ログファイルのあるディレクトリを設定 # このスクリプトがある場所からの相対パス、又はサーバの絶対パスを記入 $where = './'; # このスクリプトのファイル名 # 通常はこのままでよい。うまく動作しない時はファイル名・パス・URIのいずれかを記入 $here = "$ENV{'SCRIPT_NAME'}"; #*#*# 初期設定ここまで #*#*# # 1.04 バグを修正、きちんと動作するように # 1.03 2000のログに対応 # 1.02 7.x系のcryptなしログに対応 # 1.01 指定されたファイルの存在を明示的にチェック # 1.00 公開 if ($password eq "") { &error('エラー','パスワードが設定されていません'); } read(STDIN,$form,$ENV{'CONTENT_LENGTH'}); foreach (split(/&/,$form)) { ($name,$data) = split(/=/); next if $data eq ""; $data =~ tr/+/ /; $data =~ s/%([a-fA-F\d]{2})/pack("C", hex($1))/eg; $FORM{$name} = $data; } if ($FORM{'log'}) { &restore; } else { &prompt; } exit(0); sub prompt { print <<"HTML"; Content-Type: text/html Re^9: First aid

修復したいファイルを指定して下さい

ファイル名:
パスワード:

※必ずバックアップをとってから試して下さい。修復できなかった場合、更に悪化する可能性があります。
※正常なファイルは指定しないで下さい。逆に破壊してしまう可能性があります。
※ログファイルが大きい場合、タイムアウトエラーが表示されることがあります。修復できたかはMiniBBSにアクセスして確認して下さい。

HTML &foot; } sub restore { if ($FORM{'log'} =~ /^\// || $FORM{'log'} =~ /\.\./) { &error('エラー','ファイル名の指定が間違っています'); } if ($FORM{'passwd'} ne $password) { &error('エラー','入力したパスワードが正しくありません'); } $altfile = "$where$FORM{'log'}"; unless (-e $altfile) { &error('エラー','指定されたファイルがありません'); } unless (open(DB,$altfile)) { &error('エラー','ファイルが読み込めません'); } $content = ; if ($content =~ /^crypt_password:/) { $type = 7; } elsif ($content =~ /^MiniBBSv8/) { $type = 8; } elsif ($content =~ /^MiniBBSv9/) { $type = 9; } elsif ($content =~ /^MiniBBSv10:/) { $type = 10; } elsif ($content =~ /^\d\d月\d\d日\(..\)\d\d時\d\d分\d\d秒/) { $type = 7; } elsif ($content =~ /^\d+\t[\w\.\/]+\t/) { $type = 2000; } else { &error('エラー','ログ形式が判定できませんでした'); } $content .= $_ while ; close(DB); $content =~ s/\r?\n/\r/g; if ($type == 7) { $content =~ s/\r(\d\d月\d\d日\(..\)\d\d時\d\d分\d\d秒\,)/\n$1/g; } elsif ($type == 8 || $type == 9) { $content =~ s/\r(\"\d{10}\"\,\")/\n$1/g; } elsif ($type == 10) { $content =~ s/\r(\d{14}\t)/\n$1/g; } elsif ($type == 2000) { $content =~ s/\r(\d+\t)/\n$1/g; } $content =~ s/\r$/\n/; unless (open(DB,">$altfile")) { &error('エラー','ファイルに書き込めません'); } print DB $content; close(DB); print <<"HTML"; Content-Type: text/html [Re^9: First aid] OK

処置完了

バージョン $type 系のログファイルとして修復できたようです。
MiniBBSにアクセスして、修復できているか確認して下さい。

HTML &foot; } sub foot { print <<'HTML';
Re^9: First aid 1.04 - by しあわせのツボ.
MiniBBS by Rescue.
HTML } sub error { print <<"HTML"; Content-Type: text/html [Re^9: First aid] Error

$_[0]

$_[1]

ブラウザの[戻る]ボタンで戻ってください。

HTML &foot; exit; } __END__