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

http://d.hatena.ne.jp/dwarfjay/20110610/1307704454の改造ネタ続きです。

外部コマンドを呼ぶ時に、あらかじめ引数リストを定義しておいて、

predefined_command=['ls','-l']
call(predefined_command)

としていたのですが、main関数を分割することしたので、これを機会に関数化しておくことにしました。というのも、複数の関数で、同じコマンド呼び出しをする場合、全部の関数に引数リストを定義しておかなくてはならなくて、それはあまりにも面倒臭いからです。もちろん、引数リストをグローバルに定義すれ方法もありますが、なるべくならグローバルな変数は多用したくないです。

ついでに、コマンド文字列を定義するのに、dictを利用してみました。dictについて、詳しくはこちら。ここには、has_key()はdepreciateだとここに書いてあったので、書き換えました。

def execCommand(cmd, extra):
    """
    関数 execCommand: cmdをextraパラメーターをつけて実行する

    パラメータ
    cmd: 実行するコマンドのシンボル 
    ex. 'mount'

    extra: コマンドに追加するエクストラパラメータのリスト
    ex. ['-t','ext2','/boot']
    """

    cmdList = dict([\
        ('mount',['/bin/mount','-v']),\
        ('umount',['/bin/umount','-v']),\
        ('rsync',['/usr/bin/rsync','-av','--delete']),\
        ('chcp',['/usr/bin/chcp','ss']),\
        ])


    if cmd in cmdList:
        if os.getuid() != 0:
            if cmd == 'rsync':
                cmdList[cmd].append('--dry-run')
            cmdList[cmd].insert(0,'sudo')
        call(cmdList[cmd] + extra)

# def execCommand(cmd, extra):

そうして、これまでcallしていた所を、全部この関数で書き換えました。これは、関数callのラッパーを書いた、といって良いんでしょうか。とにかく、こうすることのメリットは、

  • callに渡す引数リストをプログラマがいちいち用意する必要がない

ってことですね。デメリットは、

  • 関数呼びだしの度に、cmdListを初期化する手間がかかるかもしれない
  • callを呼びだす前に、何ステップものifを実行することによる速度低下

という所でしょうか。このスクリプトでは、実行速度が問題になることはないので、とりあえずこの方式でいこうと思います。何といっても、ファイルコピーそのものが、とてつもなく時間のかかるプロセスですから。

これまでは、シェルスクリプトを単に直訳しただけみたいな感じだったのですが、ちょっとだけpythonを使ったスクリプトっぽい感じがしてきました。

次に、main関数のうち、実際にバックアップする部分を分離しました。
def doBackup(partition, dest_mtpt):
というインターフェイスにして、あとはゴリゴリと実装(というかコピぺ)しました。こういう場当たり的な対応をしても、スクリプト全体が破綻することが少いというのは、pythonのいい所ですね。