#!/usr/bin/env python

import os
import sys
import glob
import datetime

def main():
    dst = "/home/vpri/backup"
    remain = 7
    today_dir = dst + "/backup-today"
    last_dir = dst + "/backup-" + datetime.date.today().isoformat()
#    last_dir = dst + "/backup-" + datetime.datetime.now().isoformat() # Use this line when testing
    
    print "\n*** Backup Started ***"
    shell("date")
    make_today_dir(today_dir, last_dir) # comment out when quick testing
    backup(today_dir)
    cleanup(dst, remain) # comment out when quick testing

def shell(command):
    print "$ " + command
    sys.stdout.flush()
    os.system(command)

def make_today_dir(today_dir, last_dir):
    if os.path.isdir(today_dir):
        if shell ("time cp -al %s/ %s/" % (today_dir, last_dir)):
            raise "Backup copy failed."
    else:
        os.mkdir(today_dir)

def backup(today_dir):
    """Backup web space on tinlizzie server"""
    if shell ("rsync -avzessh --delete vpri@tinlizzie.org:/var/www/tinlizzie/ %s/www/" % today_dir):
        raise "Backup failed."

    """Backup home directories"""
    if shell ("rsync -avzessh --delete vpri@tinlizzie.org:/home/ %s/home/" % today_dir):
        raise "Backup failed."
    
    """Backup subversion space on tinlizzie server"""
    if shell ("ssh vpri@tinlizzie.org 'svnadmin dump -q /var/www/tinlizzie/svn/' > %s/var.www.tinlizzie.svn.dump" % today_dir):
        raise "Backup failed."
    
    if shell ("ssh vpri@tinlizzie.org 'svnadmin dump -q /var/www/tinlizzie/public-repository/' > %s/var.www.tinlizzie.public-repository.dump" % today_dir):
        raise "Backup failed."
    
    if shell ("ssh vpri@tinlizzie.org 'svnadmin dump -q /var/www/tinlizzie/repository/' > %s/var.www.tinlizzie.repository.dump" % today_dir):
        raise "Backup failed."

def cleanup(dir_name, n):
    """Remain up to n old directories and cleanup other files"""
    backup_dirs = glob.glob(dir_name + "/backup-????-??-??")
    backup_dirs.sort()
    backup_dirs.reverse()

    while (len(backup_dirs) > n):
        unnecessary = backup_dirs.pop()
        if shell ("rm -rf %s " % unnecessary):
            raise "Cleanup failed"

main()
