バックアップスクリプトを改造した

昨日のエントリで晒したバックアップスクリプトを少し改造してみた。

修正点

svnadmin hotcopy した後に、複製先リポジトリを tar+bzip 圧縮して、圧縮前のリポジトリを削除するようにした。

スクリプト

#!/usr/bin/env python
import os
import popen2
import datetime

SVNROOT = '/var/www/svn'
BACKUPROOT = '/backup'
TODAY = datetime.date.today().isoformat()

def dobackup(abspath):
    if not issvnrepos(abspath):
        return
    destdir = getdestdir(True)
    destrepos = os.path.join(destdir, os.path.split(abspath)[1])
    
    hotcopy_cmd = '/usr/bin/svnadmin hotcopy %(abspath)s %(destrepos)s' % locals()
    doexec(hotcopy_cmd)

def doexec(command):
    stdout_and_err, stdin = popen2.popen4(command)
    for line in stdout_and_err:
        print line,

def issvnrepos(abspath):
    formatpath = os.path.join(abspath, 'format')
    if not os.path.isfile(formatpath):
        return False
    return True

def getdestdir(makeifnotexist=False):
    dest = os.path.join(BACKUPROOT, TODAY)
    if not os.path.isdir(dest) and makeifnotexist:
        os.mkdir(dest)
    return dest

def cleanup():
     today = TODAY
     os.chdir(BACKUPROOT)
     
     tar_cmd = '/bin/tar jcf %(today)s.tar.bz %(today)s/' % locals()
     doexec(tar_cmd)
     
     rm_cmd = '/bin/rm -rf %(today)s/' % locals()
     doexec(rm_cmd)

def main():
     for entry in os.listdir(SVNROOT):
         dobackup(os.path.join(SVNROOT, entry))
     cleanup()

if __name__ == '__main__': main()

追記(2009/03/08 13:58)

svnadmin のコマンド部分がテストコードになっていたので、修正しました。