U
    -dG+                     @   s@   d Z ddlZddlT ddlmZ G dd dZedd	d
ZdS )u  
Вынес всё взаимодействие с супервизором в отдельный файл
Показалось что этой кучке статик-методов не место в вьюхе signup, да и префиксы длинющие какие-то

Ошибки выполнения команд на супервизоре обязательно скрываем от пользователей.
Здесь могут быть assert'ы и exception любого рода.
Функции ничего не возвращают, просто выполняются. Никаких return hostname, stdout, stderr или res.
Если произошла ошибка - кидают exception.

На стороне view вызовы супервизора должны выглядеть строго как:

try:
    Supervisor.function()
except Exception:
    logging.exception("Произошла ошибка $stage")
    return self._error(500, "Ошибка сервера, код #NNN")

где код - тупо число для грепа программистом. Никаких трейсбэков пользователю!
Все данные, нужные пользователю, будут содержаться в куках.

run_bash_command _сам_ логирует свои ошибки при do_raise=True, оборачивать его в try/except нет смысла.
    N)*   )normalize_phonec                   @   s   e Zd ZeepddddZedd ZeddddZeddd	d
ZeddddZ	edd Z
edd Zedd ZdS )
SupervisorN)returnc                   C   s   t jdkrdS t jrt jS d S )Nz
.evacrm.ruzsupervisor.evacrm.ru)configAUTH_SESSION_COOKIE_DOMAINCLOUD_SUPERVISOR r
   r
   #./modules/auth/models/supervisor.pyget_supervisor_hostname   s    
z"Supervisor.get_supervisor_hostnamec                 C   sb   t  }|stdd| dt|  }t|dddd\}}}td| td| td	| |S )
NX   Центр авторизации не поддерживает создание EvaTeamssh z/ /opt/fox_acrm/cloud/cloud_hostname_is_free.sh TFZseparate_out_and_errZ	do_decodeZdo_raise# errcode = # stdout = # stderr = r   r   AssertionErrorshlexquoterun_bash_commandprint)hostname
supervisorcmderrcodeouterrr
   r
   r   cloud_hostname_is_free'   s    


z!Supervisor.cloud_hostname_is_freec           	      C   s   | st dt| }t }|s*t dt| tj  }d| d| d| }t|dddd\}}}t	d| t	d	| t	d
| dS )u   
        :param login: Здесь аргументом должен быть уже unquoted/normalized email!
        :param org_name: Используем для создания jwt ключа
        :return: hostname, err, res
        uL   Невозможно выдать экземпляр CRM без логинаr   r   z0 /opt/fox_acrm/cloud/cloud_assign_vm.sh --admin= --hostname=Tr   r   r   r   N)
r   r   r   r   r   r   r   stripr   r   )	loginorg_name_loginr   Z	_hostnamer   r   r   r   r
   r
   r   assign3   s    


zSupervisor.assignc                 C   sb   t  }|stdd| dt|  }t|dddd\}}}td| td| td| d	S )
u   
        :param vm_name: имя виртуалки, извлечённое из scope
        :return: hostname, out, res
        r   r   z* /opt/fox_acrm/cloud/vm_assign_prepare.sh Tr   r   r   r   Nr   )r#   r   r   r   r   r   r
   r
   r   prepareE   s    

zSupervisor.preparec                 C   s   t |}t |  tj  }t t|}t|}	t|}
t|}t }|s\t	dd| d|  d| d| d| d|	 d|
 d	| }t
|d
d
d
d\}}}td| td| td| dS )u  
        :param org_name: домен для CRM
        :param company: название компании
        :param login: Здесь аргументом должен быть уже unquoted/normalized email!
        :param phone: телефон
        :param user_name: ФИО
        :param landing_project: код страницы с которой попали на регистрацию
        r   r   z+ /opt/fox_acrm/cloud/vm_assign_branding.sh z	 --admin=r    	 --phone= --company= --user-name= --landing-project=Tr   r   r   r   N)r   r   r   r   r!   r   escape_namer   r   r   r   r   )r#   companyr"   phone	user_namelanding_projectr$   r   _phone_company
_user_name_landing_projectr   r   r   r   r   r
   r
   r   brandingT   s    

4

zSupervisor.brandingc                 C   s  t |}t |  tj }t | }t t|}	|dddddddddd}
t |
}
t|}t|}t }|sdS d	| d
| d| d|	 d|
 d| d| d| }zt	|dddd\}}}W n( t
k
r   d\}}t| Y nX t|| |||fS )u  
        :param org_name: домен для CRM
        :param company: название компании
        :param login: Здесь аргументом должен быть уже unquoted/normalized email!
        :param phone: телефон
        :param user_name: ФИО
        :param landing_project: код страницы с которой попали на регистрацию
        :return:
         _' ";\)account.evacrm.rur   r   r   z- /opt/fox_acrm/cloud/cloud_assign.sh --admin=r    r'   r(   r)   r*   z --org-name=Tr   )r   uD   Не удалось выдать виртуальную машину)r   r   r   r   r   replacer+   r   r   r   RuntimeErrorlogging	exceptionr   )r#   r,   r"   r-   r.   r/   r$   r   Z	_org_namer0   r1   r2   r3   r   r   resr   r   r
   r
   r   cloud_assignq   s&    

,
4
zSupervisor.cloud_assignc                 C   sd   t js6tt dddkr.tt dr.td t jS tddt j d|  d	}t|d
d
d
d\}}}|S )NZVM_TYPEZ
productionZdevelCRM_PUB_KEYuW   Берём токен из конфига, полагая что CRM у нас однаuy   Не указан адрес супервизора, не можем получить публичный ключ EvaTeamr   z' cat /opt/fox_acrm/custom/crm_keys/crm.z.pubTr   )r   r	   getattrhasattrr   rC   r>   r   )Zissr   rA   r   r   r
   r
   r   read_crm_pub_key   s    zSupervisor.read_crm_pub_keyc                 C   s   t | } t }|sdS d| d|  d}zt|dddd\}}}W n& tk
rl   d\}}t| Y nX t| d ||fS )N)r<   uT   Центр авторизации не поддерживает создание CRMr   r   z1 /opt/fox_acrm/cloud/cloud_idle_suspend restore "r9   Tr   )r   uJ   Не удалось запустить виртуальную машину)	r   r   r   r   r   r>   r?   r@   r   )Z	acrm_namer   r   rA   r   r   r
   r
   r   restore_idle_acrm   s    
zSupervisor.restore_idle_acrm)__name__
__module____qualname__staticmethodstrr   r   r%   r&   r4   rB   rF   rG   r
   r
   r
   r   r      s    

#
r   )namec                 C   s0   | }dD ]}|j | }qtdd|}t|S )u   
    :param name: пользовательский ввод
    :return: экранированная строка более-менее безопасная для использования с bash
    ))r5   r6   )&u   и)/r6   )-r6   u   [^A-Za-zА-Яа-я0-9_]r8   )r=   resubr   r   )rM   _namer=   r
   r
   r   r+      s
    r+   )__doc__r   Zcmf.includer-   r   r   rL   r+   r
   r
   r
   r   <module>   s    