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 listFiles(args, settings): """ Main function for the list option. """ wordArgs = fn.parseWordArgs(args) home = fn.getBackupHome(settings.backupLocation, settings.hostName) backups = fn.getBackupsForArgs(wordArgs, fn.getBackups(home)) backupWd = fn.removeAltRoot(settings.root, os.getcwd()) for id_ in backups.keys(): items = fn.expandGlob(home, backups[id_], backupWd, wordArgs["glob"]) for item in items: _outputItemInfo(id_, fn.getInfo(item))
def remove(args, settings): """ Main function for the remove option. """ wordArgs = fn.parseWordArgs(args) _validateArgs(wordArgs) home = fn.getBackupHome(settings.backupLocation, settings.hostName) backups = fn.getBackupsForArgs(wordArgs, fn.getBackups(home)) backupWd = fn.removeAltRoot(settings.root, os.getcwd()) for id_ in backups.keys(): items = fn.expandGlob(home, backups[id_], backupWd, wordArgs["glob"]) for item in items: _delete(item)
def restore(args, settings): """ Main function for the restore option. """ wordArgs = fn.parseWordArgs(args) _validateArgs(wordArgs) home = fn.getBackupHome(settings.backupLocation, settings.hostName) fn.insureBackupHomeExists(home) backup = fn.getBackupOrLatest(wordArgs, home) cwd = os.getcwd() backupWd = fn.removeAltRoot(settings.root, cwd) items = fn.expandGlob(home, backup, backupWd, wordArgs["glob"]) _validateItems(items, wordArgs) for item in items: _restoreItem(item, cwd, wordArgs["as"])
def info(args, settings): """ Main function for the info option. """ backupHome = fn.getBackupHome(settings.backupLocation, settings.hostName) backupCount = len(fn.getBackups(backupHome)) dtFormat = "%m/%d/%Y %H:%M:%S" lastBackupRan = fn.toDateTime( fn.getLatestBackup(backupHome)).strftime(dtFormat) driveUsagePercentage = fn.getDriveUsagePercentage(backupHome) fmt = "{0:<20} {1}" print(fmt.format("Backup location:", settings.backupLocation)) print(fmt.format("Host Name:", settings.hostName)) print(fmt.format("Number of Backups:", backupCount)) print(fmt.format("Last Backup Ran:", lastBackupRan)) print(fmt.format("Drive Capacity:", "{0}%".format(driveUsagePercentage)))
def diff(args, settings): """ Main function for the diff option. """ wordArgs = fn.parseWordArgs(args) _validateArgs(wordArgs) home = fn.getBackupHome(settings.backupLocation, settings.hostName) fn.insureBackupHomeExists(home) backup = fn.getBackupOrLatest(wordArgs, home) cwd = os.getcwd() backupWd = fn.removeAltRoot(settings.root, cwd) items = fn.expandGlob(home, backup, backupWd, wordArgs["glob"]) _validateItems(items) localFile = _getLines(join(cwd, wordArgs["glob"])) backupFile = _getLines(items[0]) diff = _getDiff() sys.stdout.writelines(diff(backupFile, localFile))
def changes(args, settings): """ Main function for the changes option. """ wordArgs = fn.parseWordArgs(args) _validateArgs(wordArgs) home = fn.getBackupHome(settings.backupLocation, settings.hostName) fn.insureBackupHomeExists(home) backup = fn.getBackupOrLatest(wordArgs, home) cwd = os.getcwd() backupWd = fn.removeAltRoot(settings.root, cwd) backedUpFiles = fn.expandGlob(home, backup, backupWd, "*") backupDir = join(home, backup) + backupWd allFiles = set(os.listdir(cwd)).union(map(basename, backedUpFiles)) for item in allFiles: status = _getStatus(join(cwd, item), join(backupDir, item)) if status: _outputItem(item, status)
def test_getBackupHome(self): backupHome = fn.getBackupHome("/mnt/foo", "choco") self.assertEqual( backupHome, "/mnt/foo/Backups.backupdb/choco", "Incorrect backup home returned: {0}".format(backupHome))