def poll(local, remote, lock, stop_polling): lock.acquire() # get all new/modified remote files sync.sync_all_files(remote, local, remote.root, modified=True) # delete all files deleted on remote sync.sync_all_files(local, remote, local.root, modified=False, deleted=True) if not stop_polling.isSet(): threading.Timer(2, poll, [local, remote, lock, stop_polling]).start() lock.release()
def run(mode, source, destination, sftp_host, sftp_port, hostkey, userkey, username='', password='', logfile=None, loglevel='INFO', event=threading.Event(), **kargs): logger = logging.getLogger("sync") logger.setLevel(getattr(logging, loglevel)) formatter = logging.Formatter('%(levelname)s: %(asctime)s %(message)s') ch = logging.StreamHandler() ch.setLevel(getattr(logging, loglevel)) ch.setFormatter(formatter) if logfile: fh = logging.FileHandler(logfile, mode='w') fh.setLevel(getattr(logging, loglevel)) fh.setFormatter(formatter) logger.addHandler(fh) else: logger.addHandler(ch) paramiko_logger = logging.getLogger("paramiko.transport") paramiko_logger.addHandler(logging.NullHandler()) logger.info("Connect source and destination ...<br />") local = OSFileSystem(root=source) if mode == 'local': remote = OSFileSystem(root=destination) elif mode == 'remote': client = SFTPClient.connect(sftp_host, sftp_port, hostkey, userkey) if not client: client = SFTPClient.connect(sftp_host, sftp_port, hostkey, userkey, username, password) remote = SFTPFileSystem(client) try: remote.remove(os.path.join(remote.root, username)) except: pass # copy all new files from local to remote # sync all modifications from local/remote to local/remote # modifications are compared by modification time, the latest wins sync.sync_all_files(local, remote, local.root) # copy all new files from remote to local # sync no modifications, already synced sync.sync_all_files(remote, local, remote.root, modified=False) lock = threading.Lock() event_handler = EventHandler(local, remote, lock) observer = Observer() observer.schedule(event_handler, path=source, recursive=True) observer.start() stop_polling = threading.Event() threading.Timer(2, poll, [local, remote, lock, stop_polling]).start() while not event.isSet(): time.sleep(1) stop_polling.set() time.sleep(2) observer.stop() observer.join()