Beispiel #1
0
    def test_sync_fs_fs(self):
        local = FsTarget(os.path.join(PYFTPSYNC_TEST_FOLDER, "local"))
        remote = FsTarget(os.path.join(PYFTPSYNC_TEST_FOLDER, "remote"))
        opts = {"dry_run": False, "verbose": 3}
        s = BiDirSynchronizer(local, remote, opts)
        s.run()
        stats = s.get_stats()
        #        pprint(stats)
        self.assertEqual(stats["local_dirs"], 2)
        self.assertEqual(
            stats["local_files"],
            4)  # currently files are not counted, when inside a *new* folder
        self.assertEqual(stats["remote_dirs"], 0)
        self.assertEqual(stats["remote_files"], 0)
        self.assertEqual(stats["files_written"], 6)
        self.assertEqual(stats["dirs_created"], 2)
        self.assertEqual(stats["bytes_written"], 16403)
        # file times are preserved
        self.assertEqual(_get_test_file_date("local/file1.txt"),
                         STAMP_20140101_120000)
        self.assertEqual(_get_test_file_date("remote/file1.txt"),
                         STAMP_20140101_120000)

        # Again: nothing to do
        s = BiDirSynchronizer(local, remote, opts)
        s.run()
        stats = s.get_stats()
        #        pprint(stats)
        self.assertEqual(stats["local_dirs"], 2)
        self.assertEqual(stats["local_files"], 6)
        self.assertEqual(stats["remote_dirs"], 2)
        self.assertEqual(stats["remote_files"], 6)
        self.assertEqual(stats["files_created"], 0)
        self.assertEqual(stats["files_deleted"], 0)
        self.assertEqual(stats["files_written"], 0)
        self.assertEqual(stats["dirs_created"], 0)
        self.assertEqual(stats["bytes_written"], 0)

        # Modify remote and/or remote
        _touch_test_file("local/file1.txt")
        _touch_test_file("remote/file2.txt")
        # file3.txt will cause a conflict:
        _touch_test_file("local/file3.txt")
        dt = datetime.datetime.now() - datetime.timedelta(seconds=10)
        _touch_test_file("remote/file3.txt", dt=dt)

        s = BiDirSynchronizer(local, remote, opts)
        s.run()
        stats = s.get_stats()
        #        pprint(stats)
        self.assertEqual(stats["entries_seen"], 18)
        self.assertEqual(stats["entries_touched"], 2)
        self.assertEqual(stats["files_created"], 0)
        self.assertEqual(stats["files_deleted"], 0)
        self.assertEqual(stats["files_written"], 2)
        self.assertEqual(stats["dirs_created"], 0)
        self.assertEqual(stats["download_files_written"], 1)
        self.assertEqual(stats["upload_files_written"], 1)
        self.assertEqual(stats["conflict_files"], 1)
        self.assertEqual(stats["bytes_written"], 6)
Beispiel #2
0
    def test_download_fs_fs(self):
        # Download files from local to remote (which is empty)
        local = FsTarget(os.path.join(PYFTPSYNC_TEST_FOLDER, "remote"))
        remote = FsTarget(os.path.join(PYFTPSYNC_TEST_FOLDER, "local"))
        opts = {"force": False, "delete": False, "dry_run": False}
        s = DownloadSynchronizer(local, remote, opts)
        s.run()
        stats = s.get_stats()
#        pprint(stats)
        self.assertEqual(stats["local_dirs"], 0)
        self.assertEqual(stats["local_files"], 0)
        self.assertEqual(stats["remote_dirs"], 2)
        self.assertEqual(stats["remote_files"], 4) # currently files are not counted, when inside a *new* folder
        self.assertEqual(stats["files_written"], 6)
        self.assertEqual(stats["dirs_created"], 2)
        self.assertEqual(stats["bytes_written"], 16403)
        # Again: nothing to do
        s = DownloadSynchronizer(local, remote, opts)
        s.run()
        stats = s.get_stats()
#        pprint(stats)
        self.assertEqual(stats["local_dirs"], 2)
        self.assertEqual(stats["local_files"], 6)
        self.assertEqual(stats["remote_dirs"], 2)
        self.assertEqual(stats["remote_files"], 6)
        self.assertEqual(stats["files_written"], 0)
        self.assertEqual(stats["dirs_created"], 0)
        self.assertEqual(stats["bytes_written"], 0)
        # file times are preserved
        self.assertEqual(_get_test_file_date("local/file1.txt"), STAMP_20140101_120000)
        self.assertEqual(_get_test_file_date("remote/file1.txt"), STAMP_20140101_120000)
Beispiel #3
0
def _sync_test_folders(options):
    """Run bi-dir sync with fresh objects."""
    local = FsTarget(os.path.join(PYFTPSYNC_TEST_FOLDER, "local"))
    remote = FsTarget(os.path.join(PYFTPSYNC_TEST_FOLDER, "remote"))
    opts = {"dry_run": False, "verbose": 3}
    if options:
        opts.update(options)

    s = BiDirSynchronizer(local, remote, opts)
    s.run()
    return s.get_stats()
Beispiel #4
0
    def _transfer_files(self, count, size):
        temp1_path = os.path.join(PYFTPSYNC_TEST_FOLDER, "local")
        empty_folder(temp1_path)  # remove standard test files

        local = FsTarget(temp1_path)
        remote = self.remote

        for i in range(count):
            write_test_file("local/file_{}.txt".format(i), size=size)

        # Upload all of temp/local to remote

        opts = {"force": False, "delete": False, "verbose": 3}
        s = UploadSynchronizer(local, remote, opts)
        s.run()
        stats = s.get_stats()
        #        pprint(stats)

        self.assertEqual(stats["files_written"], count)
        self.assertEqual(stats["bytes_written"], count * size)
        #        pprint(stats)
        print(
            "Upload {} x {} bytes took {}: {}".format(
                count, size, stats["upload_write_time"],
                stats["upload_rate_str"]),
            file=sys.stderr,
        )

        # Download all of remote to temp/remote

        local = FsTarget(os.path.join(PYFTPSYNC_TEST_FOLDER, "remote"))

        opts = {"force": False, "delete": True, "verbose": 3}
        s = DownloadSynchronizer(local, remote, opts)
        s.run()
        stats = s.get_stats()
        #        pprint(stats)

        self.assertEqual(stats["files_written"], count)
        self.assertEqual(stats["bytes_written"], count * size)

        #        pprint(stats)
        print(
            "Download {} x {} bytes took {}: {}".format(
                count, size, stats["download_write_time"],
                stats["download_rate_str"]),
            file=sys.stderr,
        )
Beispiel #5
0
 def run(self):
     from ftpsync.targets import FsTarget, UploadSynchronizer
     from ftpsync.ftp_target import FtpTarget
     ftp_configuration = self.deployment['FTP']
     local = FsTarget(os.path.join(SETUP_DIR, 'keys_of_peace'))
     remote = FtpTarget(ftp_configuration['PATH'],
                        self.deployment['SERVER'],
                        ftp_configuration['USER'],
                        ftp_configuration['PASSWORD'])
     s = UploadSynchronizer(
         local, remote, {
             'delete_unmatched': True,
             'dry_run': False,
             'force': False,
             'omit': '*.sqlite3,*.pyc',
         })
     s.run()
     import paramiko
     ssh_configuration = self.deployment['SSH']
     client = paramiko.SSHClient()
     client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
     client.connect(self.deployment['SERVER'],
                    username=ssh_configuration['USER'],
                    password=ssh_configuration['PASSWORD'])
     _in, _out, _err = client.exec_command(';'.join(
         ssh_configuration['COMMANDS']))
     _in.write(ssh_configuration['IN'])
     client.close()
Beispiel #6
0
def copy_to_ftp(source_folder, dest_host):
    logging.info('Copying %s to %s' % (source_folder, dest_host))
    local = FsTarget(source_folder)
    remote = FtpTarget(settings.DEFAULT_FTP_PATH, dest_host,
                       settings.DEFAULT_FTP_USER, settings.DEFAULT_FTP_PASS)
    s = UploadSynchronizer(local, remote, settings.DEFAULT_FTP_SYNC_OPTS)
    s.run()
Beispiel #7
0
def sync_gridsome() -> None:
    """
    指定のローカルとリモートディレクトリを同期する
    """

    cfg = configparser.ConfigParser()
    cfg.read("config.ini")

    # ローカルとリモートの設定
    local = FsTarget(cfg["PATH"]["LOCAL"])
    user = cfg["FTPS"]["USER"]
    passwd = cfg["FTPS"]["PASSWORD"]
    remote = FtpTarget(
        cfg["PATH"]["REMOTE"],  # リモートディレクトリパス
        cfg["FTPS"]["SERVER"],  # FTPサーバ
        username=user,
        password=passwd,
        tls=True,  # FTPS有効
    )

    # オプション設定
    # ローカル優先/--deleteオプション有効/指定ディレクトリは同期除外
    # opts = {"resolve": "local", "delete": True, "force": True}
    opts = {"resolve": "local"}

    # 同期の実行
    sync = BiDirSynchronizer(local, remote, opts)
    sync.run()
Beispiel #8
0
 def _make_remote_target(cls):
     """Return the remote target instance, depending on `use_ftp_target`."""
     if cls.use_ftp_target:
         check_ftp_test_connection(PYFTPSYNC_TEST_FOLDER, PYFTPSYNC_TEST_FTP_URL)
         remote = make_target(PYFTPSYNC_TEST_FTP_URL)
     else:
         remote = FsTarget(os.path.join(PYFTPSYNC_TEST_FOLDER, "remote"))
     return remote
Beispiel #9
0
 def test_upload_fs_fs(self):
     local = FsTarget(os.path.join(PYFTPSYNC_TEST_FOLDER, "local"))
     remote = FsTarget(os.path.join(PYFTPSYNC_TEST_FOLDER, "remote"))
     opts = {"force": False, "delete": False, "verbose": self.verbose}
     s = UploadSynchronizer(local, remote, opts)
     s.run()
     stats = s.get_stats()
     #        pprint(stats)
     self.assertEqual(stats["local_dirs"], 2)
     # currently files are not counted, when inside a *new* folder:
     self.assertEqual(stats["local_files"], 4)
     self.assertEqual(stats["remote_dirs"], 0)
     self.assertEqual(stats["remote_files"], 0)
     self.assertEqual(stats["files_written"], 6)
     self.assertEqual(stats["dirs_created"], 2)
     self.assertEqual(stats["bytes_written"], 16403)
     # file times are preserved
     self.assertEqual(get_test_file_date("local/file1.txt"), STAMP_20140101_120000)
     self.assertEqual(get_test_file_date("remote/file1.txt"), STAMP_20140101_120000)
Beispiel #10
0
def upload_dir(local, remote, dry_run=False, opts=None):
    env = environment()
    if 'ssh' in env:
        ssh = env['ssh']
        rsync_opts = [
            '--recursive', '--archive', '--compress', '--itemize-changes'
        ]
        if dry_run:
            rsync_opts.append('--dry-run')
        if state['verbose']:
            rsync_opts.append('--verbose')
        # trailing slash is important, see rsync documentation
        src = local + '/'
        abs_remote = os.path.join(ssh['document_root'], remote)
        dest = '{}@{}:{}'.format(ssh['user'], ssh['host'], abs_remote)
        args = rsync_opts + ([] if opts is None else opts) + [src, dest]
        # TODO rsync still prompts for the password
        with shell_env(RSYNC_PASSWORD=ssh['password']):
            fab.local('rsync {}'.format(' '.join(args)))
    else:
        ftp = env['ftp']
        host = ftp_host(env)
        extra_opts = {'ftp_debug': 1 if state['verbose'] else 0}
        url = urlparse(ftp['url'])
        if url.scheme != 'ftp':
            fab.warn('non-ftp url scheme, may not be supported')
        abs_remote = os.path.join(url.path, remote)
        if not host.path.exists(abs_remote):
            fab.warn('remote path is missing: {}'.format(abs_remote))
            if console.confirm('create missing directories?'):
                host.makedirs(abs_remote)
        local_target = FsTarget(local, extra_opts=extra_opts)
        remote_target = FtpTarget(path=abs_remote,
                                  host=url.netloc,
                                  username=ftp['user'],
                                  password=ftp['password'],
                                  extra_opts=extra_opts)
        opts = {
            'force': False,
            # TODO
            'delete_unmatched': False,
            'verbose': 3,
            'execute': True,
            'dry_run': dry_run
        }
        s = UploadSynchronizer(local_target, remote_target, opts)
        try:
            s.run()
        except KeyboardInterrupt:
            fab.warn('aborted by user')
        finally:
            s.local.close()
            s.remote.close()
        stats = s.get_stats()
        pprint(stats)
Beispiel #11
0
    def test_sync_conflicts(self):
        local = FsTarget(os.path.join(PYFTPSYNC_TEST_FOLDER, "local"))
        remote = FsTarget(os.path.join(PYFTPSYNC_TEST_FOLDER, "remote"))
        opts = {
            "dry_run": False,
            "verbose": self.verbose
        }  # , "resolve": "ask"}

        # Copy local -> remote

        s = BiDirSynchronizer(local, remote, opts)
        s.run()
        stats = s.get_stats()
        self.assertEqual(stats["files_written"], 6)
        self.assertEqual(stats["dirs_created"], 2)

        # Modify local and remote

        # conflict 1: local is newer
        dt = datetime.datetime.utcnow()
        touch_test_file("local/file1.txt", dt)
        dt = datetime.datetime.utcnow() - datetime.timedelta(seconds=10)
        touch_test_file("remote/file1.txt", dt=dt)
        #         path = os.path.join(PYFTPSYNC_TEST_FOLDER, "remote/file1.txt")
        #         stamp = time.time() - 10
        #         os.utime(path, (stamp, stamp))

        # conflict 2: remote is newer
        touch_test_file("remote/file2.txt")
        dt = datetime.datetime.utcnow() - datetime.timedelta(seconds=10)
        touch_test_file("local/file2.txt", dt=dt)

        s = BiDirSynchronizer(local, remote, opts)
        s.run()
        stats = s.get_stats()
        #         pprint(stats)
        self.assertEqual(stats["entries_seen"], 18)
        self.assertEqual(stats["entries_touched"], 0)
        self.assertEqual(stats["bytes_written"], 0)
        self.assertEqual(stats["conflict_files"], 2)
Beispiel #12
0
def synchronize(user, password):
    print "syncing..."
    try:
        local = FsTarget(DEPLOY_FOLDER)
        remote = FtpTarget(FTP_TARGET, FTP_HOST, user, password, tls=True)
        opts = {"resolve": "skip", "verbose": 1, "dry_run": False}
        s = BiDirSynchronizer(local, remote, opts)
        s.run()
        print "sync complete..."
    except Exception as e:
        print type(e)
        print e.args
        print e
Beispiel #13
0
    def _sync_test_folders(cls, synchronizer_class, options, remote=None):
        """Run synchronizer with fresh objects and custom options."""
        local = FsTarget(os.path.join(PYFTPSYNC_TEST_FOLDER, "local"))
        if remote is None:
            remote = cls._make_remote_target()
        opts = {"verbose": 1}
        if options:
            opts.update(options)

        s = synchronizer_class(local, remote, opts)
        s.run()
        s.close()
        return s.get_stats()
Beispiel #14
0
def download_prolog():

    localpath = path_config.local_ftp_path  # 本地保存的ftp目录
    os.makedirs(localpath, 0o777)  # 创建本地日志文件夹

    local = FsTarget(localpath)
    remote = FtpTarget(path_config.ftp_remotepath,
                       path_config.ftp_server,
                       username=path_config.ftp_username,
                       password=path_config.ftp_password)
    opts = {"resolve": "skip", "verbose": 1}

    try:
        s = DownloadSynchronizer(local, remote, opts)  # 下载ftp日志文件夹
        s.run()

    except SyntaxError:
        pass
Beispiel #15
0
    def test_sync_fs_ftp(self):
        local = FsTarget(os.path.join(PYFTPSYNC_TEST_FOLDER, "local"))
        remote = self.remote

        # Upload all of temp/local to remote

        opts = {"force": False, "delete": True, "verbose": 3}
        s = UploadSynchronizer(local, remote, opts)
        s.run()

        stats = s.get_stats()
        #         pprint(stats)

        self.assertEqual(stats["local_dirs"], 2)
        # currently files are not counted, when inside a *new* folder:
        self.assertEqual(stats["local_files"], 4)
        self.assertEqual(stats["remote_dirs"], 0)
        self.assertEqual(stats["remote_files"], 0)
        self.assertEqual(stats["files_written"], 6)
        self.assertEqual(stats["dirs_created"], 2)
        self.assertEqual(stats["bytes_written"], 16403)

        # Change one file and upload again

        touch_test_file("local/file1.txt")

        opts = {"force": False, "delete": True, "verbose": 3}
        s = UploadSynchronizer(local, remote, opts)
        s.run()
        stats = s.get_stats()
        #         pprint(stats)
        #         assert False

        self.assertEqual(stats["entries_seen"], 18)  # ???
        self.assertEqual(stats["entries_touched"], 1)
        self.assertEqual(stats["files_created"], 0)
        self.assertEqual(stats["files_deleted"], 0)
        self.assertEqual(stats["files_written"], 1)
        self.assertEqual(stats["dirs_created"], 0)
        self.assertEqual(stats["download_files_written"], 0)
        self.assertEqual(stats["upload_files_written"], 1)
        self.assertEqual(stats["conflict_files"], 0)
        self.assertEqual(stats["bytes_written"], 3)

        # Download all from remote to temp/remote

        local = FsTarget(os.path.join(PYFTPSYNC_TEST_FOLDER, "remote"))

        opts = {"force": False, "delete": True, "verbose": 3}
        s = DownloadSynchronizer(local, remote, opts)
        s.run()
        stats = s.get_stats()
        #        pprint(stats)

        self.assertEqual(stats["entries_seen"], 8)
        self.assertEqual(stats["entries_touched"], 8)
        #        self.assertEqual(stats["files_created"], 6)
        self.assertEqual(stats["files_deleted"], 0)
        self.assertEqual(stats["files_written"], 6)
        self.assertEqual(stats["dirs_created"], 2)
        self.assertEqual(stats["download_files_written"], 6)
        self.assertEqual(stats["upload_files_written"], 0)
        self.assertEqual(stats["conflict_files"], 0)
        self.assertEqual(stats["bytes_written"], 16403)

        # Original file times are preserved, even when retrieved from FTP

        self.assertNotEqual(get_test_file_date("local/file1.txt"),
                            STAMP_20140101_120000)
        self.assertEqual(
            get_test_file_date("local/file1.txt"),
            get_test_file_date("local//file1.txt"),
        )

        self.assertEqual(get_test_file_date("local/file2.txt"),
                         STAMP_20140101_120000)
        self.assertEqual(get_test_file_date("remote//file2.txt"),
                         STAMP_20140101_120000)

        # Synchronize temp/local <=> remote : nothing to do

        local = FsTarget(os.path.join(PYFTPSYNC_TEST_FOLDER, "local"))

        opts = {"verbose": 3}
        s = BiDirSynchronizer(local, remote, opts)
        s.run()
        stats = s.get_stats()
        pprint(stats)
        self.assertEqual(stats["entries_touched"], 0)
        self.assertEqual(stats["conflict_files"], 0)
        self.assertEqual(stats["bytes_written"], 0)

        # Synchronize temp/remote <=> remote : nothing to do

        local = FsTarget(os.path.join(PYFTPSYNC_TEST_FOLDER, "remote"))

        opts = {"verbose": 3}
        s = BiDirSynchronizer(local, remote, opts)
        s.run()
        stats = s.get_stats()
        pprint(stats)
        self.assertEqual(stats["entries_touched"], 0)
        self.assertEqual(stats["conflict_files"], 0)
        self.assertEqual(stats["bytes_written"], 0)
Beispiel #16
0
# ftpsync library shuld be installed

from ftpsync.targets import FsTarget
from ftpsync.ftp_target import FtpTarget
from ftpsync.syncronizers import UploadSynchronizer

local = FsTarget('C:\\foo')
user = '******'
passwd = 'pwd'
remote = FtpTarget("/foo", "svr.com", username=user, password=passwd)
opts = {"force": False, "delete_unmatched": True, "verbose": 3}
s = UploadSynchronizer(local, remote, opts)
s.run()
Beispiel #17
0
#!/usr/bin/env python3.6
from ftpsync.targets import FsTarget
from ftpsync.ftp_target import FtpTarget
from ftpsync.synchronizers import UploadSynchronizer

from ftpsetupfile import *

print('\n\nOpening an FTP connection for the upload...\n')

local = FsTarget(LOCAL_DIR)
remote = FtpTarget(REMOTE_DIR,
                   REMOTE_HOST,
                   username=FTP_USERNAME,
                   password=FTP_PASSWD)
opts = {"force": True, "delete_unmatched": True, "verbose": 2}

s = UploadSynchronizer(local, remote, opts)
s.run()

print('\n\nUpload complete!')
Beispiel #18
0
from ftpsync.targets import FsTarget
from ftpsync.ftp_target import FtpTarget
from ftpsync.synchronizers import UploadSynchronizer

local = FsTarget('C:\\temp')
user = '******'
passwd = 'pwd'
remote = FtpTarget("/foo", "ftp.svr.com", username=user, password=passwd)
opts = {"force": True, "delete_unmatched": True, "verbose": 3}
s = UploadSynchronizer(local, remote, opts)
s.run()