Ë
    êmxi%  ã                  ó‚  — d Z ddlmZ 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	Z	ddl
Z
ddlmZmZmZmZ ddlmZmZ ddlmZ ddlmZ  ej.                  e«      Z ej4                  ej"                  d„ ¬	«      Z G d
„ de«      Z G d„ de«      Z G d„ de«      Z G d„ de«      Z ej@                  «       rdd„Z!ydd„Z!y)u·  :module: watchdog.tricks
:synopsis: Utility event handlers.
:author: yesudeep@google.com (Yesudeep Mangalapilly)
:author: contact@tiger-222.fr (MickaÃ«l Schoentgen)

Classes
-------
.. autoclass:: Trick
   :members:
   :show-inheritance:

.. autoclass:: LoggerTrick
   :members:
   :show-inheritance:

.. autoclass:: ShellCommandTrick
   :members:
   :show-inheritance:

.. autoclass:: AutoRestartTrick
   :members:
   :show-inheritance:

é    )ÚannotationsN)ÚEVENT_TYPE_CLOSED_NO_WRITEÚEVENT_TYPE_OPENEDÚFileSystemEventÚPatternMatchingEventHandler)ÚechoÚplatform)ÚEventDebouncer)ÚProcessWatcherc                ó,   — t         j                  | «      S ©N)ÚloggerÚinfo)Úmsgs    úO/home/htdocs/ttos/venv/lib/python3.12/site-packages/watchdog/tricks/__init__.pyú<lambda>r   +   s   € ¼V¿[¹[ÈÓ=M€ ó    )Úwritec                  ó*   — e Zd ZdZdd„Zedd„«       Zy)ÚTrickz'Your tricks should subclass this class.c                ó4   — dt        | «      j                  › d�S )Nú<ú>)ÚtypeÚ__name__©Úselfs    r   Ú__repr__zTrick.__repr__1   s   € Ø”4˜“:×&Ñ&Ð' qÐ)Ð)r   c                ó<   — d| j                   › d| j                  › d�S )Nz- ú.zž:
  args:
  - argument1
  - argument2
  kwargs:
    patterns:
    - "*.py"
    - "*.js"
    ignore_patterns:
    - "version.py"
    ignore_directories: false
)Ú
__module__r   )Úclss    r   Úgenerate_yamlzTrick.generate_yaml4   s'   € à�c—n‘nÐ% Q s§|¡| nð 5ð ð 	r   N)ÚreturnÚstr)r   r!   Ú__qualname__Ú__doc__r   Úclassmethodr#   © r   r   r   r   .   s   „ Ù1ó*ð òó ñr   r   c                  ó"   — e Zd ZdZedd„«       Zy)ÚLoggerTrickz*A simple trick that does only logs events.c                 ó   — y r   r)   ©r   Úevents     r   Úon_any_eventzLoggerTrick.on_any_eventG   s   € àr   N©r.   r   r$   ÚNone)r   r!   r&   r'   Úecho_eventsr/   r)   r   r   r+   r+   D   s   „ Ù4àòó ñr   r+   c                  óX   ‡ — e Zd ZdZddddddœ	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zd	d„Zd
d„Zˆ xZS )ÚShellCommandTrickz6Executes shell commands in response to matched events.NF)ÚpatternsÚignore_patternsÚignore_directoriesÚwait_for_processÚdrop_during_processc               ó€   •— t         ‰| �  |||¬«       || _        || _        || _        d | _        t        «       | _        y )N©r5   r6   r7   )ÚsuperÚ__init__Úshell_commandr8   r9   ÚprocessÚsetÚ_process_watchers)r   r>   r5   r6   r7   r8   r9   Ú	__class__s          €r   r=   zShellCommandTrick.__init__O   sK   ø€ ô 	‰ÑØØ+Ø1ð 	ô 	
ð
 +ˆÔØ 0ˆÔØ#6ˆÔ à7;ˆŒÜ69³eˆÕr   c                ó  — |j                   t        t        hv ry ddlm} | j
                  r| j                  «       ry |j                  rdnd}|j                  d|j                   |dœ}| j                  €!t        |d«      r|j                  |d<   d}n*d	}n't        |d«      r|j                  |d
<   | j                  }  ||«      j                  di |¤Ž}t        j                  |d¬«      | _        | j                   r| j                  j#                  «        y t%        | j                  d «      }| j&                  j)                  |«       t+        j,                  | j&                  j.                  |«      |_        |j3                  «        y )Nr   )ÚTemplateÚ	directoryÚfileÚ )Úwatch_src_pathÚwatch_dest_pathÚwatch_event_typeÚwatch_objectÚ	dest_pathzWecho "${watch_event_type} ${watch_object} from ${watch_src_path} to ${watch_dest_path}"z<echo "${watch_event_type} ${watch_object} ${watch_src_path}"rI   T)Úshellr)   )Ú
event_typer   r   ÚstringrD   r9   Úis_process_runningÚis_directoryÚsrc_pathr>   ÚhasattrrL   Úsafe_substituteÚ
subprocessÚPopenr?   r8   Úwaitr   rA   ÚaddÚ	functoolsÚpartialÚdiscardÚprocess_termination_callbackÚstart)r   r.   rD   Úobject_typeÚcontextÚcommandÚprocess_watchers          r   r/   zShellCommandTrick.on_any_evente   sR  € Ø×ÑÔ 1Ô3MÐNÑNàå#à×#Ò#¨×(?Ñ(?Ô(AØà%*×%7Ò%7‘k¸Vˆà#Ÿn™nØ!Ø %× 0Ñ 0Ø'ñ	
ˆð ×ÑÐ%Ü�u˜kÔ*Ø',§¡�˜Ñ$Øs‘àX‘ä�u˜kÔ*Ø-2¯_©_�Ð)Ñ*Ø×(Ñ(ˆGà3‘(˜7Ó#×3Ñ3Ñ>°gÑ>ˆÜ!×'Ñ'¨°tÔ<ˆŒØ× Ò Ø�L‰L×ÑÕä,¨T¯\©\¸4Ó@ˆOØ×"Ñ"×&Ñ& Ô7Ü;D×;LÑ;LØ×&Ñ&×.Ñ.Øó<ˆOÔ8ð ×!Ñ!Õ#r   c                óˆ   — t        | j                  xs, | j                  d uxr | j                  j                  «       d u «      S r   )ÚboolrA   r?   Úpollr   s    r   rP   z$ShellCommandTrick.is_process_running�   s9   € Ü�D×*Ñ*Òh¨t¯|©|À4Ð/GÒ/gÈDÏLÉL×L]ÑL]ÓL_ÐcgÐLgÓiÐir   )r>   r%   r5   úlist[str] | Noner6   re   r7   rc   r8   rc   r9   rc   r0   )r$   rc   )r   r!   r&   r'   r=   r/   rP   Ú__classcell__©rB   s   @r   r4   r4   L   sb   ø„ Ù@ð &*Ø,0Ø#(Ø!&Ø$)ñ<àð<ð #ð	<ð
 *ð<ð !ð<ð ð<ð "õ<ó,($÷Tjr   r4   c                  ó¢   ‡ — e Zd ZdZdddej
                  ddddœ	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd„Zdd	„Zdd
„Zdd„Z	dd„Z
edd„«       Zdd„Zˆ xZS )ÚAutoRestartTricka  Starts a long-running subprocess and restarts it on matched events.

    The command parameter is a list of command arguments, such as
    `['bin/myserver', '-c', 'etc/myconfig.ini']`.

    Call `start()` after creating the Trick. Call `stop()` when stopping
    the process.
    NFé
   r   T)r5   r6   r7   Ústop_signalÚ
kill_afterÚdebounce_interval_secondsÚrestart_on_command_exitc               óŠ  •— |dk  rd}	t        |	«      ‚|dk  rd}	t        |	«      ‚t        ‰
| �	  |||¬«       || _        t	        |t
        j                  «      r|j                  n|| _        || _	        || _
        || _        d | _        d | _        d | _        d| _        d| _        d| _        t%        j&                  «       | _        y )Nr   z kill_after must be non-negative.z/debounce_interval_seconds must be non-negative.r;   F)Ú
ValueErrorr<   r=   r`   Ú
isinstanceÚsignalÚSignalsÚvaluerk   rl   rm   rn   r?   ra   Úevent_debouncerÚrestart_countÚ_is_process_stoppingÚ_is_trick_stoppingÚ	threadingÚRLockÚ_stopping_lock)r   r`   r5   r6   r7   rk   rl   rm   rn   ÚerrorrB   s             €r   r=   zAutoRestartTrick.__init__�   sË   ø€ ð ˜Š>Ø6ˆEÜ˜UÓ#Ð#Ø$ qÒ(ØEˆEÜ˜UÓ#Ð#ä‰ÑØØ+Ø1ð 	ô 	
ð ˆŒÜ0:¸;ÌÏÉÔ0W˜;×,Ò,Ð]hˆÔØ$ˆŒØ)BˆÔ&Ø'>ˆÔ$à7;ˆŒØ6:ˆÔØ6:ˆÔØˆÔà$)ˆÔ!Ø"'ˆÔÜ'Ÿo™oÓ/ˆÕr   c                ó°   ‡ — ‰ j                   r9t        ‰ j                   ˆ fd„¬«      ‰ _        ‰ j                  j                  «        ‰ j	                  «        y )Nc                ó$   •— ‰j                  «       S r   )Ú_restart_process)Úeventsr   s    €r   r   z(AutoRestartTrick.start.<locals>.<lambda>É   s   ø€ ¨t×/DÑ/DÓ/F€ r   )rm   Úevents_callback)rm   r
   ru   r]   Ú_start_processr   s   `r   r]   zAutoRestartTrick.startÅ   sE   ø€ Ø×)Ò)Ü#1Ø*.×*HÑ*HÛ Fô$ˆDÔ ð × Ñ ×&Ñ&Ô(Ø×ÑÕr   c                óv  — | j                   5  | j                  r
	 d d d «       y d| _        d d d «       | j                  }| j                  �| j                  j	                  «        | j                  «        | j                  �| j                  j                  «        |�|j                  «        y y # 1 sw Y   Œ…xY w)NT)r{   rx   ra   ru   ÚstopÚ_stop_processÚjoin)r   ra   s     r   r„   zAutoRestartTrick.stopÎ   s®   € à× Ñ ñ 	+Ø×&Ò&Ø÷	+ð 	+ð '+ˆDÔ#÷	+ð
 ×.Ñ.ˆØ×ÑÐ+Ø× Ñ ×%Ñ%Ô'Ø×ÑÔð ×ÑÐ+Ø× Ñ ×%Ñ%Ô'ØÐ&Ø× Ñ Õ"ð '÷	+ð 	+ús   �B/¤B/Â/B8c                ó   — | j                   ry t        j                  | j                  t	        t
        dd «      ¬«      | _        | j                  r@t        | j                  | j                  «      | _
        | j                  j                  «        y y )NÚsetsid)Ú
preexec_fn)rx   rU   rV   r`   ÚgetattrÚosr?   rn   r   r   ra   r]   r   s    r   r‚   zAutoRestartTrick._start_processà   sk   € Ø×"Ò"Øô "×'Ñ'¨¯©ÄÌÈXÐW[ÓA\Ô]ˆŒØ×'Ò'Ü#1°$·,±,À×@UÑ@UÓ#VˆDÔ Ø× Ñ ×&Ñ&Õ(ð (r   c                ó:  — | j                   5  | j                  r
	 d d d «       y d| _        d d d «       	 | j                  �!| j                  j                  «        d | _        | j                  �ô	 t        | j                  j                  | j                  «       t        j                  «       | j                  z   }t        j                  «       |k  rH| j                  j                  «       �not        j                  d«       t        j                  «       |k  rŒHt        j                  t        «      5  t        | j                  j                  d«       d d d «       d | _        d| _        y # 1 sw Y   �Œ@xY w# 1 sw Y   Œ%xY w# t        $ r Y Œ3w xY w# d| _        w xY w)NTg      Ð?é	   F)r{   rw   ra   r„   r?   Úkill_processÚpidrk   Útimerl   rd   ÚsleepÚ
contextlibÚsuppressÚOSError)r   Ú	kill_times     r   r…   zAutoRestartTrick._stop_processê   sP  € à× Ñ ñ 	-Ø×(Ò(Ø÷	-ð 	-ð )-ˆDÔ%÷	-ð
	.Ø×#Ñ#Ð/Ø×$Ñ$×)Ñ)Ô+Ø'+�Ô$à�|‰|Ð'ð>Ü  §¡×!1Ñ!1°4×3CÑ3CÔDô
 !%§	¡	£¨d¯o©oÑ =�IÜŸ)™)›+¨	Ò1ØŸ<™<×,Ñ,Ó.Ð:Ø!ÜŸ
™
 4Ô(ô Ÿ)™)›+¨	Ó1ô (×0Ñ0´Ó9ñ >Ü(¨¯©×)9Ñ)9¸1Ô=÷>à#�”à(-ˆDÕ%÷9	-ñ 	-ú÷0>ð >ûô ò áðûð ).ˆDÕ%ús^   �E)¤E)´9F Á.*F ÂA?F ÄF Ä1!E6ÅF Å)E3Å6E?Å;F Æ	FÆF ÆFÆF Æ	Fc                ó¦   — |j                   t        t        hv ry | j                  �| j                  j	                  |«       y | j                  «        y r   )rN   r   r   ru   Úhandle_eventr   r-   s     r   r/   zAutoRestartTrick.on_any_event
  sF   € à×ÑÔ 1Ô3MÐNÑNàà×ÑÐ+Ø× Ñ ×-Ñ-¨eÕ4à×!Ñ!Õ#r   c                óˆ   — | j                   ry | j                  «        | j                  «        | xj                  dz  c_        y )Né   )rx   r…   r‚   rv   r   s    r   r   z!AutoRestartTrick._restart_process  s7   € Ø×"Ò"ØØ×ÑÔØ×ÑÔØ×Ò˜aÑÖr   )r`   z	list[str]r5   re   r6   re   r7   rc   rk   zsignal.Signals | intrl   Úintrm   rš   rn   rc   )r$   r1   r0   )r   r!   r&   r'   rr   ÚSIGINTr=   r]   r„   r‚   r…   r2   r/   r   rf   rg   s   @r   ri   ri   “   s¥   ø„ ñð &*Ø,0Ø#(Ø,2¯M©MØØ)*Ø(,ñ&0àð&0ð #ð	&0ð
 *ð&0ð !ð&0ð *ð&0ð ð&0ð $'ð&0ð "&õ&0óPó#ó$)ó.ð@ ò$ó ð$÷ r   ri   c                ó0   — t        j                  | |«       y r   )r‹   Úkill©r�   rk   s     r   rŽ   rŽ     s   € Ü
�‰��[Õ!r   c                óV   — t        j                  t        j                  | «      |«       y r   )r‹   ÚkillpgÚgetpgidrž   s     r   rŽ   rŽ   $  s   € Ü
�	‰	”"—*‘*˜S“/ ;Õ/r   )r�   rš   rk   rš   r$   r1   )"r'   Ú
__future__r   r’   rY   Úloggingr‹   rr   rU   ry   r�   Úwatchdog.eventsr   r   r   r   Úwatchdog.utilsr   r	   Úwatchdog.utils.event_debouncerr
   Úwatchdog.utils.process_watcherr   Ú	getLoggerr   r   rZ   r2   r   r+   r4   ri   Ú
is_windowsrŽ   r)   r   r   ú<module>rª      s´   ðñõ2 #ã Û Û Û 	Û Û Û Û ç wÓ wß )Ý 9Ý 9à	ˆ×	Ñ	˜8Ó	$€Øˆi×Ñ §	¡	Ñ1MÔN€ôÐ'ô ô,�%ô ôDj˜ô DjôNG �uô G ðT €8×ÑÔô"ô
0r   