B
    bEfG+                 @   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 )
NuX   Центр авторизации не поддерживает создание EvaTeamzssh z/ /opt/fox_acrm/cloud/cloud_hostname_is_free.sh TF)separate_out_and_err	do_decodedo_raisez# errcode = z# stdout = z# 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 без логинаuX   Центр авторизации не поддерживает создание EvaTeamzssh z0 /opt/fox_acrm/cloud/cloud_assign_vm.sh --admin=z --hostname=T)r   r   r   z# errcode = z# stdout = z# stderr = 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
        uX   Центр авторизации не поддерживает создание EvaTeamzssh z* /opt/fox_acrm/cloud/vm_assign_prepare.sh T)r   r   r   z# errcode = z# stdout = z# stderr = N)r   r   r   r   r   r   r   )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: код страницы с которой попали на регистрацию
        uX   Центр авторизации не поддерживает создание EvaTeamzssh z+ /opt/fox_acrm/cloud/vm_assign_branding.sh z	 --admin=z --hostname=z	 --phone=z --company=z --user-name=z --landing-project=T)r   r   r   z# errcode = z# stdout = z# stderr = 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| }y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:
         _' ";\)zaccount.evacrm.ruuX   Центр авторизации не поддерживает создание EvaTeamr   zssh z- /opt/fox_acrm/cloud/cloud_assign.sh --admin=z --hostname=z	 --phone=z --company=z --user-name=z --landing-project=z --org-name=T)r   r   r   )r   uD   Не удалось выдать виртуальную машину)r   r   r   r   r   replacer"   r   r   r   RuntimeErrorlogging	exceptionr   )r   r#   r   r$   r%   r&   r   r   Z	_org_namer'   r(   r)   r*   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   Не указан адрес супервизора, не можем получить публичный ключ EvaTeamzssh z' cat /opt/fox_acrm/custom/crm_keys/crm.z.pubT)r   r   r   )r   r	   getattrhasattrr   r9   r4   r   )Zissr   r7   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}yt|dddd\}}}W n& tk
rl   d\}}t| Y nX t| d ||fS )N)zaccount.evacrm.ruuT   Центр авторизации не поддерживает создание CRMr   zssh z1 /opt/fox_acrm/cloud/cloud_idle_suspend restore "r0   T)r   r   r   )r   uJ   Не удалось запустить виртуальную машину)	r   r   r   r   r   r4   r5   r6   r   )Z	acrm_namer   r   r7   r   r   r
   r
   r   restore_idle_acrm   s    
zSupervisor.restore_idle_acrm)__name__
__module____qualname__staticmethodstrr   r   r    r!   r+   r8   r<   r=   r
   r
   r
   r   r      s   $r   )namec             C   s4   | }xdD ]}|j | }q
W tdd|}t|S )u   
    :param name: пользовательский ввод
    :return: экранированная строка более-менее безопасная для использования с bash
    ))r,   r-   )&u   и)/r-   )-r-   u   [^A-Za-zА-Яа-я0-9_]r/   )r3   resubr   r   )rC   _namer3   r
   r
   r   r"      s
    
r"   )__doc__r   Zcmf.includer$   r   r   rB   r"   r
   r
   r
   r   <module>   s    