U
    Įwh\                     @   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mZ d dlm	Z	 d dl
m
Z
mZ d dl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)	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dVeeed,d-d.Zed/d0 Zed1d2 ZedWeeee d3d4d5Z e!"d6Z#ee$e d%d7d8Z%edXe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dYdKdLZ/ee0dMdNedOdPdQZ1edRdS Z2edTdU Z3  Z4S )Z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_settings1   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*   @   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)r3   r4   r   r0   	file_pathfr!   r!   r"   r   L   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 )Nr5   r6   )r(   r9   r:   r'   r   r;   r<   r=   r>   r?   remove)rG   r3   rE   r!   r!   r"   r   X   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?   rA   readstriprematchloggingerrorr'   r   )cls_kwargsrF   versionr!   r!   r"   r   k   s    

z'CmfGlobalSettings.eva_available_versionc                 K   s   t  S )u.   Получение текущей версии)Zcmf_get_versionrU   rV   r!   r!   r"   r   }   s    z%CmfGlobalSettings.eva_current_versionNrelease)rW   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$   rK   uc   Версия для обновления указана в неправильном формате.uT   Версия меньше текущей, обновление недоступно.ug   На тестовые версии может обновлять только техподдержка.rY   u   Смена на тестовые ветки доступно через ручное обновление техподдржкой.)rW   rZ   shedule_timestampwu0   Обновление запланировано.)r   rL   rM   r'   rQ   rR   r   r   r(   current_user
is_supportintdatetimeZnow	timestamp_EVA_SHEDULE_UPGRADE_FILErA   jsondump)rU   rW   rZ   r[   Znow_tsr\   shedulerF   r!   r!   r"   r      s&    
z%CmfGlobalSettings.eva_shedule_upgradec              	   C   s2   i }| j  r.| j  }t|}W 5 Q R X |S r-   )rc   r?   rA   rd   load)rU   rf   rF   r!   r!   r"   r      s
    
z.CmfGlobalSettings.eva_current_sheduled_upgradec                 C   s*   t j  | j r| j  td d S )Nu&   Обновление отменено.)r   rL   rM   rc   r?   unlinkr'   rU   r!   r!   r"   r      s    


z$CmfGlobalSettings.eva_cancel_upgrade)rW   restore_on_failrI   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
   )timeoutZcapture_outputchecktextzeva_upgrade: %s error: %s, %suB   Ошибка запуска процесса обновления(z): , Nu4   Запущен процесс обновления:  r      )rW   entry_idu-   Обновление не требуется.)r   rL   rM   r'   str_EVA_UPDATE_SCRIPTappend
subprocessrunZTimeoutExpiredZCalledProcessErrorrS   	exceptioncmdstdoutstderrrP   	partition)	rU   rW   rj   rV   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   Возвращаем список истории обновленийrk   Tr$   rs   c                 S   s   | d S Nrs   r!   xr!   r!   r"   <lambda>       z7CmfGlobalSettings.eva_upgrade_history.<locals>.<lambda>reversekey)r   rL   rM   r'   _EVA_UPDATE_DIRis_diriterdir_UPDATE_ENTRY_RErR   r3   rv   sort)rU   rV   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: ...}
        rk   Tr$   u=   Недопустимый формат ID обновленияz
Backup ID u&    не найден на сервереN)rs   ra   logrz   Zversion_srcZversion_dstZversion_patchesstatusZret_coder   )r   rL   rM   r'   r   rR   r   r?   rv   	read_textrP   )rU   r   Zwith_logrV   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 )Nrk   Tr$   r3   ra   rb   )rs   r3   aliasesra   rb   r   c                 S   s   | d S r   r!   r   r!   r!   r"   r   
  r   z6CmfGlobalSettings.eva_backup_history.<locals>.<lambda>r   )r   rL   rM   r'   r   list_EVA_BACKUP_DIRr   r   _BACKUP_ENTRY_RErR   r3   rv   
is_symlinkr=   readlinkitemsextendr   )
rU   rV   r   idxr   r   rR   targetrs   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 )Nrk   Tr$   zTODO get backup detailr   rL   rM   r'   rX   r!   r!   r"   r     s    
z"CmfGlobalSettings.eva_backup_entryc                 K   s&   t j  tddd tddd d S )Nrk   Tr$   zTODO Background Restorer   )rU   r   rV   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_customizerd   ri   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    ZgsZfstek_default_fieldsZfieldr!   r!   r"   fstek_set_default$  s*    
z#CmfGlobalSettings.fstek_set_defaultc           2      C   s  dd l }dAdd}dd l}dd l}tjjs>tjjs>tddd t		 }d}|dk r\|d7 }qJt		 | }d	}|d
krxd}|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- || qTt|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 rJd}|d1| d2|} |  j!d }!d	}"|!d3k r|d}"|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		 }/zRt|,D ]D}t"%t"j#|.t)|t"j*t"j+B t"j,B }&t"-|&|- t".|& qLW n& tk
r } z W 5 d }~X Y nX t		 |/ }0W 5 Q R X |d?|, d@|0dd}1d|	||| |#|%|+|1gS )BNr   c                 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captionr   Zcolorr!   r!   r"   _test_formatF  s    z?CmfGlobalSettings.performance_server_test.<locals>._test_formatud   Тестирование сервера доступно только АдминистраторамTr$   i@x}r8   Zgreenrr   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, rp   c                 s   s   | ]}d | dV  qdS )r3   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 (запись/чтение, 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   xxxxxxxxuN   Производительность запись/чтение на диск (u    файлов))N)/tempfilepsutilshutilr(   r9   r:   r^   r_   r'   timeZAPPZREDIS_DBZredisr   r   r   digitsrangesetformatr   deleter   r   dpdata_driverengineconnectexecute	Exceptionr`   Zvirtual_memoryZcpu_freqmaxr=   r>   r?   rA   rO   	cpu_countZTemporaryDirectoryrt   O_RDWRO_CREATO_SYNCrB   close)2rU   r   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test6rF   Z	test6_valZtest6_colorZ	test7_valZtest7_colorZtest7Z
file_countZs_8kbZtmpdirZtest8_start_timeZ
test8_timeZtest8r!   r!   r"   r   B  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<   listdirrv   )resZplugin_namer!   r!   r"   enabled_plugin_nclist  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)rU   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;   DEBUGrS   Z	getLoggerZsetLevelINFOinfo)r   r0   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_tmp)NrY   N)NN)F)N)5__name__
__module____qualname____doc__r
   r   Zapi_methodsr#   r,   r.   r*   staticmethodrt   r   r   r   r   r   ru   r   rN   rc   classmethodr   r   r`   r   r   r   boolr   dictr   rQ   compiler   r   r   r   r   r   r   r   r   r   r   r   r   Zon_server_eventr   r   r   __classcell__r!   r!   r1   r"   r      s   	







	
 

r   )rC   r   rw   r   rd   ra   collectionsr   pathlibr   r   r   typingr   r   Zwerkzeug.utilsr   Zcmf.includeZmodules.settings.fieldsr
   r   r!   r!   r!   r"   <module>   s   