バックアップをとろう(その5)

前回の続きです。

まずは、do_backup()の実装から。

def do_backup(partition, dest_mtpt):
    """
    関数 doBckup: rsyncを利用してバックアップコピーをとります

    パラメータ
    partition コピー元となるパーティションの名前(文字列)
    ex 'boot'

    dest_mtpt コピー先となるディレクトリ(文字列)
    ex '/mnt/backup'
    """

    #文字列 source_node
    #バックアップ元となる論理ボリュームもしくは物理パーティション
    #の名前を格納します
    source_node = LFS.get_devnode(partition)

    #文字列 source_mtpt 
    #バックアップ元のマウントポイント
    #通常は、/etc/fstabにあるマウントポイントをそのまま利用します
    source_mtpt = LFS.get_mountpoint(partition)

    # コピー元の処理
    # FSタイプをmount_cmdに追加します
    file_system = LFS.get_filesystem(partition)
    mount_cmd_ext = ['-t', file_system]
    
    # nilfs2パーティション用のマウントポイント、オプションスイッチ設定
    if file_system == 'nilfs2':

        # nilfs2パーティションでは、スナップショットを特別な場所に
        # マウントします
        source_mtpt = MNT_ROOT + "/src/" + partition

        # 直近のチェックポイントを変数check_pointに格納します
        lscp_result = Popen(('/usr/bin/lscp', '-r', '-n1', \
                source_node),stdout=PIPE).communicate()[0]
        check_point = lscp_result.split()[7]
        
        # nilfs2のsnapshotを作成します
        exec_command('chcp', [source_node, check_point])

        # snapshotをマウントする為のオプションを設定します
        mount_cmd_ext.extend(["-o", "ro,cp="+check_point])

    # コピー元をマウントする必要があるかどうか調べます
    need_mount = True if not LFS.is_automount(partition)\
            or file_system == 'nilfs2' else False

    if need_mount:
        # もしsource_mtptが存在しなければ、作成します
        if not os.path.exists(source_mtpt):
            os.makedirs(source_mtpt)

        # コピー元をマウントします
        exec_command('mount', mount_cmd_ext + [source_node, source_mtpt])

    # ファイルをコピーします
    exec_command('rsync', [source_mtpt+'/', dest_mtpt])

    if need_mount:
        exec_command('umount', [source_mtpt])

# def do_backup():

マウントしてコピーして、マウント解除するという流れなんですが、これが、main関数にも同じような処理があって、非常に煩わしい。ということで、Partitionクラスを導入することにしました。このクラスは、大体こんな感じのプロトタイプになります。

class Partition():
    """ 
    パーティションを管理するクラス
    適切な方法で、自身をマウントしたりアンマウトできます
    """
    def __init__(self, name):
    	pass

    def mount(self):
        """ マウントする """
	pass

    def umount(self):
        """ アンマウントする """
        # アンマウントしなければいけないのは、
        # 1.オートマウントでないのにマウントされたパーティション
        # 2.nilfs2のスナップショットを利用したパーティション
	pass


    def get_mtpt(self):
        """ 
        マウントポイントを返す 
        """
	pass

# class Partition():

このクラスを使うと、前述のdo_backup()関数はこんな感じになります。

def do_backup(partition, dest_mtpt):
    """
    関数 doBckup: rsyncを利用してバックアップコピーをとります

    パラメータ
    partition コピー元となるパーティションの名前(文字列)
    ex 'boot'

    dest_mtpt コピー先となるディレクトリ(文字列)
    ex '/mnt/backup'
    """

    src_part = Partition(partition)
    src_part.mount()

    exec_command('rsync', [src_part.get_mtpt() + '/', dest_mtpt])

    src_part.umount()

# def do_backup():

ほとんどコメントがいらないくらいスッキリ