def purge_backupset(backupset, force=False, all_backups=False): """Purge a whole backupset either entirely or per the configured retention count :param backupset: Backupset object to purge :param force: Force the purge - this is not a dry-run :param all_backupsets: purge all backups regardless of configured retention count """ if all_backups: retention_count = 0 else: try: config = hollandcfg.backupset(backupset.name) config.validate_config(CONFIGSPEC, suppress_warnings=True) except (IOError, ConfigError) as exc: LOG.error("Failed to load backupset '%s': %s", backupset.name, exc) LOG.error("Aborting, because I could not tell how many backups to " "preserve.") LOG.error("You can still purge the backupset by using the --all " "option or specifying specific backups to purge") return 1 retention_count = config['holland:backup']['backups-to-keep'] LOG.info("Evaluating purge for backupset %s", backupset.name) LOG.info("Retaining up to %d backup%s", retention_count, 's'[0:bool(retention_count)]) backups = [] bytes = 0 backup_list = backupset.list_backups(reverse=True) for backup in itertools.islice(backup_list, retention_count, None): backups.append(backup) config = backup.config['holland:backup'] bytes += int(config['on-disk-size']) LOG.info(" %d total backups", len(backup_list)) for backup in backup_list: LOG.info(" * %s", backup.path) LOG.info(" %d backups to keep", len(backup_list) - len(backups)) for backup in backup_list[0:-len(backups)]: LOG.info(" + %s", backup.path) LOG.info(" %d backups to purge", len(backups)) for backup in backups: LOG.info(" - %s", backup.path) LOG.info(" %s total to purge", format_bytes(bytes)) if force: count = 0 for backup in backupset.purge(retention_count): count += 1 LOG.info("Purged %s", backup.name) if count == 0: LOG.info("No backups purged.") else: LOG.info("Purged %d backup%s", count, 's'[0:bool(count)]) else: LOG.info("Skipping purge in dry-run mode.") backupset.update_symlinks()
def purge_backupset(backupset, force=False, all_backups=False): """Purge a whole backupset either entirely or per the configured retention count :param backupset: Backupset object to purge :param force: Force the purge - this is not a dry-run :param all_backupsets: purge all backups regardless of configured retention count """ if all_backups: retention_count = 0 else: try: config = hollandcfg.backupset(backupset.name) config.validate_config(CONFIGSPEC, suppress_warnings=True) except (IOError, ConfigError), exc: LOG.error("Failed to load backupset '%s': %s", backupset.name, exc) LOG.error("Aborting, because I could not tell how many backups to " "preserve.") LOG.error("You can still purge the backupset by using the --all " "option or specifying specific backups to purge") return 1 retention_count = config['holland:backup']['backups-to-keep']
def run(self, cmd, opts, *backupsets): if not backupsets: backupsets = hollandcfg.lookup("holland.backupsets") # strip empty items from backupsets list backupsets = [name for name in backupsets if name] if not backupsets: LOG.info("Nothing to backup") return 1 runner = BackupRunner(spool) # dry-run implies no-lock if opts.dry_run: opts.no_lock = True # don't purge if doing a dry-run, or when simultaneous backups may be running if not opts.no_lock: purge_mgr = PurgeManager() runner.register_cb("before-backup", purge_mgr) runner.register_cb("after-backup", purge_mgr) runner.register_cb("failed-backup", purge_backup) runner.register_cb("after-backup", report_low_space) if not opts.dry_run: runner.register_cb("before-backup", call_hooks) runner.register_cb("after-backup", call_hooks) runner.register_cb("failed-backup", call_hooks) error = 1 LOG.info("--- Starting %s run ---", opts.dry_run and "dry" or "backup") for name in backupsets: try: config = hollandcfg.backupset(name) # ensure we have at least an empty holland:backup section config.setdefault("holland:backup", {}) except (SyntaxError, IOError), exc: LOG.error("Could not load backupset '%s': %s", name, exc) break if not opts.no_lock: lock = Lock(config.filename) try: lock.acquire() LOG.debug("Set advisory lock on %s", lock.path) except LockError: LOG.debug("Unable to acquire advisory lock on %s", lock.path) LOG.error("Another holland backup process is already " "running backupset '%s'. Aborting.", name) break try: try: runner.backup(name, config, opts.dry_run) except BackupError, exc: LOG.error("Backup failed: %s", exc.args[0]) break except ConfigError, exc: break
def run(self, cmd, opts, *backupsets): if not backupsets: backupsets = hollandcfg.lookup('holland.backupsets') # strip empty items from backupsets list backupsets = [name for name in backupsets if name] if not backupsets: LOG.info("Nothing to backup") return 1 runner = BackupRunner(spool) # dry-run implies no-lock if opts.dry_run: opts.no_lock = True # don't purge if doing a dry-run, or when simultaneous backups may be running if not opts.no_lock: purge_mgr = PurgeManager() runner.register_cb('before-backup', purge_mgr) runner.register_cb('after-backup', purge_mgr) runner.register_cb('failed-backup', purge_backup) runner.register_cb('after-backup', report_low_space) if not opts.dry_run: runner.register_cb('before-backup', call_hooks) runner.register_cb('after-backup', call_hooks) runner.register_cb('failed-backup', call_hooks) error = 1 LOG.info("--- Starting %s run ---", opts.dry_run and 'dry' or 'backup') for name in backupsets: try: config = hollandcfg.backupset(name) # ensure we have at least an empty holland:backup section config.setdefault('holland:backup', {}) except (SyntaxError, IOError), exc: LOG.error("Could not load backupset '%s': %s", name, exc) break if not opts.no_lock: lock = Lock(config.filename) try: lock.acquire() LOG.debug("Set advisory lock on %s", lock.path) except LockError: LOG.debug("Unable to acquire advisory lock on %s", lock.path) LOG.error("Another holland backup process is already " "running backupset '%s'. Aborting.", name) break try: try: runner.backup(name, config, opts.dry_run) except BackupError, exc: LOG.error("Backup failed: %s", exc.args[0]) break except ConfigError, exc: break
def run(self, cmd, opts, *backupsets): if not backupsets: backupsets = hollandcfg.lookup('holland.backupsets') # strip empty items from backupsets list backupsets = [name for name in backupsets if name] if not backupsets: LOG.info("Nothing to backup") return 1 runner = BackupRunner(spool) # dry-run implies no-lock if opts.dry_run: opts.no_lock = True # don't purge if doing a dry-run, or when simultaneous backups may be running if not opts.no_lock: purge_mgr = PurgeManager() runner.register_cb('pre-backup', purge_mgr) runner.register_cb('post-backup', purge_mgr) runner.register_cb('backup-failure', purge_backup) runner.register_cb('post-backup', report_low_space) runner.register_cb('pre-backup', call_hooks) runner.register_cb('post-backup', call_hooks) runner.register_cb('backup-failure', call_hooks) error = 1 LOG.info("--- Starting %s run ---", opts.dry_run and 'dry' or 'backup') for name in backupsets: try: config = hollandcfg.backupset(name) # ensure we have at least an empty holland:backup section config.setdefault('holland:backup', {}) except (SyntaxError, IOError), exc: LOG.error("Could not load backupset '%s': %s", name, exc) break if not opts.no_lock: lock = Lock(config.filename) try: lock.acquire() LOG.info("Acquired lock %s : '%s'", lock.path, lock.lock.name) except LockError: LOG.error("Failed to acquire lock on backupset %s (%s)", name, config.filename) break try: try: runner.backup(name, config, opts.dry_run) except BackupError, exc: LOG.error("Backup failed: %s", exc.args[0]) break except ConfigError, exc: break