
     hmy                         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 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)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"   r4   staff_control_block_workspacesuperr9   )r+   r    kwargs	__class__s      r,   r9   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+,   )r6   current_personis_adminr4   r
   configPROJECT_DIRospathexistsmakedirsopenwritebase64	b64decodesplit)rF   rG   r    rD   	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 )NrI   rJ   )r6   rM   rN   r4   r
   rO   rP   rQ   rR   rS   remove)r\   rF   rZ   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   Недопустимый ответ с сервера.Tr0   )r'   CmfAccessListcheck_admin_mode_EVA_VERSION_FILErS   rU   readstriprematchloggingerrorr4   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rl   rm   s     r,   r   z%CmfGlobalSettings.eva_current_version~   s       r.   Nrn   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=   Не указана версия для обновления.Tr0   rb   uc   Версия для обновления указана в неправильном формате.uT   Версия меньше текущей, обновление недоступно.ug   На тестовые версии может обновлять только техподдержка.releaseu   Смена на тестовые ветки доступно через ручное обновление техподдржкой.)rn   rr   shedule_timestampwu0   Обновление запланировано.)r'   rc   rd   r4   rh   ri   r   r   r6   current_user
is_supportintdatetimenow	timestamp_EVA_SHEDULE_UPGRADE_FILErU   jsondump)rl   rn   rr   rs   now_tsrv   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~   rS   rU   r   load)rl   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'   rc   rd   r~   rS   unlinkr4   rl   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 - если обновление не требуется.
        /   Метод обновления устарел.Tr0   z--backgroundz
--version=z--restore-on-fail
   )timeoutcapture_outputchecktextzeva_upgrade: %s error: %s, %suB   Ошибка запуска процесса обновления(z): , Nu4   Запущен процесс обновления:  r      )rn   entry_idu-   Обновление не требуется.)r'   rc   rd   r4   str_EVA_UPDATE_SCRIPTappend
subprocessrunTimeoutExpiredCalledProcessErrorrj   	exceptioncmdstdoutstderrrg   	partition)	rl   rn   r   rm   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   Tr0   r   c                     | d   S Nr   r>   xs    r,   <lambda>z7CmfGlobalSettings.eva_upgrade_history.<locals>.<lambda>   
    * r.   reversekey)r'   rc   rd   r4   _EVA_UPDATE_DIRis_diriterdir_UPDATE_ENTRY_REri   rF   r   sort)rl   rm   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   Tr0   u=   Недопустимый формат ID обновленияz
Backup ID u&    не найден на сервереN)r   r{   log)r   version_srcversion_dstversion_patchesstatusret_coder   )r'   rc   rd   r4   r   ri   r   rS   r   	read_textrg   )rl   r   with_logrm   
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   Tr0   rF   r{   r}   )r   rF   aliasesr{   r}   r   c                     | d   S r   r>   r   s    r,   r   z6CmfGlobalSettings.eva_backup_history.<locals>.<lambda>  r   r.   r   )r'   rc   rd   r4   r   list_EVA_BACKUP_DIRr   r   _BACKUP_ENTRY_REri   rF   r   
is_symlinkrQ   readlinkitemsextendr   )
rl   rm   r   idxr   r   ri   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   Tr0   zTODO get backup detailr'   rc   rd   r4   rq   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   Tr0   zTODO Background Restorer   )rl   r   rm   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)r6   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valuer9   r4   )r+   gsfstek_default_fieldsfields       r,   fstek_set_defaultz#CmfGlobalSettings.fstek_set_default%  sa     %%))#)7 
" * 	E i55BuIOGGI	 	`br.   c                 :   dd l }t        d   }d }d|fd}dd l}dd l}t        j
                  j                  s't        j                  j                  st        dd       d	d
 dfdd dfdd dfdd dfdd dfdd dfdd dfdd dfdd dfdd dfdd dfg}t        j                  d       |d   \  }}	}
t        j                         }d}|dk  r|d z  }|dk  rt        j                         |z
  } |d!| d"|||	|
#      }t        j                  d$       |d    \  }}	}
d%}t        j                  j                  }d&}d'j                  t!        t"        j$                  d()            }t        j                         }t'        |      D ]#  }|j)                  |j+                  |      |       % t'        |      D ]"  }|j-                  |j+                  |             $ t'        |      D ]"  }|j/                  |j+                  |             $ t        j                         |z
  } |d*| d+|||	|
#      }t        j                  d,       |d-   \  }}	}
d%}d.}d/}d0}d1| d2}d3| d4}|d5z  }|d6j                  d7 t'        d8      D              z  }|d6z  }|d6j                  d9 t'        d8      D              z  }|d:z  }d;| d<}|d=z  }|d6j                  d> t'        d8      D              z  }|d6z  }|d6j                  t'        d8      D cg c]0  }d?d'j                  t!        t"        j0                  d@)             d?2 c}      z  }|d:z  }dA| dB}t2        j4                  j6                  j8                  j:                  j=                         5 }|j?                  |       |j?                  |       t        j                         } 	 t'        |      D ]E  }|j?                  |       |j?                  |j+                  |C             |j?                  |       G t'        |      D ]E  }|j?                  |       |j?                  |j+                  |C             |j?                  |       G 	 t        j                         | z
  }"|j?                  |       d d d         |dD| d+"||	|
#      }#t        j                  dE       |d   \  }}	}
tC        |jE                         d   dFz  dFz  dFz        }$ |dG| dH|$||	|
#      }%t        j                  dI       |dJ   \  }}	}
|jG                         jH                  d%z  }& |dK| dL|&||	|
#      }'t        j                  dM       |dN   \  }}	}
dO}(tJ        jL                  jO                  |(      s |dP| dL      })nEtQ        |(dQ      5 }*tC        |*jS                               d%z  d%z  }+d d d         |dR| dL+||	|
#      })t        j                  dS       |dT   \  }}	}
|jU                         }, |dU| dV|,||	|
#      }-t        j                  dW       |dX   \  }}	}
d%}.dYd%z  }/|jW                         5 }0t        j                         }1	 t'        |.      D ]  }tJ        jQ                  tJ        jL                  j                  |0tY        |            tJ        jZ                  tJ        j\                  z  tJ        j^                  z        }*tJ        ja                  |*|/       tJ        jc                  |*        	 t        j                         |1z
  }2d d d         |dZ|. d[| d"2||	|
#      }3t        j                  d\       |d   \  }}	}
te        jf                  g d]dd^dd_      }4|4jh                  jk                         }5tl        jo                  d`|5      }4|4r|4d   }4nd }4d }6|4r#d'j                  da |4D              }7tq        |7      }6|6r |db| dc|6||	|
#      }8n |dd      }8t        j                  de       |df   \  }}	}
	 te        jf                  dgdhditr        jt                  dj   dk   dltr        jt                  dj   dm   dndodpg	dd^dd_      }9|9jh                  jk                         }:|:jw                         ^};}<}=} |dq| dr|; ds|< dt|= du	|=||	|
#      }>|dx   \  }}	}
d%}@t2        j4                  j6                  j8                  j:                  j=                         5 }g }At'        @      D ]M  }t        j                         }B|j?                  dy       Ajy                  t        j                         |Bz
         O 	 d d d        t{        A      d%z  }CtI        |A      d%z  }Dt}        |A      t        |A      z  d%z  }Et        |A      tC        @dzz  d{z           d%z  }F |d|| dr|Cd}ds|Dd}dt|Ed}d~|Fd}du|E||	|
#      }Gt        j                  d       d'j                  |||#|%|'|)|-|3|8|>|Gg      S c c}w # t@        $ r}! d }!~!ww xY w# 1 sw Y   xY w# 1 sw Y   dxY w# t@        $ r}! d }!~!ww xY w# 1 sw Y    xY w# t@        $ r+}? |dv      }>t        j                  dw|?        Y d }?~?d }?~?ww xY w# 1 sw Y   9xY w)Nr   )greaterlessc                     d|  dS )N<p><span><b>z%</b>: </span><span>Skipped</span></p>r>   )captions    r,   _test_skippedz@CmfGlobalSettings.performance_server_test.<locals>._test_skippedI  s    !'*OPPr.   condc                 R    |dk(  r||k\  }n||k  }|rdnd}d|  d| d ||       dS )Nr   greenredr   z </b>: </span><span style="color:z">z</span></p>r>   )r   
actual_val
cutoff_valfmt_funcr   successcolors          r,   _test_formatz?CmfGlobalSettings.performance_server_test.<locals>._test_formatL  sM    y $
2$
2&GEE!'*J5'QST\]gThSiituur.   ud   Тестирование сервера доступно только АдминистраторамTr0   g       @c                     | ddS Nz.2f    сек.r>   r   s    r,   r   z;CmfGlobalSettings.performance_server_test.<locals>.<lambda>c      qgX. r.   r   g      ?c                     | ddS r   r>   r   s    r,   r   z;CmfGlobalSettings.performance_server_test.<locals>.<lambda>e  r  r.   g      ?c                     | ddS N.1fr  r>   r   s    r,   r   z;CmfGlobalSettings.performance_server_test.<locals>.<lambda>g  r  r.      c                     |  dS )Nu    Гб.r>   r   s    r,   r   z;CmfGlobalSettings.performance_server_test.<locals>.<lambda>i  s    QCv, r.   r      c                     | ddS Nr  z GHzr>   r   s    r,   r   z;CmfGlobalSettings.performance_server_test.<locals>.<lambda>k  s    QsG4. r.   gffffff@c                     | ddS r  r>   r   s    r,   r   z;CmfGlobalSettings.performance_server_test.<locals>.<lambda>m  s    qgTN r.   c                     t        |       S r=   )r   r   s    r,   r   z;CmfGlobalSettings.performance_server_test.<locals>.<lambda>o  s
    #a& r.   c                     | ddS r  r>   r   s    r,   r   z;CmfGlobalSettings.performance_server_test.<locals>.<lambda>q  r  r.   gQ?c                     | ddS )N.3fu    мксек.r>   r   s    r,   r   z;CmfGlobalSettings.performance_server_test.<locals>.<lambda>s  s    #wl3 r.   c                     | ddS Nr  u
    мсек.r>   r   s    r,   r   z;CmfGlobalSettings.performance_server_test.<locals>.<lambda>u      qgZ0 r.   g      @c                     | ddS r  r>   r   s    r,   r   z;CmfGlobalSettings.performance_server_test.<locals>.<lambda>w  r  r.   zStart test 1i@x}rL   u-   Скорость цикла (не более u	    сек.))r   r   r   r   r   zStart test 2i  z_performance_server_test2_{}    )kuG   Производительность Redis (запись/чтение, u    записей)zStart test 3r   zpublic.performance_server_test3BEGINCOMMITzDROP TABLE IF EXISTS ;zCREATE TABLE z (zid integer, r   c              3   (   K   | ]
  }d | d  yw)rF   z integerNr>   .0is     r,   	<genexpr>z<CmfGlobalSettings.performance_server_test.<locals>.<genexpr>  s     >q$qc*>      c              3   (   K   | ]
  }d | d  yw)name_sz varcharNr>   r  s     r,   r  z<CmfGlobalSettings.performance_server_test.<locals>.<genexpr>  s     @&8,@r   z);zINSERT INTO z	 VALUES (z{id}, c              3   "   K   | ]  }|  	 y wr=   r>   r  s     r,   r  z<CmfGlobalSettings.performance_server_test.<locals>.<genexpr>  s     211#2s   '   zDELETE FROM z WHERE id = {id};)iduL   Производительность PostgreSQL (запись/чтение, zStart test 4i   u=   Объем памяти на сервере (не менее u    Гб.)zStart test 5   u6   Частота процессора (не менее  z GHz)zStart test 6   z5/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_frequ5   Частота процессора (не менее ru;   Частота процессора Turbo (не менее zStart test 7   u/   Количество ядер (не менее )zStart test 8   s   xxxxxxxxuN   Производительность запись/чтение на диск (u    файлов, не более zStart test 9)	redis-cliz--intrinsic-latency5   )r   r   r   r   zavg latency: ([\d.]* \w*)c              3   L   K   | ]  }|j                         s|d k(  s|  yw).N)isdigit)r  chars     r,   r  z<CmfGlobalSettings.performance_server_test.<locals>.<genexpr>8  s!     [dllnPTWZPZ[s   $$u?   Тест виртуализации (Redis cli не более u    микросек.)u/   Тест виртуализации (Redis cli)zStart test 10	   r.  z	--latencyz-hdefaulthostz-pportz-ir/  z--rawu$   Latency до Redis (не более u    мс) min u   мс. / max u   мс. / avg u   мс.u*   Latency до Redis (не более 1мс)zTEST 10 Exception: r   z	select 1;d   b   u)   Latency до PostgreSQL (не более r  u   мс. / 98p z
Tests DONE)Atempfiler	   psutilshutilr6   rM   rN   rx   ry   r4   debugtimeAPPREDIS_DBredisjoinr   stringdigitsrangesetformatr   deleteascii_lettersr'   r(   dpdata_driverengineconnectexecute	Exceptionrz   virtual_memorycpu_freqmaxrQ   rR   rS   rU   rf   	cpu_countTemporaryDirectoryr   O_RDWRO_CREATO_SYNCrV   closer   r   r   rg   rh   findallfloatrO   cache_settingsrY   r   minsumlensorted)Hrl   r;  ConditionTyper   r   r<  r=  reference_valuescutoff_valuer   r   startr  
test1_timetest1	key_countredis_dbdb_keynew_captchatest2_start_time
test2_timetest2	row_counttest_table_namebegincommits1s2s3_s4
db_connecttest3_start_timeerr
test3_timetest3	test4_valtest4	test5_valtest5cpufreq_filetest6r[   	test6_val	test7_valtest7
file_counts_8kbtmpdirtest8_start_time
test8_timetest8	test9_restest9_stdout	test9_val	float_strtest9
test10_restest10_stdout
test10_min
test10_max
test10_avgtest10r   	try_counttimingsst
test11_min
test11_max
test11_avg	test11_98test11sH                                                                           r,   r   z)CmfGlobalSettings.performance_server_testC  s    12	Q	v- 	v 	((1J1J|  EI  J .7.7.7&	2()4*I6 ),.73V<0&90&9-
2 	
'7':$h		*nFA *nYY[5(
CL>QZ[!#
 	
'7':$h	<<%%/gggfmms;<99;y! 	8ALLq);7	8y! 	+ALLq)*	+y! 	.AOOFMM!,-	.YY[#33
]^g]hhxy!#
 	
'7':$h	;$_$5Q7_-R0
n
dii>E"I>>>
d

dii@eBi@@@
d
O,I6
h
dii2b	222
d

diiW\]_W`aRS1RWWWV-A-AS%IJK1Mabb
d
O,,?@  ,,33;;= 	#r"r"#yy{y) /A&&u-&&ryyAy7&&v./
 y) /A&&u-&&ryyAy7&&v./ '77Jr"'	#* bclbmm}~!#
 	
'7':$h--/247<TAB	ST`Saahi #
 	
'7':$hOO%))D0	L\NZ_` #
 	
'7':$hNww~~l+!$YZfYggl"mnElC( 8AMD047	8 UVbUcchi$'!E 	
'7':$h$$&	El^STU #
 	
'7':$h
E"((* 		8f#yy{z*  AVSV <bii"**>TWYW`W`>`aAHHQ&HHQK  '77J		8 deodp  qP  Q]  P^  ^g  h!#
 	
'7':$hNN#MUYcevz  BF  G	 ''--/JJ;\J	!!II	[[[Ii(I YZfYggz{$'!E ""STE	 '7':$h	/#k)-v/D/DY/OPV/W)-v/D/DY/OPV/W)-sG)= 04RPT[_	aJ
 '--335M5B5H5H5J2J
J!>|nKXbWccopzo{  |H  IS  HT  TY  Z%'!F (8';$h	  ,,33;;= 	/G9% /YY["";/tyy{2~./	/ \D(
\D(
'lS\1T9
7OC	#b(8$9:TA	?~[YcdgXhhtu  AD  uE  EQ  R\  ]`  Qa  am  nw  x{  m|  |A  B!#
 	
wwueUE5%PUW]_efggs b(  	# 	#x8 8H  		8 		8@  	/"%OQFGG)!-..	/	/ 	/s   5h	
7h B&h1)h + h-i.B(h:i Bi :Aj	hhhh  h*-h7:	i	ii		ii	j" jjj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)rQ   rR   rS   rO   rP   listdirr   )resplugin_names     r,   enabled_plugin_nclistz'CmfGlobalSettings.enabled_plugin_nclistu  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   r   r'  gen_idrK  rL  rM  rN  rO  	CMF_CACHEflushdb)rl   gs_id
connections      r,   fix_gsidzCmfGlobalSettings.fix_gsid  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)rO   DEBUGrj   	getLoggersetLevelINFOinfo)r  rD   s     r,   _change_debug_tmpz#CmfGlobalSettings._change_debug_tmp  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_tmp  s    7>r.   c                      t        dd       y )Nr  Fr  r>   r.   r,   stop_debug_tmpz CmfGlobalSettings.stop_debug_tmp  s    7?r.   T)rG   closabler   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   Публикуемый баннер не может быть пуст!Tr0   )announcement_bannerannouncement_banner_closableannouncement_banner_enabledannouncement_banner_colorannouncement_banner_versionr   rL   N)r4   r'   r   r   cmfutil
html_cleanr  r  r  r  r  r9   )rl   rG   r  r   r  r    rD   r   s           r,   banner_publishz CmfGlobalSettings.banner_publish  s     7^gkl%%)) * 
 ")!3!3G!<*2'',$)0&686T6TQZ\ZxZx{|Z|B*
	r.   )Nru   N)NN)Fr=   )6__name__
__module____qualname____doc__r   r   api_methodsr-   r;   r?   r9   staticmethodr   r   r   r   r   r   r   r   re   r~   classmethodr   r   rz   r   r   r   boolr   dictr   rh   compiler   r   r   r   r   r   r   r   r   r   r   r  r  on_server_eventr  r  r  r  __classcell__)rE   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< oh ohb	 
 
    677D 7 8 7
 ? ? @ @ 26\`rv C $ VY ko  r.   r   )rW   sysr?  r   rD  r   r{   collectionsr   pathlibr   r   r   typingr   r   r	   werkzeug.utilsr
   cmf.includemodules.settings.fieldsr   r   r>   r.   r,   <module>r     sG     
      #  " * * $  7b
+== b
r.   