All pastes #521365 Raw Edit

Someone

public text v1 · immutable
#521365 ·published 2007-05-30 05:09 UTC
rendered paste body
#!/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