a
    $ iA                     @   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mZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ G d	d
 d
eZdS )    N)Thread)datetime	timedelta)Interpreter)	TaskQueue)logger)config)SQLitec                       s   e Zd Zedd fddZdd Zeeddd	Zdeee	d
ddZ
eedddZeedddZeedddZdeddddZddddZ  ZS )RulesHandlerN)queuereturnc                    s`   t  jdd t | _|| _g | _t | _t	| jj
d< t| jj
d< t| jj
d< t| jj
d< d S )NT)daemonroundintabsmath)super__init__	threadingEvent
stop_eventr   rulesr   astval_interpreterr   Zsymtabler   r   r   )selfr   	__class__ -/var/aqua_controller/workers/rules_handler.pyr      s    
zRulesHandler.__init__c                 C   s   | j   d S N)r   set)r   r   r   r   stop(   s    zRulesHandler.stop)exprr   c                 C   s    d}dd t j||t jdD S )Nz\{([TS]):(.*?)\}c                 S   s.   i | ]&}| d | d | ddqS )r         typevalue)grouplower).0matchr   r   r   
<dictcomp>1   s   z7RulesHandler.__extract_placeholders.<locals>.<dictcomp>)flags)refinditer
IGNORECASE)r   r!   patternr   r   r   Z__extract_placeholders/   s    z#RulesHandler.__extract_placeholders)r!   type_filterr   c                    sD    d u s   dvrg S | |} fdd| D }t|S d S )N)tsc                    s$   h | ]}|d     kr|d qS r$   )r(   )r)   infor1   r   r   	<setcomp>A   s   z4RulesHandler.__get_values_by_type.<locals>.<setcomp>)r(   #_RulesHandler__extract_placeholdersvalueslist)r   r!   r1   ZplaceholdersZunique_valuesr   r5   r   Z__get_values_by_type<   s    

z!RulesHandler.__get_values_by_typec                 C   s   |  dkr.t }|jd |jd  |j S ttt|	d}t
|dkrf|\}}|d |d  S t
|dkr|\}}}|d |d  | S td| d S )NZcurrent_timei  <   :r#      uF   указан неверный формат времени (HH:MM:SS): )r(   r   nowhourminutesecondr9   mapr   splitlen
ValueError)r   r!   r=   partshmr3   r   r   r   Z__time_to_secondsL   s    
zRulesHandler.__time_to_secondsc              
   C   s   zd|  v r| |ni }| |}| D ]\}}|d   dkrV| |d }nN|d   dkrt||d }|d u rtd| dntd|d  |	|t|}q.|W S  t
y } ztd	| W Y d }~n
d }~0 0 d S )
Nz{s:r%   r2   r&   r3   u/   Отсутствует значение для u    в БДu2   Неизвестный тип параметра: ud   Не удалось осуществить замену параметров на значения: )r(   _RulesHandler__load_to_sqliter7   items_RulesHandler__time_to_secondsstrgetKeyErrorrD   replace	ExceptionRuntimeError)r   r!   Zcondition_type_s_dictZplaceholderZ	structureZreplace_valueer   r   r   Z__replace_placeholders_   s    
z#RulesHandler.__replace_placeholders)	conditionr   c              
   C   s   i }|  |d}|s|S tjddd d}|d u r8tdz|ddd |D }d	| d
}|}t|<}|||}	|	D ]}
|
d ||
d < qx|W  d    W S 1 s0    Y  W n2 ty } ztd| W Y d }~n
d }~0 0 d S )Nr3   
controllerZsqlite_databasessectionkeydefaultu1   Не указан путь к хранилищу.z, c                 s   s   | ]
}d V  qdS )?Nr   )r)   _r   r   r   	<genexpr>       z0RulesHandler.__load_to_sqlite.<locals>.<genexpr>z
				SELECT 	t.r_id,
						t.r_code,
						t.r_create_datetime,
						t.r_value
				FROM 	t_result t
						JOIN (
							SELECT 	r_code,
									MAX(r_create_datetime) AS max_datetime
							FROM 	t_result
							WHERE 	r_code IN (zk)    
							GROUP BY r_code
						) m ON t.r_code = m.r_code AND t.r_create_datetime = m.max_datetime;
			Zr_valueZr_codeuK   Не удалось получить записи из хранилища: )	!_RulesHandler__get_values_by_typer   	get_valuerD   joinr	   Z	query_allrO   rP   )r   rR   resultZcondition_values_by_typeZ"config_controller_sqlite_databasesmaskqueryZparamZdbZrowsrowrQ   r   r   r   Z__load_to_sqlitev   s(    

(zRulesHandler.__load_to_sqlite)r   r   c                    s~  |sd S t jdddd}|D ]Z}i }zd|vr@td| n|d |d< d|v r`|d |d< d|v rt|d |d< d	|v r|d	 |d	< n||d	< d
|vrtd|d  dd}g |d
< |d
 D ]2 t fdddD r|d
   qd} qq|std|d  d| j| W nN tyl } z4td|  t	dt
jdd  W Y d }~n
d }~0 0 td qd S )NrS   Zcron_defaultz	* * * * *rT   nameu   Правило не будет обработано. Отсутствует наименование 'name' для правила: coderR   cronactions   Правило 'u`   ' не будет обработано. Отсутствует список задач 'actions'Tc                 3   s   | ]}| v V  qd S r   r   )r)   rV   Zitem_rules_actionsr   r   rZ      r[   z,RulesHandler.__load_rules.<locals>.<genexpr>ZdevicemethodFu   ' не будет обработано. Не все задачи из списка 'actions', содержат обязательные параметры ['device', 'method']u.   Ошибка загрузки правила: %   Трассировка ошибки: r"   limitg?)r   r]   rM   allappendr   rO   r   errordebug	traceback
format_exctimesleep)r   r   Zconfig_controller_cron_default
item_rulesZtmp_item_rulesZis_valid_actionsrQ   r   rh   r   Z__load_rules   s@    
.zRulesHandler.__load_rules)r   c                 C   s  t d zАzptd}|d ur.| | t| jdkrDtd| j	 s~t
 }| jD ]}zt|d |}|t
}W nb ty } zJt d|d  d|  t d	tjd
d  W Y d }~q^W Y d }~n
d }~0 0 ||td
d k rq^d|v rt|d trz4d|d v r4| |d }n|d }| |}W nh ty } zNd}t d|d  d|  t d	tjd
d  W Y d }~q^W Y d }~n
d }~0 0 nd}nd}|r^g }	zZ|d D ]J}
i }|
 D ]$\}}|dv r|||< qt|tr d|v r$| |n|}| }|drnt|t| }|d | |d
d   }|||< n|dr|d
d   }z$| |}|d ur|n|||< W nD ty } z*t d| d|  |||< W Y d }~n
d }~0 0 n|||< n|||< q|r|	| qW nd ty } zJt d|d  d|  t d	tjd
d  W Y d }~q^W Y d }~n
d }~0 0 zi }t|	dkr|	|d< d|v r|d |d< |rt d|d  d|d  d| d | j|t j!j"st#d| W q^ tyn } zJt d|d  d|  t d	tjd
d  W Y d }~q^W Y d }~q^d }~0 0 q^t$%d
 qDW nN ty } z4t d |  t d	tjd
d  W Y d }~n
d }~0 0 W t d! nt d! 0 d S )"Nu   Поток запущен.r   r   u   Cписок правил пуст. Вероятно правила не были приняты в обработку, ввиду наличия ошибок конфигурации.re   rg   rc   uk   ' не будет обработано. Ошибка формирования расписания 'cron': rk   r"   rl   )secondsrR   {Fub   ' не будет обработано. Ошибка проверки условия 'condition': Trf   ri   z'==u;   Не удалось вычислить выражение 'z': uu   ' не будет обработано. Ошибка формирования списка заданий 'actions': rd   u   Правило: 'u   ' => Расписание: 'u   ' => Задача: ''uI   Не удалось поставить в очередь задание: uj   ' не будет обработано. Ошибка постановки задачи в очередь: u<   Ошибка функциональности потока: u    Поток остановлен.)&r   r4   r   get_section_RulesHandler__load_rulesrC   r   rD   r   is_setr   r=   croniterZget_prevrO   rp   rq   rr   rs   r   
isinstancerK   #_RulesHandler__replace_placeholdersr   rI   lstrip
startswithstripwarningro   r   set_taskr   PriorityLOWrP   rt   ru   )r   Zconfig_rulesZ	this_timerv   ZcitZ	prev_timerQ   Zitem_rules_conditionZis_item_rules_conditionZnew_actionsZitem_actionsZnew_parametrskvZ_vZ_v_strippedZ_len_non_spaceZ_v_newZ_expressionZ_v_evalZnew_taskr   r   r   run   s    


"
$


 
"
&$0zRulesHandler.run)N)N)__name__
__module____qualname__r   r   r    rK   dictr7   r9   r\   r   rJ   r   rH   r|   r   __classcell__r   r   r   r   r
      s   (@r
   )rr   rt   r~   r-   r   r   r   r   r   Zastevalr   core.task_queuer   core.loggerr      core.сonfig_handlerr   Zcore.sqliter	   r
   r   r   r   r   <module>   s   