U
    Įwh                     @   sf   d dl Z d dlmZmZ d dlmZ d dlZd dlZd dlZd dlT d dl	m
Z
 G dd de
jZdS )    N)datetimetimezone)Path)*)cmf_ssh_keyc                       sz   e Zd Zedd Zedd Zedd Zdd Zdd
dZdd Z	dd Z
 fddZ fddZ fddZ  ZS )	CmfSshKeyc                 C   s   t tj d| j dS )Nz/conf/users/key_.jsonr   configGIT_DIRcodeself r   &./modules/evagit/models/cmf_ssh_key.pykey_file   s    zCmfSshKey.key_filec                 C   s   t tj d| j dS )Nz/conf/users/deleted_key_r   r	   r   r   r   r   key_file_deleted   s    zCmfSshKey.key_file_deletedc                 C   s   t tj dS )Nz/githome/.ssh/authorized_keys)r   r
   r   r   r   r   r   authorized_keys_file   s    zCmfSshKey.authorized_keys_filec              	   C   s   | j   | j stddd | j r2tddd t| j j| jrLt| jnd i d}| jj jddd t	| jd}t
j||dd	 W 5 Q R X d S )
NuK   SSH-ключ должен принадлежать пользователюTabortu8   SSH-ключ c таким id уже существует)userexpiration_daterepos)exist_okparentsw   indent)parentload	cmf_alertr   existsstridr   mkdiropenjsondump)r   datafr   r   r   _create_key_file   s    


zCmfSshKey._create_key_fileNc              	   C   s   |pi |pg  }}| j  s2td| j ddd t| j d}t|}W 5 Q R X | D ]\}}||d |< q\|D ]"}||d krqvd|d | d< qvt| j d	}tj||d
d W 5 Q R X d S )Nu   Файл для SSH-ключа u    отсутствуетTr   rr    Zallowr   r   r   )	r   r"   r!   r   r&   r'   r    itemsr(   )r   Z	additionsZ	deletionsr*   r)   ZrepoZpermr   r   r   update_key_file+   s    
zCmfSshKey.update_key_filec              	   C   s   dt j d| j d| j d}d\}}t| jd}||k rzt|tjtj	B  W n4 t
k
r   td |d7 }td Y q4Y nX || t|tj W 5 Q R  d S W 5 Q R X td	 td
dd d S )Nz	command="z/githook.py zB",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty 
   r   a/authorized_keys file is locked by other process   Dauthorized_keys file is locked by other process longer than expectedu2   Невозможно добавить SSH-ключTr   )r
   r   r   keyr&   r   fcntlflockLOCK_EXLOCK_NBIOErrorloggingwarningtimesleepwriteLOCK_UNerrorr!   )r   Zauth_templatemax_retriescur_retriesr*   r   r   r   _add_authorized_key@   s     




zCmfSshKey._add_authorized_keyc                 C   s4   t jj| jddddgd}|D ]}|| g qd S )Nzgit_role.perm_push	namespacememberZtree_parent)rH   Zfields)ZmodelsZCmfEvagitRoleAssignlistr   Zadd_ssh_key_perms)r   Zrole_assignsZrole_assignr   r   r   _recalc_role_assignsY   s    
zCmfSshKey._recalc_role_assignsc                    s   t   dg S )Nr   )supersave_preload_fieldsr   	__class__r   r   rL   a   s    zCmfSshKey.save_preload_fieldsc                    s   | j stddd | jr8| jtjtjdk r8tddd t| j	j
   d fddtd	t d
D | _t| j	j
  | _|   |   |   t j||S )Nu<   SSH-ключ невозможно редактироватьTr   )Ztzum   Дата истечения срока действия ключа не может быть в прошлом:c                    s   g | ]} ||d   qS )   r   ).0imd5r   r   
<listcomp>l   s     z"CmfSshKey.save.<locals>.<listcomp>r   rP   )Zis_newr!   r   r   Znowr   ZutchashlibrT   r7   valueencodeZ	hexdigestjoinrangelenZfingerprintZsha256Zfingerprint_sha256r+   rF   rJ   rK   save)r   argskwargsrM   rS   r   r\   d   s    &zCmfSshKey.savec              
      s$   j  s td j  d n j  j d\}}t jd}||k r zt	|tj
tjB  W n4 tk
r   td |d7 }td Y qDY nX |d  fdd	| D }|d |  || t	|tj t j||W  5 Q R  S W 5 Q R X td
 tddd d S )NzSSH-key file z already been deletedr1   zr+r4   r5   r   c                    s&   g | ]}t  j|krd | n|qS )#)r#   r   )rQ   liner   r   r   rU      s     z$CmfSshKey.delete.<locals>.<listcomp>r6   u0   Невозможно удалить SSH-ключTr   )r   r"   r=   r>   renamer   r&   r   r8   r9   r:   r;   r<   r?   r@   seek	readlinestruncate
writelinesrB   rK   deleterC   r!   )r   r]   r^   rD   rE   r*   linesrM   r   r   rf   u   s,    







$
zCmfSshKey.delete)NN)__name__
__module____qualname__propertyr   r   r   r+   r/   rF   rJ   rL   r\   rf   __classcell__r   r   rM   r   r      s   



r   )rV   r   r   pathlibr   r'   r?   r8   Zcmf.includeZmodules.evagit.fieldsr   r   r   r   r   r   <module>   s   