
    iJ                         d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZm	Z	 d dl
mZ d dlmZmZ d dlmZmZmZ d dlmZ d dl d dlmZ  G d	 d
ej.                        Zy)    N)defaultdict
namedtuple)Path)randomchoices)OptionalListLiteral)	safe_join)*)cmf_global_settingsc            
           e Zd ZdZej
                  j                  g dz   Zd Zd Zd Z	 fdZ
ededefd	       Zed
efd       Z ed      Z ed      Z ed      Z ed      Z ed      Zedefd       Zedefd       Zed5dededefd       Zed        Zed        Zed6dededee   fd       Z e!jE                  d      Z#ede$e   fd       Z%ed7defd       Z&e!jE                  d       Z'ed!        Z(ed"        Z)ed#        Z*ed$        Z+d% Z,ed&        Z-ed'        Z.ed8d(       Z/e e0d)*      d+efd,              Z1ed-        Z2ed.        Z3edd/dd/d0ded1ed2ed3efd4       Z4 xZ5S )9CmfGlobalSettingsuF   
    Глобальные настройки приложения
    )performance_server_test
public_getpublic_listchange_page_settingsreset_page_settingseva_available_versioneva_current_versioneva_upgradeeva_shedule_upgradeeva_current_sheduled_upgradeeva_cancel_upgradeeva_upgrade_historyeva_upgrade_entryeva_backup_historyeva_backup_entryeva_restorec                    | j                   j                  sC| j                  j                  s-| j                  j                  s| j                  j                  sy t        t        j                  j                  dg       y )NT)args)	auth_options_allow_base
is_changedauth_options_allow_oauthauth_options_allow_ldapauth_options_allow_ssoschedule_deferred_jobmodels	CmfPersonaccount_sync_usersselfs    0./modules/settings/models/cmf_global_settings.py_check_auth_settingsz&CmfGlobalSettings._check_auth_settings)   sY    ,,77--88,,77++66f..AAO    c                 Z   | j                   j                  sy d}| j                   s|j                  dd      }t        |d       t	        t
        j                  j                         t        j                  r4dt        j                  _
        t        j                  j                          y y )Nu   Включение двухфакторной авторизации у всех пользователей может занять от 1 до 15 минутu   Включениеu   ВыключениеFabortT)two_factor_optr#   replace	cmf_alertr'   r(   r)   init_2fa_settingsgsessioncheckedsave)r,   messages     r-   _check_2fa_settingsz%CmfGlobalSettings._check_2fa_settings2   s{    ""-- r""oo&:<RSG''f..@@A99 $AIIIINN r/   c                      y N r+   s    r-   _check_password_settingsz*CmfGlobalSettings._check_password_settings>   s    r/   c                 6   | j                          | j                          | j                          | j                  j                  r| j                  rt        d       | j                  j                  r| j                  rt        d       t        |    |i |S )Nu   Контроль работы включен. Система будет предупреждать о нарушениях сроков.u   Контроль работы включен. Система будет предупреждать и блокировать работу через 1 час в случае нарушения сроков.)	r@   r.   r<   staff_control_enabledr#   r5   staff_control_block_workspacesuperr:   )r,   r!   kwargs	__class__s      r-   r:   zCmfGlobalSettings.saveA   s    %%'!!#  "%%00T5O5O t u--88T=_=_ z {w|T,V,,r/   namecontentc                    t         j                  j                  st        d       y t	        t
        j                  d      }t        j                  j                  |      st        j                  |       t	        ||       }t        |d      5 }|j                  t        j                  |j                  d      d                d d d        y # 1 sw Y   y xY w)NR   Только администратор может менять настройкиcustom/static/app/assets/imageszwb+,   )r7   current_personis_adminr5   r   configPROJECT_DIRospathexistsmakedirsopenwritebase64	b64decodesplit)rG   rH   r!   rE   	file_pathfs         r-   r   z&CmfGlobalSettings.change_page_settingsM   s    ((jkf002ST	ww~~i(KK	"i.	)U# 	=qGGF$$W]]3%7%:;<	= 	= 	=s   7CCnamesc                     t         j                  j                  st        d       y | D ]R  }t	        t
        j                  d|      }t        j                  j                  |      s>t        j                  |       T y )NrJ   rK   )r7   rN   rO   r5   r   rP   rQ   rR   rS   rT   remove)r]   rG   r[   s      r-   r   z%CmfGlobalSettings.reset_page_settingsY   s^    ((jk 	%D!&"4"46WY]^Iww~~i(		)$	%r/   z/var/log/eva_updatez/opt/bin/update.shz/opt/var/backup/z$/mnt/shared/config/available_versionz'/mnt/shared/config/shedule_upgrade.jsonreturnc                    t         j                  j                          | j                  j	                         sy| j                  j                         5 }|j                         j                  d      }ddd       t        j                  d      s#t        j                  d|       t        dd       || j                         k  ry|S # 1 sw Y   XxY w)u   
        Получение доступной для обновления последней официальной версии
        '' - обновление не требуется, None - обновление не доступно
        N
^(\d{2}\.\d{2}\.\d{2}\.\d{4})?$z)eva_available_version: invalid version %su6   Недопустимый ответ с сервера.Tr1   )r(   CmfAccessListcheck_admin_mode_EVA_VERSION_FILErT   rV   readstriprematchloggingerrorr5   r   )cls_kwargsr\   versions       r-   r   z'CmfGlobalSettings.eva_available_versionl   s     	--/$$++-""'') 	+QffhnnT*G	+xx:GDMMEPNVZ[c--//	+ 	+s    CCc                     t               S )u.   Получение текущей версии)cmf_get_versionrm   rn   s     r-   r   z%CmfGlobalSettings.eva_current_version~   s       r/   Nro   branchwanted_timestampc                    t         j                  j                          |st        dd       t        j                  d|      st        dd       || j                         k  rt        dd       || j                         k7  r't        j                  j                  st        dd       |dk7  rt        d	d       t        t        j                  j                         j                               }|r||kD  r|}n|}|||d
}| j                  j!                  d      5 }t#        j$                  ||       d d d        t        d       y # 1 sw Y   xY w)Nu=   Не указана версия для обновления.Tr1   rc   uc   Версия для обновления указана в неправильном формате.uT   Версия меньше текущей, обновление недоступно.ug   На тестовые версии может обновлять только техподдержка.releaseu   Смена на тестовые ветки доступно через ручное обновление техподдржкой.)ro   rs   shedule_timestampwu0   Обновление запланировано.)r(   rd   re   r5   ri   rj   r   r   r7   current_user
is_supportintdatetimenow	timestamp_EVA_SHEDULE_UPGRADE_FILErV   jsondump)rm   ro   rs   rt   now_tsrw   sheduler\   s           r-   r   z%CmfGlobalSettings.eva_shedule_upgrade   s8   --/U^bcxx:GD{  EI  Jc--//luyzc//11!..:S:S  IM  NY  \  ei  jX&&**,6689 06 9 0 &%N_`**//4 	"IIgq!	"DF	" 	"s   E

Ec                     i }| j                   j                         r:| j                   j                         5 }t        j                  |      }d d d        |S |S # 1 sw Y   |S xY wr>   )r   rT   rV   r   load)rm   r   r\   s      r-   r   z.CmfGlobalSettings.eva_current_sheduled_upgrade   sX    ((//1..335 '))A,'w's   AA#c                     t         j                  j                          | j                  j	                         r| j                  j                          t        d       y )Nu&   Обновление отменено.)r(   rd   re   r   rT   unlinkr5   rm   s    r-   r   z$CmfGlobalSettings.eva_cancel_upgrade   sA    --/((//1))002:<r/   restore_on_failc           	         t         j                  j                          t        dd       t	        | j
                        dg}|r|j                  d|        |r|j                  d       	 t        j                  |dddd      }j                  j!                         }|r*t        d|        |j#                  d      }|d   |d   dS t        d       y# t        j                  t        j                  f$ rj}t        j                  d	|j                  |j                  |j                         t        d
| d|j                   d|j                   d       Y d}~d}~ww xY w)u  
        Запуск обновления. На  последнюю официальную, если version is None
        restore_on_fail - автоматический откат при ошибке.
        Возвращаем {'version': ..., 'entry_id': ...} - если обновление запущено.
        None - если обновление не требуется.
        /   Метод обновления устарел.Tr1   z--backgroundz
--version=z--restore-on-fail
   )timeoutcapture_outputchecktextzeva_upgrade: %s error: %s, %suB   Ошибка запуска процесса обновления(z): z, Nu4   Запущен процесс обновления:  r      )ro   entry_idu-   Обновление не требуется.)r(   rd   re   r5   str_EVA_UPDATE_SCRIPTappend
subprocessrunTimeoutExpiredCalledProcessErrorrk   	exceptioncmdstdoutstderrrh   	partition)	rm   ro   r   rn   r!   proceoutputpartss	            r-   r   zCmfGlobalSettings.eva_upgrade   sU    	--/CDQC**+^<KK*WI./KK+,	E>>$4tZ^_D ""$LVHUV$$S)E$QxU1X>>EG )):+H+HI 	E =qxxQRQYQYZZ[\Z]]`abaiai`jjlmnmumulvw  @D  E  E	Es   -C #E&<A E!!E&z%^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}$c                    t         j                  j                          t        dd       g }| j                  j                         rb| j                  j                         D ]E  }| j                  j                  |j                        s)|j                  d|j                  i       G |j                  dd        |S )uE   Возвращаем список истории обновленийr   Tr1   r   c                     | d   S Nr   r?   xs    r-   <lambda>z7CmfGlobalSettings.eva_upgrade_history.<locals>.<lambda>   
    * r/   reversekey)r(   rd   re   r5   _EVA_UPDATE_DIRis_diriterdir_UPDATE_ENTRY_RErj   rG   r   sort)rm   rn   resultentrys       r-   r   z%CmfGlobalSettings.eva_upgrade_history   s     	--/CDQ%%',,446 <''--ejj9MM:uzz":;< 	D&=>r/   c                    t         j                  j                          t        dd       | j                  j                  |      st        dd       | j                  |z  }|j                         st        d| dd       ||dd}g d	}|r|j                  d
       |D ]?  }d||<   ||z  j                         s||z  j                         j                         ||<   A |S )u;  
        Получим информацию об обновлении, with_log - получить лог-файл
        Возвращаем {
            entry_id: ..., datetime: ..., cmd: ..., version_src: ..., version_dst: ..., version_patches: ...,
            status: ..., ret_code: ..., log: ...}
        r   Tr1   u=   Недопустимый формат ID обновленияz
Backup ID u&    не найден на сервереN)r   r|   log)r   version_srcversion_dstversion_patchesstatusret_coder   )r(   rd   re   r5   r   rj   r   rT   r   	read_textrh   )rm   r   with_logrn   
entry_pathr   filesfiles           r-   r   z#CmfGlobalSettings.eva_upgrade_entry   s     	--/CDQ##))%0U^bc((.
  "
5')OPX\]#tD^LL 	EDF4L4'') *4::<BBDt	E r/   zI^(?P<datetime>\d{4}-\d{2}-\d{2}_\d{6})__(?P<timestamp>\d+)__(?P<name>.*)$c                 ,   t         j                  j                          t        dd       g }i }t	        t
              }| j                  j                         r&| j                  j                         D ]  }| j                  j                  |j                        x}rG|j                  |d   g |d   |d   d||j                  <   |j                  ||j                            q|j                         st        j                  |      x}s| j                  j                  |      x}s||   j                  |j                          |j!                         D ]!  \  }}	||v s||   d   j#                  |	       # |j%                  dd	 
       |S )Nr   Tr1   rG   r|   r~   )r   rG   aliasesr|   r~   r   c                     | d   S r   r?   r   s    r-   r   z6CmfGlobalSettings.eva_backup_history.<locals>.<lambda>  r   r/   r   )r(   rd   re   r5   r   list_EVA_BACKUP_DIRr   r   _BACKUP_ENTRY_RErj   rG   r   
is_symlinkrR   readlinkitemsextendr   )
rm   rn   r   idxr   r   rj   targetr   
alias_lists
             r-   r   z$CmfGlobalSettings.eva_backup_history   sm   --/CDQd#%%',,446 	70066uzzBB5B$)JJfRT$)*$5E+DV'XC

O MM#ejj/2%%'r{{57I-IV-I!$!5!5!;!;F!CCCFO**5::6	7 )0 @$*s?M),33J?@ 	D&=>r/   c                 t    t         j                  j                          t        dd       t        dd       y )Nr   Tr1   zTODO get backup detailr(   rd   re   r5   rr   s     r-   r   z"CmfGlobalSettings.eva_backup_entry  s*    --/CDQ*$7r/   c                 t    t         j                  j                          t        dd       t        dd       y )Nr   Tr1   zTODO Background Restorer   )rm   r   rn   s      r-   r   zCmfGlobalSettings.eva_restore  s*    --/CDQ+48r/   c                     t         j                  j                  r$t         j                  j                  j                  S y)uk   
        Хак, т.к. в публичном контексте возвращается acl_deny
        N)r7   global_settingspage_customizer   r   s    r-   public_get_page_customizez+CmfGlobalSettings.public_get_page_customize  s.    
 ++$$33888r/   c                     t         j                  j                  dg      }g d}|D ])  }||   j                  ||   _        |j                          + t        d       y)uv   
        Установить в соответствии с ФСТЭК, включаем все защиты
        r   fields)two_factor_adminsession_timeoutpassword_min_upper_symbolpassword_min_numberspassword_min_special_symbolpassword_min_lengthpassword_max_dayspassword_check_historyauth_admin_mode_reloginauth_inactive_block_daysauth_fail_timeoutauth_fail_try_countauth_fail_permanent_blockaudit_storage_durationlogin_reuse_lockuL   Опции установлены в соответствии с ФСТЭК.N)r(   r   getfstek_defaultvaluer:   r5   )r,   gsfstek_default_fieldsfields       r-   fstek_set_defaultz#CmfGlobalSettings.fstek_set_default%  sa     %%))#)7 
" * 	E i55BuIOGGI	 	`br/   c                 L   t         j                  j                  s7t         j                  j                  st         j
                  st        dd       ddlm}  |t        j                  j                  j                  j                  t        j                  j                         S )Nud   Тестирование сервера доступно только АдминистраторамTr1   r   )performance_server_test_)dbcache)r7   rN   rO   ry   rz   acl_admin_moder5   benchmarks.web_benchmarkr   r(   r)   dpdata_driverengineAPPREDIS_DBredis)rm   r   s     r-   r   z)CmfGlobalSettings.performance_server_testB  sr    ((1J1JSTScSc|  EI  JE'6+;+;+>+>+J+J+Q+Q.1ll.@.@B 	Br/   c                  N   g } t         j                  j                  t        j                   d      sg S t         j                  t        j                   d      D ]G  }t         j                  j                  t        j                   d| d      s7| j                  |       I | S )Nz/custom/pluginsz/custom/plugins/z/enabled)rR   rS   rT   rP   rQ   listdirr   )resplugin_names     r-   enabled_plugin_nclistz'CmfGlobalSettings.enabled_plugin_nclistJ  s    
 ww~~!3!3 4ODEI::););(<<L&MN 	(Kww~~!3!3 44D[MQYZ[

;'	( 
r/   c                    |s*t         j                  j                  d      j                  }|dk(  rt         j                  j	                         }t         j                  j
                  j                  j                  j                         5 }|j                  d| d       d d d        t        j                          |S # 1 sw Y   xY w)NT)TECHCOM_nocachez6CmfGlobalSettings:00000000-0000-0000-0000-000000000001z%update cmf_global_settings set id = '')r(   r   r   idgen_idr   r   r   connectexecute	CMF_CACHEflushdb)rm   gs_id
connections      r-   fix_gsidzCmfGlobalSettings.fix_gsidW  s     ,,000FIIELL ,,335E)),,88??GGI UZ""%J5'QR#STU 	U Us   C  C	CmfGlobalSettings:debug)channelis_debugc                     | t         _        t        j                         j	                  | rt        j                  nt        j
                         t        j                  d|        y )NzSet debug mode to %s)rP   DEBUGrk   	getLoggersetLevelINFOinfo)r  rE   s     r-   _change_debug_tmpz#CmfGlobalSettings._change_debug_tmph  s=      $$hW]]GLLQ+X6r/   c                      t        dd       y )Nr  Tcmf_emit_server_eventr?   r/   r-   start_debug_tmpz!CmfGlobalSettings.start_debug_tmpo  s    7>r/   c                      t        dd       y )Nr  Fr  r?   r/   r-   stop_debug_tmpz CmfGlobalSettings.stop_debug_tmps  s    7?r/   T)rH   closablecolorenabledr  r  r  c                0   |r|st        dd       t        j                  j                  g d      }t        j                  |      |_        ||_        ||_        ||_	        |r"|j                  sdn|j                  dz   |_
        |j                          y)z\SPEC: https://bcrm.carbonsoft.ru/project/Document/DOC-016510?vf=draft#spec-016510-b
        uF   Публикуемый баннер не может быть пуст!Tr1   )announcement_bannerannouncement_banner_closableannouncement_banner_enabledannouncement_banner_colorannouncement_banner_versionr   rM   N)r5   r(   r   r   cmfutil
html_cleanr  r   r"  r!  r#  r:   )rm   rH   r  r  r  r!   rE   r   s           r-   banner_publishz CmfGlobalSettings.banner_publishw  s     7^gkl%%)) * 
 ")!3!3G!<*2'',$)0&686T6TQZ\ZxZx{|Z|B*
	r/   )Nrv   N)NN)Fr>   )6__name__
__module____qualname____doc__r   r   api_methodsr.   r<   r@   r:   staticmethodr   r   r   r   r   r   r   r   rf   r   classmethodr   r   r{   r   r   r   boolr   dictr   ri   compiler   r	   r   r   r   r   r   r   r   r   r   r   r
  on_server_eventr  r  r  r&  __classcell__)rF   s   @r-   r   r      s    &77CC G
 
K&P

- 	=# 	= 	= 	= %4 % % 01O23-.OCD $%N O  " !s ! ! G# Gc Gad G G,   = = H# Ht HZbcgZh H H> zz"JK
tDz 
 
 D  4 zz"no . 8 8 9 9
  c: B B 
 
    677D 7 8 7
 ? ? @ @ 26\`rv C $ VY ko  r/   r   )rX   systimer   stringr   r|   collectionsr   r   pathlibr   r   r   typingr   r	   r
   werkzeug.utilsr   cmf.includemodules.settings.fieldsr   r   r?   r/   r-   <module>r<     sG     
      /  " * * $  7w+== wr/   