U
    d%                     @   sb   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	T d dl
mZ G dd dejZdS )	    N)defaultdict)Path)OptionalList)*)cmf_global_settingsc                       s  e Zd Z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  ZS )%CmfGlobalSettingsuF   
    Глобальные настройки приложения
    c                    s$   | j jr| j rtd t j||S )Nu   Контроль работы включен. Система будет предупреждать и блокировать работу через 1 час в случае просроченных задачах.)Zstaff_control_enabledZ
is_changed	cmf_alertsupersave)selfargskwargs	__class__ 0./modules/settings/models/cmf_global_settings.pyr      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+,   )g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_settings   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"   r#   remove)r,   r   r)   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r2   Zcapture_outputchecktextz'eva_available_version: %s error: %s, %suB   Не удалось получить ответ с сервера.abortz^(\d{2}\.\d{2}\.\d{2}\.\d{4})?$z0eva_available_version: %s invalid output: %s, %su6   Недопустимый ответ с сервера.i,  )ex)modelsCmfAccessListcheck_admin_mode_EVA_UPDATE_SCRIPTr#   ZcmfutilZCmfLock
class_nameZ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_version3   s:    


   

   z'CmfGlobalSettings.eva_available_versionc                 K   s   t  S )u.   Получение текущей версии)Zcmf_get_versionrP   rQ   r   r   r   eva_current_versionQ   s    z%CmfGlobalSettings.eva_current_versionN)rR   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-failr3   Tr4   zeva_upgrade: %s error: %s, %suB   Ошибка запуска процесса обновления(z): z, r7   Nu4   Запущен процесс обновления:  r      )rR   entry_idu-   Обновление не требуется.)r:   r;   r<   rC   r=   appendrA   rB   rD   rE   rF   rG   rH   rI   rJ   r	   rK   	partition)	rP   rR   rX   rQ   r   rS   rT   outputpartsr   r   r   eva_upgradeV   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   Возвращаем список истории обновленийr[   Tc                 S   s   | d S Nr[   r   xr   r   r   <lambda>       z7CmfGlobalSettings.eva_upgrade_history.<locals>.<lambda>reversekey)r:   r;   r<   _EVA_UPDATE_DIRis_diriterdir_UPDATE_ENTRY_RErM   r   r\   sort)rP   rQ   resultentryr   r   r   eva_upgrade_historyw   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 обновленияTr7   z
Backup ID u&    не найден на сервереN)r[   datetimelogrH   Zversion_srcZversion_dstZversion_patchesstatusZret_coderr   )r:   r;   r<   rl   rM   r	   ri   r#   r\   Z	read_textrK   )rP   ro   Zwith_logrQ   Z
entry_pathrn   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   rq   	timestamp)r[   r   aliasesrq   rw   rx   Tc                 S   s   | d S ra   r   rb   r   r   r   rd      re   z6CmfGlobalSettings.eva_backup_history.<locals>.<lambda>rf   )r:   r;   r<   r   list_EVA_BACKUP_DIRrj   rk   _BACKUP_ENTRY_RErM   r   r\   
is_symlinkr!   readlinkitemsextendrm   )
rP   rQ   rn   idxrx   ro   rM   targetr[   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 detailTr7   r:   r;   r<   r	   rV   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 RestoreTr7   r   )rP   ro   rQ   r   r   r   eva_restore   s    
zCmfGlobalSettings.eva_restore)NN)F) __name__
__module____qualname____doc__r   staticmethodrC   r+   ry   r.   r   ri   r=   rz   classmethodr   rU   rW   booldictr`   rL   compilerl   r   rp   rv   r{   r   r   r   __classcell__r   r   r   r   r      s6   



r   )r'   rA   collectionsr   pathlibr   typingr   r   Zcmf.includeZmodules.settings.fieldsr   r   r   r   r   r   <module>   s   