
    =.                        S r SSKrSSKJr  SSKJr  SSKJr  SSKJ	r
  SSKJr  SSKJr  SS	KJr  SS
KJr  SSKJr  SSKJr  SSKJr  SSKJr  SSKrSrSrSrSrSrSr\R@                  \RB                  " \RD                  RF                  5       " S S\RH                  5      5       5       r%\RB                  " \RD                  RL                  5       " S S\%5      5       r' " S S\RP                  5      r$g)z8Scan a container image using the On-Demand Scanning API.    N)util)base)flags)ondemandscanning_util)binary_operations)	arg_utils)log)
properties)progress_tracker)local_state)update_manager)	platformszScanning container imagez@Locally extracting packages and versions from {} container imagez5Remotely initiating analysis of packages and versionsz*Waiting for analysis operation to completezExtraction failed: image extraction was either stopped or crashed (possibly due to a lack of available memory) with exit code {exit_code}z9Extraction failed: unknown error (exit code: {exit_code})c                   J    \ rS rSrSrSSS.r\S 5       rS rS r	S	 r
S
 rSrg)ScanBeta2   C  Perform a vulnerability scan on a container image.

You can scan a container image in a Google Cloud registry (Artifact Registry
or Container Registry), or a local container image.

Reference an image by tag or digest using any of the formats:

  Artifact Registry:
    LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY-ID/IMAGE[:tag]
    LOCATION-docker.pkg.dev/PROJECT-ID/REPOSITORY-ID/IMAGE@sha256:digest

  Container Registry:
    [LOCATION.]gcr.io/PROJECT-ID/REPOSITORY-ID/IMAGE[:tag]
    [LOCATION.]gcr.io/PROJECT-ID/REPOSITORY-ID/IMAGE@sha256:digest

  Local:
    IMAGE[:tag]
z{description}a	      Start a scan of a container image stored in Artifact Registry:

        $ {command} us-west1-docker.pkg.dev/my-project/my-repository/busy-box@sha256:abcxyz --remote

    Start a scan of a container image stored in the Container Registry, and perform the analysis in Europe:

        $ {command} eu.gcr.io/my-project/my-repository/my-image:latest --remote --location=europe

    Start a scan of a container image stored locally, and perform the analysis in Asia:

        $ {command} ubuntu:latest --location=asia
    )DESCRIPTIONEXAMPLESc                    [         R                  " 5       R                  U 5        [         R                  " 5       R                  U 5        [         R                  " 5       R                  U 5        [         R
                  " 5       R                  U 5        [         R                  " 5       R                  U 5        [         R                  " 5       R                  U 5        [         R                  " 5       R                  U 5        [         R                  " 5       R                  U 5        [        R                  R                  U 5        g )N)r   GetResourceURIArgAddToParserGetRemoteFlag%GetOnDemandScanningFakeExtractionFlagGetOnDemandScanningLocationFlagGetAdditionalPackageTypesFlagGetExperimentalPackageTypesFlagGetSkipPackageTypesFlagGetVerboseErrorsFlagr   
ASYNC_FLAG)parsers    +lib/surface/artifacts/docker/images/scan.pyArgsScanBeta.Args[   s    	))&1	%%f-	//1==fE	))+77?	'')55f=	))+77?	!!#//7	 ,,V4OO'    c                    [         R                  R                  5       (       a  [        R                  " S5      e [
        R                  R                  S/5        [        5       n[        R                  " [        R                  UR                   (       a  SOS5      SS9[        R                  " ["        SS9/nUR$                  (       d  U[        R                  " [&        SS9/-  nU R)                  5       n[        R*                  " [,        US	9 nUR/                  S5        U" UR0                  UR                   UR2                  UR4                  UR6                  UR8                  UR:                  S
9nUR<                  (       a  SnUR>                  (       aR  SRA                  UR>                  RC                  5        Vs/ s H  nURE                  S5      (       d  M  UPM     sn5      nU(       dK  UR<                  S:  a  [F        R                  UR<                  S9nO[H        R                  UR<                  S9nURK                  S[        RL                  " U5      5         SSS5        g/ n	[N        RP                  " URR                  5       Hk  n
URU                  U
S   U
S   U
S   S9nSU
;   a3  [V        RX                  " U
S   URT                  RZ                  5      Ul.        SU
;   a
  U
S   Ul/        X/-  n	Mm     URa                  S5        UR/                  S5        U Rc                  X5      nURa                  S5        SnUR$                  (       d^  UR/                  S5        URe                  SSR                  URf                  5      5        U Ri                  U5      nURa                  S5        SSS5        UR$                  (       a:  [j        Rl                  Ro                  SR                  WRf                  5      5        U$ W$ ! [
        R                   a    e [        R                   a     GNf = fs  snf ! , (       d  f       N= f)a  Runs local extraction then calls ODS with the results.

Args:
  args: an argparse namespace. All the arguments that were provided to this
    command invocation.

Returns:
  AnalyzePackages operation.

Raises:
  UnsupportedOS: when the command is run on a Windows machine.
z.On-Demand Scanning is not supported on Windowslocal-extractremotelocalextract)keyrpcpoll)stages)resource_urir'   fake_extractionadditional_package_typesexperimental_package_typesskip_package_typesverbose_errorsN
zExtraction failedr   )	exit_codepackageversioncpe_uri)r6   r7   cpeUripackage_typehash_digestz[{}]z Check operation [{}] for status.)8r   OperatingSystem	IsWindowsods_utilUnsupportedOSr   UpdateManagerEnsureInstalledAndRestartMissingRequiredComponentsErrorr   InvalidSDKRootErrorCommandr   StageEXTRACT_MESSAGEformatr'   RPC_MESSAGEasync_POLL_MESSAGEGetMessagesStagedProgressTrackerSCAN_MESSAGE
StartStageRESOURCE_URIr/   r0   r1   r2   r3   r5   stderrjoin
splitlines
startswith EXTRACTION_KILLED_ERROR_TEMPLATE!UNKNOWN_EXTRACTION_ERROR_TEMPLATE	FailStageExtractionFailedErrorjsonloadsstdoutPackageDatar   ChoiceToEnumPackageTypeValueValuesEnumpackageType
hashDigestCompleteStageAnalyzePackagesUpdateStagenameWaitForOperationr	   statusPrint)selfargscmdr-   messagestrackeroperation_resultextraction_errorlinepkgspkgpkg_dataopresponses                 r!   RunScanBeta.Rung   s      **,,""
:< <
 ""<<o=NO )C 	""t{{8H	 	{6	F ;;!''&ABBf!H		/	/V
%(/#((..#'#@#@%)%D%D!44,, 
	#	#  ""!YY/66AAC(Ct!45 C( 
  ''!+?FF*44  G  7  AGG*44  H  7)"889IJ	L?
% 
%D d,334#''	N	Ny> ( 

 S !*!7!7.!""=="?(
 C #M 2(

 5 I& +bE" h[[6"FFMM"''$:;((,f%{
%~ {{	jj9@@IJiOA 88  ** 
P(%
% 
%s>    P B/P;?P6
P6
#B P;,EP;(P32P36P;;
Q	c                     [         R                  " [        R                  R                  R
                  R                  SS9UR                  UR                  U5      $ NT)required)	api_utilAnalyzePackagesBetar
   VALUEScoreprojectGetlocationrO   rg   rh   ro   s      r!   ra   ScanBeta.AnalyzePackages   sK    ''&&**D*9	 r$   c                 .    [         R                  " S5      $ Nv1beta1ry   rK   rg   s    r!   rK   ScanBeta.GetMessages   s    	**r$   c                 0    [         R                  " US5      $ r   r>   rd   rg   rr   s     r!   rd   ScanBeta.WaitForOperation   s    $$R33r$    N)__name__
__module____qualname____firstlineno____doc__detailed_helpstaticmethodr"   rt   ra   rK   rd   __static_attributes__r   r$   r!   r   r   2   sB    * 	-& 	( 	(xt+4r$   r   c                   *    \ rS rSrSrS rS rS rSrg)ScanGA   r   c                     [         R                  " [        R                  R                  R
                  R                  SS9UR                  UR                  U5      $ rw   )	ry   AnalyzePackagesGAr
   r{   r|   r}   r~   r   rO   r   s      r!   ra   ScanGA.AnalyzePackages  sK    %%&&**D*9	 r$   c                 .    [         R                  " S5      $ Nv1r   r   s    r!   rK   ScanGA.GetMessages  s    %%r$   c                 0    [         R                  " US5      $ r   r   r   s     r!   rd   ScanGA.WaitForOperation  s    $$R..r$   r   N)	r   r   r   r   r   ra   rK   rd   r   r   r$   r!   r   r      s    &&/r$   r   c                   2   ^  \ rS rSrSrU 4S jrS rSrU =r$ )rD   i  z"Wrapper for call to the Go binary.c                 2   > [         [        U ]
  " SSS0UD6  g )Nbinaryr&   r   )superrD   __init__)rg   kwargs	__class__s     r!   r   Command.__init__  s    	'4!CCFCr$   c                 D   SU-   S[         R                  " U5      -   S[         R                  " U5      -   SSR                  / SQ5      -   /n	/ n
U(       a  X-  n
U(       a  X-  n
U
(       a7  U	R                  S[         R                  " SR                  U
5      5      -   5        U(       a7  U	R                  S[         R                  " SR                  U5      5      -   5        U(       a(  U	R                  S	[         R                  " U5      -   5        U	R                  S
5        U	$ )Nz--resource_uri=z	--remote=z--provide_fake_results=z
--undefok=,)r0   r2   r3   use_scalibrz--additional_package_types=z--skip_package_types=z--verbose_errors=z--use_scalibr)six	text_typerQ   append)rg   r.   r'   r/   r0   r1   r2   r3   r   rh   package_typess              r!   _ParseArgsForCommandCommand._ParseArgsForCommand  s     	L(cmmF++!CMM/$BB
 	
(( 
 	D" M/m!1m
kk/-- 789 : 
kk
!CMM#((;M2N$O
O 
kk%n(EEFKK Kr$   r   )	r   r   r   r   r   r   r   r   __classcell__)r   s   @r!   rD   rD     s    *D0 0r$   rD   ))r   rX   'googlecloudsdk.api_lib.ondemandscanningr   ry   googlecloudsdk.callioper   $googlecloudsdk.command_lib.artifactsr   r   r>   &googlecloudsdk.command_lib.util.anthosr   $googlecloudsdk.command_lib.util.apisr   googlecloudsdk.corer	   r
   googlecloudsdk.core.consoler   googlecloudsdk.core.updaterr   r   googlecloudsdk.core.utilr   r   rM   rF   rH   rJ   rT   rU   DefaultUniverseOnlyReleaseTracksReleaseTrackBETArD   r   GAr   BinaryBackedOperationr   r$   r!   <module>r      s    ?  D ( 6 R D : # * 8 3 6 . 
 *%E; !
 @ " D%%**+x4t|| x4 , x4v D%%(()/X / */D655 6r$   