Пример #1
0
    def test_specific_target(self, INotifyRecursive, SyncWorker):
        INotifyRecursive.return_value = FakeINotify(
            events={
                Event(wd=1, mask=flags.CREATE, cookie=None, name="hello.txt"),
                Event(wd=2, mask=flags.CREATE, cookie=None, name="bar.txt"),
            },
            wd_map={
                1: "/home/jon/code/",
                2: "/home/jon/code/hoot"
            },
        )

        args = argparse.Namespace(targets=["foo"],
                                  conflicts="ignore",
                                  read_delay=0)
        config = {
            "targets": {
                "foo": {
                    "local_folder": "/home/jon/code",
                    "s3_uri": "s3://bucket/code",
                    "aws_secret_access_key": "23232323",
                    "aws_access_key_id": "########",
                    "region_name": "eu-west-2",
                },
                "bar": {},
            }
        }
        command = DaemonCommand(args, config, create_logger())
        command.run(terminator=self.single_term)

        assert SyncWorker.call_count == 2
        assert INotifyRecursive.call_count == 1
Пример #2
0
    def test_specific_target(self, INotifyRecursive, SyncWorker):
        INotifyRecursive.return_value = FakeINotify(events={
            Event(wd=1, mask=flags.CREATE, cookie=None, name="hello.txt"),
            Event(wd=2, mask=flags.CREATE, cookie=None, name="bar.txt"),
        },
                                                    wd_map={
                                                        1: '/home/jon/code/',
                                                        2:
                                                        '/home/jon/code/hoot',
                                                    })

        args = argparse.Namespace(targets=['foo'],
                                  conflicts='ignore',
                                  read_delay=0)
        config = {
            'targets': {
                'foo': {
                    'local_folder': '/home/jon/code',
                    's3_uri': 's3://bucket/code',
                    'aws_secret_access_key': '23232323',
                    'aws_access_key_id': '########',
                    'region_name': 'eu-west-2',
                },
                'bar': {},
            }
        }
        command = DaemonCommand(args, config, create_logger())
        command.run(terminator=self.single_term)

        assert SyncWorker.call_count == 2
        assert INotifyRecursive.call_count == 1
Пример #3
0
    def test_no_targets(self, INotifyRecursive, SyncWorker, capsys):
        args = argparse.Namespace(targets=None,
                                  conflicts="ignore",
                                  read_delay=0)

        command = DaemonCommand(args, {"targets": {}}, create_logger())
        command.run(terminator=self.single_term)

        out, err = capsys.readouterr()
        assert out == ""
        assert err == ("No targets available\n" 'Use "add" command first\n')
        assert SyncWorker.call_count == 0
        assert INotifyRecursive.call_count == 0
Пример #4
0
    def test_wrong_target(self, INotifyRecursive, SyncWorker, capsys):
        args = argparse.Namespace(targets=["foo"],
                                  conflicts="ignore",
                                  read_delay=0)

        command = DaemonCommand(args, {"targets": {
            "bar": {}
        }}, create_logger())
        command.run(terminator=self.single_term)

        out, err = capsys.readouterr()
        assert out == ""
        assert err == ("Unknown target: foo\n")
        assert SyncWorker.call_count == 0
        assert INotifyRecursive.call_count == 0
Пример #5
0
    def test_os_not_supported(self, INotifyRecursive, SyncWorker, capsys):
        args = argparse.Namespace(targets=None,
                                  conflicts="ignore",
                                  read_delay=0)

        command = DaemonCommand(args, {}, create_logger())
        command.run(terminator=self.single_term)

        out, err = capsys.readouterr()
        assert out == ""
        assert err == (
            "Cannot run INotify on your operating system\n"
            "Only Linux machines are officially supported for this command\n")
        assert SyncWorker.call_count == 0
        assert INotifyRecursive.call_count == 0
Пример #6
0
    def test_wrong_target(self, INotifyRecursive, SyncWorker, capsys):
        args = argparse.Namespace(targets=['foo'],
                                  conflicts='ignore',
                                  read_delay=0)

        command = DaemonCommand(
            args,
            {'targets': {
                'bar': {}
            }},
            create_logger(),
        )
        command.run(terminator=self.single_term)

        out, err = capsys.readouterr()
        assert out == ''
        assert err == ('Unknown target: foo\n')
        assert SyncWorker.call_count == 0
        assert INotifyRecursive.call_count == 0
Пример #7
0
def main(arguments):
    parser = argparse.ArgumentParser(
        prog='s4',
        formatter_class=argparse.RawDescriptionHelpFormatter,
        description=('Fast and cheap synchronisation of files with Amazon S3\n'
                     '\n'
                     'Version: {}\n'
                     '\n'
                     'To start off, add a Target with the "add" command\n'
                     ).format(VERSION),
    )
    parser.add_argument(
        '--log-level',
        default='INFO',
        choices=['DEBUG', 'INFO', 'WARNING', 'ERROR'],
    )
    parser.add_argument(
        '--no-colors',
        action='store_true',
        help='Display without colors',
    )
    parser.add_argument(
        '--timestamps',
        action='store_true',
        help='Display timestamps for each log message',
    )
    subparsers = parser.add_subparsers(dest='command')

    daemon_parser = subparsers.add_parser('daemon',
                                          help="Run S4 sync continiously")
    daemon_parser.add_argument('targets', nargs='*')
    daemon_parser.add_argument('--read-delay', default=1000, type=int)
    daemon_parser.add_argument('--conflicts',
                               default='ignore',
                               choices=['1', '2', 'ignore'])

    add_parser = subparsers.add_parser('add',
                                       help="Add a new Target to synchronise")
    add_parser.add_argument(
        '--copy-target-credentials',
        '-C',
        help=
        "Copy credentials from an existing target instead of typing them in again"
    )

    sync_parser = subparsers.add_parser('sync',
                                        help="Synchronise Targets with S3")
    sync_parser.add_argument('targets', nargs='*')
    sync_parser.add_argument('--conflicts',
                             default=None,
                             choices=['1', '2', 'ignore'])
    sync_parser.add_argument('--dry-run', action='store_true')

    edit_parser = subparsers.add_parser('edit', help="Edit Target details")
    edit_parser.add_argument('target')

    subparsers.add_parser('targets', help="Print available Targets")

    subparsers.add_parser('version', help="Print S4 Version")

    ls_parser = subparsers.add_parser(
        'ls', help="Display list of files for a Target")
    ls_parser.add_argument('target')
    ls_parser.add_argument('--sort-by',
                           '-s',
                           choices=['key', 'local', 's3'],
                           default='key')
    ls_parser.add_argument('--descending', '-d', action='store_true')
    ls_parser.add_argument(
        '--all',
        '-A',
        dest='show_all',
        action='store_true',
        help='show deleted files',
    )

    remove_parser = subparsers.add_parser('rm', help="Remove a Target")
    remove_parser.add_argument('target')

    args = parser.parse_args(arguments)

    if args.log_level == 'DEBUG':
        log_format = '%(levelname)s:%(module)s:%(lineno)s %(message)s'
    else:
        log_format = '%(message)s'

    if args.timestamps:
        log_format = '%(asctime)s: ' + log_format

    logging.basicConfig(format=log_format, level=args.log_level)

    # shut boto up
    logging.getLogger('boto3').setLevel(logging.CRITICAL)
    logging.getLogger('botocore').setLevel(logging.CRITICAL)
    logging.getLogger('nose').setLevel(logging.CRITICAL)
    logging.getLogger('s3transfer').setLevel(logging.CRITICAL)
    logging.getLogger('filelock').setLevel(logging.CRITICAL)

    logger = logging.getLogger(__name__)
    logger.setLevel(args.log_level)

    config = utils.get_config()

    try:
        command = None
        if args.command == 'version':
            print(VERSION)
            return
        elif args.command == 'sync':
            command = SyncCommand(args, config, logger)
        elif args.command == 'targets':
            command = TargetsCommand(args, config, logger)
        elif args.command == 'add':
            command = AddCommand(args, config, logger)
        elif args.command == 'edit':
            command = EditCommand(args, config, logger)
        elif args.command == 'ls':
            command = LsCommand(args, config, logger)
        elif args.command == 'rm':
            command = RmCommand(args, config, logger)
        elif args.command == 'daemon':
            command = DaemonCommand(args, config, logger)

        if command:
            try:
                command.run()
            except Exception as e:
                logger.error('An unhandled error has occurred: %s', e)
                # Only display a scary stack trace to the user if in DEBUG mode
                if args.log_level == 'DEBUG':
                    raise e
        else:
            parser.print_help()
    except KeyboardInterrupt:
        pass
Пример #8
0
Файл: cli.py Проект: troylar/S4
def main(arguments):
    parser = argparse.ArgumentParser(
        prog="s4",
        formatter_class=argparse.RawDescriptionHelpFormatter,
        description=("Fast and cheap synchronisation of files with Amazon S3\n"
                     "\n"
                     "Version: {}\n"
                     "\n"
                     'To start off, add a Target with the "add" command\n'
                     ).format(VERSION),
    )
    parser.add_argument("--log-level",
                        default="INFO",
                        choices=["DEBUG", "INFO", "WARNING", "ERROR"])
    parser.add_argument("--no-colors",
                        action="store_true",
                        help="Display without colors")
    parser.add_argument(
        "--timestamps",
        action="store_true",
        help="Display timestamps for each log message",
    )
    subparsers = parser.add_subparsers(dest="command")

    daemon_parser = subparsers.add_parser("daemon",
                                          help="Run S4 sync continiously",
                                          aliases=["d"])
    daemon_parser.add_argument("targets", nargs="*")
    daemon_parser.add_argument("--read-delay", default=1000, type=int)
    daemon_parser.add_argument("--conflicts",
                               default="ignore",
                               choices=["1", "2", "ignore"])

    add_parser = subparsers.add_parser("add",
                                       help="Add a new Target to synchronise",
                                       aliases=["a"])
    add_parser.add_argument(
        "--copy-target-credentials",
        "-C",
        help=
        "Copy credentials from an existing target instead of typing them in again",
    )

    sync_parser = subparsers.add_parser("sync",
                                        help="Synchronise Targets with S3",
                                        aliases=["s"])
    sync_parser.add_argument("targets", nargs="*")
    sync_parser.add_argument("--conflicts",
                             default=None,
                             choices=["1", "2", "ignore"])
    sync_parser.add_argument("--dry-run", action="store_true")

    edit_parser = subparsers.add_parser("edit",
                                        help="Edit Target details",
                                        aliases=["e"])
    edit_parser.add_argument("target")

    subparsers.add_parser("targets",
                          help="Print available Targets",
                          aliases=["t"])

    subparsers.add_parser("version", help="Print S4 Version", aliases=["v"])

    ls_parser = subparsers.add_parser(
        "ls", help="Display list of files for a Target")
    ls_parser.add_argument("target")
    ls_parser.add_argument("--sort-by",
                           "-s",
                           choices=["key", "local", "s3"],
                           default="key")
    ls_parser.add_argument("--descending", "-d", action="store_true")
    ls_parser.add_argument("--all",
                           "-A",
                           dest="show_all",
                           action="store_true",
                           help="show deleted files")

    remove_parser = subparsers.add_parser("rm", help="Remove a Target")
    remove_parser.add_argument("target")

    args = parser.parse_args(arguments)

    if args.log_level == "DEBUG":
        log_format = "%(levelname)s:%(module)s:%(lineno)s %(message)s"
    else:
        log_format = "%(message)s"

    if args.timestamps:
        log_format = "%(asctime)s: " + log_format

    logging.basicConfig(format=log_format, level=args.log_level)

    # shut boto up
    logging.getLogger("boto3").setLevel(logging.CRITICAL)
    logging.getLogger("botocore").setLevel(logging.CRITICAL)
    logging.getLogger("nose").setLevel(logging.CRITICAL)
    logging.getLogger("s3transfer").setLevel(logging.CRITICAL)
    logging.getLogger("filelock").setLevel(logging.CRITICAL)

    logger = logging.getLogger(__name__)
    logger.setLevel(args.log_level)

    config = utils.get_config()

    try:
        command = None
        if args.command in ("version", "v"):
            print(VERSION)
            return
        elif args.command in ("sync", "s"):
            command = SyncCommand(args, config, logger)
        elif args.command in ("targets", "t"):
            command = TargetsCommand(args, config, logger)
        elif args.command in ("add", "a"):
            command = AddCommand(args, config, logger)
        elif args.command in ("edit", "e"):
            command = EditCommand(args, config, logger)
        elif args.command == "ls":
            command = LsCommand(args, config, logger)
        elif args.command == "rm":
            command = RmCommand(args, config, logger)
        elif args.command in ("daemon", "d"):
            command = DaemonCommand(args, config, logger)

        if command:
            try:
                command.run()
            except Exception as e:
                logger.error("An unhandled error has occurred: %s", e)
                # Only display a scary stack trace to the user if in DEBUG mode
                if args.log_level == "DEBUG":
                    raise e
        else:
            parser.print_help()
    except KeyboardInterrupt:
        pass