U
    }dD                     @   s   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 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)*)cmf_global_settingsc                       s,  e Zd Z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ee dddZeedddZed+eeee dddZedZeee dddZed,edddZed Zed!d" Zed#d$ Zed%d& Z ed'd( Z!ed)d* Z"  Z#S )-CmfGlobalSettingsuF   
    Глобальные настройки приложения
    c                 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cmf_deferred_task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_settings   s    z%CmfGlobalSettings._check_2fa_settingsc                    sJ   |    |   | jjr&| jr&td | jjr<| jr<td t j||S )Nu   Контроль работы включен. Система будет предупреждать о нарушениях сроков.u   Контроль работы включен. Система будет предупреждать и блокировать работу через 1 час в случае нарушения сроков.)r   r   Zstaff_control_enabledr   r   Zstaff_control_block_workspacesuperr   )r   r   kwargs	__class__r   r   r   (   s    zCmfGlobalSettings.save)namecontentc              	   O   s|   t jjstd d S tjtjd}t	j
|s:t	| tj|| }t|d }|t|dd  W 5 Q R X d S )NR   Только администратор может менять настройкиcustom/static/app/assets/imageszwb+,   )r   current_personis_adminr   flaskhelpers	safe_joinconfigPROJECT_DIRospathexistsmakedirsopenwritebase64Z	b64decodesplit)r!   r"   r   r   	file_pathfr   r   r   change_page_settings3   s    
z&CmfGlobalSettings.change_page_settings)namesc                 C   sJ   t jjstd d S | D ],}tjtjd|}t	j
|rt	| qd S )Nr#   r$   )r   r'   r(   r   r)   r*   r+   r,   r-   r.   r/   r0   remove)r9   r!   r6   r   r   r   reset_page_settings?   s    z%CmfGlobalSettings.reset_page_settingsz/var/log/eva_updatez/opt/bin/update.shz/opt/var/backup/)returnc                 K   s0  t j  | j sdS tj| j dddd t	| j d}|dk	rV|
 }nz"tjt| jdgdd	d	d	d
}W nL tjtjfk
r } z&td|j|j|j tdd	d W 5 d}~X Y nX |j }td|std|j|j|j tdd	d tj| j d|dd |W  5 Q R  S Q R X dS )u   
        Получение доступной для обновления последней официальной версии
        '' - обновление не требуется, None - обновление не доступно
        Nz::eva_available_version::lock      )timeoutZblocking_timeoutz*::eva_available_version::available_versionz--check
   Tr?   Zcapture_outputchecktextz'eva_available_version: %s error: %s, %suB   Не удалось получить ответ с сервера.r   z^(\d{2}\.\d{2}\.\d{2}\.\d{4})?$z0eva_available_version: %s invalid output: %s, %su6   Недопустимый ответ с сервера.i,  )ex)r   CmfAccessListcheck_admin_mode_EVA_UPDATE_SCRIPTr0   ZcmfutilZCmfLock
class_nameREDIS_DBgetdecode
subprocessrunstrTimeoutExpiredCalledProcessErrorlogging	exceptioncmdstdoutstderrr   striprematcherrorr   set)cls_kwargsversionprocer   r   r   eva_available_versionP   s:    


   

   z'CmfGlobalSettings.eva_available_versionc                 K   s   t  S )u.   Получение текущей версии)Zcmf_get_versionr[   r\   r   r   r   eva_current_versionn   s    z%CmfGlobalSettings.eva_current_versionN)r]   restore_on_failr<   c           	   
   K   s   t j  t| jdg}|r,|d|  |r:|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 - если обновление не требуется.
        z--backgroundz
--version=z--restore-on-failr@   TrA   zeva_upgrade: %s error: %s, %suB   Ошибка запуска процесса обновления(z): , r   Nu4   Запущен процесс обновления:  r      )r]   entry_idu-   Обновление не требуется.)r   rE   rF   rN   rG   appendrL   rM   rO   rP   rQ   rR   rS   rT   rU   r   rV   	partition)	r[   r]   rc   r\   r   r^   r_   outputpartsr   r   r   eva_upgrades   s"    

4

zCmfGlobalSettings.eva_upgradez%^\d{4}-\d{2}-\d{2}_\d{2}-\d{2}-\d{2}$c                 K   s\   t j  g }| j rF| j D ]"}| j|jr"|	d|ji q"|j
ddd d |S )uE   Возвращаем список истории обновленийrg   Tc                 S   s   | d S Nrg   r   xr   r   r   <lambda>       z7CmfGlobalSettings.eva_upgrade_history.<locals>.<lambda>reversekey)r   rE   rF   _EVA_UPDATE_DIRis_diriterdir_UPDATE_ENTRY_RErX   r!   rh   sort)r[   r\   resultentryr   r   r   eva_upgrade_history   s    

z%CmfGlobalSettings.eva_upgrade_historyFc                 K   s   t j  | j|s"tddd | j| }| sHtd| ddd ||dd}dd	d
dddg}|rr|d |D ],}d||< ||  rv|| 	 
 ||< qv|S )u;  
        Получим информацию об обновлении, with_log - получить лог-файл
        Возвращаем {
            entry_id: ..., datetime: ..., cmd: ..., version_src: ..., version_dst: ..., version_patches: ...,
            status: ..., ret_code: ..., log: ...}
        u=   Недопустимый формат ID обновленияTr   z
Backup ID u&    не найден на сервереN)rg   datetimelogrS   Zversion_srcZversion_dstZversion_patchesstatusZret_coder~   )r   rE   rF   rx   rX   r   ru   r0   rh   Z	read_textrV   )r[   r{   Zwith_logr\   Z
entry_pathrz   filesfiler   r   r   eva_upgrade_entry   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  g }i }tt}| j r| j D ]}| j	|j
 }rz|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 )
Nr!   r}   	timestamp)rg   r!   aliasesr}   r   r   Tc                 S   s   | d S rm   r   rn   r   r   r   rp      rq   z6CmfGlobalSettings.eva_backup_history.<locals>.<lambda>rr   )r   rE   rF   r   list_EVA_BACKUP_DIRrv   rw   _BACKUP_ENTRY_RErX   r!   rh   
is_symlinkr.   readlinkitemsextendry   )
r[   r\   rz   idxr   r{   rX   targetrg   Z
alias_listr   r   r   eva_backup_history   s.    

   z$CmfGlobalSettings.eva_backup_historyc                 K   s   t j  tddd d S )NzTODO get backup detailTr   r   rE   rF   r   ra   r   r   r   eva_backup_entry   s    
z"CmfGlobalSettings.eva_backup_entryc                 K   s   t j  tddd d S )NzTODO Background RestoreTr   r   )r[   r{   r\   r   r   r   eva_restore   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_customizeZjson)r[   r   r   r   public_get_page_customize   s    
z+CmfGlobalSettings.public_get_page_customizec           1      C   s$  dBdd}dd l }dd l}tjjs6tjjs6tddd t }d}|dk rT|d7 }qBt | }d	}|d
krpd}|d|dd|}d}	t	j
j}
d}dttjdd}t }t|	D ]}|
||| qt|	D ]}|
|| qt|	D ]}|
|| qt | }|d|	 d|dd}d}d}d}d}d| d}d| d}|d7 }|dd d! td"D 7 }|d7 }|dd#d! td"D 7 }|d$7 }d%| d&}|d'7 }|dd(d! td"D 7 }|d7 }|dd)d* td"D 7 }|d$7 }d+| d,}tjjjj }|| || t }zpt|D ],}|| ||j|d- || qJt|D ],}|| ||j|d- || qW n& tk
r } z W 5 d }~X Y nX t | }|| W 5 Q R X |d.| d|dd}t| d d/ d/ d/ }d	}|d0k r@d}|d1| d2|}| j d } d	}!| d3k rrd}!|d4| d5d6|!}"d7}#t!j"#|#s|d8d9}$nPt$|#d:}%t|%% d d }&W 5 Q R X d	}'|&d;k rd}'|d<|&d5d6|'}$|& }(d	})|(d0k rd})|d=|(|)}*d}+d>d },t!j"t'j(d?}-t!j"#|-rN|)|- t!*|- t }.zRt|+D ]D}t!$t!j"|-t+|t!j,t!j-B t!j.B }%t!/|%|, t!0|% qjW n& tk
r } z W 5 d }~X Y nX t |. }/|)|- |d@|+ dA|/dd}0d|||||"|$|*|0gS )CNc                 S   s.   |rd|  d| d| dS d|  d| dS )Nz<p><span><b>z </b>: </span><span style="color:z">z</span></p>z</b>: </span><span>r   )Zcaptionrz   Zcolorr   r   r   _test_format   s    z?CmfGlobalSettings.performance_server_test.<locals>._test_formatr   ud   Тестирование сервера доступно только АдминистраторамTr   i@x}r&   Zgreenrf   Zredu6   Скорость цикла (не более 2сек.)z.2fu   сек.i  z_performance_server_test2_{}    kuG   Производительность Redis (запись/чтение, u    записей)u    сек.zpublic.performance_server_test3ZBEGINZCOMMITzDROP TABLE IF EXISTS ;zCREATE TABLE z (zid integer, rd   c                 s   s   | ]}d | dV  qdS )r!   z integerNr   .0ir   r   r   	<genexpr>'  s     z<CmfGlobalSettings.performance_server_test.<locals>.<genexpr>r>   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 )Nr   r   r   r   r   r   .  s     c              	   S   s(   g | ] }d d ttjdd d qS )'r      r   )joinr   stringZascii_letters)r   _r   r   r   
<listcomp>0  s     z=CmfGlobalSettings.performance_server_test.<locals>.<listcomp>zDELETE FROM z WHERE id = {id};)iduL   Производительность PostgreSQL (запись/чтение, i      uD   Объем памяти на сервере (не менее 8Гб.)u   Гб.   u:   Частота процессора (не менее 3GHz)z.1fZGHzz5/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_frequ<   Частота процессора (не менее 3.8GHz)ZSkippedrgffffff@uB   Частота процессора Turbo (не менее 3.8GHz)u1   Количество ядер (не менее 8)s   xxxxxxxxZperformance_servertest4uN   Производительность запись/чтение на диск (u    файлов))N)1psutilshutilr   r'   r(   Zcurrent_userZ
is_supportr   timeZAPPrI   Zredisr   r   r   digitsrangerZ   formatrJ   deleter   r   ZdpZdata_driverZengineZconnectZexecute	ExceptionintZvirtual_memoryZcpu_freqmaxr.   r/   r0   r2   read	cpu_countr,   Z
UPLOAD_DIRrmtreemkdirrN   O_RDWRO_CREATO_SYNCr3   close)1r[   r   r   r   startr   Z
test1_timeZtest1_colorZ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test4_colorZtest4Z	test5_valZtest5_colorZtest5Zcpufreq_fileZtest6r7   Z	test6_valZtest6_colorZ	test7_valZtest7_colorZtest7Z
file_countZs_8kbZ	test_pathZtest8_start_timeZ
test8_timeZtest8r   r   r   performance_server_test   s    













(

z)CmfGlobalSettings.performance_server_test)NN)F)$__name__
__module____qualname____doc__r   r   r   staticmethodrN   r8   r   r;   r   ru   rG   r   classmethodr   r`   rb   booldictrl   rW   compilerx   r   r|   r   r   r   r   r   r   r   __classcell__r   r   r   r   r
      sB   	






r
   )r4   r   rL   r   collectionsr   pathlibr   r   r   typingr   r   Zcmf.includeZmodules.settings.fieldsr	   r
   r   r   r   r   <module>   s   