Ejemplo n.º 1
0
    def _ChAcl(self):
        """Parses options and changes ACLs on the specified buckets/objects."""
        self.parse_versions = True
        self.changes = []
        self.continue_on_error = False

        if self.sub_opts:
            for o, a in self.sub_opts:
                if o == '-f':
                    self.continue_on_error = True
                elif o == '-g':
                    if 'gserviceaccount.com' in a:
                        raise CommandException(
                            'Service accounts are considered users, not groups; please use '
                            '"gsutil acl ch -u" instead of "gsutil acl ch -g"')
                    self.changes.append(
                        acl_helper.AclChange(
                            a, scope_type=acl_helper.ChangeType.GROUP))
                elif o == '-p':
                    self.changes.append(
                        acl_helper.AclChange(
                            a, scope_type=acl_helper.ChangeType.PROJECT))
                elif o == '-u':
                    self.changes.append(
                        acl_helper.AclChange(
                            a, scope_type=acl_helper.ChangeType.USER))
                elif o == '-d':
                    self.changes.append(acl_helper.AclDel(a))
                elif o == '-r' or o == '-R':
                    self.recursion_requested = True
                else:
                    self.RaiseInvalidArgumentException()

        if not self.changes:
            raise CommandException('Please specify at least one access change '
                                   'with the -g, -u, or -d flags')

        if (not UrlsAreForSingleProvider(self.args)
                or StorageUrlFromString(self.args[0]).scheme != 'gs'):
            raise CommandException(
                'The "{0}" command can only be used with gs:// URLs'.format(
                    self.command_name))

        self.everything_set_okay = True
        self.ApplyAclFunc(
            _ApplyAclChangesWrapper,
            _ApplyExceptionHandler,
            self.args,
            object_fields=['acl', 'generation', 'metageneration'])
        if not self.everything_set_okay:
            raise CommandException('ACLs for some objects could not be set.')
Ejemplo n.º 2
0
    def _Enable(self):
        """Enables logging configuration for a bucket."""
        # Disallow multi-provider 'logging set on' calls, because the schemas
        # differ.
        if not UrlsAreForSingleProvider(self.args):
            raise CommandException(
                '"logging set on" command spanning providers not '
                'allowed.')
        target_bucket_url = None
        target_prefix = None
        for opt, opt_arg in self.sub_opts:
            if opt == '-b':
                target_bucket_url = StorageUrlFromString(opt_arg)
            if opt == '-o':
                target_prefix = opt_arg

        if not target_bucket_url:
            raise CommandException(
                '"logging set on" requires \'-b <log_bucket>\' '
                'option')
        if not target_bucket_url.IsBucket():
            raise CommandException('-b option must specify a bucket URL.')

        # Iterate over URLs, expanding wildcards and setting logging on each.
        some_matched = False
        for url_str in self.args:
            bucket_iter = self.GetBucketUrlIterFromArg(url_str,
                                                       bucket_fields=['id'])
            for blr in bucket_iter:
                url = blr.storage_url
                some_matched = True
                self.logger.info('Enabling logging on %s...', blr)
                logging = apitools_messages.Bucket.LoggingValue(
                    logBucket=target_bucket_url.bucket_name,
                    logObjectPrefix=target_prefix or url.bucket_name)

                bucket_metadata = apitools_messages.Bucket(logging=logging)
                self.gsutil_api.PatchBucket(url.bucket_name,
                                            bucket_metadata,
                                            provider=url.scheme,
                                            fields=['id'])
        if not some_matched:
            raise CommandException(NO_URLS_MATCHED_TARGET % list(self.args))
        return 0
Ejemplo n.º 3
0
    def _SetCors(self):
        """Sets CORS configuration on a Google Cloud Storage bucket."""
        cors_arg = self.args[0]
        url_args = self.args[1:]
        # Disallow multi-provider 'cors set' requests.
        if not UrlsAreForSingleProvider(url_args):
            raise CommandException(
                '"%s" command spanning providers not allowed.' %
                self.command_name)

        # Open, read and parse file containing JSON document.
        cors_file = open(cors_arg, 'r')
        cors_txt = cors_file.read()
        cors_file.close()

        self.api = self.gsutil_api.GetApiSelector(
            StorageUrlFromString(url_args[0]).scheme)

        # Iterate over URLs, expanding wildcards and setting the CORS on each.
        some_matched = False
        for url_str in url_args:
            bucket_iter = self.GetBucketUrlIterFromArg(url_str,
                                                       bucket_fields=['id'])
            for blr in bucket_iter:
                url = blr.storage_url
                some_matched = True
                self.logger.info('Setting CORS on %s...', blr)
                if url.scheme == 's3':
                    self.gsutil_api.XmlPassThroughSetCors(cors_txt,
                                                          url,
                                                          provider=url.scheme)
                else:
                    cors = CorsTranslation.JsonCorsToMessageEntries(cors_txt)
                    if not cors:
                        cors = REMOVE_CORS_CONFIG
                    bucket_metadata = apitools_messages.Bucket(cors=cors)
                    self.gsutil_api.PatchBucket(url.bucket_name,
                                                bucket_metadata,
                                                provider=url.scheme,
                                                fields=['id'])
        if not some_matched:
            raise CommandException(NO_URLS_MATCHED_TARGET % list(url_args))
        return 0
Ejemplo n.º 4
0
    def _ChDefAcl(self):
        """Parses options and changes default object ACLs on specified buckets."""
        self.parse_versions = True
        self.changes = []

        if self.sub_opts:
            for o, a in self.sub_opts:
                if o == '-g':
                    self.changes.append(
                        acl_helper.AclChange(
                            a, scope_type=acl_helper.ChangeType.GROUP))
                if o == '-u':
                    self.changes.append(
                        acl_helper.AclChange(
                            a, scope_type=acl_helper.ChangeType.USER))
                if o == '-p':
                    self.changes.append(
                        acl_helper.AclChange(
                            a, scope_type=acl_helper.ChangeType.PROJECT))
                if o == '-d':
                    self.changes.append(acl_helper.AclDel(a))

        if not self.changes:
            raise CommandException('Please specify at least one access change '
                                   'with the -g, -u, or -d flags')

        if (not UrlsAreForSingleProvider(self.args)
                or StorageUrlFromString(self.args[0]).scheme != 'gs'):
            raise CommandException(
                'The "{0}" command can only be used with gs:// URLs'.format(
                    self.command_name))

        bucket_urls = set()
        for url_arg in self.args:
            for result in self.WildcardIterator(url_arg):
                if not result.storage_url.IsBucket():
                    raise CommandException(
                        'The defacl ch command can only be applied to buckets.'
                    )
                bucket_urls.add(result.storage_url)

        for storage_url in bucket_urls:
            self.ApplyAclChanges(storage_url)
Ejemplo n.º 5
0
    def _SetLifecycleConfig(self):
        """Sets lifecycle configuration for a Google Cloud Storage bucket."""
        lifecycle_arg = self.args[0]
        url_args = self.args[1:]
        # Disallow multi-provider 'lifecycle set' requests.
        if not UrlsAreForSingleProvider(url_args):
            raise CommandException(
                '"%s" command spanning providers not allowed.' %
                self.command_name)

        # Open, read and parse file containing JSON document.
        lifecycle_file = open(lifecycle_arg, 'r')
        lifecycle_txt = lifecycle_file.read()
        lifecycle_file.close()

        # Iterate over URLs, expanding wildcards and setting the lifecycle on each.
        some_matched = False
        for url_str in url_args:
            bucket_iter = self.GetBucketUrlIterFromArg(
                url_str, bucket_fields=['lifecycle'])
            for blr in bucket_iter:
                url = blr.storage_url
                some_matched = True
                self.logger.info('Setting lifecycle configuration on %s...',
                                 blr)
                if url.scheme == 's3':
                    self.gsutil_api.XmlPassThroughSetLifecycle(
                        lifecycle_txt, url, provider=url.scheme)
                else:
                    lifecycle = LifecycleTranslation.JsonLifecycleToMessage(
                        lifecycle_txt)
                    bucket_metadata = apitools_messages.Bucket(
                        lifecycle=lifecycle)
                    self.gsutil_api.PatchBucket(url.bucket_name,
                                                bucket_metadata,
                                                provider=url.scheme,
                                                fields=['id'])
        if not some_matched:
            raise CommandException(NO_URLS_MATCHED_TARGET % list(url_args))
        return 0