
    fb                     $   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 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 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 ddlmZ  G d d      Z G d d      Zej4                  j6                  ej4                  j8                  ej4                  j:                  fZ G d dej>                        Z  G d dejB                        Z"d Z# G d d      Z$d Z%d Z& G d de$      Z'd dZ(e)dk(  r e(        yy)!a  supervisorctl -- control applications run by supervisord from the cmd line.

Usage: %s [options] [action [arguments]]

Options:
-c/--configuration FILENAME -- configuration file path (searches if not given)
-h/--help -- print usage message and exit
-i/--interactive -- start an interactive shell after executing commands
-s/--serverurl URL -- URL on which supervisord server is listening
     (default "http://localhost:9001").
-u/--username USERNAME -- username to use for authentication with server
-p/--password PASSWORD -- password to use for authentication with server
-r/--history-file -- keep a readline history (if readline is available)

action [arguments] -- see below

Actions are commands like "tail" or "stop".  If -i is specified or no action is
specified on the command line, a "shell" interpreting actions typed
interactively is started.  Use the action "help" to find out about available
actions.
    N)	xmlrpclib)urlparse)unicode)	raw_input)	as_string)asyncore_25)ClientOptionsmake_namespec)split_namespec)xmlrpc)states)http_clientc                   (    e Zd ZdZdZdZdZdZdZdZ	y)	LSBInitExitStatusesr                     N)
__name__
__module____qualname__SUCCESSGENERICINVALID_ARGSUNIMPLEMENTED_FEATUREINSUFFICIENT_PRIVILEGESNOT_INSTALLEDNOT_RUNNING     :/usr/lib/python3/dist-packages/supervisor/supervisorctl.pyr   r   /   s'    GGLMKr#   r   c                       e Zd ZdZdZy)LSBStatusExitStatusesr   r   N)r   r   r   r!   UNKNOWNr"   r#   r$   r&   r&   8   s    KGr#   r&   c                   :    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
y	)
fgthreadz A subclass of threading.Thread, with a kill() method.
    To be used for foreground output/error streaming.
    http://mail.python.org/pipermail/python-list/2004-May/260937.html
    c                 &   t         j                  j                  |        d| _        || _        || _        t        j                         | _        t        j                  | j                  | j
                  j                  j                  | j
                  j                  j                        | _        t        j                  | j                  | j
                  j                  j                  | j
                  j                  j                        | _        y )NF)	threadingThread__init__killedprogramctlr   ListenerlistenerHTTPHandleroptionsusernamepasswordoutput_handlererror_handler)selfr/   r0   s      r$   r-   zfgthread.__init__F   s    !!$'#,,.)55dmm6:hh6F6F6O6O6:hh6F6F6O6OQ )44T]]59XX5E5E5N5N59XX5E5E5N5NPr#   c                     | j                   | _        | j                  | _         t        j                  j                  |        y N)run_fgthread__run_backup_fgthread__runr+   r,   startr9   s    r$   r?   zfgthread.startS   s-     HH::t$r#   c                 H   | j                   j                  | j                  j                  j                  d| j
                  z         | j                  j                  | j                  j                  j                  d| j
                  z         t        j                          y )Nz/logtail/%s/stdoutz/logtail/%s/stderr)	r7   getr0   r4   	serverurlr/   r8   asyncoreloopr@   s    r$   r<   zfgthread.runY   sq     0 0 : : 4t|| C	Etxx//993dllB	Dr#   c                     t        j                  | j                         | j                          | j                  | _        y r;   )syssettraceglobaltracer=   r<   r@   s    r$   __runzfgthread.__run`   s-    T%%&$$r#   c                 &    |dk(  r| j                   S y )Ncall)
localtracer9   framewhyargs       r$   rI   zfgthread.globaltracef   s    &=??"r#   c                 P    | j                   r|dk(  r
t               | j                  S )Nline)r.   
SystemExitrM   rN   s       r$   rM   zfgthread.localtracel   s"    ;;f} l"r#   c                 z    | j                   j                          | j                  j                          d| _        y )NT)r7   closer8   r.   r@   s    r$   killzfgthread.killr   s-    !!#  "r#   N)r   r   r   __doc__r-   r?   r<   r>   rI   rM   rW   r"   r#   r$   r)   r)   @   s+    
P%%r#   r)   c                       e Zd Z	 	 ddZd Zd Zd ZddZd Zd Z	d	 Z
d
 ZddZd ZddZd Zd Zd Zd Zd Zd Zd Zd Zy)
ControllerNc                 P   || _         | j                   j                  dz   | _        g | j                   _        dg| _        d | _        t
        j                  | _        t        j                  j                  | |||       | j                   j                  D ]  \  }}} || fi |}t        |      D ]H  }	|	j                  d      st        t        ||	            s+| j                  j!                  |	dd         J | j                   j                  j!                  |       ||_         y )Nz> helpdo_r   )r4   promptpluginsvocab_complete_infor   r   
exitstatuscmdCmdr-   plugin_factoriesdir
startswithcallablegetattrappendname)
r9   r4   completekeystdinstdoutrk   factorykwargspluginas
             r$   r-   zController.__init__y   s    ll))D0!X
"-55{E6:%)\\%B%B 	!D'6T,V,F[ -<<&8GFA4F+GJJ%%ae,- LL  ''/FK	r#   c                      y r;   r"   r@   s    r$   	emptylinezController.emptyline   s    r#   c                 V    | j                  d|z         t        j                  | _        y )Nz*** Unknown syntax: %s)outputr   r   rb   )r9   rS   s     r$   defaultzController.default   s!    ,t34-55r#   c                    	 dd l j                         }|j                  dd      }|j                  dd      }|j                  dd      }j                  |       j                  r7	 j                  j                         fd}dd l}|j                  |       	 | j                  j                  d       | j                          y # t        $ r Y Sw xY w# t        $ r Y Gw xY w# t        $ r | j                  d       Y y w xY w)Nr   : *-c                  \    	 j                   j                         y # t        $ r Y y w xY wr;   )write_history_filehistory_fileIOError)r4   readlines   r$   savez%Controller.exec_cmdloop.<locals>.save   s.     33G4H4HI" s    	++status)r   get_completer_delimsreplaceset_completer_delimsr   read_history_filer   atexitregisterImportErrorcmdqueuerj   cmdloopKeyboardInterruptrv   )r9   argsr4   delimsr   r   r   s     `   @r$   exec_cmdloopzController.exec_cmdloop   s    	224F^^C,F^^C,F^^C,F))&1##..w/C/CD %	MM  *LLN    		
 ! 	KKO	sH   A'C ,C C #+C- 	CC CC 	C*)C*-D
	D
c                     ||t         j                  j                  fv ry |t        v rt        j
                  | _        y t        j                  | _        y r;   )r   Faultsr   DEAD_PROGRAM_FAULTSr   r!   rb   r   )r9   	faultcodeignored_faultcodes      r$    set_exitstatus_from_xmlrpc_faultz+Controller.set_exitstatus_from_xmlrpc_fault   s@    *FMM,A,ABB--1==DO199DOr#   c           	         | j                  |      \  }}}|s| j                         S || j                  |      S d| _        || _        |dk(  r| j                  |      S | j                  |      }|| j                  |      S 	 	  ||      S # t        j                  $ r}|j                  dk(  r| j                  j                  r{| j                  d       t        d      }t        j                  d      }| j                  d       || j                  _        || j                  _        | j!                  |      cY d}~S | j                  d       t"        j$                  | _        nt"        j$                  | _         Y d}~nd}~ww xY w ||       y# t(        $ rT t+        j,                         \  \  }}	}}
}}d|
d	|d
|d|}| j                  |       t"        j$                  | _        Y yw xY w)z Override the onecmd method to:
          - catch and print all exceptions
          - call 'do_foo' on plugins rather than ourself
        Nrz   i  zServer requires authenticationz	Username:z	Password:)r^   zerror: z, z: file: z line: )	parselinert   rw   ra   lastcmd_get_do_funcr   ProtocolErrorerrcoder4   interactiverv   r   getpassr5   r6   onecmdr   r   rb   	ExceptionrD   compact_traceback)r9   rS   rc   rQ   do_funcer5   r6   filefuntvtbinfoerrors                 r$   r   zController.onecmd   s   
 -S$>>##;<<%%""9<<%%'',G||D))>"3<' .. yyC'<<33 KK(HI'0'=H'.k'JH KKO4<DLL14<DLL1#';;t#44 KK(HI.A.I.IDO*=*E*E ,   >2:2L2L2N/!sD1a>?D$OE""5"="=	>sD   B F BF:F;F  =F=F FF AG0/G0c                     d|z   }t        | |d       }|s-| j                  j                  D ]  }t        ||d       }| |S  |S )Nr]   )ri   r4   r_   )r9   rc   	func_namefuncrq   s        r$   r   zController._get_do_func   sX    CK	tY-,,.. vy$7#	 r#   c                     t        |t              r|j                  d      }| j                  j	                  |dz          y )Nzutf-8
)
isinstancer   encodern   write)r9   messages     r$   rv   zController.output   s0    gw'nnW-G'D.)r#   c                 $    | j                  d      S )N
supervisor)get_server_proxyr@   s    r$   get_supervisorzController.get_supervisor   s    $$\22r#   c                 V    | j                   j                         }||S t        ||      S r;   )r4   getServerProxyri   )r9   	namespaceproxys      r$   r   zController.get_server_proxy   s,    ++-L5),,r#   c                    	 | j                         }|j                         }ddlm} ||j                  k7  r8| j                  d|j                  d|d       t        j                  | _        y	 y
# t        j                  $ rm}|j                  t        j                  j                  k(  r+| j                  d       t        j                  | _        Y d }~yt        j                   | _         d }~wt"        j$                  $ r}|j&                  d   t(        j*                  k(  rB| j                  d| j,                  j.                  z         t        j0                  | _        Y d }~y|j&                  d   t(        j2                  k(  rB| j                  d	| j,                  j.                  z         t        j4                  | _        Y d }~yt        j                   | _         d }~ww xY w)Nr   )rpcinterfacezRSorry, this version of supervisorctl expects to talk to a server with API version z, but the remote version is .FzSorry, supervisord responded but did not recognize the supervisor namespace commands that supervisorctl uses to control it.  Please check that the [rpcinterface:supervisor] section is enabled in the configuration file (see sample.conf).z%s refused connectionz%s no such fileT)r   
getVersionr   r   API_VERSIONrv   r   r    rb   r   Fault	faultCoder   r   UNKNOWN_METHODr   r   socketr   r   errnoECONNREFUSEDr4   rC   r   ENOENTr!   )r9   r   apir   r   s        r$   upcheckzController.upcheck   sn   !	,,.J'')C/l... 0</G/GNO #6"C"C /< /  	{{fmm:::<= #6"K"K199DO|| 
	vvayE...3dll6L6LLM"5"M"Mell*-0F0FFG"5"A"A199DO
	s9   A,A1 1G!AC,C,,G!AG$AGGG!c                    |ddl }|j                         }g }|j                         s| j                  |      }n|j	                         }|d   }t        |      dk(  r#|j                  d      s| j                  |      }nA|dv r| j                  |      }n+|dv r| j                  |      }n|dv r| j                  |      }t        |      |kD  r||   S y)aa  Completer function that Cmd will register with readline using
        readline.set_completer().  This function will be called by readline
        as complete(text, state) where text is a fragment to complete and
        state is an integer (0..n).  Each call returns a string with a new
        completion.  When no more are available, None is returned.Nr   r    r\   )addremoveupdate)	clearfgpidrestartsignalr?   r   stoptail)	r   get_line_bufferstrip_complete_actionssplitlenendswith_complete_groups_complete_processes)r9   textstaterS   r   matcheswordsactions           r$   completezController.complete%  s     <++-Dzz|,,T2GJJLE1XF5zQt}}S'9006F#00666//5 ? ?2248w<%5>!  r#   c                 j    | j                   D cg c]  }|j                  |      s|dz    c}S c c}w )z5Build a completion list of action names matching textr   )r`   rg   )r9   r   rr   s      r$   r   zController._complete_actionsF  s)    "&**CQT0BSCCCs   00c                     g }| j                         D ]  }|d   |vs|j                  |d            |D cg c]  }|j                  |      s|dz    c}S c c}w )z4Build a completion list of group names matching textgroupr   _get_complete_inforj   rg   )r9   r   groupsinfogs        r$   r   zController._complete_groupsJ  s`    ++- 	-DG}F*d7m,	- #)@QALL,>S@@@s   AAc                 H   g }| j                         D ]d  }d|v s|d   |d   k7  r?|j                  |d   d|d          d|d   z  |vs9|j                  d|d   z         Q|j                  |d          f |D cg c]  }|j                  |      s|dz    c}S c c}w )z6Build a completion list of process names matching textry   rk   r   z%s:*r   r   )r9   r   	processesr   ps        r$   r   zController._complete_processesR  s    	++- 	/Dd{d6ld7m;  DM4<!HIDM):$$Vd7m%;<  f.	/ #,CQq||D/ASCCCs   >BBc                 x    | j                   #| j                         j                         | _         | j                   S )zGet all process info used for completion.  We cache this between
        commands to reduce XML-RPC calls because readline may call
        complete() many times if the user hits tab only once.)ra   r   getAllProcessInfor@   s    r$   r   zController._get_complete_info^  s6     &"&"5"5"7"I"I"KD"""r#   c                     |j                         dk(  r| j                          y | j                  j                  D ]  }|j	                  |        y )Nr\   )r   	help_helpr4   r_   do_help)r9   rQ   rq   s      r$   r   zController.do_helpf  s?    99;& NN,,.. $s#$r#   c                 H    | j                  d       | j                  d       y )Nz'help		Print a list of available actionsz%help <action>	Print help for <action>rv   r@   s    r$   r   zController.help_helpm  s    ?@<=r#   c                 &    | j                  d       y)Nrz   r   r   r9   rQ   s     r$   do_EOFzController.do_EOFq  s    Br#   c                 &    | j                  d       y )Nz(To quit, type ^D or use the quit commandr   r@   s    r$   help_EOFzController.help_EOFu  s    >?r#   )tabNNr;   )r   r   r   r-   rt   rw   r   r   r   r   rv   r   r   r   r   r   r   r   r   r   r   r   r   r"   r#   r$   rZ   rZ   w   st    9="6@:+>Z*
3-#J"BDA
D#$>@r#   rZ   c                     g }| j                   g}|rF|j                  d      }|j                  r|t        |j                        z   }|t	        |      z   }|rF|S )Nr   )	__class__pop	__bases__listrf   )instnamesclassesaclasss       r$   	get_namesr  x  s[    E~~G
QV%5%5 66GF#	 
 Lr#   c                   2    e Zd ZdZd Zd Z ee      Zd Zy)ControllerPluginBaseunnamedc                     || _         y r;   )r0   )r9   
controllers     r$   r-   zControllerPluginBase.__init__  s	    r#   c                      d| j                   z  S )Nz %s commands (type help <topic>):)rk   r@   s    r$   _doc_headerz ControllerPluginBase._doc_header  s    1DII==r#   c                 (   |r	 t        | d|z         } |        y t        |       }g }g }i }|D ]  }|d d dk(  sd||dd  <    |j                          d}	|D ]j  }|d d dk(  s||	k(  r|}	|dd  }
|
|v r|j                  |
       ||
= 2t        | |      j                  r|j                  |
       Z|j                  |
       l | j                  j	                  d       | j                  j                  | j                  |dd       y # t        $ r 	 t        | d|z         j                  }|r| j                  j	                  |       Y y n# t        $ r Y nw xY w| j                  j	                  | j                  j
                  |fz         Y y w xY w)	Nhelp_r]   r   r   rz   r      P   )ri   AttributeErrorrX   r0   rv   nohelpr  sortrj   print_topics
doc_header)r9   rQ   r   docr  cmds_doc
cmds_undocr\   rk   prevnamerc   s              r$   r   zControllerPluginBase.do_help  s   tWs]3 FdOEHJD %8w&#$DabN% JJLH /8u$x' #HQRCd{ , I t,44 ,"))#./ HHOOBHH!!$//8RDI " 	!$4<<C,  & 3& 89	s5   D	 		F6EF	EFE6FFN)	r   r   r   rk   r-   r  propertyr  r   r"   r#   r$   r  r    s!    D>+&J)Er#   r  c                      t        t        j                  dd       xs d} | j                         j	                  d      rd S t        j                  j
                  S )Nencodingrz   utf)ri   rG   rn   lowerrg   r  )encs    r$   not_all_langsr    sA    
#**j$
/
52C99;))%04Icjj6I6IIr#   c                 F    t               }|r| j                  d|z         y y )NzWarning: sys.stdout.encoding is set to %s, so Unicode output may fail. Check your LANG and PYTHONIOENCODING environment settings.)r  rv   )r0   problematic_encs     r$   check_encodingr"    s*    #oO

 +-<= 	> r#   c                   B   e Zd ZdZdZd Zd Zd Zd Zd Z	d Z
d	 Ze
Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd4dZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d  Z#d! Z$d" Z%d# Z&d$ Z'd% Z(d& Z)d' Z*d( Z+d) Z,d* Z-d+ Z.d, Z/d- Z0d. Z1d/ Z2d0 Z3d1 Z4d2 Z5d5d3Z6y)6DefaultControllerPluginrw   Nc                 r   t        | j                         | j                  j                  d       | j                  j                  j                  }| j                  j                  j
                  }d }	 | j                  t        j                         }n| j                  }t        j                  |||      }|j                  | j                  j                  j                  |       t        j                          y # t        $ r0 |r|j                          | j                  j                  d       Y y w xY w)N==> Press Ctrl-C to exit <==rz   )r"  r0   rv   r4   r5   r6   r2   r   r1   r3   rB   rC   rD   rE   r   rV   )r9   pathr5   r6   handlerr2   s         r$   _tailfzDefaultControllerPlugin._tailf  s    txx 6788##,,88##,,	 }}$&//1==!--h(KGKK((22D9MMO  	HHOOB		s   4BC= =6D65D6c                    | j                   j                         sy |j                         }t        |      dk  rK| j                   j	                  d       t
        j                  | j                   _        | j                          y t        |      dkD  rK| j                   j	                  d       t
        j                  | j                   _        | j                          y d }|d   j                  d      r|j                  d      }t        |      dk(  r|d   }d}n|rZ|d   }|d   j                         }|d	vry| j                   j	                  d
|z         t
        j                  | j                   _        y | j                   j	                  d       t
        j                  | j                   _        y d}||dd  }|dk(  rd }n	 t        |      }| j                   j                         }|| j                  d|d|      S t        | j                          	 |dk(  r|j!                  || d      }	n|j#                  || d      }	| j                   j	                  |	       y #  | j                   j	                  d|z         t
        j                  | j                   _        Y y xY w# t$        j&                  $ r}
t
        j                  | j                   _        d}|
j(                  t*        j,                  j.                  k(  r!| j                   j	                  ||dfz         n|
j(                  t*        j,                  j0                  k(  r!| j                   j	                  ||dfz         nN|
j(                  t*        j,                  j2                  k(  r!| j                   j	                  ||dfz         n Y d }
~
y Y d }
~
y Y d }
~
y d }
~
ww xY w)Nr   zError: too few argumentsr   Error: too many argumentsr   r|   rn   )stderrrn   zError: bad channel %rz!Error: tail requires process name@  fError: bad argument %sz	/logtail//%s: ERROR (%s)no log fileunknown error reading logzno such process name)r0   r   r   r   rv   r   r   rb   	help_tailrg   r   r  intr   r)  r"  readProcessStdoutLogreadProcessStderrLogr   r   r   r   r   NO_FILEFAILEDBAD_NAME)r9   rQ   r   modifierrk   channelbyteswhatr   rv   r   templates               r$   do_tailzDefaultControllerPlugin.do_tail  s#   xx!yy{t9q=HHOO67"5"="=DHHNNY]HHOO78"5"="=DHHNN7c"xx{Ht9>8DGAwr(..*"66HHOO$;g$EF*=*E*EDHH' CD&9&A&A#AB<Ds{IE XX,,.
=;;4ABB 488$(h&'<<T>CVQHF (<<T>CVQHF  'CHHOO$<x$GH*=*E*EDHH'  ?? &9&A&A#+;;&--"7"77HHOOHm/D$DE[[FMM$8$88HHOOH-H0J %J K[[FMM$:$::HHOOH-C0E %E F FK F	s%   I" .J& "?J#&O:C:OOc                 :    | j                   j                  d       y )Nztail [-f] <name> [stdout|stderr] (default stdout)
Ex:
tail -f <name>		Continuous tail of named process stdout
			Ctrl-C to exit.
tail -100 <name>	last 100 *bytes* of process stdout
tail <name> stderr	last 1600 *bytes* of process stderrr0   rv   r@   s    r$   r5  z!DefaultControllerPlugin.help_tail3  s    F	r#   c                    | j                   j                         sy |j                         }t        |      dkD  rK| j                   j	                  d       t
        j                  | j                   _        | j                          y t        |      dk(  r|d   j                  d      r/|d   dd  }|dk(  rd}| j                  |      S 	 t        |      }|}nC| j                   j	                  d|d   z         t
        j                  | j                   _        y d}| j                   j                         }	 |j                  | d      }| j                   j	                  |       y #  | j                   j	                  d|d   z         t
        j                  | j                   _        Y y xY w# t        j                  $ r}t
        j                  | j                   _        d	}	|j                   t"        j$                  j&                  k(  r| j                   j	                  |	d
z         nL|j                   t"        j$                  j(                  k(  r| j                   j	                  |	dz         n Y d }~y Y d }~y d }~ww xY w)Nr   r+  r   r|   r/  z/mainlogtailr0  r.  r2  )supervisordr3  )rE  r4  )r0   r   r   r   rv   r   r   rb   help_maintailrg   r)  r6  r   readLogr   r   r   r   r   r9  r:  )
r9   rQ   r   r?  r'  r>  r   rv   r   r@  s
             r$   do_maintailz#DefaultControllerPlugin.do_maintail=  s    xx!yy{t9q=HHOO78"5"="=DHH Y!^Aw!!#&Awqr{3;)D;;t,,!t9D !E 847 BC&9&A&A# EXX,,.
	$''2F HHOOF#;HHOO$<tAw$FG*=*E*EDHH'  		"5"="=DHH'H{{fmm333+I IJ 4 44 ,F !F G G K			s&   E# 4F* #AF'*I:=B.I55I:c                 :    | j                   j                  d       y )Nzmaintail -f 	Continuous tail of supervisor main log file (Ctrl-C to exit)
maintail -100	last 100 *bytes* of supervisord main log file
maintail	last 1600 *bytes* of supervisor main log file
rC  r@   s    r$   rF  z%DefaultControllerPlugin.help_maintailp  s    H	r#   c                 8    | j                   j                  |      S r;   )r0   r   r   s     r$   do_quitzDefaultControllerPlugin.do_quitx  s    xxs##r#   c                 :    | j                   j                  d       y )Nzquit	Exit the supervisor shell.rC  r@   s    r$   	help_quitz!DefaultControllerPlugin.help_quit{      :;r#   c                 :    | j                   j                  d       y )Nzexit	Exit the supervisor shell.rC  r@   s    r$   	help_exitz!DefaultControllerPlugin.help_exit  rN  r#   c                 \   g d}}t        |      D ]F  \  }}|j                  t        |d   |d                t        ||         |kD  s9t        ||         }H dt	        |dz         z   dz   }t        |      D ]2  \  }}|||   |d   |d   d	z  }| j
                  j                  |       4 y )
N   r   rk   z%(namespec)-r   zs%(state)-10s%(desc)s	statenamedescription)namespecr   desc)	enumeraterj   r   r   strr0   rv   )r9   process_infos	namespecsmaxlenir   r@  rS   s           r$   _show_statusesz&DefaultControllerPlugin._show_statuses  s    6	 / 	+GAt]4=$v,GH9Q< 6)Yq\*	+
 "CqM14KK / 	"GAt9Q<(,[(9'+M':< <D HHOOD!		"r#   c                    | j                   j                         s t        j                  | j                   _        y | j                   j                         }|j                         }t        |      j                         }|rd|v r|}ng }|D ]  }d}t        |      \  }}	|D ].  }
|
d   |k(  }|	|xr |
d   |	k(  }|sd}|j                  |
       0 |sI|	d|z  }nd|z  }| j                   j                  |       t        j                  | j                   _         | j                  |       |D ]7  }
|
d   t        j                  v st        j                  | j                   _        9 y )	NallTr   rk   F%s: ERROR (no such group)z%s: ERROR (no such process)r   )r0   r   r&   r'   rb   r   r   r   r   r   rj   rv   r]  r   STOPPED_STATESr!   )r9   rQ   r   	all_infosr  matching_infosrk   bad_name
group_nameprocess_namer   matchedmsgs                r$   	do_statusz!DefaultControllerPlugin.do_status  se    xx!"7"?"?DHHXX,,.
002	#$$&&NN H+9$+?(
L% 4D"7mz9G#/")"Jd6ll.J#(&--d34 #+9JF;dBHHOOC(*?*G*GDHH''H( 	N+" 	HDG} 5 55&;&G&G#	Hr#   c                     | j                   j                  d       | j                   j                  d       | j                   j                  d       | j                   j                  d       y )Nz.status <name>		Get status for a single processz8status <gname>:*	Get status for all processes in a groupz<status <name> <name>	Get status for multiple named processesz$status			Get all process status inforC  r@   s    r$   help_statusz#DefaultControllerPlugin.help_status  sN    JK / 	0 $ 	%ABr#   c                 X   | j                   j                         }| j                   j                         sy |j                         }|s5|j	                         }| j                   j                  t        |             y d|v r=|j                         D ])  }| j                   j                  t        |d                + y |D ]b  }	 |j                  |      }|d   }| j                   j                  t        |             |dk(  sDt        j                  | j                   _        d y # t        j                  $ rp}t        j                  | j                   _        |j                  t         j"                  j$                  k(  r| j                   j                  d|z         n Y d }~d }~ww xY w)Nr_  r   r   zNo such process %s)r0   r   r   r   getPIDrv   rX  r   getProcessInfor   r!   rb   r   r   r   r   r   r   r;  )r9   rQ   r   r  r   r   rk   r   s           r$   do_pidzDefaultControllerPlugin.do_pid  sM   XX,,.
xx!		##%CHHOOCH%e^"446 2DK 012  NN%44T:D u+CHHOOCH-ax.A.M.M+N ! *=*E*EDHH'{{fmm&<&<<(<t(CD Es   D&&F)9A&F$$F)c                     | j                   j                  d       | j                   j                  d       | j                   j                  d       y )Nz!pid			Get the PID of supervisord.z:pid <name>		Get the PID of a single child process by name.z;pid all			Get the PID of every child process, one per line.rC  r@   s    r$   help_pidz DefaultControllerPlugin.help_pid  s=    >? % 	& % 	&r#   c                 J   t        |d   |d         }|d   }d}|t        j                  j                  k(  r||dfz  S |t        j                  j                  k(  r||dfz  S |t        j                  j
                  k(  r||dfz  S |t        j                  j                  k(  r||dfz  S |t        j                  j                  k(  r||d	fz  S |t        j                  j                  k(  r||d
fz  S |t        j                  j                  k(  rd|z  S t        d|d|      )Nr   rk   r   r2  no such processzno such filezfile is not executablezalready startedzspawn errorzabnormal termination%s: startedUnknown result code  for )r   r   r   r;  r9  NOT_EXECUTABLEALREADY_STARTEDSPAWN_ERRORABNORMAL_TERMINATIONr   
ValueErrorr9   resultrk   coder@  s        r$   _startresultz$DefaultControllerPlugin._startresult  s"   VG_fVn=h#6==)))t%6777V]]***t^444V]]111t%=>>>V]]222t%6777V]]...t]333V]]777t%;<<<V]]*** 4''D$GHHr#   c                 H   | j                   j                         sy |j                         }| j                   j                         }|sK| j                   j	                  d       t
        j                  | j                   _        | j                          y d|v ry|j                         }|D ]c  }| j                   j	                  | j                  |             | j                   j                  |d   t        j                  j                         e y |D ]  }t        |      \  }}|{	 |j!                  |      }|D ]c  }| j                   j	                  | j                  |             | j                   j                  |d   t        j                  j                         e 	 |j-                  |      }t/        ||      }| j                   j	                  d|z          y # t"        j$                  $ r}	|	j&                  t        j                  j(                  k(  r@d|z  }
| j                   j	                  |
       t
        j                  | j                   _        n t
        j*                  | j                   _         Y d }	~	md }	~	ww xY w# t"        j$                  $ r}	|	j&                  |||	j0                  d}
| j                   j	                  | j                  |
             | j                   j                  |
d   t        j                  j                         Y d }	~	
d }	~	ww xY w)Nz$Error: start requires a process namer_  r   r`  rt  r   rk   r   rT  )r0   r   r   r   rv   r   r   rb   
help_startstartAllProcessesr  r   r   r   rx  r   startProcessGroupr   r   r   r;  r   startProcessr   faultStringr9   rQ   r  r   resultsr}  rk   re  rf  r   r   s              r$   do_startz DefaultControllerPlugin.do_start  sx   xx!		XX,,.
HHOOBC"5"B"BDHHOOE> 224G! k 1 1& 9:99&:JFMMLiLijk  >+9$+?(
L'"",">">z"J&- wF HHOOD,=,=f,EF HHEEfXFVX^XeXeXuXuvw>!+!8!8!>  -ZF(<=9> %?? ";;&--*@*@@$?*$LE HHOOE22E2R2RDHH/2E2M2MDHH/! 0	" %?? r+,;;*6+512!@ (9(9%(@AAA%/SYS`S`SpSpqqrs3   &A9G!JJ2BI??JL!A<LL!c                     | j                   j                  d       | j                   j                  d       | j                   j                  d       | j                   j                  d       y )Nzstart <name>		Start a processz/start <gname>:*		Start all processes in a groupz6start <name> <name>	Start multiple processes or groupszstart all		Start all processesrC  r@   s    r$   r  z"DefaultControllerPlugin.help_start,  sI    9:KLE	G:;r#   c                    t        |d   |d         }|d   }|d   }d}|t        j                  j                  k(  r||dfz  S |t        j                  j                  k(  r||dfz  S |t        j                  j
                  k(  r||dfz  S |t        j                  j                  k(  r|d	|S |t        j                  j                  k(  r|S t        d
|d|      )Nr   rk   r   rT  r2  rs  zbad signal nameznot running: ru  rv  )	r   r   r   r;  
BAD_SIGNALr!   r   r:  r{  )r9   r}  successrk   r~  fault_stringr@  s          r$   _signalresultz%DefaultControllerPlugin._signalresult3  s    VG_fVn=hm,#6==)))t%6777V]]---t%6777V]]...t]333V]]***#W--V]])))D$GHHr#   c                 (    | j                  |d      S )Nstopped)r  )r  )r9   r}  s     r$   _stopresultz#DefaultControllerPlugin._stopresultE  s    !!&)!<<r#   c                 
   | j                   j                         sy |j                         }| j                   j                         }|sK| j                   j	                  d       t
        j                  | j                   _        | j                          y d|v ry|j                         }|D ]c  }| j                   j	                  | j                  |             | j                   j                  |d   t        j                  j                         e y |D ]  }t        |      \  }}|{	 |j!                  |      }|D ]c  }| j                   j	                  | j                  |             | j                   j                  |d   t        j                  j                         e 	 |j+                  |       t-        ||      }| j                   j	                  d|z          y # t"        j$                  $ rs}	t
        j                  | j                   _        |	j&                  t        j                  j(                  k(  r!d|z  }
| j                   j	                  |
       n Y d }	~	Nd }	~	ww xY w# t"        j$                  $ r}	|	j&                  |||	j.                  d}
| j                   j	                  | j                  |
             | j                   j                  |
d   t        j                  j                         Y d }	~	d }	~	ww xY w)Nz#Error: stop requires a process namer_  r   r`  z%s: stoppedr  )r0   r   r   r   rv   r   r   rb   	help_stopstopAllProcessesr  r   r   r   r!   r   stopProcessGroupr   r   r   r;  stopProcessr   r  r  s              r$   do_stopzDefaultControllerPlugin.do_stopH  sc   xx!		XX,,.
HHOOAB"5"="=DHHNNE> 113G! g 0 0 8999&:JFMMLeLefg  >+9$+?(
L'"","="=j"I&- sF HHOOD,<,<V,DE HHEEfXFVX^XeXeXqXqrs>"..t4  -ZF(<=9> %?? ".A.I.I+;;&--*@*@@$?*$LE HHOOE2! 3	" %?? n+,;;)5*4/0}}!> (8(8(?@AA%/SYS`S`SlSlmmns3   &A9G!I(I%2A(I  I%(L;A<K==Lc                     | j                   j                  d       | j                   j                  d       | j                   j                  d       | j                   j                  d       y )Nzstop <name>		Stop a processz-stop <gname>:*		Stop all processes in a groupz4stop <name> <name>	Stop multiple processes or groupszstop all		Stop all processesrC  r@   s    r$   r  z!DefaultControllerPlugin.help_stopy  sF    78IJOP89r#   c                    | j                   j                         sy |j                         }t        |      dk  rK| j                   j	                  d       | j                          t        j                  | j                   _        y |d   }|dd  }| j                   j                         }d|v ra|j                  |      }|D ]J  }| j                   j	                  | j                  |             | j                   j                  |d          L y |D ]  }t        |      \  }	}
|
c	 |j                  |	|      }|D ]J  }| j                   j	                  | j                  |             | j                   j                  |d          L v	 |j+                  ||       t-        |	|
      }| j                   j	                  d|z          y # t        j                   $ rs}|j"                  t$        j&                  j(                  k(  r@d|	z  }| j                   j	                  |       t        j                  | j                   _        n Y d }~7d }~ww xY w# t        j                   $ rn}|j"                  |
|	|j.                  d	}| j                   j	                  | j                  |             | j                   j                  |d          Y d }~d }~ww xY w)
Nr   z7Error: signal requires a signal name and a process namer   r   r_  r   r`  z%s: signalledr  )r0   r   r   r   rv   help_signalr   r   rb   r   signalAllProcessesr  r   r   signalProcessGroupr   r   r   r   r   r;  signalProcessr   r  )r9   rQ   r   sigr  r   r  r}  rk   re  rf  r   r   s                r$   	do_signalz!DefaultControllerPlugin.do_signal  sh   xx!yy{t9q=HHOOIK"5"="=DHH1gQRXX,,.
E> 33C8G! L 2 26 :;99&:JKL  @+9$+?(
L'"","?"?&# '. XF HHOOD,>,>v,FG HHEEfXFVWX@"00s;  -ZF$(>?;@ %?? ";;&--*@*@@$?*$LE HHOOE22E2M2MDHH/! 0	" %?? S+,;;)5*4/0}}!> (:(:5(ABAA%/RRSs3   $A!GIIA(IIK"A#KKc                     | j                   j                  d       | j                   j                  d       | j                   j                  d       | j                   j                  d       y )Nz-signal <signal name> <name>		Signal a processz?signal <signal name> <gname>:*		Signal all processes in a groupzFsignal <signal name> <name> <name>	Signal multiple processes or groupsz.signal <signal name> all		Signal all processesrC  r@   s    r$   r  z#DefaultControllerPlugin.help_signal  sF    IJ[\abJKr#   c                 8   | j                   j                         sy |j                         }|sK| j                   j                  d       t        j
                  | j                   _        | j                          y | j                  |       | j                  |       y )Nz&Error: restart requires a process name)
r0   r   r   rv   r   r   rb   help_restartr  r  )r9   rQ   r  s      r$   
do_restartz"DefaultControllerPlugin.do_restart  sm    xx!		HHOODE"5"="=DHHScr#   c                    | j                   j                  d       | j                   j                  d       | j                   j                  d       | j                   j                  d       | j                   j                  d       y )Nz!restart <name>		Restart a processz2restart <gname>:*	Restart all processes in a groupz:restart <name> <name>	Restart multiple processes or groupsz"restart all		Restart all processeszLNote: restart does not reread config files. For that, see reread and update.rC  r@   s    r$   r  z$DefaultControllerPlugin.help_restart  s_    =>MN  	>? 2 	3r#   c                    |rK| j                   j                  d       t        j                  | j                   _        | j                          y | j                   j                  j                  r+t        d      }|j                         j                  d      }nd}|rG| j                   j                         }	 |j                          | j                   j                  d       y y # t        j                  $ rm}|j                  t         j"                  j$                  k(  r| j                   j                  d       n t        j                  | j                   _         Y d }~y d }~wt&        j(                  $ r}t        j                  | j                   _        |j*                  d   t,        j.                  k(  r?d}| j                   j                  || j                   j                  j0                  z         ne|j*                  d   t,        j2                  k(  r?d	}| j                   j                  || j                   j                  j0                  z         n Y d }~y Y d }~y d }~ww xY w)
Nz$Error: shutdown accepts no argumentsz5Really shut the remote supervisord process down y/N? yr   z	Shut downERROR: already shutting downr   z1ERROR: %s refused connection (already shut down?)z+ERROR: %s no such file (already shut down?))r0   rv   r   r   rb   help_shutdownr4   r   r   r  rg   r   shutdownr   r   r   r   r   SHUTDOWN_STATEr   r   r   r   r   rC   r   )r9   rQ   yesnoreallyr   r   rh  s          r$   do_shutdownz#DefaultControllerPlugin.do_shutdown  s   HHOOBC"5"="=DHH 88'' + ,E[[]--c2FF002J-##%$ ,+  ?? ;;&--">">>HHOO$BC*=*E*EDHH' D << 	&9&A&A#66!9 2 22MCHHOOC$((*:*:*D*D$DEVVAY%,,.GCHHOOC$((*:*:*D*D$DE F F		s&   8C% %I#8A#E  I#6CII#c                 :    | j                   j                  d       y )Nz+shutdown 	Shut the remote supervisord down.rC  r@   s    r$   r  z%DefaultControllerPlugin.help_shutdown  s    FGr#   c                    |rK| j                   j                  d       t        j                  | j                   _        | j                          y | j                   j                  j                  r+t        d      }|j                         j                  d      }nd}|rG| j                   j                         }	 |j                          | j                   j                  d       y y # t        j                  $ rm}t        j                  | j                   _        |j                  t         j"                  j$                  k(  r| j                   j                  d       n Y d }~y d }~ww xY w)Nz"Error: reload accepts no argumentsz3Really restart the remote supervisord process y/N? r  r   zRestarted supervisordr  )r0   rv   r   r   rb   help_reloadr4   r   r   r  rg   r   r   r   r   r   r   r   r  )r9   rQ   r  r  r   r   s         r$   	do_reloadz!DefaultControllerPlugin.do_reload  s
   HHOO@A"5"="=DHH88'' & 'E[[]--c2FF002J	9""$  78  ?? &9&A&A#;;&--">">>HHOO$BC Ds   8C% %E%8A#E  E%c                 :    | j                   j                  d       y )Nz(reload 		Restart the remote supervisord.rC  r@   s    r$   r  z#DefaultControllerPlugin.help_reload  s    DEr#   c                 ~   |\  }}}i }|df|df|dffD ]6  \  }}|j                  t        t        ||gt        |      z                     8 |rTt	        |j                               }|j                          |D ]%  }	| j                  j                  |	d||	          ' y | j                  j                  d       y )N	availablechangeddisappearedr  zNo config updates to processes)	r   dictzipr   r   keysr  r0   rv   )
r9   added_changed_dropped_tupleaddedr  dropped
changedictnr   r  rk   s
             r$   _formatChangesz&DefaultControllerPlugin._formatChanges  s    "=w
[)y)}-/ 	:DAq d3q1#A,#789	:
 *+EJJL ED*T2B CDE HHOO<=r#   c                     t        |d   |d         }d|i}|d   rd|d<   nd|d<   |d   rd|d<   nd|d<   |d	   d
|d   |d<   d}||z  S )Nr   rk   inusezin useavail	autostartautomanual
group_priory   process_priopriorityz4%(name)-32s %(inuse)-9s %(autostart)-9s %(priority)sr
   )r9   
configinfork   	formattedr@  s        r$   _formatConfigInfoz)DefaultControllerPlugin._formatConfigInfo(  s    Z0*V2DEd$	g!)Ig!(Igk"%+Ik"%-Ik"+5l+C+5n+E!G	* J)##r#   c                 \   |rK| j                   j                  d       t        j                  | j                   _        | j                          y | j                   j                         }	 |j                         }|D ],  }| j                   j                  | j                  |             . y # t        j                  $ rm}t        j                  | j                   _        |j                  t        j                  j                  k(  r| j                   j                  d       n Y d }~y d }~ww xY w)Nz!Error: avail accepts no argumentsERROR: supervisor shutting down)r0   rv   r   r   rb   
help_availr   getAllConfigInfor  r   r   r   r   r   r  )r9   rQ   r   r  pinfor   s         r$   do_availz DefaultControllerPlugin.do_avail9  s    HHOO?@"5"="=DHHOOXX,,.

	?#446J $ ? 6 6u =>?  	"5"="=DHH{{fmm::: AB C	s   )B+ +D+>A#D&&D+c                 :    | j                   j                  d       y )Nz(avail			Display all configured processesrC  r@   s    r$   r  z"DefaultControllerPlugin.help_availM  s    EFr#   c                    |rK| j                   j                  d       t        j                  | j                   _        | j                          y | j                   j                         }	 |j                         }| j                  |d          y # t        j                  $ r}t        j                  | j                   _        |j                  t        j                  j                  k(  r| j                   j                  d       nV|j                  t        j                  j                  k(  r)| j                   j                  d|j                   z         n Y d }~y Y d }~y d }~ww xY w)Nz"Error: reread accepts no argumentsr   r  z	ERROR: %s)r0   rv   r   r   rb   help_rereadr   reloadConfigr  r   r   r   r   r   r  CANT_REREADr  )r9   rQ   r   r}  r   s        r$   	do_rereadz!DefaultControllerPlugin.do_rereadP  s    HHOO@A"5"="=DHHXX,,.
	+,,.F q	*  	"5"="=DHH{{fmm::: AB 9 99amm ;< = C	s   )B E#!B3EE#c                 :    | j                   j                  d       y )NzDreread 			Reload the daemon's configuration files without add/removerC  r@   s    r$   r  z#DefaultControllerPlugin.help_rereade  s    abr#   c                 ^   |j                         }| j                  j                         }|D ]2  }	 |j                  |       | j                  j	                  d|z         4 y # t
        j                  $ r5}|j                  t        j                  j                  k(  r;| j                  j	                  d       t        j                  | j                  _        n|j                  t        j                  j                  k(  r| j                  j	                  d       n|j                  t        j                  j                  k(  r>| j                  j	                  d|z         t        j                  | j                  _        n t        j                  | j                  _         Y d }~zd }~ww xY w)Nz%s: added process groupzERROR: shutting downz#ERROR: process group already active ERROR: no such process/group: %s)r   r0   r   addProcessGrouprv   r   r   r   r   r   r  r   r   rb   ALREADY_ADDEDr;  r9   rQ   r  r   rk   r   s         r$   do_addzDefaultControllerPlugin.do_addh  s&   		XX,,.
 	BDB**40  9D @A!	B ?? ;;&--">">>HHOO$:;*=*E*EDHH'[[FMM$?$??HHOO$IJ[[FMM$:$::HHOO$F$MN*=*E*EDHH'*=*E*EDHH's   A##F,7D*F''F,c                 :    | j                   j                  d       y )NzBadd <name> [...]	Activates any updates in config for process/grouprC  r@   s    r$   help_addz DefaultControllerPlugin.help_add~  s     , 	-r#   c                 ^   |j                         }| j                  j                         }|D ]2  }	 |j                  |       | j                  j	                  d|z         4 y # t
        j                  $ r}t        j                  | j                  _	        |j                  t        j                  j                  k(  r| j                  j	                  d|z         nG|j                  t        j                  j                  k(  r| j                  j	                  d|z         n Y d }~d }~ww xY w)Nz%s: removed process groupz&ERROR: process/group still running: %sr  )r   r0   r   removeProcessGrouprv   r   r   r   r   rb   r   r   r   STILL_RUNNINGr;  r  s         r$   	do_removez!DefaultControllerPlugin.do_remove  s    		XX,,.
 	DDD--d3  ;d BC	D ?? &9&A&A#;;&--"="==HHOO$L(,%- .[[FMM$:$::HHOO$F$MNs   A##D,6B,D''D,c                 :    | j                   j                  d       y )Nz<remove <name> [...]	Removes process/group from active configrC  r@   s    r$   help_removez#DefaultControllerPlugin.help_remove  s     ( 	)r#   c                 N     fd} j                   j                         }	 |j                         }|d   \  }}}t        |j                               }	d|	v r
t               }	|	rt               }
|j                         D ]  }|
j!                  |d           |
j#                  |       |	D ]D  }||
vs j                   j                  d|z         t
        j                   j                   _        F |D ]  }|	r||	vr
|j%                  |      } ||d       |D cg c]$  }|d   t        j                  j&                  k(  r|& }}|r@ j                   j                  |d	d
       t
        j                   j                   _        |j)                  |        ||d        |D ]N  }|	r||	vr
|j%                  |        ||d       |j)                  |       |j+                  |        ||d       P |D ]#  }|	r||	vr
|j+                  |        ||d       % y # t        j                  $ rl}t
        j                   j                   _        |j                  t        j                  j                  k(  r  j                   j                  d       Y d }~y  d }~ww xY wc c}w )Nc                 F    j                   j                  | d|       y )Nr  rC  )rk   r   r9   s     r$   logz.DefaultControllerPlugin.do_update.<locals>.log  s    HHOOg67r#   r  r   r_  r   zERROR: no such group: %sr  r   r  zhas problems; not removingzremoved process groupzupdated process groupzadded process group)r0   r   r  r   r   r   r   rb   r   r   r   r  rv   setr   r   r   r   r  r:  r  r  )r9   rQ   r  r   r}  r   r  r  removedvalid_gnamesr   r   gnamer  resfailss   `               r$   	do_updatez!DefaultControllerPlugin.do_update  s   	8 XX,,.
	,,.F #))w399;' L 5L UF"446 *

4=)* MM% % F&HHOO$>$FG*=*E*EDHH'F
  	0E\ 9 11%8Gy!$+ ?SH)=)==  ?E ?E3O PQ&9&A&A#))%0./	0  	0E\ 9''.y!))%0&&u-./	0  	.E\ 9&&u-,-		.o  	"5"="=DHH{{fmm::: >?	H?s$   H  )J" J3A!JJJc                     | j                   j                  d       | j                   j                  d       | j                   j                  d       y )NzVupdate			Reload config and add/remove as necessary, and will restart affected programszYupdate all		Reload config and add/remove as necessary, and will restart affected programsz+update <gname> [...]	Update specific groupsrC  r@   s    r$   help_updatez#DefaultControllerPlugin.help_update  s5    stuvFGr#   c                 *   t        |d   |d         }|d   }d}|t        j                  j                  k(  r||dfz  S |t        j                  j                  k(  r||dfz  S |t        j                  j
                  k(  rd|z  S t        d|d	|      )
Nr   rk   r   r2  rs  failed%s: clearedru  rv  )r   r   r   r;  r:  r   r{  r|  s        r$   _clearresultz$DefaultControllerPlugin._clearresult  s    VG_fVn=h#6==)))t%6777V]])))tX...V]]*** 4''D$GHHr#   c                    | j                   j                         sy |j                         }|sK| j                   j                  d       t        j
                  | j                   _        | j                          y | j                   j                         }d|v r`|j                         }|D ]J  }| j                   j                  | j                  |             | j                   j                  |d          L y |D ]L  }t        |      \  }}	 |j                  |       t        ||      }| j                   j                  d|z         N y # t        j                   $ rm}	|	j"                  |||	j$                  d}
| j                   j                  | j                  |
             | j                   j                  |
d          Y d }	~	d }	~	ww xY w)Nz$Error: clear requires a process namer_  r   r  r  )r0   r   r   rv   r   r   rb   
help_clearr   clearAllProcessLogsr  r   r   clearProcessLogsr   r   r   r   r  r  s              r$   do_clearz DefaultControllerPlugin.do_clear  s|   xx!		HHOOBC"5"="=DHHOOXX,,.
E> 446G! L 1 1& 9:99&:JKL  :+9$+?(
L://5 )\BDHHOOMD$89: ! O'({{%1&0,-MM;E HHOOD$5$5e$<=HH==eHoNNOs   E		G	A#GG	c                     | j                   j                  d       | j                   j                  d       | j                   j                  d       y )Nz)clear <name>		Clear a process' log files.z5clear <name> <name>	Clear multiple process' log filesz'clear all		Clear all process' log filesrC  r@   s    r$   r  z"DefaultControllerPlugin.help_clear  s8    EFD	FCDr#   c                 x   |j                         }t        j                  |      }|d   dvr;| j                  j                  d       t        j
                  | j                  _        y || j                  j                  _        | j                  j                  }| j                  d       || j                  _        y )Nr   )unixhttpz%ERROR: url must be http:// or unix://rz   )
r   r   r0   rv   r   r   rb   r4   rC   ri  )r9   rQ   urlpartsold_exitstatuss        r$   do_openzDefaultControllerPlugin.do_open  s    iik!!#&8++HHOOCD"5"="=DHH%(",,r,r#   c                 p    | j                   j                  d       | j                   j                  d       y )Nz3open <url>	Connect to a remote supervisord process.z3		(for UNIX domain socket, use unix:///socket/path)rC  r@   s    r$   	help_openz!DefaultControllerPlugin.help_open$  s$    NOOPr#   c                 Z   |rK| j                   j                  d       t        j                  | j                   _        | j                          y | j                   j                         sy | j                   j                         }| j                   j                  |j                                y )Nz#Error: version accepts no arguments)	r0   rv   r   r   rb   help_versionr   r   getSupervisorVersion)r9   rQ   r   s      r$   
do_versionz"DefaultControllerPlugin.do_version(  su    HHOOAB"5"="=DHHxx!XX,,.

779:r#   c                 :    | j                   j                  d       y )Nz<version			Show the version of the remote supervisord processrC  r@   s    r$   r	  z$DefaultControllerPlugin.help_version4  s    	r#   c                    | j                   j                         sy |j                         }|sK| j                   j                  d       t        j
                  | j                   _        | j                          y t        |      dkD  r;| j                   j                  d       t        j
                  | j                   _        y |d   }| j                   j                         }	 |j                  |      }|d   t$        j&                  j(                  k7  r;| j                   j                  d       t        j
                  | j                   _        y | j                   j                  d	       d }	 t+        || j                         }|j-                          	 t/               d
z   }	 |j1                  ||       |j                  |      }|d   t$        j&                  j(                  k7  rG| j                   j                  d       | j                   j                  d       |j5                          y # t        j                  $ r}|j                  t        j                  j                   k(  r;| j                   j                  d       t        j
                  | j                   _        n'| j                   j                  dt#        |      z          Y d }~y d }~ww xY w# t        j                  $ r}|j                  t        j                  j2                  k(  r| j                   j                  d       n'| j                   j                  dt#        |      z          | j                   j                  d       |j5                          Y d }~y d }~ww xY w# t6        t8        f$ r2 | j                   j                  d       |r|j5                          Y y Y y w xY w)NzERROR: no process name suppliedr   z&ERROR: too many process names suppliedr   z ERROR: bad process name suppliedzERROR: r   zERROR: process not runningr&  r   zProcess got killedzExiting foreground)r0   r   r   rv   r   r   rb   help_fgr   r   rn  r   r   r   r   r   r;  rX  r   ProcessStatesRUNNINGr)   r?   r   sendProcessStdinr!   rW   r   EOFError)	r9   rQ   r  rk   r   r   r   rr   inps	            r$   do_fgzDefaultControllerPlugin.do_fg9  s   xx!		HHOO=>"5"="=DHHLLNu:>HHOODE"5"="=DHHQxXX,,.
	,,T2D =F00888HHOO89"5"="=DHH67	txx(AGGI kD(	//c: "006=F$8$8$@$@@HHOO$89HHOO$89FFH% -  	{{fmm444 BC&9&A&A#	CF 23	4 ! {{fmm&?&??(<=	CF(:;HHOO$89FFH "8, 	HHOO01 	s]   "H, ,4N
 !K 3A7N
 +N
 ,K?B	KKN(BN=N
 NN
 
<O
Oc                 p    | j                   j                  d       | j                   j                  d       y )Nz4fg <process>	Connect to a process in foreground modez		Ctrl-C to exitrC  )r9   r   s     r$   r  zDefaultControllerPlugin.help_fg{  s$    OP,-r#   )	signalledr;   )7r   r   r   rk   r2   r)  rA  r5  rH  rF  rK  rM  do_exitrP  r]  ri  rk  ro  rq  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r	  r  r  r"   r#   r$   r$  r$    s&   DH6Q(f1$f$< G<")HVCN6&I*/>b<I$=/>b:4@lL3#-JH94F> $"?(G+*cB,-D&)B.HH

I!:FE-Q
;
@D.r#   r$  c                 r   |
t               }|j                  | t               t        |      }|j                  rI|j                  dj                  |j                               t        j                  |j                         |j                  r(|j                  | |       t        j                  d       y y )N)r  r   r   )r	   realizerX   rZ   r   r   joinrG   exitrb   r   r   )r   r4   cs      r$   mainr    s    /OODgO&7A||	',,'(	tW% r#   __main__)NN)*rX   rc   r   r   r   rG   r+   supervisor.compatr   r   r   r   r   supervisor.medusar   rD   supervisor.optionsr	   r   r   r   r   r   r   r   r&   r   ry  rz  r!   r   r,   r)   rd   rZ   r  r  r  r"  r$  r  r   r"   r#   r$   <module>r"     s   ,     
  ' & % ' ' 5 , , -   "   }}00}}99}}002 5y 5n@ @B3E 3EjJ>{.2 {.| zF r#   