<PETROOM大改造> 
 【自動バックアップ】

MissingLinkさまで公開されているPETROOM2.4と、
ことねっつで公開している「標準改造スクリプトVer.A03」および、
「水月の片想いスクリプトVer.A03−D」に、
ユーザーデータの自動バックアップを行う改造を施すためのページです。

= ご注意 =
ことねっつで公開している「標準改造スクリプトVer.A03」および、
「水月の片想いスクリプトVer.A03−D」には、
すでにユーザーデータの半自動バックアップが入っていましたが、
オーナーさんが遊んだ時のみバックアップを取る構造でしたので、
オーナーさんが遊ばない、遊べないような時の対応が出来ませんでした。
今回は曜日によってバックアップを取りますので、誰かが遊びに来さえすれば、
バックアップを取ることが可能になります。

作業前に必ずバックアップを取り、しばらく保存しておいてくださいませ。




MissingLinkさま PETROOM2.4

ことねっつ 標準改造スクリプトVer.A03&水月の片想いVer.A03−D




  MissingLinkさま PETROOM2.4  

まず「ユーザーデータの書き込み(sub openoutuserdata)」の中に、
下記のオレンジ色のスクリプトを追加します。

# ------------------------- #
# Sub Open Out User Data
# ユーザーデータの書きこみ
# ------------------------- #
sub openoutuserdata {
    &lock;
    open(OUT,">$userdata") || &error("Can't write $userdata");
    print OUT @new;
    close(OUT);

    $bfk = '.back'; # バックアップファイルの拡張子
    $bfw = 4;       # 毎週何曜日にバックアップを取るか(日曜:0 〜 土曜:6)
    $bfl = 30;      # バックアップを保存しておく期間(日数)

    # バックアップ用現在の日付取得
    ($bsec,$bmin,$bhour,$bday,$bmon,$byear,$bweek) = localtime(time);
    $byear += 1900; $bmon++;
    $bmon = sprintf("%.2d",$bmon);
    $bday = sprintf("%.2d",$bday);

    # 今日が設定した曜日かつ今日の日付のファイル名がまだなかったらバックアップ処理
    if ($bweek == $bfw && !(-e "$byear$bmon$bday$bfk")) {
        # 設定した日数経過しているバックアップファイルがあったら削除
        opendir(DIR,".");
        @bff = readdir(DIR);
        closedir(DIR);
        foreach (@bff) {
            if ($_ =~ /$bfk/) {
                if ((-M "$_") > $bfl) {
                    unlink($_);
                }
            }
        }

        # バックアップ保存
        open(OUT,"> $byear$bmon$bday$bfk") || &error("Can't write Backupfile");
        print OUT @new;
        close(OUT);
    }

    &unlock;
}

そして、追加した部分の最初の方にある3行の設定を変更します。

1行目は、バックアップファイルの拡張子の設定です。
拡張子がわかってしまうと、
そのファイルに直接アクセスすることが出来てしまう場合がありますので、
できるだけ他の文字列に変更してください。

2行目は、毎週何曜日にバックアップを取るかの設定です。
日曜日なら「0」、月曜日なら「1」、火曜日なら「2」、…、土曜日なら「6」という具合に、
曜日に対応する数字で設定してください。

3行目は、そのバックアップファイルを何日間保存しておくかの設定です。
30日に設定しますと、5〜6週分のバックアップが常にサーバにあることになりますので、
サーバ容量が少ない方は短めに設定してください。


バックアップファイルは、pet.cgiが置いてあるディレクトリの中に自動で作成されます。
そのため、pet.cgiが入っているディレクトリのパーミッションを、
「777(707)」に変更する必要があります。
バックアップファイルの作成が上手く行かない場合は、ここを確認してみてください。


バックアップファイルの名前は、「日付.設定した拡張子」になっています。
ユーザーデータが消えてしまったり、壊れてしまったりしましたら、
ユーザーデータのファイルを一度削除して、
正常だった日付のバックアップファイルの名前を、ユーザーデータのファイルの名前に変更します。


バックアップを毎日取りたい、という方は、

    # 今日が設定した曜日かつ今日の日付のファイル名がまだなかったらバックアップ処理
    if ($bweek == $bfw && !(-e "$byear$bmon$bday$bfk")) {

この条件式を変更することで可能になります。
条件式前半の「$bweek == $bfw && 」を削除して、

    # 今日が設定した曜日かつ今日の日付のファイル名がまだなかったらバックアップ処理
    if (!(-e "$byear$bmon$bday$bfk")) {

とすると、バックアップを毎日取るようになります。
、バックアップの保存期間を30日などにしてしまうと、
ユーザーデータのバックアップがサーバに30個出来てしまうことになりますので、
3〜7日など、比較的短い周期にしてください。






  ことねっつ 標準改造スクリプトVer.A03&水月の片想いVer.A03−D  

まず、元々入っている「半自動バックアップ」を無効にします。
スクリプトの最初の方にある「▼主な設定はここから▼」の少し下に、

$editor   = 'オーナー';              # オーナーさんが遊ぶときの名前(半自動バックアップ用)要変更

という行がありますので、ここの設定を、

$editor   = '';              # オーナーさんが遊ぶときの名前(半自動バックアップ用)要変更

このように、名前がない状態にします。これで無効になります。


次に「ユーザーデータの書き込み(sub openoutuserdata)」の中に、
下記のオレンジ色のスクリプトを追加します。

# ------------------------- #
# Sub Open Out User Data
# ユーザーデータの書きこみ
# ------------------------- #
sub openoutuserdata {
# 以下変更(a02-02)
    if ($FORM{'name'} eq $editor) {
        open(BACK,"$bufile2") || &error("Can't Open BackUpFile");
        @back3 = <BACK>;
        close(BACK);
        open(BACK,"> $bufile3") || &error("Can't Write BackUpFile");
        print BACK @back3;
        close(BACK);

        open(BACK,"$bufile1") || &error("Can't Open BackUpFile");
        @back2 = <BACK>;
        close(BACK);
        open(BACK,"> $bufile2") || &error("Can't Write BackUpFile");
        print BACK @back2;
        close(BACK);

        open(USER_FH,"$userdata") || &error("Can't open Userdata");
        eval { flock(USER_FH,1); };
        @back1 = <USER_FH>;
        close(USER_FH);

        open(BACK,"> $bufile1") || &error("Can't Write BackUpFile");
        print BACK @back1;
        close(BACK);
    }
    open(USER_FH,"+< $userdata") || &error("Can't write Userdata");
    eval { flock(USER_FH,2); };
    seek(USER_FH,0,0);
    print USER_FH @new;
    truncate(USER_FH,tell(USER_FH));
    close(USER_FH);

    $bfk = '.back'; # バックアップファイルの拡張子
    $bfw = 4;       # 毎週何曜日にバックアップを取るか(日曜:0 〜 土曜:6)
    $bfl = 30;      # バックアップを保存しておく期間(日数)

    # バックアップ用現在の日付取得
    ($bsec,$bmin,$bhour,$bday,$bmon,$byear,$bweek) = localtime(time);
    $byear += 1900; $bmon++;
    $bmon = sprintf("%.2d",$bmon);
    $bday = sprintf("%.2d",$bday);

    # 今日が設定した曜日かつ今日の日付のファイル名がまだなかったらバックアップ処理
    if ($bweek == $bfw && !(-e "$byear$bmon$bday$bfk")) {
        # 設定した日数経過しているバックアップファイルがあったら削除
        opendir(DIR,".");
        @bff = readdir(DIR);
        closedir(DIR);
        foreach (@bff) {
            if ($_ =~ /$bfk/) {
                if ((-M "$_") > $bfl) {
                    unlink($_);
                }
            }
        }

        # バックアップ保存
        open(BACK_FH,"> $byear$bmon$bday$bfk") || &error("Can't write Backupfile");
        eval { flock(BACK_FH,2); };
        print BACK_FH @new;
        close(BACK_FH);
    }

}

そして、追加した部分の最初の方にある3行の設定を変更します。

1行目は、バックアップファイルの拡張子の設定です。
拡張子がわかってしまうと、
そのファイルに直接アクセスすることが出来てしまう場合がありますので、
できるだけ他の文字列に変更してください。

2行目は、毎週何曜日にバックアップを取るかの設定です。
日曜日なら「0」、月曜日なら「1」、火曜日なら「2」、…、土曜日なら「6」という具合に、
曜日に対応する数字で設定してください。

3行目は、そのバックアップファイルを何日間保存しておくかの設定です。
30日に設定しますと、5〜6週分のバックアップが常にサーバにあることになりますので、
サーバ容量が少ない方は短めに設定してください。


バックアップファイルは、pet.cgiが置いてあるディレクトリの中に自動で作成されます。
そのため、pet.cgiが入っているディレクトリのパーミッションを、
「777(707)」に変更する必要があります。
バックアップファイルの作成が上手く行かない場合は、ここを確認してみてください。


バックアップファイルの名前は、「日付.設定した拡張子」になっています。
ユーザーデータが消えてしまったり、壊れてしまったりしましたら、
ユーザーデータのファイルを一度削除して、
正常だった日付のバックアップファイルの名前を、ユーザーデータのファイルの名前に変更します。


半自動バックアップで使用していたバックアップ用のファイルは、
この改造を施すことで必要なくなりますので、
サーバから削除していただいて構いません。


バックアップを毎日取りたい、という方は、

    # 今日が設定した曜日かつ今日の日付のファイル名がまだなかったらバックアップ処理
    if ($bweek == $bfw && !(-e "$byear$bmon$bday$bfk")) {

この条件式を変更することで可能になります。
条件式前半の「$bweek == $bfw && 」を削除して、

    # 今日が設定した曜日かつ今日の日付のファイル名がまだなかったらバックアップ処理
    if (!(-e "$byear$bmon$bday$bfk")) {

とすると、バックアップを毎日取るようになります。
、バックアップの保存期間を30日などにしてしまうと、
ユーザーデータのバックアップがサーバに30個出来てしまうことになりますので、
3〜7日など、比較的短い周期にしてください。