From 1709fd597430de0a9c04ee592442601cf1b54626 Mon Sep 17 00:00:00 2001 From: Sergey Morozov Date: Tue, 31 May 2022 08:48:22 +0300 Subject: [PATCH] Fix retention period of child files Cosmetic changes --- clean-backups.py | 147 +++++++++++++++++++++++------------------------ 1 file changed, 73 insertions(+), 74 deletions(-) diff --git a/clean-backups.py b/clean-backups.py index a0891fa..c69a05b 100755 --- a/clean-backups.py +++ b/clean-backups.py @@ -9,6 +9,79 @@ default_daily = 7 default_weekly = 4 default_monthly = 3 +class backupFile(): + def __init__(self, daily, weekly, monthly, path = None, dateformat = "%Y%m%d") -> None: + self.path = path + self.daily = daily + self.weekly = weekly + self.monthly = monthly + self.dateformat = dateformat + curr_date = date.today() # Maybe this will be used to specify date as starting point... + if self.path == None: + self.filename = None + else: + self.filename = os.path.basename(path) + dates = [] + + # Daily + for i in range(0, daily): + day = curr_date - timedelta(days = i) + dates.append(day) + # Weekly + monday = curr_date - timedelta(days=date.weekday(curr_date)) + for i in range(0,weekly): + day = monday - timedelta( days = (i * 7)) + if day not in dates: + dates.append(day) + # Monthly + day = curr_date.replace(day=1) + for i in range(0,monthly): + if day not in dates: + dates.append(day) + day = (day - timedelta(days=1)).replace(day=1) + self.dates = dates + + def newFile(self, path, daily = None, weekly = None, monthly = None, dateformat = None): + if daily == None: daily = self.daily + if weekly == None: weekly = self.weekly + if monthly == None: monthly = self.monthly + if dateformat == None: dateformat = self.dateformat + newfile = backupFile(daily, weekly, monthly, path) + return(newfile) + + def __str__(self): + val = "<{path}>".format( + path = self.path, + ) + return(val) + + def needRemove(self): + if self.filename == None: + need_remove = False + else: + need_remove = True + for date in self.dates: + if date.strftime(self.dateformat) in self.filename: + need_remove = False + break + return(need_remove) + + def remove(self, force = False): + print("Removing {file}...".format(file = self)) + # Check force option + if force: + os.unlink(self.path) + else: + # Remove interactively + print("Are you sure? (y/n) ", end="") + answer = input() + if answer == "y": + os.unlink(self.path) + + def removeIfNeeded(self, force = False): + if self.needRemove(): + self.remove(force = force) + # Argument parser parser = argparse.ArgumentParser(description="Cleanup old backups") # path argument @@ -63,80 +136,6 @@ monthly = args.monthly force = args.force directory = args.path[0] -class backupFile(): - def __init__(self, daily, weekly, monthly, path = None, dateformat = "%Y%m%d", dates = None,) -> None: - self.path = path - self.daily = daily - self.weekly = weekly - self.monthly = monthly - self.dateformat = dateformat - curr_date = date.today() # Maybe this will be used to specify date as starting point... - if self.path == None: - self.filename = None - else: - self.filename = os.path.basename(path) - if dates == None: - dates = [] - - # Daily - for i in range(0, daily): - day = curr_date - timedelta(days = i) - dates.append(day) - # Weekly - monday = curr_date - timedelta(days=date.weekday(curr_date)) - for i in range(0,weekly): - day = monday - timedelta( days = (i * 7)) - if day not in dates: - dates.append(day) - # Monthly - day = curr_date.replace(day=1) - for i in range(0,monthly): - if day not in dates: - dates.append(day) - day = (day - timedelta(days=1)).replace(day=1) - self.dates = dates - - def newFile(self, path, daily = None, weekly = None, monthly = None, dateformat = None): - if daily == None: daily = self.daily - if weekly == None: weekly = self.weekly - if monthly == None: monthly = self.monthly - if dateformat == None: dateformat = self.dateformat - newfile = backupFile(daily, weekly, monthly, path, dates = self.dates) - return(newfile) - - def __str__(self): - val = "<{path}>".format( - path = self.path, - ) - return(val) - - def needRemove(self): - if self.filename == None: - need_remove = False - else: - need_remove = True - for date in self.dates: - if date.strftime(self.dateformat) in self.filename: - need_remove = False - break - return(need_remove) - - def remove(self, force = False): - print("Removing {file}...".format(file = self)) - # Check force option - if force: - os.unlink(self.path) - else: - # Remove interactively - print("Are you sure? (y/n) ", end="") - answer = input() - if answer == "y": - os.unlink(self.path) - - def removeIfNeeded(self, force = False): - if self.needRemove(): - self.remove(force = force) - # File processing files = backupFile(daily = daily, weekly = weekly, monthly = monthly) # Generate file list with full paths