
    Vh9                        d dl mZmZmZ e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	Zd
Zd
ZdZdZ e edeedgfdg       ededgf       eddedgfdg       edeedgf       edg d       edddg       edddg       ed eed!gf       ed d
"       ed eed#gfd$g       ed d
"      %      Z eeD  cg c]  } | d&k7  r| d'| z  g c}       Zg Zd(d)ggZd*Zg d+Zd, Z d>d-Z!d. Z"d>d/Z# G d0 d1e$      Z%d?d2Z&d3 Z'd4 Z( G d5 d6e$      Z)d@d7Z*d>d8Z+d9 Z,d: Z-d>d;Z.d< Z/d= Z0yc c} w )A    )absolute_importdivisionprint_functionN)	timedelta)env_fallback)is_sequence)string_types)urlparse)to_textzunix:///var/run/docker.sockF	localhost<   strDOCKER_HOST
docker_url)typedefaultfallbackaliasesDOCKER_TLS_HOSTNAME)r   r   autoDOCKER_API_VERSIONdocker_api_versionintDOCKER_TIMEOUT)r   r   r   path)ca_certtls_ca_certcacert_path)r   r   tls_client_cert	cert_pathtls_client_keykey_pathbool
DOCKER_TLS)r   r   DOCKER_TLS_VERIFY
tls_verify)docker_hosttls_hostnameapi_versiontimeoutca_pathclient_cert
client_keytlsuse_ssh_clientvalidate_certsdebugr1   zansible_docker_%sr,   r-   zhttps://index.docker.io/v1/)BKBMBGBTBPBc                 2    t        j                  d|       ryy)zACheck whether the given image name is in fact an image ID (hash).z^sha256:[0-9a-fA-F]{64}$TF)rematch)names    n/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/docker/plugins/module_utils/util.pyis_image_name_idr=   8   s    	xx*D1    c                 H    | s|S t        t        j                  d|             S )z:Check whether the given string is a valid docker tag name.z#^[a-zA-Z0-9_][a-zA-Z0-9_.-]{0,127}$)r#   r9   r:   )tagallow_emptys     r<   is_valid_tagrB   ?   s$     >DEEr>   c                     t        | t              r t        d | j                         D              S t        | t        t        f      r| D cg c]  }t        |       c}S | S c c}w )a  Sanitize data object for return to Ansible.

    When the data object contains types such as docker.types.containers.HostConfig,
    Ansible will fail when these are returned via exit_json or fail_json.
    HostConfig is derived from dict, but its constructor requires additional
    arguments. This function sanitizes data structures by recursively converting
    everything derived from dict to dict and everything derived from list (and tuple)
    to a list.
    c              3   <   K   | ]  \  }}|t        |      f  y wN)sanitize_result.0kvs      r<   	<genexpr>z"sanitize_result.<locals>.<genexpr>S   s     E1Q*+Es   )
isinstancedictitemslisttuplerF   )datarJ   s     r<   rF   rF   H   sS     $E

EEE	D4-	(,01q"11 2s   A"c           	          t        dd      5 }|r:|j                  t        j                  | ddd             |j                  d       n|j                  | dz          ddd       y# 1 sw Y   yxY w)	zrWrite a log message to docker.log.

    If ``pretty_print=True``, the message will be pretty-printed as JSON.
    z
docker.logaT   ),z: )	sort_keysindent
separators
N)openwritejsondumps)msgpretty_printlog_files      r<   	log_debugra   Z   s`    
 
lC	  (HNN4::cT!P[\]NN5!NN3;'( ( (s   AA''A0c                       e Zd Zd ZddZy)DockerBaseClassc                     d| _         y )NF)r1   selfs    r<   __init__zDockerBaseClass.__init__h   s	    
r>   c                      y rE    )rf   r^   r_   s      r<   logzDockerBaseClass.logk   s    r>   NF)__name__
__module____qualname__rg   rj   ri   r>   r<   rc   rc   g   s    r>   rc   c                 p    | d   1t        | d         }|j                  j                  dd      d   | d<   y y )Nr(   r'   :   r   )r
   netlocrsplit)resultold_behaviordeprecate_functionuses_tls
parsed_urls        r<   update_tls_hostnamery   q   sC    n%f]34
!+!2!2!9!9#q!A!!D~ &r>   c                 T    | j                         D ]  \  }}||vr y||   |k7  s y y)zY
    Compare two dictionaries for whether every entry of the first is in the second.
    FT)rN   )avbvkeyvalues       r<   compare_dict_allow_more_presentr   x   s;     hhj 
Ub=c7e	
 r>   c                 v   |dk(  ry| |-| |k(  ry|dk(  ry|dk(  r| yt        | 	|      dk(  S |       dk(  S |dk(  r| |k(  S |dk(  r[|d	k(  r| |k(  S d}| D ]I  }|t        |      k  r$||   |k7  r|d
z  }|t        |      k  r	||   |k7  r|t        |      k(  r y|d
z  }K y|dk(  r|d	k(  r| |k(  S t        | |      S |dk(  r%t        |       }t        |      }|d	k(  r||k(  S ||k\  S |dk(  rN| D ]  }d}	|D ]  }
t        ||
      sd}	 n |	r y |d	k(  r$|D ]  }
d}	| D ]  }t        ||
      sd}	 n |	r y yy)a  
    Compare values a and b as described by method and datatype.

    Returns ``True`` if the values compare equal, and ``False`` if not.

    ``a`` is usually the module's parameter, while ``b`` is a property
    of the current object. ``a`` must not be ``None`` (except for
    ``datatype == 'value'``).

    Valid values for ``method`` are:
    - ``ignore`` (always compare as equal);
    - ``strict`` (only compare if really equal)
    - ``allow_more_present`` (allow b to have elements which a does not have).

    Valid values for ``datatype`` are:
    - ``value``: for simple values (strings, numbers, ...);
    - ``list``: for ``list``s or ``tuple``s where order matters;
    - ``set``: for ``list``s, ``tuple``s or ``set``s where order does not
      matter;
    - ``set(dict)``: for ``list``s, ``tuple``s or ``sets`` where order does
      not matter and which contain ``dict``s; ``allow_more_present`` is used
      for the ``dict``s, and these are assumed to be dictionaries of values;
    - ``dict``: for dictionaries of values.
    ignoreTNr~   Fallow_more_presentr   rO   strictrq   rM   setz	set(dict))lenr   r   )rS   bmethoddatatypeirJ   set_aset_br{   foundr|   s              r<   compare_genericr      s   2 yAI6 w))ai	1)Q..q)Q..7Av	V	X6MA #a&jQqTQYFA #a&jQqTQYA; Q 	V	X6M21a88	U	AAXE>!E>!	[	  	BE 22r: E 	 X
  ! B6r2> $  ! - 
!r>   c                   H    e Zd Zd Zd
dZd Zed        Zd Zd Z	d Z
d	 Zy)DifferenceTrackerc                     g | _         y rE   _diffre   s    r<   rg   zDifferenceTracker.__init__   s	    
r>   Nc                 R    | j                   j                  t        |||             y )N)r;   	parameteractive)r   appendrM   )rf   r;   r   r   s       r<   addzDifferenceTracker.add   s$    

$
 	r>   c                 N    | j                   j                  |j                          y rE   )r   extend)rf   other_trackers     r<   mergezDifferenceTracker.merge   s    

---.r>   c                 2    t        | j                        dk(  S )Nr   )r   r   re   s    r<   emptyzDifferenceTracker.empty   s    4::!##r>   c                     t               }t               }| j                  D ]  }|d   ||d   <   |d   ||d   <    ||fS )z8
        Return texts ``before`` and ``after``.
        r   r;   r   )rM   r   )rf   beforeafteritems       r<   get_before_afterz"DifferenceTracker.get_before_after   sV     JJ 	4D#'>F4< "&{"3E$v,	4 u}r>   c                 @    t        fd| j                  D              S )zC
        Returns a boolean if a difference exists for name
        c              3   4   K   | ]  }|d    k(  s|  yw)r;   Nri   )rH   diffr;   s     r<   rK   z7DifferenceTracker.has_difference_for.<locals>.<genexpr>  s     GD$v,$2F4Gs   )anyr   )rf   r;   s    `r<   has_difference_forz$DifferenceTracker.has_difference_for   s     GDJJGGGr>   c                     g }| j                   D ]6  }t               }t        |d   |d         ||d   <   |j                  |       8 |S )K
        Return differences in the docker_container legacy format.
        r   r   )r   	containerr;   )r   rM   r   )rf   rt   entryr   s       r<   !get_legacy_docker_container_diffsz3DifferenceTracker.get_legacy_docker_container_diffs  sZ     ZZ 	 E6D"&,/#Dv MM$	  r>   c                 H    | j                   D cg c]  }|d   	 }}|S c c}w )r   r;   r   )rf   r   rt   s      r<   get_legacy_docker_diffsz)DifferenceTracker.get_legacy_docker_diffs  s)     .2ZZ8E%-88 9s   NN)rl   rm   rn   rg   r   r   propertyr   r   r   r   r   ri   r>   r<   r   r      s:    / $ $	Hr>   r   c                 *   fd}| y t        | j                               D ]l  \  }}t        |t              s |dj	                  ||             t        |t
        t        f      r |dj	                  |||             t        |      | |<   n y )Nc                 h    j                  |        j                  |        t        |       )N)r^   )fail	fail_json
ValueError)r^   clientmodules    r<   r   zsanitize_labels.<locals>.fail  s6    KK%or>   z+The key {key!r} of {field} is not a string!)fieldr}   zqThe value {value!r} for {key!r} of {field} is not a string or something than can be safely converted to a string!)r   r}   r~   )rO   rN   rL   r	   formatr#   floatr   )labelslabels_fieldr   r   r   rI   rJ   s     ``   r<   sanitize_labelsr     s     ~V\\^$ 	1!\*=DD&A E /0 a$' D  K  K&AQ K 89 AJq		r>   c                     d }t               }| O| j                         D ]<  \  }}|r!t        |      r|D cg c]
  } ||       c}n ||      |t        |      <   > |S c c}w )a  
    Go does not like Python booleans 'True' or 'False', while Ansible is just
    fine with them in YAML. As such, they need to be converted in cases where
    we pass dictionaries to the Docker API (e.g. docker_network's
    driver_options and docker_prune's filters). When `allow_sequences=True`
    YAML sequences (lists, tuples) are converted to [str] instead of str([...])
    which is the expected format of filters which accept lists such as labels.
    c                 ,    | du ry| du ryt        |       S )NTtrueFfalse)r   )r~   s    r<   sanitizez4clean_dict_booleans_for_docker_api.<locals>.sanitize9  s     D=e^u:r>   )rM   rN   r   r   )rQ   allow_sequencesr   rt   rI   rJ   es          r<   "clean_dict_booleans_for_docker_apir   0  si     VFJJL 	mDAq9H[YZ^15ahqk5aijkalF3q6N	mM 6s   A!c                    t        | t              st        d| z        t        j                  d      }|j                  |       }|st        d| z        |j                         }i }|j                         D ]  \  }}|s	t        |      ||<    t        di |}|j                  |j                  |j                  dz  dz  z   dz  z   dz  }|S )	z-
    Return time duration in nanosecond.
    zMissing unit in duration - %szw^(((?P<hours>\d+)h)?((?P<minutes>\d+)m(?!s))?((?P<seconds>\d+)s)?((?P<milliseconds>\d+)ms)?((?P<microseconds>\d+)us)?)$zInvalid time duration - %s   i  i@B i  ri   )rL   r   r   r9   compiler:   	groupdictrN   r   r   microsecondssecondsdays)time_strregexpartstime_paramsr;   r~   deltatime_in_nanosecondss           r<   convert_duration_to_nanosecondr   H  s     h$88CDDJJ	(E KK!E5@AAOOEK +u #E
K+ $$Eemmejj2o.DDOO r>   c                     t        | t        t        f      r| D cg c]  }t        |       c}S dt        |       gS c c}w )Nz	CMD-SHELL)rL   rP   rO   r   )testr   s     r<   normalize_healthcheck_testr   i  s9    $& $%1A%%T## &s   =c                 <   t               }d}d}|D ]a  }|| v s| |   }|||v rt        |      }|s| j                  d      r|dk(  s8|dk(  r	 t        |      }|dk(  r|r|rt        |      }|||<   c |S # t        $ r t	        dj                  |            w xY w)z6
    Return dictionary of healthcheck parameters.
    )r   test_cli_compatibleintervalr*   start_periodstart_intervalretries)r   r*   r   r   r   r   r   zOCannot parse number of retries for healthcheck. Expected an integer, got "{0}".)rM   r   getr   r   r   r   )healthchecknormalize_testrt   optionsduration_optionsr}   r~   s          r<   normalize_healthcheckr   o  s     VF rGP  +$E} &&6u=+//2G"HSTZ]iJE f}>259F3K+ . M " $::@&- s   A77$Bc                 `    | r| j                  d      syt        | d      }|d   dgk(  ry|dfS )z
    Return dictionary of healthcheck parameters and boolean if
    healthcheck defined in image was requested to be disabled.
    r   r   T)r   NONE)NTF)r   r   )r   rt   s     r<   parse_healthcheckr     s>    
 !8";tDFf~&! 5=r>   c                 B    t        d | j                         D              S )zP
    Return a copy of the dictionary with all keys with value None omitted.
    c              3   0   K   | ]  \  }}|	||f  y wrE   ri   rG   s      r<   rK   z&omit_none_from_dict.<locals>.<genexpr>  s     @6Aq!-A@s   
	)rM   rN   )ds    r<   omit_none_from_dictr     s     @QWWY@@@r>   rk   )FNTr   )1
__future__r   r   r   r   __metaclass__r\   r9   datetimer   ansible.module_utils.basicr   'ansible.module_utils.common.collectionsr   ansible.module_utils.sixr	   +ansible.module_utils.six.moves.urllib.parser
   +ansible.module_utils.common.text.convertersr   DEFAULT_DOCKER_HOSTDEFAULT_TLSDEFAULT_TLS_VERIFYDEFAULT_TLS_HOSTNAMEDEFAULT_TIMEOUT_SECONDSrM   DOCKER_COMMON_ARGSDOCKER_COMMON_ARGS_VARSDOCKER_MUTUALLY_EXCLUSIVEDOCKER_REQUIRED_TOGETHERDEFAULT_DOCKER_REGISTRYBYTE_SUFFIXESr=   rB   rF   ra   objectrc   ry   r   r   r   r   r   r   r   r   r   r   )option_names   0r<   <module>r      s   
 C B  	  3 ? 1 @ ? 4  "  %)<WdVeGfq}p~5L;P:Q+RS%<J^I_:`k  kA  Be%<WgVhGijf&OP&+<k*JK*:J)GH&+~8VWVU3V-?<ZmYnJo  {G  zH  I
FE
*  ) g %34      L!  8 3F$
(f E	Zz6 6r,0B$"J$A} s   E