diff --git a/script.py b/script.py index ee12ddd..c05869d 100644 --- a/script.py +++ b/script.py @@ -5,15 +5,15 @@ import time config = { - 'dirs':{ - 'from': os.getenv('IWATCH_FROM', '/in'), - 'to': os.getenv('IWATCH_TO', '/out'), + "dirs": { + "from": os.getenv("IWATCH_FROM", "/in"), + "to": os.getenv("IWATCH_TO", "/out"), }, - 'action': 'move', - 'timeout': int(os.getenv('IWATCH_TIMEOUT', 30)), + "timeout": int(os.getenv("IWATCH_TIMEOUT", 30)), } -loglines = [''] +loglines = [""] + def log(line): if line == loglines[-1]: @@ -21,66 +21,68 @@ def log(line): print(line) loglines[-1] = line + def _main(): - i = inotify.adapters.InotifyTree(config['dirs']['from']) + i = inotify.adapters.InotifyTree(config["dirs"]["from"]) files = {} lastcount = 0 - log('Looking for existing files in in') - for dirpath, _, filenames in os.walk(config['dirs']['from']): + log(f'Looking for existing files in {config["dirs"]["from"]}') + for dirpath, _, filenames in os.walk(config["dirs"]["from"]): for f in filenames: - log('found {}'.format(f)) - files[dirpath + f] = { - 'path': dirpath, - 'filename': f, - 'time': time.time() - } + log(f"found {f}") + files[dirpath + f] = {"path": dirpath, "filename": f, "time": time.time()} - log('waiting for events') + log("waiting for events") for event in i.event_gen(yield_nones=True): if event is None: completed = [] for filename, file in files.items(): - if file['time'] < time.time()-config['timeout']: + if file["time"] < time.time() - config["timeout"]: completed.append(filename) - fpath = os.path.join(file['path'], file['filename']) + fpath = os.path.join(file["path"], file["filename"]) if not os.path.isfile(fpath): continue - if config['action'] == 'move': - tpath = fpath.replace(config['dirs']['from'], config['dirs']['to']) - shutil.move(fpath, tpath) - log('moved {}'.format(fpath)) - else: - log('action unknown') + tpath = fpath.replace(config["dirs"]["from"], config["dirs"]["to"]) + shutil.move(fpath, tpath) + log(f"moved {fpath}") + for filename in completed: del files[filename] + if len(files) != lastcount: - log('waiting for {} files to be completed'.format(len(files))) + log(f"waiting for {len(files)} files to be completed") lastcount = len(files) - continue - (_, type_names, path, filename) = event - if filename == '' or any(filter(lambda x: x in ['IN_MOVED_FROM'], type_names)): + continue - fname = path + filename - if 'IN_DELETE' in type_names: - log('removed file {}/{}'.format(path, filename)) + (_, type_names, path, filename) = event + if filename == "" or any(filter(lambda x: x in ["IN_MOVED_FROM"], type_names)): + # Assume we moved the file ourself, so no need to take an action here + continue + + fname = path + filename + if "IN_DELETE" in type_names: + # Ok, the file is gone, just notify and remove from watched files + log(f"removed file {path}/{filename}") if fname in files: del files[fname] + continue - if not any(filter(lambda x: x in ['IN_MODIFY', 'IN_CREATE'], type_names)): + if not any(filter(lambda x: x in ["IN_MODIFY", "IN_CREATE"], type_names)): + # skip all uninteresting events continue - if fname in files: - log("PATH=[{}] FILENAME=[{}] EVENT_TYPES={}".format( path, filename, type_names)) + if fname not in files: + log(f"PATH=[{path}] FILENAME=[{filename}] EVENT_TYPES={type_names}") files[fname] = { - 'path': path, - 'filename': filename, + "path": path, + "filename": filename, } - files[fname]['time'] = time.time() + files[fname]["time"] = time.time() -if __name__ == '__main__': +if __name__ == "__main__": _main()