mirror of https://github.com/bvn13/PyBackuper.git
112 lines
3.4 KiB
Python
112 lines
3.4 KiB
Python
import os
|
|
import sys
|
|
import time
|
|
import logging
|
|
from watchdog.observers import Observer
|
|
from watchdog.events import PatternMatchingEventHandler
|
|
|
|
import threading
|
|
|
|
import logging
|
|
|
|
_MAX_CHECKS_BY_TIMER = 5
|
|
|
|
|
|
class FileSystemEventHandler(PatternMatchingEventHandler) :
|
|
checkAvailability = True
|
|
onCreated = None
|
|
onModified = None
|
|
|
|
def isFileAvailable(self, filename) :
|
|
logging.info("CHECK: %s" % (filename,))
|
|
if os.path.exists(filename) :
|
|
try :
|
|
os.rename(filename, filename)
|
|
return True
|
|
except OSError :
|
|
return False
|
|
return False
|
|
|
|
|
|
def process(self, event, isThread=False) :
|
|
global _MAX_CHECKS_BY_TIMER
|
|
|
|
logging.info("PROCESS: %r" % (isThread,))
|
|
doProcess = True
|
|
|
|
if self.checkAvailability :
|
|
logging.info("check for file availability: %s" % (event.src_path,))
|
|
if not self.isFileAvailable(event.src_path) :
|
|
logging.info("file is not available: %s" % (event.src_path,))
|
|
if (isThread) :
|
|
return None
|
|
|
|
t = threading.Timer(5, self.process, [event, True])
|
|
t.start()
|
|
doProcess = False
|
|
|
|
if doProcess :
|
|
logging.info("file is available: %s" % (event.src_path,))
|
|
logging.info("event_type: %s, onCreated: %s, onModified: %s" % (event.event_type, self.onCreated, self.onModified))
|
|
if event.event_type == 'created' and self.onCreated :
|
|
logging.info("call onCreated")
|
|
return self.onCreated(event.src_path)
|
|
if event.event_type == 'modified' and self.onModified :
|
|
logging.info("call onModified")
|
|
return self.onModified(event.src_path)
|
|
|
|
def on_any_event(self, event) :
|
|
logging.info("Any event, type: %s, source: %s, is dir: %r" % (event.event_type, event.src_path, event.is_directory))
|
|
|
|
if event.is_directory :
|
|
return None
|
|
|
|
return self.process(event)
|
|
|
|
|
|
class DirWatcher(object) :
|
|
|
|
onFileCreated = None
|
|
onFileModified = None
|
|
|
|
observer = None
|
|
eventHandler = None
|
|
|
|
def __init__(self, onFileCreatedHandler=None, onFileModifiedHandler=None) :
|
|
self.onFileCreated = onFileCreatedHandler
|
|
self.onFileModified = onFileModifiedHandler
|
|
|
|
def watch(self, path, mask) :
|
|
self.observer = Observer()
|
|
self.eventHandler = FileSystemEventHandler(patterns=[mask], ignore_patterns=[], ignore_directories=True, case_sensitive=True)
|
|
self.eventHandler.onCreated = self.onFileCreated
|
|
self.eventHandler.onModified = self.onFileModified
|
|
self.observer.schedule(self.eventHandler, path, recursive=True)
|
|
self.observer.start()
|
|
try:
|
|
while True:
|
|
time.sleep(1)
|
|
except KeyboardInterrupt:
|
|
self.observer.stop()
|
|
self.observer.join()
|
|
|
|
|
|
|
|
|
|
#def onFileCreatedHandler(event) :
|
|
# logging.info("Created: %s" % (event.src_path,))
|
|
|
|
|
|
#def onFileModifiedHandler(event) :
|
|
# logging.info("Modified: %s" % (event.src_path,))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
logging.basicConfig(level = logging.INFO, format='%(asctime)s - %(message)s', datefmt='%Y-%m-%d %H:%M:%S')
|
|
path = sys.argv[1] if len(sys.argv) > 1 else '.'
|
|
|
|
|
|
watcher = DirWatcher(onFileCreatedHandler, onFileModifiedHandler)
|
|
watcher.watch(path, "*.bak")
|
|
|