
    $g$                       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    X/var/www/html/netbox-4.1.3/venv/lib/python3.11/site-packages/watchdog/tricks/__init__.py<lambda>r   +   s    V[[=M=M     )writec                  *    e Zd ZdZedd            ZdS )Trickz'Your tricks should subclass this class.returnstrc                (    d| j          d| j         dS )Nz- .z:
  args:
  - argument1
  - argument2
  kwargs:
    patterns:
    - "*.py"
    - "*.js"
    ignore_patterns:
    - "version.py"
    ignore_directories: false
)
__module____name__)clss    r   generate_yamlzTrick.generate_yaml1   s-    cn  s|    	r   N)r   r   )r   r   __qualname____doc__classmethodr    r   r   r   r   .   s8        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"   selfr%   s     r   on_any_eventzLoggerTrick.on_any_eventD   s    r   Nr%   r   r   r&   )r   r   r   r    echo_eventsr*   r"   r   r   r$   r$   A   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   r/   list[str] | Noner0   r1   boolr2   r3   c                   t                                          |||           || _        || _        || _        d | _        t                      | _        d S )Nr/   r0   r1   )super__init__r4   r2   r3   processset_process_watchers)r)   r4   r/   r0   r1   r2   r3   	__class__s          r   r:   zShellCommandTrick.__init__L   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}"rE   T)shellr"   )
event_typer   r   stringr@   r3   is_process_runningis_directorysrc_pathr4   hasattrrH   safe_substitute
subprocessPopenr;   r2   waitr   r=   add	functoolspartialdiscardprocess_termination_callbackstart)r)   r%   r@   object_typecontextcommandprocess_watchers          r   r*   zShellCommandTrick.on_any_eventb   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   )r6   r=   r;   pollr)   s    r   rL   z$ShellCommandTrick.is_process_running   s8    D*ht|4/G/gDLL]L]L_L_cgLgiiir   )r4   r   r/   r5   r0   r5   r1   r6   r2   r6   r3   r6   r+   )r   r6   )r   r   r   r    r:   r*   rL   __classcell__r>   s   @r   r.   r.   I   s        @@ &*,0#(!&$)< < < < < < < <,($ ($ ($ ($Tj j j j j j j jr   r.   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)r/   r0   r1   stop_signal
kill_afterdebounce_interval_secondsrestart_on_command_exitr\   	list[str]r/   r5   r0   r1   r6   rf   signal.Signalsrg   intrh   ri   c               v   |dk     rd}	t          |	          |dk     rd}	t          |	          t                                          |||           || _        || _        || _        || _        || _        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.r8   F)
ValueErrorr9   r:   r\   rf   rg   rh   ri   r;   r]   event_debouncerrestart_count_is_process_stopping_is_trick_stopping	threadingRLock_stopping_lock)r)   r\   r/   r0   r1   rf   rg   rh   ri   errorr>   s             r   r:   zAutoRestartTrick.__init__   s     >>6EU###$q((EEU###+1 	 	
 	
 	
 &$)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   )rh   events_callback)rh   r
   ro   rY   _start_processr`   s   `r   rY   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)ru   rr   r]   ro   stop_stop_processjoin)r)   r]   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)rr   rQ   rR   r\   getattrosr;   ri   r   ry   r]   rY   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)ru   rq   r]   r~   r;   kill_processpidrf   timerg   r_   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   )rJ   r   r   ro   handle_eventry   r(   s     r   r*   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   )rr   r   r|   rp   r`   s    r   ry   z!AutoRestartTrick._restart_process  sP    " 	Far   )r\   rj   r/   r5   r0   r5   r1   r6   rf   rk   rg   rl   rh   rl   ri   r6   )r   r&   r+   )r   r   r   r    signalSIGINTr:   rY   r~   r|   r   r,   r*   ry   ra   rb   s   @r   rd   rd      s          &*,0#(&,m)*(,&0 &0 &0 &0 &0 &0 &0 &0P   # # # #$) ) ) ). . . .@ $ $ $ [$               r   rd   r   rl   rf   r   r&   c                0    t          j        | |           d S r   )r   killr   rf   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   rl   rf   rl   r   r&   )"r    
__future__r   r   rU   loggingr   r   rQ   rs   r   watchdog.eventsr   r   r   r   watchdog.utilsr   r	   watchdog.utils.event_debouncerr
   watchdog.utils.process_watcherr   	getLoggerr   r   rV   r,   r   r$   r.   rd   
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   