diff --git a/README.md b/README.md index b13446b..330cfa7 100644 --- a/README.md +++ b/README.md @@ -31,18 +31,20 @@ With *auto_create* set to True, possibly missing subdirectories in *dst_re* are Set the mode of moved/copied files/directories with *filemode* and *dirmode*. Ownership of moved/copied files/directories is set with *user* and *group*. Mode and ownership is also set to automatically created subdirectories. Use *logname* in log messages. ```python -rule = Rule(action="move", - src_re="^/src_path/(?P.*).to_move$", - dst_re="/dst_path/\g", - auto_create=False, - rec=False, - filemode=None, - dirmode=None, - user=None, - group=None) +rule = Rule( + action="move", + src_re="^/src_path/(?P.*).to_move$", + dst_re="/dst_path/\g", + auto_create=False, + rec=False, + filemode=None, + dirmode=None, + user=None, + group=None) -fm = FileManager(rules=[rule], - logname="FileManager") +fm = FileManager( + rules=[rule], + logname="FileManager") ``` FileManager provides a task **fm.task**. @@ -53,11 +55,12 @@ pyinotifyd has different schedulers to schedule tasks with an optional delay. Th TaskScheduler schedules *task* with an optional *delay* in seconds. Use the *files* and *dirs* arguments to schedule tasks only for files and/or directories. Use *logname* in log messages. All arguments except for *task* are optional. ```python -s = TaskScheduler(task=task, - files=True, - dirs=False, - delay=0, - logname="TaskScheduler") +s = TaskScheduler( + task=task, + files=True, + dirs=False, + delay=0, + logname="TaskScheduler") ``` TaskScheduler provides two tasks which can be bound to an event in an event map. * **s.schedule** @@ -74,8 +77,9 @@ s1 = ShellScheduler(cmd="/usr/local/bin/task.sh {maskname} {pathname} {src_pathn EventMap maps event types to tasks. It is possible to set a list of tasks to run multiple tasks on a single event. If the task of an event type is set to None, it is ignored. This is an example: ```python -event_map = EventMap({"IN_CLOSE_NOWRITE": [s.schedule, s1.schedule], - "IN_CLOSE_WRITE": s.schedule}) +event_map = EventMap({ + "IN_CLOSE_NOWRITE": [s.schedule, s1.schedule], + "IN_CLOSE_WRITE": s.schedule}) ``` The following event types are available: * **IN_ACCESS**: a file was accessed @@ -97,18 +101,20 @@ The following event types are available: ### Watches Watch watches *path* for event types in *event_map* and execute the corresponding task(s). If *rec* is True, a watch will be added on each subdirectory in *path*. If *auto_add* is True, a watch will be added automatically on newly created subdirectories in *path*. ```python -watch = Watch(path="/tmp", - event_map=event_map, - rec=False, - auto_add=False) +watch = Watch( + path="/tmp", + event_map=event_map, + rec=False, + auto_add=False) ``` ### PyinotifydConfig pyinotifyd expects an instance of PyinotifydConfig named **pyinotifyd_config** that holds its config options. The options are a list of *watches*, the *loglevel* (see https://docs.python.org/3/library/logging.html#levels) and the *shutdown_timeout*. pyinotifyd will wait *shutdown_timeout* seconds for pending tasks to complete during shutdown. ```python -pyinotifyd_config = PyinotifydConfig(watches=[watch], - loglevel=logging.INFO, - shutdown_timeout=30) +pyinotifyd_config = PyinotifydConfig( + watches=[watch], + loglevel=logging.INFO, + shutdown_timeout=30) ``` ### Autostart @@ -128,80 +134,98 @@ systemctl start pyinotifyd.service async def task(event, task_id): logging.info(f"{task_id}: execute example task: {event}") -s = TaskScheduler(task=task, - files=True, - dirs=True) +s = TaskScheduler( + task=task, + files=True, + dirs=True) -event_map = EventMap(default_task=s.schedule) +event_map = EventMap( + default_task=s.schedule) -watch = Watch(path="/tmp", - event_map=event_map, - rec=True, - auto_add=True) +watch = Watch( + path="/tmp", + event_map=event_map, + rec=True, + auto_add=True) -pyinotifyd_config = PyinotifydConfig(watches=[watch], - loglevel=logging.INFO, - shutdown_timeout=5) +pyinotifyd_config = PyinotifydConfig( + watches=[watch], + loglevel=logging.INFO, + shutdown_timeout=5) ``` ### Schedule Shell commands for specific events on files ```python -s = ShellScheduler(cmd="/usr/local/sbin/task.sh {pathname}", files=True, dirs=False) +s = ShellScheduler( + cmd="/usr/local/sbin/task.sh {pathname}", + files=True, + dirs=False) -event_map = EventMap({"IN_WRITE_CLOSE": s.schedule}) +event_map = EventMap( + {"IN_WRITE_CLOSE": s.schedule}) -watch = Watch(path="/tmp", - event_map=event_map, - rec=True, - auto_add=True) +watch = Watch( + path="/tmp", + event_map=event_map, + rec=True, + auto_add=True) -pyinotifyd_config = PyinotifydConfig(watches=[watch], - loglevel=logging.INFO, - shutdown_timeout=5) +pyinotifyd_config = PyinotifydConfig( + watches=[watch], + loglevel=logging.INFO, + shutdown_timeout=5) ``` ### Move, copy or delete newly created files after a delay ```python -move_rule = Rule(action="move", - src_re="^/src_path/(?P.*)\.to_move$", - dst_re="/dst_path/\g", - auto_create=True, - filemode=0o644, - dirmode=0o755) +move_rule = Rule( + action="move", + src_re="^/src_path/(?P.*)\.to_move$", + dst_re="/dst_path/\g", + auto_create=True, + filemode=0o644, + dirmode=0o755) -copy_rule = Rule(action="copy", - src_re="^/src_path/(?P.*)\.to_copy$", - dst_re="/dst_path/\g", - auto_create=True, - filemode=0o644, - dirmode=0o755) +copy_rule = Rule( + action="copy", + src_re="^/src_path/(?P.*)\.to_copy$", + dst_re="/dst_path/\g", + auto_create=True, + filemode=0o644, + dirmode=0o755) -delete_rule = Rule(action="delete", - src_re="^/src_path/(?P.*)\.to_delete$", - rec=False) +delete_rule = Rule( + action="delete", + src_re="^/src_path/(?P.*)\.to_delete$", + rec=False) -fm = FileManager(rules=[move_rule, copy_rule, delete_rule]) +fm = FileManager( + rules=[move_rule, copy_rule, delete_rule]) -s = TaskScheduler(task=fm.task, - delay=30, - files=True, - dirs=False) +s = TaskScheduler( + task=fm.task, + delay=30, + files=True, + dirs=False) -event_map = EventMap({"IN_CLOSE_WRITE": s.schedule, - "IN_DELETE": s.cancel, - "IN_DELETE_SELF": s.cancel, - "IN_MODIFY": s.cancel, - "IN_MOVED_TO": s.schedule, - "IN_UNMOUNT": s.cancel}) +event_map = EventMap({ + "IN_CLOSE_WRITE": s.schedule, + "IN_DELETE": s.cancel, + "IN_DELETE_SELF": s.cancel, + "IN_MODIFY": s.cancel, + "IN_MOVED_TO": s.schedule, + "IN_UNMOUNT": s.cancel}) -watch = Watch(path="/src_path", - event_map=event_map, - rec=True, - auto_add=True) +watch = Watch( + path="/src_path", + event_map=event_map, + rec=True, + auto_add=True) # note that shutdown_timeout should be greater than the greatest scheduler delay, # otherwise pending tasks may get cancelled during shutdown. -pyinotifyd_config = PyinotifydConfig(watches=[watch], - loglevel=logging.INFO, - shutdown_timeout=35) +pyinotifyd_config = PyinotifydConfig( + watches=[watch], + loglevel=logging.INFO, + shutdown_timeout=35) ``` diff --git a/docs/config.py b/docs/config.py index 009c08f..0cd4c29 100644 --- a/docs/config.py +++ b/docs/config.py @@ -7,19 +7,34 @@ #async def custom_task(event, task_id): # logging.info(f"{task_id}: execute example task: {event}") # -#s = TaskScheduler(task=custom_task, files=True, dirs=False) +#s = TaskScheduler( +# task=custom_task, +# files=True, +# dirs=False) ##################################################### # Example usage of TaskScheduler with FileManager # ##################################################### -#rules=[{"action": "move", -# "src_re": r"^(?P.*)", -# "dst_re": r"\g.processed", -# "auto_create": True}] -#fm = FileManager(rules=rules) -#s = TaskScheduler(task=fm.task, delay=10, files=True, dirs=False) +#rules=[{ +# "action": "move", +# "src_re": r"^(?P.*)", +# "dst_re": r"\g.processed", +# "auto_create": True, +# "filemode": 0o755, +# "dirmode": 0o644, +# "user": "root", +# "goup": "root"}] +# +#fm = FileManager( +# rules=rules) +# +#s = TaskScheduler( +# task=fm.task, +# delay=10, +# files=True, +# dirs=False) ##################################### @@ -27,29 +42,36 @@ ##################################### #cmd = "/usr/local/bin/task.sh {maskname} {pathname} {src_pathname}" -#s = ShellScheduler(cmd=cmd) +#s = ShellScheduler( +# cmd=cmd) ################### # Example watch # ################### -#event_map = EventMap({"IN_ACCESS": None, -# "IN_ATTRIB": None, -# "IN_CLOSE_NOWRITE": None, -# "IN_CLOSE_WRITE": s.schedule, -# "IN_CREATE": None, -# "IN_DELETE": s.cancel, -# "IN_DELETE_SELF": s.cancel, -# "IN_IGNORED": None, -# "IN_MODIFY": s.cancel, -# "IN_MOVE_SELF": None, -# "IN_MOVED_FROM": s.cancel, -# "IN_MOVED_TO": s.schedule, -# "IN_OPEN": None, -# "IN_Q_OVERFLOW": None, -# "IN_UNMOUNT": s.cancel}) -#watch = Watch(path="/tmp", event_map=event_map, rec=True, auto_add=True) +#event_map = EventMap({ +# "IN_ACCESS": None, +# "IN_ATTRIB": None, +# "IN_CLOSE_NOWRITE": None, +# "IN_CLOSE_WRITE": s.schedule, +# "IN_CREATE": None, +# "IN_DELETE": s.cancel, +# "IN_DELETE_SELF": s.cancel, +# "IN_IGNORED": None, +# "IN_MODIFY": s.cancel, +# "IN_MOVE_SELF": None, +# "IN_MOVED_FROM": s.cancel, +# "IN_MOVED_TO": s.schedule, +# "IN_OPEN": None, +# "IN_Q_OVERFLOW": None, +# "IN_UNMOUNT": s.cancel}) +# +#watch = Watch( +# path="/tmp", +# event_map=event_map, +# rec=True, +# auto_add=True) ############################### @@ -57,4 +79,6 @@ ############################### #pyinotifyd_config = PyinotifydConfig( -# watches=[watch], loglevel=logging.INFO, shutdown_timeout=30) +# watches=[watch], +# loglevel=logging.INFO, +# shutdown_timeout=30)