#!/usr/bin/env python # -*- coding: iso-8859-1 -*- # newshiz3 watcher 0.1, creates picklefile in /tmp max every 1 minutes # usage: ./simple.py '/path-to-watch' import os from datetime import datetime, timedelta import pickle from pyinotify import SimpleINotify, EventsCodes, ProcessEvent picklefilename = "/tmp/newshiz" # import from the picklefile if its there if os.path.exists(picklefilename): createddict = pickle.load(open(picklefilename,"r")) print "imported picklefile successfuly" else: createddict = {} print "created new dictionary" class PCreate(ProcessEvent): def __init__(self): PCreate.lastpickled = datetime.now() def process_IN_CREATE(self, event_k): """ process 'IN_CREATE_*' events by checking to see if file is a directory """ if event_k.name: createdname = os.path.join(event_k.path, event_k.name) f = "%s" % createdname if event_k.isdir: print "%s: created (directory), adding to watchlist." % f ino.add_watch(event_k.path, mask, PCreate(), rec=True) else: # heart math operations on datetime objects timeadded = datetime.now() print "%s: created file, adding to createddict with timestamp %s (lastpickled %s)" % (f, timeadded, PCreate.lastpickled) createddict[createdname] = timeadded if timeadded - PCreate.lastpickled > timedelta(minutes=1): print "pickling createddict to /tmp/newshiz" picklefile = open(picklefilename, "w") pickle.dump(createddict, picklefile) picklefile.close() PCreate.lastpickled = timeadded else: # in example but have never seen this get called print "move along, nothing to see here." f = "%s" % event_k.path def process_IN_DELETE(self, event_k): """ delete occurences of event_k from the dictionary. """ try: deletedname = os.path.join(event_k.path, event_k.name) createddict.pop(deletedname) print "removed %s"% deletedname except KeyError: print "failed to remove %s from dictionary, likely didnt exist"% deletedname if __name__ == '__main__': # import sys path = '/home/global' # default watched path if sys.argv[1:]: path = sys.argv[1] # only interested in create/destroy mask = EventsCodes.IN_DELETE | EventsCodes.IN_CREATE # class instance and init ino = SimpleINotify() print "this is newshiz3, inotify watcher component." print 'start monitoring %s with mask %d' % (path, mask) added_flag = False while True: try: if not added_flag: print "adding root: %s"%path ino.add_watch(path, mask, PCreate(), rec=True) added_flag = True ino.process_events() if ino.event_check(): ino.read_events() except KeyboardInterrupt: # ...until c^c signal print 'stop monitoring...' # close inotify's instance ino.close() break except Exception, err: # otherwise keep on watching print err