
    g                     &   d 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	  G d de	j                        Z G d dej                        Z G d d	e      Z ed
di      Zd Z G d dej$                        Zedk(  r ej*                  e       yy)z$Windows service.

Requires pywin32.
    N)wspbuspluginsc                   (    e Zd ZdZd Zd Zd Zd Zy)ConsoleCtrlHandlerz@A WSPBus plugin for handling Win32 console events (like Ctrl-C).c                 R    d| _         t        j                  j                  | |       y )NF)is_setr   SimplePlugin__init__)selfbuss     +/opt/Tautulli/lib/cherrypy/process/win32.pyr
   zConsoleCtrlHandler.__init__   s    %%dC0    c                 P   | j                   r| j                  j                  dd       y t        j                  | j
                  d      }|dk(  r3| j                  j                  dt        j                         z  d       y | j                  j                  dd       d	| _         y )
Nz'Handler for console events already set.   level   r   z*Could not SetConsoleCtrlHandler (error %r)(   zSet handler for console events.T)r   r   logwin32apiSetConsoleCtrlHandlerhandleGetLastErrorr   results     r   startzConsoleCtrlHandler.start   s    ;;HHLLB"LM//Q?Q;HHLLE!..018:  < HHLL:"LEDKr   c                 t   | j                   s| j                  j                  dd       y 	 t        j                  | j
                  d      }|dk(  r3| j                  j                  dt        j                         z  d       y | j                  j                  dd       d	| _         y # t        $ r d}Y jw xY w)
Nz'Handler for console events already off.r   r   r   r   z1Could not remove SetConsoleCtrlHandler (error %r)r   z#Removed handler for console events.F)r   r   r   r   r   r   
ValueErrorr   r   s     r   stopzConsoleCtrlHandler.stop$   s    {{HHLLB"LM	33DKKCF
 Q;HHLLL!..018:  < HHLL>bLIDK  	F	s    B) )B76B7c                 T   |t         j                  t         j                  t         j                  t         j                  t         j
                  fv rJ| j                  j                  d|z         	 | j                          | j                  j                          yy# t        $ r Y 'w xY w)z,Handle console control events (like Ctrl-C).z#Console event %s: shutting down busr   r   )win32conCTRL_C_EVENTCTRL_LOGOFF_EVENTCTRL_BREAK_EVENTCTRL_SHUTDOWN_EVENTCTRL_CLOSE_EVENTr   r   r   r   exit)r   events     r   r   zConsoleCtrlHandler.handle6   s    X**H,F,F..0L0L..0 0 HHLL>FG		 HHMMO  s   /B 	B'&B'N)__name__
__module____qualname____doc__r
   r   r   r    r   r   r   r      s    J1 $r   r   c                   X    e Zd ZdZd Zd Zed        Zej                  d        ZddZ	y)	Win32BuszA Web Site Process Bus implementation for Win32.

    Instead of time.sleep, this bus blocks using native win32event
    objects.
    c                 P    i | _         t        j                  j                  |        y N)eventsr   Busr
   r   s    r   r
   zWin32Bus.__init__P   s    

D!r   c                     	 | j                   |   S # t        $ rO t        j                  dddd|j                  dt        j                         d      }|| j                   |<   |cY S w xY w)z@Return a win32event for the given state (creating it if needed).Nr   zWSPBus z Event (pid=))r2   KeyError
win32eventCreateEventnameosgetpid)r   stater(   s      r   _get_state_eventzWin32Bus._get_state_eventT   sf    	;;u%% 	**4A,1JJ		,EFE "'DKKL	s    AA)(A)c                     | j                   S r1   )_stater4   s    r   r=   zWin32Bus.state_   s    {{r   c                 ^    || _         | j                  |      }t        j                  |       y r1   )r@   r>   r8   
PulseEvent)r   valuer(   s      r   r=   zWin32Bus.statec   s'    %%e,e$r   Nc                 ~   t        |t        t        f      r]| j                  |vrNt        |D cg c]  }| j	                  |       c}      }t        j                  |dt
        j                         yy| j                  |k7  r6| j	                  |      }t        j                  |t
        j                         yyc c}w )zWait for the given state(s), KeyboardInterrupt or SystemExit.

        Since this class uses native win32event objects, the interval
        argument is ignored.
        r   N)	
isinstancetuplelistr=   r>   r8   WaitForMultipleObjectsINFINITEWaitForSingleObject)r   r=   intervalchannelsr2   r(   s          r   waitzWin32Bus.waiti   s     eeT]+zz&%HQ 5 5a 8HI11Az224 ' zzU"--e4..uj6I6IJ #  Is   B:)g?N)
r)   r*   r+   r,   r
   r>   propertyr=   setterrN   r-   r   r   r/   r/   I   sC    "	   \\% %
Kr   r/   c                       e Zd ZdZd Zy)_ControlCodesa)  Control codes used to "signal" a service via ControlService.

    User-defined control codes are in the range 128-255. We generally use
    the standard Python value for the Linux signal and add 128. Example:

        >>> signal.SIGUSR1
        10
        control_codes['graceful'] = 128 + 10
    c                 ^    | j                         D ]  \  }}||u s|c S  t        d|z        )z2For the given value, return its corresponding key.z'The given object could not be found: %r)itemsr   )r   objkeyvals       r   key_forz_ControlCodes.key_for   s:    

 	HCcz
	 BSHIIr   N)r)   r*   r+   r,   rX   r-   r   r   rR   rR   |   s    Jr   rR   graceful   c                     |dk(  rt        j                  |        y |dk(  rt        j                  |        y t        j                  | t        |          y )Nr   restart)win32serviceutilStopServiceRestartServiceControlServicecontrol_codes)servicecommands     r   signal_childrd      sC    &$$W-	I	''0''w1GHr   c                   :    e Zd ZdZdZdZdZdZdZdZ	d Z
d Zd Zy)PyWebServicezPython Web Service.zPython Web ServiceNpywebsvcc                 x    ddl m} |j                  j                          |j                  j	                          y Nr   )process)cherrypyrj   r   r   blockr   rj   s     r   SvcDoRunzPyWebService.SvcDoRun   s%    $r   c                     ddl m} | j                  t        j                         |j
                  j                          y ri   )rk   rj   ReportServiceStatuswin32serviceSERVICE_STOP_PENDINGr   r'   rm   s     r   SvcStopzPyWebService.SvcStop   s)    $  !B!BCr   c                 l    ddl m} |j                  j                  t        j                  |             y ri   )rk   rj   r   publishra   rX   )r   controlrj   s      r   SvcOtherzPyWebService.SvcOther   s"    $M11':;r   )r)   r*   r+   r,   
_svc_name__svc_display_name_
_svc_deps_
_exe_name_
_exe_args__svc_description_rn   rs   rw   r-   r   r   rf   rf      s6    %J-JJJ -

<r   rf   __main__)r,   r;   r   r!   r8   rq   r]   cherrypy.processr   r   r	   r   r3   r/   dictrR   ra   rd   ServiceFrameworkrf   r)   HandleCommandLiner-   r   r   <module>r      s   
 
      ,6-- 6r0Kvzz 0KfJD J& z3/0I<#44 <6 z&&&|4 r   