Package Products :: Package ZenRRD :: Module FileCleanup |
[hide private]
[frames] | no frames]

# Source Code for Module Products.ZenRRD.FileCleanup

     1  #! /usr/bin/env python
     2  ##############################################################################
     3  #
     4  # Copyright (C) Zenoss, Inc. 2007, all rights reserved.
     5  #
     6  # This content is made available according to terms specified in
     7  # License.zenoss under the directory where your Zenoss product is installed.
     8  #
     9  ##############################################################################
    10
    11
    12  __doc__='''FileCleanup
    13
    14  Walk a tree recursively and cleanup files.  Slowly.
    15
    16  $Id$
    17  '''
    18
    19  from twisted.internet import reactor
    20
    21  import os
    22  import time
    23  import re
    24
    25  __version__ = "$Revision$"[11:-2]
    26
    27  THIRTY_DAYS = 30 * 24 * 60 * 60
    28
    29 -class FileCleanup:
    30
    31 -    def __init__(self, root, pattern,
    32                   tooOld = THIRTY_DAYS, maxProcess = 50, frequency = 60):
    33          """Recursively delete all  files under [root] matching
    34          [pattern] older than [tooOld], processing only [maxProcess]
    35          files every [frequency] seconds."""
    36          self.tooOld = tooOld
    37          self.pattern = re.compile(pattern)
    38          self.root = root
    39          self.frequency = frequency
    40          self.maxProcess = maxProcess
    41          self.iter = None
    42
    43
    44 -    def start(self):
    45          "Begin processing the directory, recursively"
    46          reactor.callLater(0, self.run)
    47
    48
    49 -    def run(self):
    50          "Start a run at the directory"
    51          if self.iter is None:
    52              self.now = time.time()
    53              self.iter = self.walk(self.root)
    54          for i, f in enumerate(self.iter):
    55              if i > self.maxProcess:
    56                  break
    57              if self.test(f):
    58                  self.process(f)
    59          else:
    60              self.iter = None
    61          reactor.callLater(self.frequency, self.run)
    62
    63
    64 -    def process(self, fullPath):
    65          "Hook for cleanin up the file"
    66          os.unlink(fullPath)
    67
    68
    69 -    def test(self, fullPath):
    70          "Test file file for pattern, age and type"
    71          if not os.path.isfile(fullPath):
    72              return False
    73          if not self.pattern.match(fullPath):
    74              return False
    75          mtime = os.path.getmtime(fullPath)
    76          if mtime > self.now - self.tooOld:
    77              return False
    78          return True
    79
    80
    81 -    def walk(self, root):
    82          "Generate the list of all files"
    83          for f in os.listdir(root):
    84              fullPath = os.path.join(root, f)
    85              yield fullPath
    86              if os.path.exists(fullPath) and os.path.isdir(fullPath):
    87                  for k in self.walk(fullPath):
    88                      yield k
    89
    90  if __name__ == '__main__':
    91      import sys
    92      f = FileCleanup('/tmp', 604800, '.*\\.xpi$', 10, 1)
    93      f.process = lambda x: sys.stdout.write('%s\n' % x)
    94      f.start()
    95      reactor.run()
    96