python rocks
posted in programming by jon on 2004-03-29
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)
Subscribe 