
    tni%                       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j        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!dS ddZ!dS )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                6    t                               |           S N)loggerinfo)msgs    U/var/www/html/gpu-tools/venv/lib/python3.11/site-packages/watchdog/tricks/__init__.py<lambda>r   +   s    V[[=M=M     )writec                  2    e Zd ZdZddZedd            ZdS )Trickz'Your tricks should subclass this class.returnstrc                2    dt          |           j         dS )N<>)type__name__selfs    r   __repr__zTrick.__repr__1   s    )4::&))))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-    cn  s|    	r   N)r   r   )r   r#   __qualname____doc__r    classmethodr%    r   r   r   r   .   sN        11* * * *    [  r   r   c                  *    e Zd ZdZedd            ZdS )	LoggerTrickz*A simple trick that does only logs events.eventr   r   Nonec                    d S r   r)   r   r,   s     r   on_any_eventzLoggerTrick.on_any_eventG   s    r   Nr,   r   r   r-   )r   r#   r&   r'   echo_eventsr0   r)   r   r   r+   r+   D   s8        44   [  r   r+   c                  B     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_processshell_commandr   r5   list[str] | Noner6   r7   boolr8   r9   c                   t                                          |||           || _        || _        || _        d | _        t                      | _        d S )Nr5   r6   r7   )super__init__r:   r8   r9   processset_process_watchers)r   r:   r5   r6   r7   r8   r9   	__class__s          r   r@   zShellCommandTrick.__init__O   sb     	+1 	 	
 	
 	

 + 0#6 7;69eer   r,   r   r   r-   c                   |j         t          t          hv rd S ddlm} | j        r|                                 rd S |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                                         d S t%          | j        d           }| j                            |           t+          j        | j        j        |          |_        |                                 d S )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}"rK   T)shellr)   )
event_typer   r   stringrF   r9   is_process_runningis_directorysrc_pathr:   hasattrrN   safe_substitute
subprocessPopenrA   r8   waitr   rC   add	functoolspartialdiscardprocess_termination_callbackstart)r   r,   rF   object_typecontextcommandprocess_watchers          r   r0   zShellCommandTrick.on_any_evente   s    13MNNNF####### 	(?(?(A(A 	F%*%7CkkV#n! % 0'	
 
 %uk** Y',$sXuk** =-2_)*(G3((7##3>>g>>!'t<<<  		$L,T\4@@O"&&777;D;L&.< <O8 !!#####r   c                r    t          | j        p#| j        d uo| j                                        d u           S r   )r<   rC   rA   pollr   s    r   rR   z$ShellCommandTrick.is_process_running   s8    D*ht|4/G/gDLL]L]L_L_cgLgiiir   )r:   r   r5   r;   r6   r;   r7   r<   r8   r<   r9   r<   r1   )r   r<   )r   r#   r&   r'   r@   r0   rR   __classcell__rD   s   @r   r4   r4   L   s        @@ &*,0#(!&$)< < < < < < < <,($ ($ ($ ($Tj j j j j j j 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_exitrb   	list[str]r5   r;   r6   r7   r<   rk   signal.Signals | intrl   intrm   rn   c                  |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                    | _        d S )Nr   z kill_after must be non-negative.z/debounce_interval_seconds must be non-negative.r>   F)
ValueErrorr?   r@   rb   
isinstancesignalSignalsvaluerk   rl   rm   rn   rA   rc   event_debouncerrestart_count_is_process_stopping_is_trick_stopping	threadingRLock_stopping_lock)r   rb   r5   r6   r7   rk   rl   rm   rn   errorrD   s             r   r@   zAutoRestartTrick.__init__   s     >>6EU###$q((EEU###+1 	 	
 	
 	
 0:;0W0Wh;,,]h$)B&'>$7;6:6:$)!"''o//r   r   r-   c                      j         r7t           j          fd           _         j                                                                           d S )Nc                ,                                     S r   )_restart_process)eventsr   s    r   r   z(AutoRestartTrick.start.<locals>.<lambda>   s    t/D/D/F/F r   )rm   events_callback)rm   r
   rx   r_   _start_processr   s   `r   r_   zAutoRestartTrick.start   sf    ) 	)#1*.*H F F F F$ $ $D   &&(((r   c                b   | j         5  | j        r	 d d d            d S d| _        d d d            n# 1 swxY w Y   | j        }| j        | j                                         |                                  | j        | j                                         ||                                 d S d S )NT)r~   r{   rc   rx   stop_stop_processjoin)r   rc   s     r   r   zAutoRestartTrick.stop   s      	+ 	+& 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ '+D#	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+
 .+ %%''' + %%'''&  """"" '&s   	1155c                   | j         rd S t          j        | j        t	          t
          dd                     | _        | j        r:t          | j        | j	                  | _
        | j
                                         d S d S )Nsetsid)
preexec_fn)r{   rW   rX   rb   getattrosrA   rn   r   r   rc   r_   r   s    r   r   zAutoRestartTrick._start_process   s    " 	F "'XW[A\A\]]]' 	)#1$,@U#V#VD  &&(((((	) 	)r   c                   | j         5  | j        r	 d d d            d S d| _        d d d            n# 1 swxY w Y   	 | j         | j                                         d | _        | j        	 t          | j        j        | j                   t          j                    | j	        z   }t          j                    |k     rE| j        
                                nvt          j        d           t          j                    |k     Et          j        t                    5  t          | j        j        d           d d d            n# 1 swxY w Y   n# t          $ r Y nw xY wd | _        d| _        d S # d| _        w xY w)NTg      ?	   F)r~   rz   rc   r   rA   kill_processpidrk   timerl   re   sleep
contextlibsuppressOSError)r   	kill_times     r   r   zAutoRestartTrick._stop_process   s     	- 	-( 	- 	- 	- 	- 	- 	- 	- 	- )-D%	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-
	.#/$))+++'+$|'> !143CDDD
 !%	do =I)++	11<,,..:!
4((( )++	11 (099 > >()91===> > > > > > > > > > > > > > >    D  $(-D%%%D%----sd   	1155.E. ,E BE. E6E. EE. 	E
E. 
EE. E
E. .	E7r,   r   c                    |j         t          t          hv rd S | j        | j                            |           d S |                                  d S r   )rP   r   r   rx   handle_eventr   r/   s     r   r0   zAutoRestartTrick.on_any_event
  sZ     13MNNNF+ --e44444!!#####r   c                    | j         rd S |                                  |                                  | xj        dz  c_        d S )N   )r{   r   r   ry   r   s    r   r   z!AutoRestartTrick._restart_process  sP    " 	Far   )rb   ro   r5   r;   r6   r;   r7   r<   rk   rp   rl   rq   rm   rq   rn   r<   )r   r-   r1   )r   r#   r&   r'   ru   SIGINTr@   r_   r   r   r   r2   r0   r   rf   rg   s   @r   ri   ri      s          &*,0#(,2M)*(,&0 &0 &0 &0 &0 &0 &0 &0P   # # # #$) ) ) ). . . .@ $ $ $ [$               r   ri   r   rq   rk   r   r-   c                0    t          j        | |           d S r   )r   killr   rk   s     r   r   r     s    
[!!!!!r   c                T    t          j        t          j        |           |           d S r   )r   killpggetpgidr   s     r   r   r   $  s"    
	"*S//;/////r   )r   rq   rk   rq   r   r-   )"r'   
__future__r   r   r[   loggingr   ru   rW   r|   r   watchdog.eventsr   r   r   r   watchdog.utilsr   r	   watchdog.utils.event_debouncerr
   watchdog.utils.process_watcherr   	getLoggerr   r   r\   r2   r   r+   r4   ri   
is_windowsr   r)   r   r   <module>r      s   2 # " " " " "          				           w w w w w w w w w w w w ) ) ) ) ) ) ) ) 9 9 9 9 9 9 9 9 9 9 9 9		8	$	$i	1M1MNNN    '   ,    %   Dj Dj Dj Dj Dj Dj Dj DjNG  G  G  G  G u G  G  G T 8 0" " " " " "
0 0 0 0 0 0r   