o
    2.a                     @   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| _|s5|r#|dkr%dn|}|t||| di| _d S |	 D ]7\}}t
|tsJtd|||| j|< |dkrTq9|dt||| j| d< t|d| | j| d< q9d 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   tlsdefault_endpointkv r$   8/usr/lib/python3/dist-packages/docker/context/context.py__init__   sJ   

zContext.__init__r   c                 C   s@   t || |d| j|< |r|| j| d< |r|| j|< d S d S )Nr   DefaultNamespace)r	   r   r   )r   r   r   r   skip_tls_verifydef_namespacer$   r$   r%   set_endpoint9   s   
zContext.set_endpointc                 C   s   |   S N)__call__r   r$   r$   r%   inspectF   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_contextI   s   


zContext.load_contextc              
   C   s   t |}tj|sd S i }zt|}t|}W d    n1 s#w   Y  W n ttt	fy@ } zt
d||d }~ww |d  D ]&\}}|dkrPqG|dtd d|d | d< t|dd|d | d< qG|S )Nz@Detected corrupted meta file for
                context {} : {}r2   r   r   Fr   T)r   ospathisfileopenjsonloadOSErrorKeyError
ValueErrorr   r   r   r   r	   r   )r6   r   	meta_filemetadatafer"   r#   r$   r$   r%   r4   W   s2   


zContext._load_metac           	      C   s  i }t | j}| j D ]m}tjtj||sqd }d }d }ttj||D ]+}|	dr:tj|||}q*|	drHtj|||}q*|	drUtj|||}q*t
|||gryd }|dkrn| jd ddsnd}t||f||d||< q|| _|| _d S )	Ncacertkeyr   r   FT)client_certca_certverify)r   r   r   keysr:   r;   isdirjoinlistdir
startswithallr   r   r   r   )	r   certstls_direndpointrK   rH   rI   filenamerL   r$   r$   r%   r5   r   s8   






zContext._load_certsc           	   
   C   s:  t | j}tj|st| tt| jd}|t	
| j W d    n1 s,w   Y  t| j}| j D ]S\}}tjtj||sTttj|| |j}|rht|tj||tj| |jr|j\}}t|tj||tj| t|tj||tj| q;t | j| _t| j| _d S )Nw)r   r   r:   r;   rN   makedirsr=   r   writer>   dumpsr0   r   r   r   rO   rK   r   basenamerH   r   r   )	r   meta_dirrE   rT   rU   r    ca_file	cert_filekey_filer$   r$   r%   save   s4   






zContext.savec                 C   s8   t j| jrt| j t j| jrt| j d S d S r+   )r:   r;   rN   r   r   r   r-   r$   r$   r%   remove   s
   
zContext.removec                 C   s   d| j j d| j dS )N<z: 'z'>)	__class____name__r   r-   r$   r$   r%   __repr__   s   zContext.__repr__c                 C   s   t j|  ddS )N   )indent)r>   rZ   r,   r-   r$   r$   r%   __str__   s   zContext.__str__c                 C   s"   | j }|| j || j |S r+   )r0   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      | j S r+   )r   r-   r$   r$   r%   r/         zContext.Namec                 C   sF   | j r| j dkr| jdd }|r|dd S d S | j| j  dd S )Nr   r   r   )r   r   r   )r   rU   r$   r$   r%   r      s   zContext.Hostc                 C   rn   r+   )r   r-   r$   r$   r%   Orchestrator   ro   zContext.Orchestratorc                 C   s$   i }| j r
d| j i}| j|| jdS )Nr1   )r/   r0   r2   )r   r   r   )r   r7   r$   r$   r%   r0      s   
zContext.Metadatac                 C   s2   | j }|r	|dkrd}|| j v r| j| S d S )Nr   r   )r   r   rM   )r   rI   r$   r$   r%   r      s   
zContext.TLSConfigc                 C   sH   i }| j  D ]\}}|j\}}tttjj|j||g||< qd|iS )Nrj   )	r   r   rH   listmapr:   r;   r[   rK   )r   rS   rU   r    rH   rI   r$   r$   r%   rj      s   

zContext.TLSMaterialc                 C   s   d| j | jdiS )Nrk   )MetadataPathTLSPath)r   r   r-   r$   r$   r%   rk      s
   zContext.Storage)NNNF)r   NNFN)rd   
__module____qualname____doc__r&   r*   r.   classmethodr9   r4   r5   r`   ra   re   rh   r,   rm   propertyr/   r   rp   r0   r   rj   rk   r$   r$   r$   r%   r
      sD    
+




	



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