U
    ݥhmy                     @   s   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T d dlmZ G d	d
 d
ejZdS )    N)defaultdict)Path)randomchoices)OptionalListLiteral)	safe_join)*)cmf_global_settingsc                       s  e Zd ZdZejjdddddddd	d
dddddddg Zdd Zdd Zdd Z	 fddZ
eeedddZeedddZed Zed!Zed"Zed#Zed$Zeed%d&d'Zeed%d(d)ZedZeeed,d-d.Zed/d0 Zed1d2 Zed[eeee d3d4d5Z e!"d6Z#ee$e d%d7d8Z%ed\ed%d:d;Z&e!"d<Z'ed=d> Z(ed?d@ Z)edAdB Z*edCdD Z+dEdF Z,edGdH Z-edIdJ Z.ed]dKdLZ/ee0dMdNedOdPdQZ1edRdS Z2edTdU Z3ed*dVd*dVdWeeeedWdXdYZ4  Z5S )^CmfGlobalSettingsuF   
    Глобальные настройки приложения
    performance_server_testZ
public_getZ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                 C   s:   | j js$| jjs$| jjs$| jjs$d S ttjjdgd d S )NT)args)	Zauth_options_allow_base
is_changedZauth_options_allow_oauthZauth_options_allow_ldapZauth_options_allow_ssoschedule_deferred_jobmodels	CmfPersonZaccount_sync_usersself r"   0./modules/settings/models/cmf_global_settings.py_check_auth_settings)   s    z&CmfGlobalSettings._check_auth_settingsc                 C   sV   | j jsd S d}| j s"|dd}t|dd ttjj tj	rRdtj	_
tj	  d S )Nu   Включение двухфакторной авторизации у всех пользователей может занять от 1 до 15 минутu   Включениеu   ВыключениеFabortT)Ztwo_factor_optr   replace	cmf_alertr   r   r   Zinit_2fa_settingsgZsessioncheckedsave)r!   messager"   r"   r#   _check_2fa_settings2   s    z%CmfGlobalSettings._check_2fa_settingsc                 C   s   d S Nr"   r    r"   r"   r#   _check_password_settings>   s    z*CmfGlobalSettings._check_password_settingsc                    sR   |    |   |   | jjr.| jr.td | jjrD| jrDtd t j||S )Nu   Контроль работы включен. Система будет предупреждать о нарушениях сроков.u   Контроль работы включен. Система будет предупреждать и блокировать работу через 1 час в случае нарушения сроков.)	r/   r$   r-   Zstaff_control_enabledr   r(   Zstaff_control_block_workspacesuperr+   )r!   r   kwargs	__class__r"   r#   r+   A   s    zCmfGlobalSettings.save)namecontentc              	   O   st   t jjstd d S ttjd}tj	|s6t
| t|| }t|d }|t|dd  W 5 Q R X d S )NR   Только администратор может менять настройкиcustom/static/app/assets/imageszwb+,   )r)   current_personis_adminr(   r	   configPROJECT_DIRospathexistsmakedirsopenwritebase64Z	b64decodesplit)r4   r5   r   r1   	file_pathfr"   r"   r#   r   M   s    

z&CmfGlobalSettings.change_page_settings)namesc                 C   sF   t jjstd d S | D ](}ttjd|}tj	|rt
| qd S )Nr6   r7   )r)   r:   r;   r(   r	   r<   r=   r>   r?   r@   remove)rH   r4   rF   r"   r"   r#   r   Y   s    z%CmfGlobalSettings.reset_page_settingsz/var/log/eva_updatez/opt/bin/update.shz/opt/var/backup/z$/mnt/shared/config/available_versionz'/mnt/shared/config/shedule_upgrade.json)returnc              	   K   st   t j  | j sdS | j }| d}W 5 Q R X t	d|s`t
d| tddd ||  krpdS |S )u   
        Получение доступной для обновления последней официальной версии
        '' - обновление не требуется, None - обновление не доступно
        N
^(\d{2}\.\d{2}\.\d{2}\.\d{4})?$z)eva_available_version: invalid version %su6   Недопустимый ответ с сервера.Tr%   )r   CmfAccessListcheck_admin_mode_EVA_VERSION_FILEr@   rB   readstriprematchloggingerrorr(   r   )cls_kwargsrG   versionr"   r"   r#   r   l   s    

z'CmfGlobalSettings.eva_available_versionc                 K   s   t  S )u.   Получение текущей версии)Zcmf_get_versionrV   rW   r"   r"   r#   r   ~   s    z%CmfGlobalSettings.eva_current_versionNrelease)rX   branchwanted_timestampc              	   C   s   t j  |stddd td|s2tddd ||  krJtddd ||  krjtj	j
sjtddd |dkr~td	dd ttj  }|r||kr|}n|}|||d
}| jd}t|| W 5 Q R X td d S )Nu=   Не указана версия для обновления.Tr%   rL   uc   Версия для обновления указана в неправильном формате.uT   Версия меньше текущей, обновление недоступно.ug   На тестовые версии может обновлять только техподдержка.rZ   u   Смена на тестовые ветки доступно через ручное обновление техподдржкой.)rX   r[   shedule_timestampwu0   Обновление запланировано.)r   rM   rN   r(   rR   rS   r   r   r)   current_user
is_supportintdatetimeZnow	timestamp_EVA_SHEDULE_UPGRADE_FILErB   jsondump)rV   rX   r[   r\   Znow_tsr]   shedulerG   r"   r"   r#   r      s&    
z%CmfGlobalSettings.eva_shedule_upgradec              	   C   s2   i }| j  r.| j  }t|}W 5 Q R X |S r.   )rd   r@   rB   re   load)rV   rg   rG   r"   r"   r#   r      s
    
z.CmfGlobalSettings.eva_current_sheduled_upgradec                 C   s*   t j  | j r| j  td d S )Nu&   Обновление отменено.)r   rM   rN   rd   r@   unlinkr(   rV   r"   r"   r#   r      s    


z$CmfGlobalSettings.eva_cancel_upgrade)rX   restore_on_failrJ   c           	   
   K   s  t j  tddd t| jdg}|r8|d|  |rF|d ztj|ddddd}W nb tj	tj
fk
r } z<td	|j|j|j td
| d|j d|j dd W 5 d}~X Y nX |j }|rtd|  |d}|d |d dS td dS )u  
        Запуск обновления. На  последнюю официальную, если version is None
        restore_on_fail - автоматический откат при ошибке.
        Возвращаем {'version': ..., 'entry_id': ...} - если обновление запущено.
        None - если обновление не требуется.
        /   Метод обновления устарел.Tr%   z--backgroundz
--version=z--restore-on-fail
   )timeoutcapture_outputchecktextzeva_upgrade: %s error: %s, %suB   Ошибка запуска процесса обновления(z): , Nu4   Запущен процесс обновления:  r      )rX   entry_idu-   Обновление не требуется.)r   rM   rN   r(   str_EVA_UPDATE_SCRIPTappend
subprocessrunZTimeoutExpiredZCalledProcessErrorrT   	exceptioncmdstdoutstderrrQ   	partition)	rV   rX   rk   rW   r   proceoutputpartsr"   r"   r#   r      s$    

4

zCmfGlobalSettings.eva_upgradez%^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}$c                 K   sh   t j  tddd g }| j rR| j D ]"}| j|j	r.|
d|j	i q.|jddd d |S )uE   Возвращаем список истории обновленийrl   Tr%   ru   c                 S   s   | d S Nru   r"   xr"   r"   r#   <lambda>       z7CmfGlobalSettings.eva_upgrade_history.<locals>.<lambda>reversekey)r   rM   rN   r(   _EVA_UPDATE_DIRis_diriterdir_UPDATE_ENTRY_RErS   r4   rx   sort)rV   rW   resultentryr"   r"   r#   r      s    

z%CmfGlobalSettings.eva_upgrade_historyFc                 K   s   t j  tddd | j|s.tddd | j| }| sTtd| ddd ||dd}d	d
ddddg}|r~|d |D ],}d||< ||  r|| 	 
 ||< q|S )u;  
        Получим информацию об обновлении, with_log - получить лог-файл
        Возвращаем {
            entry_id: ..., datetime: ..., cmd: ..., version_src: ..., version_dst: ..., version_patches: ...,
            status: ..., ret_code: ..., log: ...}
        rl   Tr%   u=   Недопустимый формат ID обновленияz
Backup ID u&    не найден на сервереN)ru   rb   logr|   Zversion_srcZversion_dstZversion_patchesstatusZret_coder   )r   rM   rN   r(   r   rS   r   r@   rx   	read_textrQ   )rV   r   Zwith_logrW   Z
entry_pathr   filesfiler"   r"   r#   r      s     


z#CmfGlobalSettings.eva_upgrade_entryzI^(?P<datetime>\d{4}-\d{2}-\d{2}_\d{6})__(?P<timestamp>\d+)__(?P<name>.*)$c           
      K   s   t j  tddd g }i }tt}| j r| j D ]}| j	
|j }r|j|d g |d |d d||j< |||j  q:| r:t| }r:| j	
| }r:|| |j q:| D ]"\}}	||kr|| d |	 q|jdd	d
 d |S )Nrl   Tr%   r4   rb   rc   )ru   r4   aliasesrb   rc   r   c                 S   s   | d S r   r"   r   r"   r"   r#   r     r   z6CmfGlobalSettings.eva_backup_history.<locals>.<lambda>r   )r   rM   rN   r(   r   list_EVA_BACKUP_DIRr   r   _BACKUP_ENTRY_RErS   r4   rx   
is_symlinkr>   readlinkitemsextendr   )
rV   rW   r   idxr   r   rS   targetru   Z
alias_listr"   r"   r#   r      s0    

   z$CmfGlobalSettings.eva_backup_historyc                 K   s&   t j  tddd tddd d S )Nrl   Tr%   zTODO get backup detailr   rM   rN   r(   rY   r"   r"   r#   r     s    
z"CmfGlobalSettings.eva_backup_entryc                 K   s&   t j  tddd tddd d S )Nrl   Tr%   zTODO Background Restorer   )rV   r   rW   r"   r"   r#   r     s    
zCmfGlobalSettings.eva_restorec                 C   s   t jjrt jjjS dS )uk   
        Хак, т.к. в публичном контексте возвращается acl_deny
        N)r)   Zglobal_settingsZpage_customizere   rj   r"   r"   r#   public_get_page_customize  s    
z+CmfGlobalSettings.public_get_page_customizec                 C   s`   t jjdgd}ddddddd	d
dddddddg}|D ]}|| j|| _|  q6td dS )uv   
        Установить в соответствии с ФСТЭК, включаем все защиты
        r
   ZfieldsZtwo_factor_adminZsession_timeoutZpassword_min_upper_symbolZpassword_min_numbersZpassword_min_special_symbolZpassword_min_lengthZpassword_max_daysZpassword_check_historyZauth_admin_mode_reloginZauth_inactive_block_daysZauth_fail_timeoutZauth_fail_try_countZauth_fail_permanent_blockZaudit_storage_durationZlogin_reuse_lockuL   Опции установлены в соответствии с ФСТЭК.N)r   r   getZfstek_defaultvaluer+   r(   )r!   gsZfstek_default_fieldsZfieldr"   r"   r#   fstek_set_default%  s*    
z#CmfGlobalSettings.fstek_set_defaultc           H      C   s  dd l }td }dd }|ddd}dd l}dd l}tjjsRtjjsRt	dd	d
 ddd dfddd dfddd dfddd dfddd dfddd dfddd dfddd dfddd dfddd dfdd d dfg}t
d! |d \}}	}
t }d}|d"k r|d#7 }qt | }|d$| d%|||	|
d&}t
d' |d# \}}	}
d(}tjj}d)}d*ttjd+d,}t }t|D ]}|||| qt|D ]}||| qt|D ]}||| qt | }|d-| d.|||	|
d&}t
d/ |d0 \}}	}
d(}d1}d2}d3}d4| d5}d6| d7}|d87 }|d9d:d; td<D 7 }|d97 }|d9d=d; td<D 7 }|d>7 }d?| d@}|dA7 }|d9dBd; td<D 7 }|d97 }|d9dCdD td<D 7 }|d>7 }dE| dF}tjjjj }|| || t }zpt|D ],}|| ||j|dG || q4t|D ],}|| ||j|dG || qjW n& tk
r }  z W 5 d } ~ X Y nX t | }!|| W 5 Q R X |dH| d.|!||	|
d&}"t
dI |d \}}	}
t |! d dJ dJ dJ }#|dK| dL|#||	|
d&}$t
dM |dN \}}	}
|" j#d( }%|dO| dP|%||	|
d&}&t
dQ |dR \}}	}
dS}'t$j%&|'s|dT| dP}(nDt'|'dU})t |)( d( d( }*W 5 Q R X |dV| dP|*||	|
d&}(t
dW |dX \}}	}
|) }+|dY| dZ|+||	|
d&},t
d[ |d\ \}}	}
d(}-d]d( }.|* }/t }0zRt|-D ]D}t$'t$j%|/t+|t$j,t$j-B t$j.B })t$/|)|. t$0|) qW n& tk
r }  z W 5 d } ~ X Y nX t |0 }1W 5 Q R X |d^|- d_| d%|1||	|
d&}2t
d` |d \}}	}
t1j2dadbdcgd	ddd	d	de}3|3j34 }4t56df|4}3|3r|3d }3nd }3d }5|3rd*dgd; |3D }6t7|6}5|5r|dh| di|5||	|
d&}7n|dj}7t
dk |dl \}}	}
zt1j2dadmdnt8j9do dp dqt8j9do dr dsdcdtg	d	ddd	d	de}8|8j34 }9|9: ^}:};}<}=|du| dv|: dw|; dx|< dy	|<||	|
d&}>W n< tk
r }? z|dz}>t
d{|?  W 5 d }?~?X Y nX |d| \}}	}
d(}@tjjjj >}g }At|@D ]*}t }B|d} |A;t |B  qW 5 Q R X t<|Ad( }Ct#|Ad( }Dt=|At>|A d( }Et?|At |@d~ d  d( }F|d| dv|Cddw|Dddx|Edd|Fddy|E||	|
d&}Gt
d d*|||"|$|&|(|,|2|7|>|GgS )Nr   )greaterlessc                 S   s   d|  dS )N<p><span><b>z%</b>: </span><span>Skipped</span></p>r"   )captionr"   r"   r#   _test_skippedI  s    z@CmfGlobalSettings.performance_server_test.<locals>._test_skipped)condc                 S   sB   |dkr||k}n||k}|r"dnd}d|  d| d|| dS )Nr   ZgreenZredr   z </b>: </span><span style="color:z">z</span></p>r"   )r   
actual_val
cutoff_valfmt_funcr   successcolorr"   r"   r#   _test_formatL  s
    
z?CmfGlobalSettings.performance_server_test.<locals>._test_formatud   Тестирование сервера доступно только АдминистраторамTr%   g       @c                 S   s   | ddS Nz.2f    сек.r"   r   r"   r"   r#   r   c  r   z;CmfGlobalSettings.performance_server_test.<locals>.<lambda>r   g      ?c                 S   s   | ddS r   r"   r   r"   r"   r#   r   e  r   g      ?c                 S   s   | ddS N.1fr   r"   r   r"   r"   r#   r   g  r      c                 S   s
   |  dS )Nu    Гб.r"   r   r"   r"   r#   r   i  r   r      c                 S   s   | ddS Nr   z GHzr"   r   r"   r"   r#   r   k  r   gffffff@c                 S   s   | ddS r   r"   r   r"   r"   r#   r   m  r   c                 S   s   t | S r.   )rv   r   r"   r"   r#   r   o  r   c                 S   s   | ddS r   r"   r   r"   r"   r#   r   q  r   gQ?c                 S   s   | ddS )N.3fu    мксек.r"   r   r"   r"   r#   r   s  r   c                 S   s   | ddS Nr   u
    мсек.r"   r   r"   r"   r#   r   u  r   g      @c                 S   s   | ddS r   r"   r   r"   r"   r#   r   w  r   zStart test 1i@x}r9   u-   Скорость цикла (не более u	    сек.))r   r   r   r   r   zStart test 2i  z_performance_server_test2_{}    kuG   Производительность Redis (запись/чтение, u    записей)zStart test 3rt   zpublic.performance_server_test3ZBEGINZCOMMITzDROP TABLE IF EXISTS ;zCREATE TABLE z (zid integer, rr   c                 s   s   | ]}d | dV  qdS )r4   z integerNr"   .0ir"   r"   r#   	<genexpr>  s     z<CmfGlobalSettings.performance_server_test.<locals>.<genexpr>   c                 s   s   | ]}d | dV  qdS )Zname_sz varcharNr"   r   r"   r"   r#   r     s     z);zINSERT INTO z	 VALUES (z{id}, c                 s   s   | ]}| V  qd S r.   r"   r   r"   r"   r#   r     s     c              	   S   s(   g | ] }d d ttjdd d qS )'r      r   )joinr   stringascii_letters)r   _r"   r"   r#   
<listcomp>  s     z=CmfGlobalSettings.performance_server_test.<locals>.<listcomp>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 9z	redis-cliz--intrinsic-latency5   )rp   rn   ro   rq   zavg latency: ([\d.]* \w*)c                 s   s"   | ]}|  s|d kr|V  qdS ).N)isdigit)r   charr"   r"   r#   r   8  s       u?   Тест виртуализации (Redis cli не более u    микросек.)u/   Тест виртуализации (Redis cli)zStart test 10	   z	--latencyz-hdefaulthostz-pportz-iz--rawu$   Latency до Redis (не более u    мс) min u   мс. / max u   мс. / avg u   мс.u*   Latency до Redis (не более 1мс)zTEST 10 Exception: rm   z	select 1;d   b   u)   Latency до PostgreSQL (не более r   u   мс. / 98p z
Tests DONE)@tempfiler   psutilshutilr)   r:   r;   r_   r`   r(   debugtimeZAPPZREDIS_DBZredisr   r   r   digitsrangesetformatr   deleter   r   dpdata_driverengineconnectexecute	Exceptionra   Zvirtual_memoryZcpu_freqmaxr>   r?   r@   rB   rP   	cpu_countZTemporaryDirectoryrv   O_RDWRO_CREATO_SYNCrC   closery   rz   r}   rQ   rR   findallfloatr<   Zcache_settingsrE   rx   minsumlensorted)HrV   r   ZConditionTyper   r   r   r   Zreference_valuesZcutoff_valuer   r   startr   Z
test1_timeZtest1Z	key_countZredis_dbZdb_keyZnew_captchaZtest2_start_timeZ
test2_timeZtest2Z	row_countZtest_table_nameZbeginZcommits1s2Zs3Zs4Z
db_connectZtest3_start_timeerrZ
test3_timeZtest3Z	test4_valZtest4Z	test5_valZtest5Zcpufreq_fileZtest6rG   Z	test6_valZ	test7_valZtest7Z
file_countZs_8kbZtmpdirZtest8_start_timeZ
test8_timeZtest8Z	test9_resZtest9_stdoutZ	test9_valZ	float_strZtest9Z
test10_resZtest10_stdoutZ
test10_minZ
test10_maxZ
test10_avgr   Ztest10r   Z	try_countZtimingsstZ
test11_minZ
test11_maxZ
test11_avgZ	test11_98Ztest11r"   r"   r#   r   C  s   





















(




       

"
 *
z)CmfGlobalSettings.performance_server_testc                  C   s\   g } t jtj dsg S t tj dD ](}t jtj d| dr.| | q.| S )Nz/custom/pluginsz/custom/plugins/z/enabled)r>   r?   r@   r<   r=   listdirrx   )resZplugin_namer"   r"   r#   enabled_plugin_nclistu  s    z'CmfGlobalSettings.enabled_plugin_nclistc              	   C   s`   |st jjddj}|dkr\t j }t jjjj }|	d| d W 5 Q R X t
  |S )NT)ZTECHCOM_nocachez6CmfGlobalSettings:00000000-0000-0000-0000-000000000001z%update cmf_global_settings set id = 'r   )r   r   r   r   Zgen_idr   r   r   r   r   Z	CMF_CACHEZflushdb)rV   Zgs_idZ
connectionr"   r"   r#   fix_gsid  s    
zCmfGlobalSettings.fix_gsidCmfGlobalSettings:debug)Zchannel)is_debugc                 K   s0   | t _t | rtjntj td|  d S )NzSet debug mode to %s)r<   DEBUGrT   Z	getLoggerZsetLevelINFOinfo)r  r1   r"   r"   r#   _change_debug_tmp  s    z#CmfGlobalSettings._change_debug_tmpc                   C   s   t dd d S )Nr  TZcmf_emit_server_eventr"   r"   r"   r#   start_debug_tmp  s    z!CmfGlobalSettings.start_debug_tmpc                   C   s   t dd d S )Nr  Fr  r"   r"   r"   r#   stop_debug_tmp  s    z CmfGlobalSettings.stop_debug_tmpT)r5   closabler   enabledc                O   sp   |r|st ddd tjjdddddgd	}t||_||_||_||_	|rd|j
sXd
n|j
d
 |_
|  dS )z\SPEC: https://bcrm.carbonsoft.ru/project/Document/DOC-016510?vf=draft#spec-016510-b
        uF   Публикуемый баннер не может быть пуст!Tr%   announcement_bannerannouncement_banner_closableannouncement_banner_enabledannouncement_banner_colorannouncement_banner_versionr   r9   N)r(   r   r   r   ZcmfutilZ
html_cleanr  r  r  r  r  r+   )rV   r5   r  r   r  r   r1   r   r"   r"   r#   banner_publish  s"       z CmfGlobalSettings.banner_publish)NrZ   N)NN)F)N)6__name__
__module____qualname____doc__r   r   Zapi_methodsr$   r-   r/   r+   staticmethodrv   r   r   r   r   r   rw   r   rO   rd   classmethodr   r   ra   r   r   r   boolr   dictr   rR   compiler   r   r   r   r   r   r   r   r   r   r   r  r  Zon_server_eventr  r  r  r  __classcell__r"   r"   r2   r#   r      s   	







	
  3


r   )rD   sysr   ry   r   re   rb   collectionsr   pathlibr   r   r   typingr   r   r   Zwerkzeug.utilsr	   Zcmf.includeZmodules.settings.fieldsr   r   r"   r"   r"   r#   <module>   s   