diff --git a/README.md b/README.md index 63f82db..bda1696 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,7 @@ This example is to run a permissions-repairing utility whenever there's a change UMASK=0000 # This is important because chmod/chown will change files in the monitored directory IGNORE_EVENTS_WHILE_COMMAND_IS_RUNNING=1 + USE_POLLING=no Since the `newperms` utility does an explicit "chown -R nobody:users", we need to use the UMAP and GMAP environment variables to update the user and group in the container so that it will match the host. For example: @@ -73,5 +74,6 @@ This example tells SageTV to rescan its imported media when the media directory GROUP_ID=0 UMASK=0000 IGNORE_EVENTS_WHILE_COMMAND_IS_RUNNING=0 + USE_POLLING=no We don't need to ignore events while the command is running because the wget command is a "fire and forget" asynchronous operation. We also don't need to use UMAP or GMAP. diff --git a/monitor.py b/monitor.py index 54bbd4d..68bba9a 100755 --- a/monitor.py +++ b/monitor.py @@ -10,6 +10,7 @@ import sys import tempfile import time from watchdog.observers import Observer +from watchdog.observers.polling import PollingObserver from watchdog.events import FileSystemEventHandler RUNAS = "/files/runas.sh" @@ -124,6 +125,15 @@ def read_config(config_file): sys.exit(1) args.ignore_events_while_command_is_running = env["IGNORE_EVENTS_WHILE_COMMAND_IS_RUNNING"] == "1" + if "USE_POLLING" in env: + if not re.match("(yes|no|true|false|0|1)", env["USE_POLLING"], re.IGNORECASE): + logging.error("Configuration error. USE_POLLING must be \"yes\" or \"no\".") + sys.exit(1) + + args.use_polling = True if re.match("(yes|true|1)", env["USE_POLLING"], re.IGNORECASE) else False + else: + args.use_polling = False + logging.info("CONFIGURATION:") logging.info(" WATCH_DIR=%s", args.watch_dir) logging.info("SETTLE_DURATION=%s", args.settle_duration) @@ -134,6 +144,7 @@ def read_config(config_file): logging.info(" GROUP_ID=%s", args.group_id) logging.info(" UMASK=%s", args.umask) logging.info(" DEBUG=%s", args.debug) + logging.info(" USE_POLLING=%s", args.use_polling) logging.info("IGNORE_EVENTS_WHILE_COMMAND_IS_RUNNING=%s", args.ignore_events_while_command_is_running) return args @@ -258,8 +269,14 @@ if args.debug: logging.info("Starting monitor for %s", name) # Launch the watchdog +if args.use_polling: + logging.info("Using polling to detect changes") + observer = PollingObserver() +else: + logging.info("Using native change detection to detect changes") + observer = Observer() + event_handler = ModifyHandler() -observer = Observer() observer.schedule(event_handler, args.watch_dir, recursive=True) observer.start() diff --git a/sample.conf b/sample.conf index 1cdf83e..9173979 100644 --- a/sample.conf +++ b/sample.conf @@ -39,5 +39,8 @@ UMASK=0 # file even if it already has that mode. IGNORE_EVENTS_WHILE_COMMAND_IS_RUNNING=1 +# Set to true to use polling to detect changes. For non-linux file systems, such as Windows shares, you must use polling. +USE_POLLING=no + # Set this to 1 to log all events, for debugging purposes. WARNING! This creates copious amounts of confusing logging! DEBUG=0