
    bEfG+                     L    d Z ddlZddlT ddlmZ  G d d          Zdef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                       e Zd Zedepdfd            Zed             Zedd            Zedd            Zedd            Z	ed             Z
ed	             Zed
             ZdS )
SupervisorreturnNc                  Z    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     #./modules/auth/models/supervisor.pyget_supervisor_hostnamez"Supervisor.get_supervisor_hostname   s6     ,<<**$ 	+**	+ 	+r   c                    t                                           }|s
J d            d| dt          j        |            }t	          |ddd          \  }}}t          d|           t          d|           t          d	|           |S )
NX   Центр авторизации не поддерживает создание EvaTeamssh z/ /opt/fox_acrm/cloud/cloud_hostname_is_free.sh TFseparate_out_and_err	do_decodedo_raise# errcode = # stdout = # stderr = r   r   shlexquoterun_bash_commandprint)hostname
supervisorcmderrcodeouterrs         r   cloud_hostname_is_freez!Supervisor.cloud_hostname_is_free'   s    7799
uuuuuugZggPUP[\dPePegg,StW\glmmmcng&&&mS!!!mS!!!r   c                    | s
J d            t          j        |           }t                                          }|s
J d            t          j        | t          j                                                   }d| d| d| }t          |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   stripr   r   )	loginorg_name_loginr!   	_hostnamer"   r#   r$   r%   s	            r   assignzSupervisor.assign3   s     ddddddU##7799
uuuuuuK8 PV-N P P V V X XYY	pZppQWppenpp,StW[fjkkkcng&&&mS!!!mS!!!!!r   c                    t                                           }|s
J d            d| dt          j        |            }t	          |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%   s         r   preparezSupervisor.prepareE   s      7799
uuuuuubZbb5;W_K`K`bb,StW[fjkkkcng&&&mS!!!mS!!!!!r   c                 >   t          j        |          }t          j        |  t          j                                                   }t          j        t          |                    }t          |          }	t          |          }
t          |          }t                                          }|s
J d            d| d|  d| d| d| d|	 d|
 d	| }t          |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+   companyr*   phone	user_namelanding_projectr,   r    _phone_company
_user_name_landing_projectr!   r"   r#   r$   r%   s                    r   brandingzSupervisor.brandingT   sv    U##;(OF,MOOUUWWXX_U3344w'' ++
&777799
uuuuuuOZ O OH O OO O-5O O@FO OS[O O'O O<LO O -StW[fjkkkcng&&&mS!!!mS!!!!!r   c                 0   t          j        |          }t          j        |  t          j                   }t          j        |           }t          j        t	          |                    }	|                    dd                              dd                              dd                              dd                              dd          }
t          j        |
          }
t          |          }t          |          }t                                          }|sdS d	| d
| d| d|	 d|
 d| d| d| }	 t          |ddd          \  }}}n/# t          $ r" d\  }}t                              |           Y nw xY w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(   r2   r3   r4   r5   z --org-name=Tr   )r   uD   Не удалось выдать виртуальную машину)r   r   r
   r   r   replacer6   r   r   r   RuntimeErrorlogging	exceptionr   )r+   r7   r*   r8   r9   r:   r,   r    	_org_namer;   r<   r=   r>   r!   r"   resr$   r%   s                     r   cloud_assignzSupervisor.cloud_assignq   s    U##;(OF,MOOPPK))	_U3344??3,,44S"==EEc2NNVVWZ\^__gghlnpqq;x(( ++
&777799
 	F F  FfZ f ff f-5f f@Ff fS[f f'f f<Lf fZcf f	#,StW[fjkkkMCcc 	# 	# 	#`HCc"""""	# 	hc!!s   <E )F ?F c                 $   t           j        sYt          t           dd          dk    r0t          t           d          rt	          d           t           j        S t          d          dt           j         d|  d	}t          |d
d
d
          \  }}}|S )NVM_TYPE
productiondevelCRM_PUB_KEYuW   Берём токен из конфига, полагая что CRM у нас однаuy   Не указан адрес супервизора, не можем получить публичный ключ EvaTeamr   z' cat /opt/fox_acrm/custom/crm_keys/crm.z.pubTr   )r
   r   getattrhasattrr   rT   rJ   r   )issr"   rN   r$   r%   s        r   read_crm_pub_keyzSupervisor.read_crm_pub_key   s     & 	\vy,777BBwvWdGeGeBoppp))   [  \  \  \^V,^^UX^^^(4SWbfgggS#
r   c                 .   t          j        |           } t                                          }|sdS d| d|  d}	 t	          |ddd          \  }}}n/# t
          $ r" d\  }}t                              |           Y nw xY wt          |           d ||fS )N)rH   uT   Центр авторизации не поддерживает создание CRMr   r   z1 /opt/fox_acrm/cloud/cloud_idle_suspend restore "rE   Tr   )r   uJ   Не удалось запустить виртуальную машину)	r   r   r   r   r   rJ   rK   rL   r   )	acrm_namer!   r"   rN   r$   r%   s         r   restore_idle_acrmzSupervisor.restore_idle_acrm   s    K	**	7799
 	B B  B'Z ' '#' ' '	#,StW[fjkkkMCcc 	# 	# 	#fHCc"""""	# 	c


S#~s   A )B ?B )r   N)__name__
__module____qualname__staticmethodstrr   r&   r.   r0   r?   rO   rX   r[   r   r   r   r   r      s
       +S[D + + + \+   \ " " " \"" " " " \" " " " \"8 !" !" \!"F 
 
 \
   \  r   r   namec                     | }dD ]} |j         | }t                              dd|          }t          j        |          S )u   
    :param name: пользовательский ввод
    :return: экранированная строка более-менее безопасная для использования с bash
    ))rA   rB   )&u   и)/rB   )-rB   u   [^A-Za-zА-Яа-я0-9_]rD   )rI   resubr   r   )ra   _namerI   s      r   r6   r6      sN    
 EB ( (w'FF-r599E;ur   )__doc__r   cmf.includer8   r   r   r`   r6   r   r   r   <module>rk      s    ,      " " " " " "S S S S S S S Sl
c 
 
 
 
 
 
r   