パスワードを忘れた? アカウント作成
10112975 journal
日記

take_tkの日記: pdumpfs-copy.rb

日記 by take_tk

【取扱説明書】

pdumpfs-copy.rb は pdumpfs が作成したバックアップのコピーを作成します。

自家用の使い捨てコマンドとして作成したので、引数で対象ディレクトリを指定するようにはなっていません。スクリプト中に書かれた下記の部分を自分用に書換えてから実行してください。

DEFAULT_SRC_BASE = "/mnt/NP11-34/storage2/pdumpfs_of"
DEFAULT_SRC_NAME = "backup_of"
DEFAULT_DST_BASE = "/storage2/pdumpfs_of"

実行すると次のように表示されていきます。pdumpfs-copy が行うのは、「rm・・、ln -s・・、pdumpfs・・、mkdir・・、mv・・」だけです。実行するコマンドは全てシェルコマンドであり、全部表示されます。

---
  [tk@EeePC-40 /]$ sudo ruby /samba_public/apollo/tkUtils/pdumpfs-copy.rb
・・・
"'/storage2/pdumpfs_of/2013/07/11/backup_of' already exists, then skip." ←前回実行分はスキップする。
"'/storage2/pdumpfs_of/2013/07/12/backup_of' .. start on Tue Jul 23 13:19:41 +0900 2013." ← 開始
["rm /storage2/pdumpfs_of/latest"]
["ln -s /storage2/pdumpfs_of/2013/07/11 /storage2/pdumpfs_of/latest"]
["pdumpfs /mnt/NP11-34/storage2/pdumpfs_of/2013/07/12/backup_of /storage2/pdumpfs_of"]
["mkdir -p /storage2/pdumpfs_of/2013/07/12"]
["mv /storage2/pdumpfs_of/2013/07/23/backup_of /storage2/pdumpfs_of/2013/07/12/backup_of"]
・・・
---

実行に長時間(何日も)係ることを想定して、途中でハングしたり、Ctrl+C で中断しても、再開後は実行済みの部分をスキップするようになっています。

【pdumpfs-copy.rb】

DEFAULT_SRC_BASE = "/mnt/NP11-34/storage2/pdumpfs_of"
DEFAULT_SRC_NAME = "backup_of"
DEFAULT_DST_BASE = "/storage2/pdumpfs_of"

def get_date_directories(src_dir)
    Dir.glob(src_dir+"/????/??/??/").collect{|dir| dir[-12,12] }.sort
end

def main
        # →/storage2/pdumpfs_of/2001/01/01/backup_of ・・・ src
        # --------base-------- ---date--- --name--- src_base src_date src_name
        # →/storage3/pdumpfs_of/2002/02/02/backup_of ・・・ dst
        # --------base-------- ---date--- --name--- dst_base dst_date dst_name
        # →/storage3/pdumpfs_of/2001/01/01/backup_of ・・・ correct
        # --------base-------- ---date--- --name--- correct_base correct_date correct_name
        #
    src_base = DEFAULT_SRC_BASE # "/mnt/NP11-34/storage2/pdumpfs_of"
    src_name = DEFAULT_SRC_NAME # "backup_of"
    dst_base = DEFAULT_DST_BASE # "/storage/pdumpfs_of"
        #
    cor_name = dst_name = src_name
    cor_base = dst_base
        #
    date_directories = get_date_directories(src_base)
    p date_directories
        # #=>["/2012/08/24/", "/2012/08/25/"・・・"/2012/09/01/", "/2012/09/02/"] 古い順に並んだ配列。
        #
    latest = dst_base + "/latest"
        #
        # rescue Interrupt を準備する。
        #
    dst = src = cor = old = nil
    begin
            #
        date_directories.each{|src_date|
                #
                # pdumpfs は独自に今日の日付を取り出すので、毎回 dst_date を作成すべき。
                # 長時間かかることが予想され、日付をまたいで実行する可能性が多い。
                #
                # この時刻から、pdumpfs開始の時刻の間で日付が変わった場合には例外で終了するはず。
                #
            today = Time.now
            dst_date = "/%04d/%02d/%02d/" % [today.year,today.month,today.day]
            cor_date = src_date
                #
            old = File.dirname(cor) if cor
            src = src_base + src_date + src_name
            dst = dst_base + dst_date + dst_name
            cor = cor_base + cor_date + cor_name
                #
                # コピー先に既に存在する場合には、
                # 前回の試行で途中で中断した場合であると想定されので、
                # スキップする。
                #
            if File.exist?(cor)
                p "'#{cor}' already exists, then skip."
                next
            end
            p "'#{cor}' .. start on #{Time.now.to_s}."
                #
                # 存在するディレクトリのうち直前のディレクトリを latest にセットする。
                #
            if old
                if File.exist? latest
                    cmd = "rm #{latest}"
                    p [cmd]
                    `#{cmd}`
                end
                cmd = "ln -s #{old} #{latest}"
                p [cmd]
                `#{cmd}`
            end
                #
            cmd = "pdumpfs #{src} #{dst_base}"
            p [cmd]
            `#{cmd}`
                #
            raise "'#{dst}' is not created by pdumpfs" if !File.exist?(dst)
                #
            cmd = "mkdir -p #{File.dirname(cor)}"
            p [cmd]
            `#{cmd}`
                #
            if dst != cor
                cmd = "mv #{dst} #{cor}"
                p [cmd] #=> ["mv /storage3/pdumpfs_of/2012/09/03/ /storage3/pdumpfs_of/2012/09/01/"]
                `#{cmd}`
            end
    }
        #
        # 例外(中断など)で中間ディレクトリが残っていたら削除する。
        #
    rescue Interrupt
        if dst != cor && File.exist?(dst)
            cmd = "rm -r #{dst}"
            p [cmd]
            `#{cmd}`
        end
        raise
    end
end

main if __FILE__ == $0

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

私は悩みをリストアップし始めたが、そのあまりの長さにいやけがさし、何も考えないことにした。-- Robert C. Pike

読み込み中...