python rocks

Python is coming very close to replacing perl as my scripting language of choice. Once you get past the fact that whitespace matters, you discover that it fairly easy to do some pretty cool stuff. The script below watches a user's home dir for changes in files, and writes the changes to a log file (no, it isn't recursive, so it's worthless as a security tool, but it still demonstrates python's readability and focus on object oriented programming)

#!/usr/bin/pythonimport sysimport osimport globimport time# general function definitionsdef getMtime(fileName): """Function to return mtime in epoch seconds."""    stats = os.stat(fileName)   mtime = stats[8]    return mtime# class definitionclass watchedFile:    """Class to hold watched files"""   filesChanged = []   filesWatched = []       def init(self, name):       self.name = name        self.startMtime = getMtime(self.name)       self.currentMtime = self.startMtime     self.numChanges = 0     watchedFile.filesWatched.append(self)   def changeCheck(self):      """Checks for changes in mtime."""      newMtime = getMtime(self.name)      if newMtime != self.currentMtime: # file has changed            self.changed()          self.currentMtime = newMtime    def changed(self):      """Action taken if a file has been altered."""      if self in watchedFile.filesChanged:            pass        else:           watchedFile.filesChanged.append(self)       self.numChanges += 1        # specify files to be watchedhomeDir = os.path.expanduser('~')watchPath = homeDir + '/*'files = glob.glob(watchPath)# create objects for all watched filesfor file in files:    watched = watchedFile(file)# open log file for writingf = '/tmp/filewatcher.log'logfile = open(f, 'a')logfile.write("Files altered log  log started on : ")logfile.write(time.strftime('%c', time.localtime()))logfile.write(" files being watched: ")logfile.write(str(len(watchedFile.filesWatched)))logfile.write("-------------------------\")logfile.flush()# loop through watched files, checking for changes at 5 sec intervalswhile 1: for i in watchedFile.filesWatched:      i.changeCheck() if watchedFile.filesChanged:        logfile.write(time.strftime('%c', time.localtime()))        logfile.write("")      for f in watchedFile.filesChanged[:]:           logString = "%s has been changed %s times since init. Last change at %s " % (f.name, f.numChanges, time.strftime('%c', time.localtime(f.currentMtime)))            logfile.write(logString)    logfile.write("\") logfile.flush() time.sleep(5)

<-- Back