
    Lf5                     :   d dl Z d dlZd dlZd dl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mZ d Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd$dZ d Z!d%dZ"d Z#d Z$d Z%d Z&d Z'd  Z(d! Z)d&d"Z*d# Z+y)'    N)datetimeVersion   )errors)tls)DEFAULT_HTTP_HOST)DEFAULT_UNIX_SOCKET)DEFAULT_NPIPE)
BYTE_UNITS)
splitnporturlparsec                  ,    t        j                  d      )Nz[utils.create_ipam_pool has been removed. Please use a docker.types.IPAMPool object instead.r   DeprecatedMethodargskwargss     4/usr/lib/python3/dist-packages/docker/utils/utils.pycreate_ipam_poolr      s    

!
!	0     c                  ,    t        j                  d      )Nz_utils.create_ipam_config has been removed. Please use a docker.types.IPAMConfig object instead.r   r   s     r   create_ipam_configr          

!
!	2 r   c                 x    t        j                  |       }|j                  d      }t        j                  |      S )Nutf-8)base64	b64decodedecodejsonloads)headerdatas     r   decode_json_headerr$   "   s/    F#D;;wD::dr   c                 H    t        |       }t        |      }||k(  ry||kD  ryy)zCompare docker versions

    >>> v1 = '1.9'
    >>> v2 = '1.10'
    >>> compare_version(v1, v2)
    1
    >>> compare_version(v2, v1)
    -1
    >>> compare_version(v2, v2)
    0
    r      r   )v1v2s1s2s       r   compare_versionr,   (   s-     
B	B	Rx	br   c                      t        | |      dkD  S )Nr   )r,   r(   r)   s     r   
version_ltr/   >   s    2r"Q&&r   c                     t        | |       S N)r/   r.   s     r   version_gter2   B   s    "b!!!r   c                 d   ddd}t        | t              rDt        |       dk(  r| d   |d<   | d   |d<   n^t        | d   t              r	| d   |d<   nB| d   |d<   n9t        | t              r$d| v r| d   |d<   d| v r| d   |d<   nt        |       | |d<   |d   d|d<   |S t        |d         |d<   |S )N )HostIpHostPortr   r'   r6   r   r5   )
isinstancetuplelenstrdict
ValueError)bindingresults     r   _convert_port_bindingr?   F   s    +F'5!w<1!(F:&qzF8
C(&qzF8!(F:	GT	" !(!4F:7"#*8#4x W%%$zj!z M !
!34zMr   c                     i }t        | j                               D ]U  \  }}t        |      }d|vr|dz  }t        |t              r|D cg c]  }t        |       c}||<   Gt        |      g||<   W |S c c}w )N/z/tcp)iteritemsr:   r7   listr?   )port_bindingsr>   kvkeyr=   s         r   convert_port_bindingsrI   b   s    F]((*+ 51!fc>6MCaIJKg09KF3K034F3K5 M Ls   
A6c                 :   t        | t              r| S g }| j                         D ]  \  }}t        |t              r|j	                  d      }t        |t
              rd|v r'd|v r#t        dj                  t        |                  |d   }t        |t              r|j	                  d      }d|v r
|d   rdnd}nd|v r|d   }nd}|j                  | d| d|        t        |t              r|j	                  d      }|j                  | d| d        |S )	Nr   romodez/Binding cannot contain both "ro" and "mode": {}bindrw:z:rw)
r7   rD   rC   bytesr   r;   r<   formatreprappend)bindsr>   rF   rG   rM   rL   s         r   convert_volume_bindsrU   o   s#   %F 1a!AaqyVq[ EVDG_ 
 V9D$&{{7+qy wtD1yMM#QtfAdV$ !U#HHW%MM#Qqc9> Mr   c                 x   t        | t              r| S t        | t              s-t        dj	                  t        |       j                              i }| D ]c  }t        |t              rd|v r|j                  dd      \  }}n2|}d}n-t        dj	                  t        |      j                              |||<   e |S )Nz=Expected tmpfs value to be either a list or a dict, found: {}rO   r'   r4   z5Expected item in tmpfs list to be a string, found: {})	r7   r;   rD   r<   rQ   type__name__r:   split)tmpfsr>   mountnameoptionss        r   convert_tmpfs_mountsr^      s    %eT"KVDK(()
 	

 F eS!e| %C 3g GU,,- 
 t Mr   c                     | s| S t        | t              st        d      g }| D ]'  }t        |t              rd|i}|j	                  |       ) |S )Nz"networks parameter must be a list.Target)r7   rD   	TypeErrorr:   rS   )networksr>   ns      r   convert_service_networksrd      sZ    h%<==F a1Aa Mr   c                     | j                  dd      }t        |      dk(  rt        |      S | j                  dd      }t        |      dk(  rd|d   vrt        |      S | d fS )N@r'   r   rO   rA   )rsplitr9   r8   )	repo_namepartss     r   parse_repository_tagrj      se    S!$E
5zQU|S!$E
5zQ3eAh.U|d?r   c                    d}d }d }| s|rt         S | r| j                         dk(  rt        S | j                         } t        |       }|j                  }|r,t        |D cg c]  }|t        j                  dz   v c}      rt        d| z   d      }d}|dk(  rt        j                  d      |dk(  s|d	k(  r|d	k(  }d}n|d
k(  rd}|dvrt        j                  d|        |dk(  r$|j                  st        j                  d|        t        |j                  |j                  |j                  |j                  g      rt        j                  d|        |j                  r)|dk(  r$t        j                  dj!                  |             |j                  }|dk(  r)|j"                  dj%                  |j"                  |f      }|dv rRt'        |j                        \  }}||dk  r+|dk7  r$t        j                  dj!                  |             d}|st(        }|dk(  rdj!                  |rdnd      }n|dk(  rd
}|dv r| d| j+                  d      S | d| d| | j+                  d      S c c}w )Nr4   zunix://+z//tcpfdzfd protocol is not implementedhttphttps	http+unixunix)rm   rr   npipesshzInvalid bind address protocol: zInvalid bind address format: rt   zBInvalid bind address format: no path allowed for this protocol: {}rA   )rm   rt   r   z1Invalid bind address format: port is required: {}   zhttp{}s)rq   rs   z://rO   )r   stripr
   r   schemeanystringascii_lettersr   DockerExceptionnetlocparamsqueryfragmentpasswordpathrQ   hostnamejoinr   r	   rstrip)	addris_win32r   r   porthost
parsed_urlprotoxs	            r   
parse_hostr      s   DDD H4::<9,""::<D$JECeL&"6"6"<<LMdTk51
}$$%EFF %7*w	+	33$$-dV4
 	
 ~j// $$+D62
 	
 :++Z-@-@  $$+D62
 	
 5E>$$&,
 	

 F?z22> 88Z00$78D  
 1 12
d<4!8~,, &,  D$D ~s3	&&&D6"))#..WCvQtfTF+22377O Ms   I5c                 r   g }| D ]  }t        |t              r|j                  |       %t        |t              s!t	        j
                  dt        |             |j                  d      }|sj|d   }t        |      dkD  r|d   }n|}t        |      dkD  r|d   }nd}|j                  |||d        |S )NzInvalid device type rO   r   r'   r   rwm)
PathOnHostPathInContainerCgroupPermissions)	r7   r;   rS   r:   r   r|   rW   rY   r9   )devicesdevice_listdevicedevice_mappingpath_on_hostpath_in_containerpermissionss          r   parse_devicesr   $  s    K fd#v&&#&((&tF|n5   c*)!,L>"Q&$21$5!$0!>"Q&,Q/#*#4%0  '0 r   c                 R   |st         j                  }|j                  d      }|j                  d      xs d }|j                  d      }|dk(  rd}n|d u}|xs |}i }|r||d<   |s|S |s=t         j                  j	                  t         j                  j                  d      d      }|s|d}t        j                  t         j                  j	                  |d	      t         j                  j	                  |d
      ft         j                  j	                  |d      || |      |d<   |S )NDOCKER_HOSTDOCKER_CERT_PATHDOCKER_TLS_VERIFYr4   Fbase_url~z.dockerzcert.pemzkey.pemzca.pem)client_certca_certverifyssl_versionassert_hostnamer   )osenvirongetr   r   
expanduserr   	TLSConfig)r   r   environmentr   	cert_path
tls_verify
enable_tlsr~   s           r   kwargs_from_envr   A  s   jj??=)D  23;tI !45JR
t+
(jJF!zGGLL!3!3C!8)D	/1  MMWW\\)Z8WW\\)Y79Y1'F5M Mr   c                 *   i }t        | j                               D ]\  \  }}t        |t              r|rdnd}t        |t              s|g}|D cg c]  }t        |t
              st        |      n|! c}||<   ^ t        j                  |      S c c}w )Ntruefalse)rB   rC   r7   boolrD   r:   r    dumps)filtersr>   rF   rG   items        r   convert_filtersr   n  s    FW]]_% 
1aA!T"A 
 (c2CI<
q	
 ::f	
s   $Bc                 p    | t        j                  d      z
  }|j                  |j                  dz  dz  z   S )z*Convert a UTC datetime to a Unix timestampr      i  )r   utcfromtimestampsecondsdays)dtdeltas     r   datetime_to_timestampr   |  s3    **1--E==5::?T111r   c                 X   t        | t        t        f      r| S t        |       dk(  ry| dd j	                         r(| d   j	                         r| d   dk(  s| d   dk(  r| d d } t
        }| d   j                         }|j                         r| }d}n| d d }||j                         v s|j                         r	 t        |      }t        |||   z        } | S t        j                  dj                  |             # t        $ r% t        j                  dj                  |            w xY w)Nr   r&   bBzAFailed converting the string value for memory ({}) to an integer.zyThe specified value for memory ({}) should specify the units. The postfix should be one of the `b` `k` `m` `g` characters)r7   intfloatr9   isalphar   lowerisdigitkeysr<   r   r|   rQ   )rv   unitssuffixdigits_partdigitss        r   parse_bytesr     s.   !c5]#
1v{BxaemmoR5C<1R5C<#2AErU[[]F ~~f!1	;'F v&' H $$ &)
 	
  	((%vk2 	s   9C; ;.D)c                     t        | t              rt        | j                               } t	        |       D cg c]  \  }}|r| d| n| c}}S c c}}w )NrO   )r7   r;   rB   rC   sorted)linksrF   rG   s      r   normalize_linksr     sI    %U[[]#/5e}=tq!!qc1#J"===s   Ac                 2   i }t        |       5 }|D ]m  }|d   dk(  r|j                         }|s|j                  dd      }t        |      dk(  r|\  }}|||<   Jt	        j
                  dj                  | |             	 ddd       |S # 1 sw Y   |S xY w)ze
    Reads a line-separated environment file.
    The format of each line should be "key=value".
    r   #=r'   r   z'Invalid line in environment file {}:
{}N)openrw   rY   r9   r   r|   rQ   )env_filer   fline
parse_linerF   rG   s          r   parse_env_filer     s    
 K	h )1 	)DAw#~::<DC+J:!#!1!"A,,>EE $() )	))& ')& s   A3BBc                 ,    t        j                  |       S r1   )shlexrY   )commands    r   split_commandr     s    ;;wr   c                 f    d }t        | j                               D cg c]  } || 	 c}S c c}w )Nc                 Z    || S t        |t              r|j                  d      }|  d| S )Nr   r   )r7   rP   r   )rH   values     r   
format_envz&format_environment.<locals>.format_env  s5    =JeU#LL)Eawr   )rB   rC   )r   r   vars      r   format_environmentr     s0      )-[->->-@(ABJBBBs   .c                    |r:t        t        | j                                     D cg c]  \  }}| d|  c}}S t        t        | j                                     D cg c]  \  }}| d|  c}}S c c}}w c c}}w )N rO   )r   rB   rC   )extra_hoststaskrF   rG   s       r   format_extra_hostsr     s    #)${/@/@/B*C#D
1aqc1#J
 	

  &d;+<+<+>&?@q!1#Qqc
 	
s   A7"A=c                 ,    t        j                  d      )Nz_utils.create_host_config has been removed. Please use a docker.types.HostConfig object instead.r   )selfr   r   s      r   create_host_configr     r   r   )FF)NNN)F),r   r    r   os.pathr   rz   r   packaging.versionr   r4   r   r   	constantsr	   r
   r   r   urllib.parser   r   r   r   r$   r,   r/   r2   r?   rI   rU   r^   rd   rj   r   r   r   r   r   r   r   r   r   r   r   r    r   r   <module>r      s      	     %   ) + % " -,'"8
$N:V8r:*Z2&R>: C	r   