
    4(                        d Z ddlmZ ddlmZ ddlZddlZddlmZ ddlm	Z	 ddl
mZ ddlmZ dd	lmZ dd
lmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ ddlmZ dZdZeejA                  d      z   Z!dZ"dZ#de#z   e"z   Z$ ee!e$      Z% eee"      Z& eee#      Z'ejP                  jR                  Z)e)jT                  Z+d ejX                         z   dz   dz   dz   dz    ejX                         z   dz   dz   dz   Z- G d d e	      Z.y)!z+This module provides the command to gsutil.    )absolute_import)print_functionN)metrics)Command)CommandArgument)ApiSelector)CommandException)NO_URLS_MATCHED_TARGET)CreateHelpText)storage_v1_messages)NO_MAX)GcloudStorageMap)InsistOnOrOff)	shim_utilz2
  gsutil ubla set (on|off) gs://<bucket_name>...
z!
  gsutil ubla get bucket_url...

a~  
<B>SET</B>
  The ``ubla set`` command enables or disables uniform
  bucket-level access for Google Cloud Storage buckets.

<B>SET EXAMPLES</B>
  Configure your buckets to use uniform bucket-level access:

    gsutil ubla set on gs://redbucket gs://bluebucket

  Configure your buckets to NOT use uniform bucket-level access:

    gsutil ubla set off gs://redbucket gs://bluebucket
a  
<B>GET</B>
  The ``ubla get`` command shows whether uniform bucket-level access is enabled
  for the specified Cloud Storage bucket(s).

<B>GET EXAMPLES</B>
  Check if your buckets are using uniform bucket-level access:

    gsutil ubla get gs://redbucket gs://bluebucket
z
  The ``ubla`` command is used to retrieve or configure the
  `uniform bucket-level access
  <https://cloud.google.com/storage/docs/bucket-policy-only>`_ setting of
  Cloud Storage bucket(s). This command has two sub-commands, ``get`` and
  ``set``.
z--format=multi[terminator="z2"](name:format="value(format('Uniform bucket-levelz! access setting for gs://{}:'))",zD iamConfiguration.uniformBucketLevelAccess.enabled.yesno(no="False")z:format="value[terminator='z'](format('  Enabled: {}'))",zC iamConfiguration.uniformBucketLevelAccess.lockedTime.sub("T", " ")z,:format="value(format('  LockedTime: {}'))")c                      e Zd ZdZ ej
                  ddgededdddej                  gej                   e
j                  d      g e
dd	d
g       e
j                         gd      Z ej                  ddgddeeed      Z e edddedgi        e eg di        eg di       di       di       Zd Zd Zd Zd Zd Zy)UblaCommandz#Implements the gsutil ubla command.ublauniformbucketlevelaccess    F   modeonoff)choicesgetset)command_name_aliasesusage_synopsismin_argsmax_argssupported_sub_argsfile_url_okprovider_url_okurls_start_arggs_api_supportgs_default_apiargparse_argumentscommand_helpz%Configure Uniform bucket-level access)	help_namehelp_name_aliases	help_typehelp_one_line_summary	help_textsubcommand_help_textstoragebucketslistz--raw)gcloud_commandflag_map)r2   r3   updatez--uniform-bucket-level-access)r2   r3   r7   z --no-uniform-bucket-level-access)r   r   c                 f    |j                   j                  dk7  rt        d| j                  z        y )Ngsz7The %s command can only be used with gs:// bucket URLs.)storage_urlschemer	   command_name)selfblrs     &platform/gsutil/gslib/commands/ubla.py,_ValidateBucketListingRefAndReturnBucketNamez8UblaCommand._ValidateBucketListingRefAndReturnBucketName   s7    
%
C


  &    c                    | j                  |       |j                  }| j                  j                  |j                  dg|j
                        }|j                  }|j                  }t        |      j                  d      |j                  d}d}|j                  r|j                  |d<   d}|rt         d|z   j                  d
i |       y	y	)z:Gets the Uniform bucket-level access setting for a bucket.iamConfigurationfieldsprovider/)bucketenabledr   locked_timez  LockedTime: {locked_time}
zGUniform bucket-level access setting for {bucket}:
  Enabled: {enabled}
N )r@   r:   
gsutil_api	GetBucketbucket_namer;   rC   bucketPolicyOnlystrrstriprI   
lockedTimeprintformat)r=   r>   
bucket_urlbucket_metadata
iam_configuniform_bucket_level_accessrE   locked_time_lines           r?   _GetUblazUblaCommand._GetUbla   s    55c:Joo//
0F0F8J7K9C9J9J 0 LO !11J #-"="= j/((-.66F
 "--9DDf]8" A &(89:@&KCIK L #rA   c                    | j                  |       |j                  }t               }t               |_        |dk(  |j                  _        t        j                  |      }|dk(  rdnd}t        |dt        |      j                  d      d       | j                  j                  |j                  |dg|j                  	       y
)zDSets the Uniform bucket-level access setting for a bucket on or off.r   )rC   Enabling	Disablingz! Uniform bucket-level access for rG   z...rC   rD   r   )r@   r:   IamConfigurationValueuniformBucketLevelAccessValuerO   rI   apitools_messagesBucketrS   rP   rQ   rL   PatchBucketrN   r;   )r=   r>   setting_argrU   rW   rV   setting_verbs          r?   _SetUblazUblaCommand._SetUbla   s    55c:J&(J #@"AJ+6$+>J''..
KO!,!4:+L	Z//46 7 	OO
 6 6 /(:';)3):):   < rA   c                    | j                   j                  d      }|dvrt        d      d}g }d}|dk(  r| j                  }nI|dk(  rD| j                  }| j                   j                  d      }t        |d       |j                  |       d}| j                   }|s| j                          |D ]%  }| j                  |      }|D ]  }	d	} ||	g|   ' |st        t        t        |      z        y)
z/Handles ubla command on a Cloud Storage bucket.r   r   zubla only supports get|setNr   r   z-Only on and off values allowed for set optionFT)argspopr	   rZ   re   r   append$RaiseWrongNumberOfArgumentsExceptionGetBucketUrlIterFromArgr
   r4   )
r=   
subcommandsubcommand_funcsubcommand_argsrc   some_matchedurl_argsurl_strbucket_iterbucket_listing_refs
             r?   _UblazUblaCommand._Ubla   s    q!J'9::OOKUo	u	oIIMM!$kKCE[) LyyH
//1009k +
*=_= !,  3d8nDEErA   c                    | j                   j                  d      t        j                  k7  r:t	        dj                  t        j                  d| j                  z                    | j                  d   }| j                  d       |dk(  s|d	k(  rHt        j                  | j                  
       t        j                  |g       | j                          yt	        d|z        )z)Command entry point for the ubla command.r9   )rF   r   zBThe "%s" command can only be used with the Cloud Storage JSON API.r   T)
check_argsr   r   )sub_opts)subcommandsz-Invalid subcommand "%s", use get|set instead.N)rL   GetApiSelectorr   JSONr	   jointextwrapwrapr<   rg   ParseSubOptsr   LogCommandParamsrw   rt   )r=   action_subcommands     r?   
RunCommandzUblaCommand.RunCommand
  s    %%t%48H8HHTYY
--R!!"#$ % %
 		!&E!%6%%?6,=+>?
jjlL./ 0 0rA   N)__name__
__module____qualname____doc__r   CreateCommandSpec	_SYNOPSISr   r   rz   r   MakeNCloudURLsArgument%MakeZeroOrMoreCloudBucketURLsArgumentcommand_specHelpSpec_DETAILED_HELP_TEXT_get_help_text_set_help_text	help_specr   _GCLOUD_FORMAT_STRINGgcloud_storage_mapr@   rZ   re   rt   r   rK   rA   r?   r   r   c   sF   +***67!&&' %%8/88;=ftUm<CoCCE	,( g34C#
) ( F4I"   +.  (* +.  (*", /#H K&PL6."H0rA   r   )/r   
__future__r   r   getoptr|   gslibr   gslib.commandr   gslib.command_argumentr   gslib.cs_api_mapr   gslib.exceptionr	   r
   gslib.help_providerr   "gslib.third_party.storage_apitoolsr   r`   gslib.utils.constantsr   gslib.utils.shim_utilr   gslib.utils.text_utilr   gslib.utilsr   _SET_SYNOPSIS_GET_SYNOPSISlstripr   _SET_DESCRIPTION_GET_DESCRIPTION_DESCRIPTIONr   r   r   ra   r^   BucketPolicyOnlyValuer_   get_format_flag_newliner   r   rK   rA   r?   <module>r      sY   2 & %    ! 2 ( , 2 . W ( 2 / ! M0066	 	   ** %Y= /?@/?@ *00FF  5 K K  ')J)J)J)LL9:() KK #	# &GY%F%F%H	I
 '' JJ 55 x0' x0rA   