def delete(filename, destination=DEFAULT_DESTINATION, profile="default", **kwargs): """Delete a backup. :type filename: str :param filename: stored filename to delete. :type destination: str :param destination: glacier|s3 :type profile: str :param profile: Profile name (default by default). :type conf: dict :keyword conf: A dict with a custom configuration. :type conf: dict :keyword conf: Override/set AWS configuration. :rtype: bool :return: True if the file is deleted. """ conf = kwargs.get("conf", None) if not filename: log.error("No file to delete, use -f to specify one.") return backup = dump_truck_get_backup(filename, destination, profile) if not backup: log.error("No file matched.") return key_name = backup.get("stored_filename") storage_backend = _get_store_backend(conf, destination, profile) log.info("Deleting {0}".format(key_name)) storage_backend.delete(key_name) dump_truck_delete_backup(key_name) return True
def delete_older_than(filename, interval, destination=DEFAULT_DESTINATION, profile="default", **kwargs): """Delete backups matching the given filename older than the given interval string. :type filename: str :param filename: File/directory name. :type interval: str :param interval: Interval string like 1M, 1W, 1M3W4h2s... (s => seconds, m => minutes, h => hours, D => days, W => weeks, M => months, Y => Years). :type destination: str :param destination: glacier|s3 :type conf: dict :keyword conf: Override/set AWS configuration. :rtype: list :return: A list containing the deleted keys (S3) or archives (Glacier). """ conf = kwargs.get("conf") storage_backend = _get_store_backend(conf, destination, profile) interval_seconds = _interval_string_to_seconds(interval) deleted = [] backup_date_filter = int(datetime.utcnow().strftime("%s")) - interval_seconds query = "SELECT stored_filename FROM backups WHERE backend == '{0}' \ AND backup_date < {1:d} AND filename LIKE '{2}%' AND is_deleted == 0" for backup in dump_truck.execute(query.format(destination, backup_date_filter, filename)): real_key = backup.get("stored_filename") log.info("Deleting {0}".format(real_key)) storage_backend.delete(real_key) dump_truck_delete_backup(real_key) deleted.append(real_key) return deleted
def rotate_backups(filename, destination=DEFAULT_DESTINATION, profile="default", **kwargs): """Rotate backup using grandfather-father-son rotation scheme. :type filename: str :param filename: File/directory name. :type destination: str :param destination: s3|glacier :type conf: dict :keyword conf: Override/set AWS configuration. :type days: int :keyword days: Number of days to keep. :type weeks: int :keyword weeks: Number of weeks to keep. :type months: int :keyword months: Number of months to keep. :type first_week_day: str :keyword first_week_day: First week day (to calculate wich weekly backup keep, saturday by default). :rtype: list :return: A list containing the deleted keys (S3) or archives (Glacier). """ conf = kwargs.get("conf", None) storage_backend = _get_store_backend(conf, destination, profile) rotate = RotationConfig(conf, profile) if not rotate: raise Exception("You must run bakthat configure_backups_rotation or provide rotation configuration.") deleted = [] query = "SELECT backup_date FROM backups WHERE backend == '{0}' \ AND filename LIKE '{1}%' AND is_deleted == 0".format( destination, filename ) backups = dump_truck.execute(query) backups_date = [datetime.fromtimestamp(float(backup["backup_date"])) for backup in backups] to_delete = grandfatherson.to_delete( backups_date, days=int(rotate.conf["days"]), weeks=int(rotate.conf["weeks"]), months=int(rotate.conf["months"]), firstweekday=int(rotate.conf["first_week_day"]), now=datetime.utcnow(), ) for delete_date in to_delete: backup_date = int(delete_date.strftime("%s")) query = "SELECT stored_filename FROM backups WHERE backend == '{0}' \ AND filename LIKE '{1}%' AND backup_date == {2:d} \ AND is_deleted == 0".format( destination, filename, backup_date ) backups = dump_truck.execute(query) if backups: real_key = backups[0].get("stored_filename") log.info("Deleting {0}".format(real_key)) storage_backend.delete(real_key) dump_truck_delete_backup(real_key) deleted.append(real_key) return deleted