X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=scripts%2Fclean-backupdb.py;h=1d993c6dea312804db32ff7181d59fbee6d59fdf;hb=HEAD;hp=b844a05f2882078079ea8029b795a8c98e8c4665;hpb=c631de8b694c763f714427b42d88aacc77593d37;p=infrastructure.git diff --git a/scripts/clean-backupdb.py b/scripts/clean-backupdb.py index b844a05..1d993c6 100755 --- a/scripts/clean-backupdb.py +++ b/scripts/clean-backupdb.py @@ -71,7 +71,7 @@ class File: self.age=now-datetime self.weekday=self.datetime.weekday() if self.age.days<0: - if self.options.verbose: print 'Filename %s is from the future - skipped'%sfilename + if self.options.verbose: print 'Filename %s is from the future - skipped'%filename raise FileIgnored,"Filename from the future %s"%filename self.group = self._group_string() @@ -151,18 +151,27 @@ class File: def cleanup (self, preserved): global counter counter+=1 - if self.options.dry_run: - print "Would cleanup %s"%(self.path()) - print " (keeping %s)"%preserved.path() + src = os.path.abspath(os.path.basename(self.path())); + if self.options.destination: + dst = os.path.abspath(self.options.destination) + '/' + os.path.basename(self.path()) + if self.options.verbose: + print "moving %s\n\tto %s"%(self.path(), dst) + if not self.options.dry_run: + os.rename (src, dst) else: - if self.options.verbose: print "unlink",self.path() - os.unlink (self.path()) + if self.options.verbose: + print "Would cleanup %s"%(src) + print " (keeping %s)"%preserved.path() + if not self.options.dry_run: + if self.options.verbose: print "unlink",src + os.unlink (src) # all files in a given timeslot (either month or week) class Group: def __init__ (self, groupname): self.groupname=groupname self.files=[] + self.count = 0 def insert (self, file): self.files.append(file) def epilogue (self): @@ -170,6 +179,7 @@ class Group: def keep_one (self): for file in self.files[1:]: file.cleanup(self.files[0]) + self.count += 1 # all files with the same (prefix, suffix) class Kind: @@ -178,6 +188,9 @@ class Kind: self.prefix=prefix self.suffix=suffix self.options=options + self.todelete = 0 + self.oldest = None + self.newest = None # will contain tuples (filename, datetime) self.list = [] @@ -185,6 +198,9 @@ class Kind: def add_file (self, dir, filename, datetime): try: self.list.append ( File (dir, filename, datetime, self.options) ) + self.newest = datetime + if not self.oldest: + self.oldest = datetime except FileIgnored: pass except: print 'could not append %s'%filename @@ -241,6 +257,7 @@ class Kind: for groupname in groupnames: if self.options.extra_verbose: print 'GROUP',groupname self.groups[groupname].keep_one() + self.todelete += self.groups[groupname].count # keeps an index of all files found, index by (prefix, suffix), then sorted by time class Index: @@ -270,12 +287,19 @@ class Index: for filename in filenames: (b,p,s,d) = parse_filename (filename) if not b: - print "Filename %s does not match - skipped"%filename + if self.options.verbose: + print "Filename %s does not match - skipped"%filename continue self.insert (dir, filename, p, s, d) def cleanup (self): - for kind in self.index.values(): kind.cleanup() + for kind in self.index.values(): + kind.cleanup() + + def summary (self): + print "%-30s%-10s%10s%25s%25s"%("Prefix","Suffix","Num (Del)","Oldest","Newest") + for kind in self.index.values(): + print "%-30s%-10s%3s (%3s) %30s%30s"%(kind.prefix, kind.suffix, len(kind.list), kind.todelete, kind.oldest, kind.newest) def handle_dir_pattern (index, dir, pattern): try: @@ -295,8 +319,12 @@ def main (): help="run in extra verbose mode") parser.add_option ("-n","--dry-run",dest='dry_run',action='store_true',default=False, help="dry run") + parser.add_option ("-m","--move-to",dest='destination',action='store',type='string',default=False, + help="move to instead of removing the file") parser.add_option ("-o","--offset",dest='offset',action='store',type='int',default=0, help="pretend we run days in the future") + parser.add_option ("-s","--summary",dest='summary',action='store_true',default=False, + help="print a summary") (options, args) = parser.parse_args() if options.extra_verbose: options.verbose=True try: @@ -308,6 +336,10 @@ def main (): print "Offset not understood %s - expect an int. number of days"%options.offset sys.exit(1) + if options.destination and not os.path.isdir(options.destination): + print "Destination should be a directory" + sys.exit(1) + if len(args) ==0: parser.print_help() sys.exit(1) @@ -330,7 +362,10 @@ def main (): index.epilogue() index.show() index.cleanup() - print 'Found %d entries to unlink'%counter + if (options.summary) : + index.summary() + if options.verbose: + print 'Found %d entries to unlink'%counter if __name__ == '__main__': main()