Exemple #1
0
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()
Exemple #2
0
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()