a
   Cȸ                   @   sz   d dl Z d dlZd dlmZ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 G d	d
 d
ZdS )    N)copyfilermtree)	TLSConfig)ContextException)get_meta_dir)get_meta_file)get_tls_dir)get_context_hostc                   @   s   e Zd ZdZd+ddZd,ddZd	d
 Zedd Zedd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zedd Zedd  Zed!d" Zed#d$ Zed%d& Zed'd( Zed)d* ZdS )-Contextz
A context.NFc           	      C   s   |st d|| _d | _|| _i | _i | _d| _d| _|sj|rF|dkrJdn|}|t||| di| _d S |	 D ]n\}}t
|tstd|||| j|< |dkrqr|dt||| j| d< t|d| | j| d< qrd S )	NzName not providedz	IN MEMORYswarmdockerHostSkipTLSVerifyz>Unknown endpoint format for
                    context {}: {}r   r   )	Exceptionnamecontext_typeorchestrator	endpointstls_cfg	meta_pathtls_pathr	   items
isinstancedictr   formatgetbool)	selfr   r   hostr   tlsZdefault_endpointkv r#   :/usr/lib/python3.9/site-packages/docker/context/context.py__init__   sH    

zContext.__init__r   c                 C   s<   t || |d| j|< |r*|| j| d< |r8|| j|< d S )Nr   ZDefaultNamespace)r	   r   r   )r   r   r   r   Zskip_tls_verifyZdef_namespacer#   r#   r$   set_endpoint8   s    
zContext.set_endpointc                 C   s   |   S N)__call__r   r#   r#   r$   inspectE   s    zContext.inspectc                 C   s`   t |}|r\| |d |d dd |dd d}|d dd |_|  t||_|S d S )NNameMetadataStackOrchestrator	Endpoints)r   r   Type)r
   
_load_metar   r   _load_certsr   r   )clsr   metainstancer#   r#   r$   load_contextH   s    


zContext.load_contextc              
   C   s   t |}tj|sd S i }z6t|}t|}W d    n1 sF0    Y  W n: ttt	fy } zt
d||W Y d }~n
d }~0 0 |d  D ]L\}}|dkrq|dtd d|d | d< t|dd|d | d< q|S )Nz@Detected corrupted meta file for
                context {} : {}r.   r   r   Fr   T)r   ospathisfileopenjsonloadIOErrorKeyError
ValueErrorr   r   r   r   r	   r   )r2   r   Z	meta_filemetadatafer!   r"   r#   r#   r$   r0   V   s*    
,

zContext._load_metac                 C   s   i }t | j}| j D ]}tjtj||s4qd }d }d }ttj||D ]V}|	drttj|||}qT|	drtj|||}qT|	drTtj|||}qTt
|||grt||f|d||< q|| _|| _d S )Ncacertkey)Zclient_certca_cert)r   r   r   keysr6   r7   isdirjoinlistdir
startswithallr   r   r   )r   certstls_direndpointrE   rC   rD   filenamer#   r#   r$   r1   q   s*    



zContext._load_certsc           	   
   C   s:  t | j}tj|s t| tt| jd"}|t	
| j W d    n1 sX0    Y  t| j}| j D ]\}}tjtj||sttj|| |j}|rt|tj||tj| |jrv|j\}}t|tj||tj| t|tj||tj| qvt | j| _t| j| _d S )Nw)r   r   r6   r7   rG   makedirsr9   r   writer:   dumpsr,   r   r   r   rH   rE   r   basenamerC   r   r   )	r   Zmeta_dirr@   rM   rN   r    Zca_fileZ	cert_fileZkey_filer#   r#   r$   save   s0    

0




zContext.savec                 C   s4   t j| jrt| j t j| jr0t| j d S r'   )r6   r7   rG   r   r   r   r)   r#   r#   r$   remove   s    
zContext.removec                 C   s   d| j j| jf S )Nz
<%s: '%s'>)	__class____name__r   r)   r#   r#   r$   __repr__   s    zContext.__repr__c                 C   s   t j|  ddS )N   )indent)r:   rS   r(   r)   r#   r#   r$   __str__   s    zContext.__str__c                 C   s"   | j }|| j || j |S r'   )r,   updateTLSMaterialStorage)r   resultr#   r#   r$   r(      s    zContext.__call__c                 C   s
   | j d u S r'   )r   r)   r#   r#   r$   is_docker_host   s    zContext.is_docker_hostc                 C   s   | j S r'   )r   r)   r#   r#   r$   r+      s    zContext.Namec                 C   sF   | j r| j dkr2| jdd }|r.|dd S d S | j| j  dd S )Nr   r   r   )r   r   r   )r   rN   r#   r#   r$   r      s    zContext.Hostc                 C   s   | j S r'   )r   r)   r#   r#   r$   Orchestrator   s    zContext.Orchestratorc                 C   s$   i }| j rd| j i}| j|| jdS )Nr-   )r+   r,   r.   )r   r   r   )r   r3   r#   r#   r$   r,      s    
zContext.Metadatac                 C   s2   | j }|r|dkrd}|| j v r.| j| S d S )Nr   r   )r   r   rF   )r   rD   r#   r#   r$   r      s    
zContext.TLSConfigc                 C   sH   i }| j  D ]0\}}|j\}}tttjj|j||g||< qd|iS )Nr^   )	r   r   rC   listmapr6   r7   rT   rE   )r   rL   rN   r    rC   rD   r#   r#   r$   r^      s    

zContext.TLSMaterialc                 C   s   d| j | jdiS )Nr_   )ZMetadataPathZTLSPath)r   r   r)   r#   r#   r$   r_      s
    zContext.Storage)NNNF)r   NNFN)rX   
__module____qualname____doc__r%   r&   r*   classmethodr5   r0   r1   rU   rV   rY   r\   r(   ra   propertyr+   r   rb   r,   r   r^   r_   r#   r#   r#   r$   r
      sB     
+  




	





r
   )r6   r:   shutilr   r   Z
docker.tlsr   Zdocker.errorsr   Zdocker.context.configr   r   r   r	   r
   r#   r#   r#   r$   <module>   s   