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   tlsZ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   ZDefaultNamespace)r	   r   r   )r   r   r   r   Zskip_tls_verifyZ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   Z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 {} : {}r.   r   r   Fr   T)r   ospathisfileopenjsonloadOSErrorKeyError
ValueErrorr   r   r   r   r	   r   )r1   r   Z	meta_fileZmetadatafer!   r"   r#   r#   r$   r/   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)Zclient_certca_certverify)r   r   r   keysr5   r6   isdirjoinlistdir
startswithallr   r   r   r   )	r   certstls_direndpointrC   rA   rB   filenamerD   r#   r#   r$   r0   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   r5   r6   rF   makedirsr8   r   writer9   dumpsr,   r   r   r   rG   rC   r   basenamerA   r   r   )	r   Zmeta_dirr>   rL   rM   r    Zca_fileZ	cert_fileZ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'   )r5   r6   rF   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)r9   rR   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      | 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   rM   r#   r#   r$   r      s   zContext.Hostc                 C   rb   r'   )r   r)   r#   r#   r$   Orchestrator   rc   zContext.Orchestratorc                 C   s$   i }| j r
d| j i}| j|| jdS )Nr-   )r+   r,   r.   )r   r   r   )r   r2   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   rE   )r   rB   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 )Nr^   )	r   r   rA   listmapr5   r6   rS   rC   )r   rK   rM   r    rA   rB   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*   classmethodr4   r/   r0   rT   rU   rY   r\   r(   ra   propertyr+   r   rd   r,   r   r^   r_   r#   r#   r#   r$   r
      sD    
+




	



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