U
    1EhW                     @   s:   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 )    )datetime	timedelta)*)	cmf_auditc                       s   e Zd ZdZejjdg Zdd Z fddZe	d,ddZ
ed-ddZedd Ze fddZe fddZe fddZe fddZe	eddddddd Zdd  Ze	eddd!d"d#d$d% Zd&d' Zed.ed) fd*d+Z  ZS )/CmfAuditTaudit_eventc                 O   s   t ddd d S )Nu>   Невозможно удалить запись Аудита!Tabort)	cmf_alertselfargskwargs r   ./cmf/models/cmf_audit.pydelete   s    zCmfAudit.deletec                    s,   | j r|   t j||S tddd d S )NuJ   Невозможно редактировать запись Аудита!Tr   )Zis_new_log_ib_auditsupersaver
   r   	__class__r   r   r      s    zCmfAudit.saveokN r   c                 C   s  t jr
d S |r(t|tr|}qH|jj}n t jr:t jjj}ntj	 jj}|}t j
rbt j
jrbt j
j}|rt|tstt|tjjr|}q|jj}n|}|s|}|dr|}|dkrd}d }tjrtjd }|sg }|
dkr|dkrd}
d|  } |
dkr|dkrd	}
d
|  } |
dkrPt|jdksBt|jdkrPd}
d|  } |r|
dkrt jrt jt j	krd|  } d}
| ||||||||||
|d}|	rt j| nt j| d S )Nz	CmfAudit:r   u   Таблица Аудитаr   )	CmfPerson   Zuser_)ZCmfPersonGroupZCmfRoleZ
CmfOrgUnitZCmfProjectRoleZCmfProjectPermSchemeRuleZCmfProjectPermSchemeZCmfAccessListZCmfAccessRuleZCmfSecurityLevelRuleZCmfSecurityLevelSchemeZCmfSecurityLevel   Zperm_)defaultZstaticZno_aclr      Zcfg_Zadmin_)operatecmf_model_nameresult_status
cmf_authorparent	client_ip
audit_datahtml_diff_dataparent_nameparent_codesecurity_levelZ	real_user)gZimport_mode
isinstancestridvaluecurrent_usermodelsr   Zsystem_personZsessionreal_user_id
issubclasstypeZcmffieldsZCmfStr
startswithZrequestZaccess_routecmfutilZget_model_by_nameZacl_typeZacl_default_user_policyZacl_admin_modeZcurrent_persondeferred_audit_notrans_listappenddeferred_audit_list)r   r   r    r!   r"   r$   r%   r&   r'   Zignore_transactionr(   Zcheck_is_adminZcmf_author_idr0   Z	parent_idr#   r   r   r   r   r      st    







&
zCmfAudit.audit_eventFc              	   C   s   |rg t _tt dsd S t jt j}|s,d S t r t dt| d |D ]P}|dd }|r|t	|t
r|tj|dd}|s|d }||d< tjf |  qPW 5 Q R X g t _g t _d S )Nr6   zapply_deferred_audit save z audit recsr"   T)Zinclude_deletedr!   )r)   r8   hasattrr6   r5   Zdisable_acldebuglengetr*   r+   Zget_obj_by_idr/   r   r   )clsZrollbackZ
audit_listr   r"   r   r   r   apply_deferred_auditv   s&    

zCmfAudit.apply_deferred_auditc                 C   s*   t jjdds&t jt jkr&tddd d S )NZIBAdmins)Z
group_codeu   Просматривать Аудит безопасности разрешено только Администраторам ИБ из группы IBAdminsTr   )r)   r.   Zin_person_groupZsystem_userr
   )r=   r   r   r   _check_perm_admin_ib   s    zCmfAudit._check_perm_admin_ibc                    sJ   d|krg |d< |d  d t j||}|rF|d jdkrF|   |S Nr3   r(   r   )r7   r   listr(   r?   r=   r   r   resr   r   r   rA      s    zCmfAudit.listc                    sJ   d|krg |d< |d  d t j||}|rF|d jdkrF|   |S r@   )r7   r   slistr(   r?   rB   r   r   r   rD      s    zCmfAudit.slistc                    sF   d|krg |d< |d  d t j||}|rB|jdkrB|   |S r@   )r7   r   r<   r(   r?   rB   r   r   r   r<      s    zCmfAudit.getc                    sF   d|krg |d< |d  d t j||}|rB|jdkrB|   |S r@   )r7   r   sgetr(   r?   rB   r   r   r   rE      s    zCmfAudit.sgetu4   Удаление устаревшего аудитаz@daily)	only_oncedescription
system_jobschedulec                  C   s   t jjj} | sd S t t| d }dd|g}tjj	dg|ddgdgd}|sRd S |d j
}|tdd }| | krddd|gdd|gg}tjj|d t  |tdd7 }qjd S )	NZdayscmf_created_at<r      )order_byfilterslicer3   ZAND)rO   )r)   Zglobal_settingsZaudit_storage_durationr-   r   nowr   r/   r   rA   rK   Z	timestampZbulk_deleteZ
cmf_commit)Zdays_durationZend_dtrO   Zoldest_date_listZoldest_datetimeZmax_datetimer   r   r   cron_delete_outdated_audit   s    


z#CmfAudit.cron_delete_outdated_auditc                 C   s2  ddl }| }||}d}d}| j}tjjj| j }| jj	 }| j
}	| j}
| j}| j}| j}| j}| j}| j}| j }| j}| j}d| d| d| d| d| d| }|d|
 d| d	| d
| 7 }|d| d| 7 }|d|	 d| 7 }|d| d| 7 }|d| d| 7 }|dd}|S )u	  
        Форматирует данные аудита в сообщение для отправки в лог-систему.
        
        Returns:
            str: Отформатированное сообщение для логирования
        r   NZEvaTeamrL   z> 1  z	 operate=z id=z cmf_model_name=z result_status=z cmf_author=z obj=z client_ip=z security_level_str=z
 obj_name=z
 obj_code=z audit_data=z html_diff_data=
)socketZgethostnameZgethostbynamer(   r/   r   choicesrK   r-   Z	isoformatr#   r   r   r    r!   r"   r&   r'   r$   Z	db_formatr%   r,   replace)r   rU   hostname
ip_addressZvendor_nameZproduct_namer(   Zsecurity_level_strZdtr#   r   r   r    r!   objZobj_nameZobj_coder$   r%   r,   messager   r   r   format_audit_message   s6    

( zCmfAudit.format_audit_messagez	@minutely   )rF   rH   rI   priorityc                  C   sb  dd l } dd l}dd l}tjddd tjsJtjr8tjsJtjddd d S tjdtj	 dd d }tjrtjrtj	dkrzRtjd	tj d
tj dd |  | j
| j}|tjttjf td W n: tk
r } ztjd| dd  W 5 d }~X Y nX | }d}g }zz^tjjdddgdgddgd}	|t|	7 }tjd| ddd |	spqd}t|	dD ]J\}
}tjd|
 d| d|j dd d}| }tjrTzHttjd }||d!  W 5 Q R X tjd"|j d#tj dd W nL tk
rR } z,tjd$|j d%| dd d&}|d7 }W 5 d }~X Y nX tjrtjrtj	dkrz0||d'   tjd"|j d(dd W q tk
r } ztjd)|j d%| dd zjtjd*dd |  |  | j
| j}|tjttjf ||d'   tjd+|j d,dd W nZ tk
r } z:tjd-| dd d }d&}|d7 }W Y W Y  qW 5 d }~X Y nX W 5 d }~X Y nX nzd.}|d/}t||kr|d |d0  jd/d1d2}|d37 }|d/}tjd4|j d5t| d6dd |  | j
| j}||tjttjf W 5 Q R X tjd"|j d7dd W nL tk
r } z,tjd8|j d%| dd d&}|d7 }W 5 d }~X Y nX |r~||jj q~tjd9dd z2tjj dd&id:d;|gd<}tjd=| dd W n"   tjd>| dd  Y nX | | d?kr\tjd@| dAdd qtjdB| dCdd |!d q&W n: tk
r } ztjdD| dd  W 5 d }~X Y nX W 5 |r@z|  tjddd W n8 tk
r } ztjd| dd W 5 d }~X Y nX tjdt| d| d| dd X tjdE| |  dd d S )FNr   uH   Запуск процесса экспорта аудит-записейINFO)levelu   Не настроены параметры экспорта (IB_AUDIT_FILE или IB_AUDIT_RSYSLOG_HOST/PORT). Экспорт не выполняется.ZWARNINGuN   Используемый протокол для отправки логов: Ztcpu7   Устанавливаем TCP-соединение с :u>   TCP-соединение успешно установленоuG   Ошибка при установлении TCP-соединения: ZERRORu6   TCP-соединение успешно закрытоu?   Ошибка при закрытии TCP-соединения: u1   Экспорт завершен. Успешно: u   , Ошибок: u   , Всего: need_exportz==Tz**   )rO   r3   rP   u   Найдено u'    записей для экспортаrM   u    Обработка записи /z, ID: DEBUGza+rT   u   Запись ID u-    успешно записана в файл uD   Ошибка при записи в файл для записи ID z: Fz
u-    успешно отправлена по TCPuN   Ошибка при отправке лога по TCP для записи ID u4   Попытка переподключения TCP...u?   Переподключение успешно, запись ID u    отправленаu8   Ошибка при переподключении TCP: i  zutf-82   ignore)errorsz... [TRUNCATED]u*   Сообщение для записи ID u    обрезано до u	    байтu-    успешно отправлена по UDPuN   Ошибка при отправке лога по UDP для записи ID u=   Обновляем статус отправки аудитаr,   IN)valuesrO   u"   Обновлено записей u@   Ошибка обновления статуса записей    uP   Превышен лимит времени 20 секунд обработано u    объектовu   Обработано u    объектов, sleep 1uX   Необработанное исключение в процессе экспорта: u3   Закончили обработку аудита )"rU   loggingtimer)   r:   configIB_AUDIT_FILEIB_AUDIT_RSYSLOG_HOSTIB_AUDIT_RSYSLOG_PORTZIB_AUDIT_RSYSLOG_PROTOZAF_INETZSOCK_STREAMZconnectint	Exceptioncloser;   r/   r   rA   	enumerater,   r\   openwriteZsendallencodedecodeZ
SOCK_DGRAMZsendtor7   r-   Zbulk_updatesleep)rU   rl   rm   Z
tcp_socketestZrecord_countsuccessZerror_countZaudit_recordsidxauditZexport_successr[   fZreconnect_errorZMAX_UDP_SIZEZmessage_bytesZtruncated_messagesrC   r   r   r   cron_log_ib_audit  s    "":

""&&zCmfAudit.cron_log_ib_auditc                 C   s*   t jst jrt jsd S | jdkr&d| _d S )Nr   T)rn   ro   rp   rq   r(   rb   )r   r   r   r   r     s    
zCmfAudit._log_ib_auditcsv)returnc                    s   |s
dg}|sXt  }t |jdd}|tdd }|d}	|d}
d|	 d|
 d}|sndd	d
ddddg}t j|||||dS )Nz-cmf_created_atrM   rJ   z%a %b %d %Yz ["AND",["cmf_created_at",">=", "z"],["cmf_created_at","<=","z"],["security_level","=", 0]]r'   r&   rK   r   r!   zcmf_author.loginr   )rN   )r   rQ   Zyearr   strftimer   export2file)r=   field_namesZbqlZformat_fileZinclude_archivedrN   Zcurrent_dateZ
start_dateZfinish_dateZstart_date_strZfinish_date_strr   r   r   r     s&    


zCmfAudit.export2file)
r   NNNr   NNTr   T)F)NNr   FN)__name__
__module____qualname__Z	api_allowr   r   Zapi_methodsr   r   staticmethodr   classmethodr>   r?   rA   rD   r<   rE   Zcmf_deferred_jobrR   r\   r   r   r+   r   __classcell__r   r   r   r   r      sN                _




, 		r   N)r   r   Zcmf.includeZ
cmf.fieldsr   r   r   r   r   r   <module>   s   