少しだけ荒らしに強いバックアップ

バックアップを荒らしに強くするためにはバックアップサイクル($cycle)を短くし保存世代($maxage)を多く取る事で対応できますが、反面バックアップがディスクを圧迫したり長い目で見た変更履歴を分かりにくくする事が問題になります。
これを両立させる一つの解決策を提案します。

変更されるバックアップ仕様

バックアップが行なわれるタイミング

バックアップの保存処理

バックアップ履歴のイメージ

差分*3

--- pukiwiki.ini.org.php	Mon Feb 07 13:22:40 2005
+++ pukiwiki.ini.php	Sat Jul 02 10:09:46 2005
@@ -269,6 +269,9 @@
 $cycle  = 3;    // Wait N hours between backup (0 = no wait)
 $maxage = 120; // Stock latest N backups
 
+// 削除行が存在する時の強制バックアップを保存する時間(0:この機能を無効にする)
+$force_backup = 24;
+
 // NOTE: $cycle x $maxage / 24 = Minimum days to lost your data
 //          3   x   120   / 24 = 15
 
--- file.org.php	Sat Jan 29 13:29:34 2005
+++ file.php	Sat Jul 02 09:31:32 2005
@@ -38,7 +38,8 @@
 	file_write(DIFF_DIR, $page, $diffdata);
 
 	// Create backup
-	make_backup($page, $postdata == ''); // Is $postdata null?
+	$is_corrected = preg_match('/^-/m', $diffdata);
+	make_backup($page, $postdata == '', $is_corrected); // Is $postdata null?
 
 	// Create wiki text
 	file_write(DATA_DIR, $page, $postdata, $notimestamp);
--- backup.org.php	Sat Jan 29 13:40:40 2005
+++ backup.php	Sat Jul 02 08:59:12 2005
@@ -25,10 +25,11 @@
  * @return    Void
  */
 
-function make_backup($page, $delete = FALSE)
+function make_backup($page, $delete = FALSE, $is_corrected)
 {
 	global $cycle, $maxage;
 	global $do_backup, $del_backup;
+	global $force_backup;
 
 	if (PKWK_READONLY || ! $do_backup) return;
 
@@ -40,10 +41,26 @@
 	if (! is_page($page)) return;
 
 	$lastmod = _backup_get_filetime($page);
-	if ($lastmod == 0 || UTIME - $lastmod > 60 * 60 * $cycle)
+	if ($lastmod == 0 || UTIME - $lastmod > 60 * 60 * $cycle ||
+		($force_backup != 0 && $is_corrected && UTIME > $lastmod))
 	{
 		$backups = get_backup($page);
-		$count   = count($backups) + 1;
+
+		if($force_backup == 0){
+			$count = count($backups) + 1;
+		}else{
+			$count = $prev_time = 0;
+			foreach($backups as $age=>$data){
+				if(UTIME - $data['time'] <= 3600 * $force_backup)
+					break;
+				if($data['time'] - $prev_time <= 3600 * $cycle){
+					unset($backups[$age]);
+				}else{
+					$count++;
+					$prev_time = $data['time'];
+				}
+			}
+		}
 
 		// 直後に1件追加するので、(最大件数 - 1)を超える要素を捨てる
 		if ($count > $maxage)

コメント


*1 差分で赤い行が存在する場合です。内容の追加だけが行なわれたり、改行のみの行が消された時は該当しません。
*2 差分で赤い行が存在する場合です。内容の追加だけが行なわれたり、改行のみの行が消された時は該当しません。
*3 1.4.5_1ベース

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-03-08 (月) 13:09:29
Site admin: PukiWiki Development Team

PukiWiki 1.5.4+ © 2001-2022 PukiWiki Development Team. Powered by PHP 8.2.12. HTML convert time: 0.187 sec.

SourceForge