f37 -> f39
[infrastructure.git] / scripts / clean-backupdb.py
index b844a05..1d993c6 100755 (executable)
@@ -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 <destination> instead of removing the file")
     parser.add_option ("-o","--offset",dest='offset',action='store',type='int',default=0,
                        help="pretend we run <offset> 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()