
    ]dG+                     F    d Z ddlZddl ddlmZ  G d d      Zdefd	Zy)
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xs 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y)
SupervisorreturnNc                  l    t         j                  dk(  ryt         j                  rt         j                  S y )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   s/     ,,<*$$*** %r   c                     t         j                         }|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
uuuzZL OPUP[P[\dPeOfg,StW\glmcng&mS!mS!r   c                 h   | sJ d       t        j                  |       }t        j                         }|sJ d       t        j                  | t        j
                   j                               }d| d| d| }t        |ddd      \  }}}t        d|       t        d	|       t        d
|       y)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duU#779
uuuzKK8*V-N-N,O P V V XY	ZL PQWPXXdendop,StW[fjkcng&mS!mS!r   c                     t         j                         }|sJ d       d| dt        j                  |        }t	        |ddd      \  }}}t        d|       t        d|       t        d|       y	)
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   su      779
uuuzZL J5;;W_K`Jab,StW[fjkcng&mS!mS!r   c                    t        j                  |      }t        j                  |  t        j                   j	                               }t        j                  t        |            }t        |      }	t        |      }
t        |      }t        j                         }|sJ d       d| d|  d| d| d| d|	 d|
 d	| }t        |d
d
d
      \  }}}t        d|       t        d|       t        d|       y)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   s    U#;;(F,M,M+NOUUWX_U34w' +
&7779
uuuz ZL KH: VXJix{S[R\ ]'L(;<L;MO -StW[fjkcng&mS!mS!r   c                    t        j                  |      }t        j                  |  t        j                         }t        j                  |       }t        j                  t	        |            }	|j                  dd      j                  dd      j                  dd      j                  dd      j                  dd      }
t        j                  |
      }
t        |      }t        |      }t        j                         }|syd	| d
| d| d|	 d|
 d| d| d| }	 t        |ddd      \  }}}t        ||       |||fS # t        $ r d\  }}t        j                  |       Y 6w xY w)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   sz    U#;;(F,M,M+NOPKK)	_U34??3,44S"=EEc2NVVWZ\^_gghlnpq;;x( +
&7779
 FZL !XJix{S[R\ ]'L(;<L;M\ZcYdf	#,StW[fjkMCc
 	hc!!  	#`HCc"	#s   E #E)(E)c                    t         j                  sJt        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
      \  }}}|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,77BwvWdGeop)))   [  \  \V,,--TUXTYY]^(4SWbfgS#
r   c                    t        j                  |       } t        j                         }|syd| d|  d}	 t	        |ddd      \  }}}t        |       d ||fS # t
        $ r d\  }}t        j                  |       Y 5w xY w)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    KK	*	779
 BZL !#A'	#,StW[fjkMCc
 	c
S#~  	#fHCc"	#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        j                  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      sJ    
 EB (w'(FF-r59E;;ur   )__doc__r   cmf.includer8   r   r   r`   r6   r   r   r   <module>rk      s.   ,   "S Sl
c 
r   