2010/12/06

pdumpfsをruby 1.9.2-p0に対応させてみた

DTIのVPSサーバを契約してからバックアップを取るためにpdumpfsを使っています。 このために余計なパッケージは入れたくなかったので、自前で入れたruby-1.9.2-p0で動くようにpdumpfsを修正しました。

pdumpfsは ~/.gvfsでエラーになる対応の投稿のコードで、これをベースとしてruby 1.9.2-p0で動かしてみました。

オリジナルのライセンス

今回修正したpdumpfsは手元にあるものでおそらくpdumpfs-1.3だと思います。 ライセンスは以下のとおりで、もちろん私の修正もこのライセンスに準じます。

# Copyright (C) 2001-2004 Satoru Takabayashi <satoru@namazu.org>
#     All rights reserved.
#     This is free software with ABSOLUTELY NO WARRANTY.
#
# You can redistribute it and/or modify it under the terms of
# the GNU General Public License version 2.

パッチファイル

作成したファイルです。

大部分の方には上のdiffファイルが良いのだろうと思います。 offsetはかかりますが、手元では無事にpatchで修正できています。

以下に、また別の方法で作成したdiffを載せておきますが、これは私が~/.gvfsを無視するように修正したコードを含んでいます。

$ tar xvzf ~/pdumpfs-1.3.tar.gz
$ cd pdumpfs-1.3/
$ make
$ cp pdumpfs ../pdumpfs.orig
$ cd ..
$ diff -u pdumpfs.orig pdumpfs

コマンドの出力結果 (自分用)

--- pdumpfs.orig	2010-12-06 14:13:14.000000000 +0900
+++ pdumpfs	2010-12-06 14:12:47.000000000 +0900
@@ -1,4 +1,4 @@
-#! /usr/bin/env ruby
+#! /usr/local/bin/ruby
 #
 #  pdumpfs - a daily backup system similar to Plan9's dumpfs.
 #
@@ -48,21 +48,21 @@
 #
 
 require 'find'
-require 'ftools'
 require 'getoptlong'
 require 'date'
+require 'fileutils'
 
 class File
   def self.real_file? (path)
-    File.file?(path) and not File.symlink?(path)
+    FileTest.file?(path) and not FileTest.symlink?(path)
   end
 
   def self.anything_exist? (path)
-    File.exist?(path) or File.symlink?(path)
+    FileTest.exist?(path) or FileTest.symlink?(path)
   end
 
   def self.real_directory? (path)
-    File.directory?(path) and not File.symlink?(path)
+    FileTest.directory?(path) and not FileTest.symlink?(path)
   end
 
   def self.force_symlink (src, dest)
@@ -79,7 +79,7 @@
   end
 
   def self.readable_file? (path)
-    File.file?(path) and File.readable?(path)
+    FileTest.file?(path) and FileTest.readable?(path)
   end
 
   def self.split_all (path)
@@ -129,7 +129,7 @@
   GetVolumeInformation = Win32API.new("kernel32", "GetVolumeInformation",
                                       "PPLPPPPL", "I")
   def get_filesystem_type (path)
-    return nil unless(File.exist?(path))
+    return nil unless(FileTest.exist?(path))
 
     drive = File.expand_path(path)[0..2]
     buff = "\0" * 1024
@@ -807,12 +807,14 @@
     end
 
     def exclude? (path)
+      if @patterns.find {|pattern| pattern.match(path) }
+        return true
+      end
+      
       stat = File.lstat(path)
 
       if @size >= 0 and stat.file? and stat.size >= @size
         return true
-      elsif @patterns.find {|pattern| pattern.match(path) }
-        return true
       elsif stat.file? and
           @globs.find {|glob| File.fnmatch(glob, File.basename(path)) }
         return true
@@ -868,7 +870,7 @@
       today  = File.join(dest, datedir(start_time), base)
 
       File.umask(0077)
-      File.mkpath(today) unless @dry_run
+      FileUtils.mkpath(today) unless @dry_run
       if latest
         update_snapshot(src, latest, today)
       else
@@ -1018,7 +1020,7 @@
 
       case type
       when "directory"
-        File.mkpath(today)
+        FileUtils.mkpath(today)
       when "unchanged"
         File.force_link(latest, today)
       when "updated"
@@ -1052,7 +1054,7 @@
 
       Find.find(src) do |s|      # path of the source file
         if @matcher.exclude?(s)
-          if File.lstat(s).directory? then Find.prune() else next end
+          if FileTest.directory?(s) then Find.prune() else next end
         end
         r = make_relative_path(s, src)
         l = File.join(latest, r)  # path of the latest  snapshot
@@ -1089,7 +1091,7 @@
 
           case type
           when "directory"
-            File.mkpath(t)
+            FileUtils.mkpath(t)
           when "new_file"
             copy(s, t)
           when "symlink"

これは自分が後から別のデスクトップ環境を使う時のための保存用ですが、似たような問題があれば使ってください。

2 件のコメント:

izzmi さんのコメント...

ruby を 1.8 から 1.9 にしたら pdumpfs が動かなくなったので、どうしようかと思って ruby 1.9 ftools で検索したら、そのものズバリの情報がここにありました。

ruby のことはほぼ何も知らないのでパッチが参考になりました。

ahirured さんのコメント...

CentOS 5 が動いていたPC が落雷による停電でクラッシュ。
新しいHDD でCentOS 7 にしたら、pdumpfs が動かない。

当該パッチのおかげで、動作するようになりました。
情報公開に感謝!?
# ruby 2.0.0p598 (2014-11-13) [x86_64-linux]

ネットワーク上のNAS(TeraStation)にあるデータを
サーバ(CentOS 7) にバックアップしています。

若干、pdumpfs の実行が不安定。
実行時間のバラツキが大きく(数十分~数時間)、
ときたま、戻ってこないことあり。
# このときは、kill -9 でもプロセスをkill できない。

ネットワーク上のNASが怪しいような気がしているのですが、
何か原因を特定する方法はありませんでしょうか。