U
    pVc'                     @   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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   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 без логинаX   Центр авторизации не поддерживает создание EvaTeamssh z0 /opt/fox_acrm/cloud/cloud_assign_vm.sh --admin= --hostname=TZseparate_out_and_errZ	do_decodeZdo_raise# errcode = # stdout = # stderr = N)
AssertionErrorshlexquoter   r   r   r   striprun_bash_commandprint)	loginorg_name_login
supervisorZ	_hostnamecmderrcodeouterrr
   r
   r   assign(   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   N)r   r   r   r   r   r   r   )r   r   r   r   r    r!   r
   r
   r   prepare:   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=z --user-name=z --landing-project=Tr   r   r   r   N)r   r   r   r   r   r   escape_namer   r   r   r   r   )r   companyr   phoneZ	user_nameZlanding_projectr   hostname_phone_companyZ
_user_nameZ_landing_projectr   r   r   r    r!   r
   r
   r   brandingI   s    

4

zSupervisor.brandingc              
   C   s   t |}t |  tj }t t|}|dddddddddd}t |}t }|srdS 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:
        :param company:
        :param login: Здесь аргументом должен быть уже unquoted/normalized email!
        :param phone:
        :return:
         _' ";\)account.evacrm.rur   r   r   z- /opt/fox_acrm/cloud/cloud_assign.sh --admin=r   r$   r%   Tr   )r   uD   Не удалось выдать виртуальную машину)r   r   r   r   r   replacer   r   r   RuntimeErrorlogging	exceptionr   )r   r'   r   r(   r   r)   r*   r+   r   r   resr    r!   r
   r
   r   cloud_assignf   s     	
,
"
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   r;   r6   r   )Zissr   r9   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)r4   uT   Центр авторизации не поддерживает создание CRMr   r   z1 /opt/fox_acrm/cloud/cloud_idle_suspend restore "r1   Tr   )r   uJ   Не удалось запустить виртуальную машину)	r   r   r   r   r   r6   r7   r8   r   )Z	acrm_namer   r   r9   r    r!   r
   r
   r   restore_idle_acrm   s    
zSupervisor.restore_idle_acrm)__name__
__module____qualname__staticmethodstrr   r"   r#   r,   r:   r>   r?   r
   r
   r
   r   r      s   

r   )namec                 C   s0   | }dD ]}|j | }qtdd|}t|S )u   
    :param name: пользовательский ввод
    :return: экранированная строка более-менее безопасная для использования с bash
    ))r-   r.   )&u   и)/r.   )-r.   u   [^A-Za-zА-Яа-я0-9_]r0   )r5   resubr   r   )rE   _namer5   r
   r
   r   r&      s
    r&   )__doc__r   Zcmf.includer(   r   r   rD   r&   r
   r
   r
   r   <module>   s    