def run_backup():
    """
    Main method that performs the backup.
    """
    commandArgs = getArgs()
    if commandArgs.version:
        print("caatinga version: " + __version__)
        exit(0)

    settings = fn.getSettingsInstance(commandArgs)
    lockFileName = settings.hostName + "-caatinga"
    SettingsValidator().validate(settings)
    bkHome = fn.getBackupHome(settings.backupLocation, settings.hostName)
    lockFile = backup.getLockFile("/tmp", lockFileName)
    outWriter = fn.getOutputWriter(commandArgs.verbose)
    previousBackup = os.path.realpath(fn.getLatestLink(bkHome))

    fn.runHooks(settings.preBackupHooksDir)
    checkForRegisterOption(settings, commandArgs, bkHome)
    insureBackupLocationIsRegistered(
        settings.backupLocation,
        settings.hostName)
    lock(lockFile)
    runNonBackupFunctions(bkHome, settings, commandArgs, outWriter, lockFile)
    executeBackup(bkHome, previousBackup, settings, outWriter, lockFile)
    runMaintenanceFunctions(bkHome, settings, outWriter)
    fn.runHooks(settings.postBackupHooksDir)
def runWithHooks(optionFn, args, settings):
    """
    Wrap the provided option call with the pre and post restore hooks.
    """
    fn.runHooks(settings.preRestoreHooksDir)
    optionFn(args, settings)
    fn.runHooks(settings.postRestoreHooksDir)
def runNonBackupFunctions(bkHome, settings, commandArgs, outWriter, lockFile):
    """
    Execute functions that do not pertain to actually performing a backup and
    are more intended on pre-backup conditions.
    """
    try:
        checkForDeleteOldest(commandArgs, bkHome)
        markPartialBackupForDeletion(bkHome)
        checkForClean(commandArgs, bkHome, outWriter)
    except CleanExitException:
        fn.runHooks(settings.postBackupHooksDir)
        backup.removeLockFile(lockFile)
        raise