o
    þâfeÖ  ã                   @   sp  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„ dƒZG dd„ dƒZejjejjejjfZG dd„ dejƒZ G dd„ dej!ƒZ"dd„ Z#G dd„ dƒZ$dd„ Z%dd„ Z&G dd „ d e$ƒZ'd$d!d"„Z(e)d#kr¶e(ƒ  dS dS )%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                   @   s(   e Zd ZdZdZdZdZdZdZdZ	dS )	ÚLSBInitExitStatusesr   é   é   é   é   é   é   N)
Ú__name__Ú
__module__Ú__qualname__ÚSUCCESSÚGENERICÚINVALID_ARGSÚUNIMPLEMENTED_FEATUREÚINSUFFICIENT_PRIVILEGESÚNOT_INSTALLEDÚNOT_RUNNING© r    r    úK/var/www/html/venv/lib/python3.10/site-packages/supervisor/supervisorctl.pyr   /   s    r   c                   @   s   e Zd ZdZdZdS )ÚLSBStatusExitStatusesr   r   N)r   r   r   r   ÚUNKNOWNr    r    r    r!   r"   8   s    r"   c                   @   sH   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dS )Ú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                 C   sh   t j | ¡ d| _|| _|| _t ¡ | _t 	| j| jj
j| jj
j¡| _t 	| j| jj
j| jj
j¡| _d S )NF)Ú	threadingÚThreadÚ__init__ÚkilledÚprogramÚctlr   ÚListenerÚlistenerÚHTTPHandlerÚoptionsÚusernameÚpasswordÚoutput_handlerÚerror_handler)Úselfr)   r*   r    r    r!   r'   F   s   
þ
þzfgthread.__init__c                 C   s    | j | _| j| _ tj | ¡ d S ©N)ÚrunÚ_fgthread__run_backupÚ_fgthread__runr%   r&   Ústart©r3   r    r    r!   r8   S   s   zfgthread.startc                 C   s@   | j  | jjjd| j ¡ | j | jjjd| j ¡ t ¡  d S )Nz/logtail/%s/stdoutz/logtail/%s/stderr)	r1   Úgetr*   r.   Ú	serverurlr)   r2   ÚasyncoreÚloopr9   r    r    r!   r5   Y   s   ÿÿzfgthread.runc                 C   s    t  | j¡ |  ¡  | j| _d S r4   )ÚsysÚsettraceÚglobaltracer6   r5   r9   r    r    r!   Ú__run`   s   zfgthread.__runc                 C   s   |dkr| j S d S )NÚcall)Ú
localtrace©r3   ÚframeÚwhyÚargr    r    r!   r@   f   s   zfgthread.globaltracec                 C   s   | j r
|dkr
tƒ ‚| jS )NÚline)r(   Ú
SystemExitrC   rD   r    r    r!   rC   l   s   zfgthread.localtracec                 C   s   | j  ¡  | j ¡  d| _d S )NT)r1   Úcloser2   r(   r9   r    r    r!   Úkillr   s   


zfgthread.killN)r   r   r   Ú__doc__r'   r8   r5   r7   r@   rC   rK   r    r    r    r!   r$   @   s    r$   c                   @   s¸   e Zd Z		d+dd„Zdd„ Zdd„ Zd	d
„ Zd,dd„Zdd„ Zdd„ Z	dd„ Z
dd„ Zd,dd„Zdd„ Zd,dd„Zdd„ Zdd„ Zdd „ Zd!d"„ Zd#d$„ Zd%d&„ Zd'd(„ Zd)d*„ ZdS )-Ú
ControllerÚtabNc           
      C   sº   || _ | j jd | _g | j _dg| _d | _tj| _tj	 
| |||¡ | j jD ]4\}}}|| fi |¤Ž}t|ƒD ]}	|	 d¡rOtt||	ƒƒrO| j |	dd … ¡ q7| j j |¡ ||_q&d S )Nz> ÚhelpÚdo_r   )r.   ÚpromptÚpluginsÚvocabÚ_complete_infor   r   Ú
exitstatusÚcmdÚCmdr'   Úplugin_factoriesÚdirÚ
startswithÚcallableÚgetattrÚappendÚname)
r3   r.   ÚcompletekeyÚstdinÚstdoutr^   ÚfactoryÚkwargsÚpluginÚar    r    r!   r'   y   s    €úzController.__init__c                 C   s   d S r4   r    r9   r    r    r!   Ú	emptylineŠ   s   zController.emptylinec                 C   s   |   d| ¡ tj| _d S )Nz*** Unknown syntax: %s)Úoutputr   r   rU   )r3   rH   r    r    r!   ÚdefaultŽ   s   zController.defaultc                    sÚ   zFdd l ‰ˆ ¡ }| dd¡}| dd¡}| dd¡}ˆ |¡ ˆ jrEzˆ ˆ j¡ W n	 ty4   Y nw ‡ ‡fdd„}dd l}| |¡ W n	 t	yO   Y nw z| j
 d¡ |  ¡  W d S  tyl   |  d¡ Y d S w )	Nr   ú:Ú Ú*ú-c                      s(   z	ˆ  ˆ j¡ W d S  ty   Y d S w r4   )Úwrite_history_fileÚhistory_fileÚIOErrorr    ©r.   Úreadliner    r!   Úsave¡   s
   ÿz%Controller.exec_cmdloop.<locals>.saveÚstatus)rq   Úget_completer_delimsÚreplaceÚset_completer_delimsrn   Úread_history_filero   ÚatexitÚregisterÚImportErrorÚcmdqueuer]   ÚcmdloopÚKeyboardInterruptrg   )r3   Úargsr.   Údelimsrr   rx   r    rp   r!   Úexec_cmdloop’   s6   
ÿ
€ÿ
þzController.exec_cmdloopc                 C   s4   ||t jjfv r
d S |tv rtj| _d S tj| _d S r4   )r   ÚFaultsr   ÚDEAD_PROGRAM_FAULTSr   r   rU   r   )r3   Ú	faultcodeÚignored_faultcoder    r    r!   Ú set_exitstatus_from_xmlrpc_fault²   s
   z+Controller.set_exitstatus_from_xmlrpc_faultc              
   C   sx  |   |¡\}}}|s|  ¡ S |du r|  |¡S d| _|| _|dkr&|  |¡S |  |¡}|du r4|  |¡S zaz||ƒW W S  tjyŽ } zF|jdkr| j	j
ru|  d¡ tdƒ}tjdd}|  d¡ || j	_|| j	_|  |¡W  Y d}~W S |  d¡ tj| _ntj| _‚ W Y d}~nd}~ww ||ƒ W dS  ty»   t ¡ \\}}	}}
}}d|
|||f }|  |¡ tj| _Y dS w )	zŒ Override the onecmd method to:
          - catch and print all exceptions
          - call 'do_foo' on plugins rather than ourself
        Nrj   i‘  zServer requires authenticationz	Username:z	Password:)rQ   z error: %s, %s: file: %s line: %s)Ú	parselinerf   rh   rT   ÚlastcmdÚ_get_do_funcr   ÚProtocolErrorÚerrcoder.   Úinteractiverg   r   Úgetpassr/   r0   Úonecmdr   r   rU   Ú	Exceptionr<   Úcompact_traceback)r3   rH   rV   rG   Údo_funcÚer/   r0   ÚfileÚfunÚtÚvÚtbinfoÚerrorr    r    r!   r   º   sN   








ý€ô
üzController.onecmdc                 C   sD   d| }t | |d ƒ}|s | jjD ]}t ||d ƒ}|d ur |S q|S )NrP   )r\   r.   rR   )r3   rV   Ú	func_nameÚfuncrd   r    r    r!   rˆ   ç   s   þzController._get_do_funcc                 C   s(   t |tƒr
| d¡}| j |d ¡ d S )Nzutf-8Ú
)Ú
isinstancer   Úencodera   Úwrite)r3   Úmessager    r    r!   rg   ñ   s   

zController.outputc                 C   s
   |   d¡S )NÚ
supervisor)Úget_server_proxyr9   r    r    r!   Úget_supervisorö   ó   
zController.get_supervisorc                 C   s    | j  ¡ }|d u r|S t||ƒS r4   )r.   ÚgetServerProxyr\   )r3   Ú	namespaceÚproxyr    r    r!   r    ù   s   

zController.get_server_proxyc              
   C   s4  z'|   ¡ }| ¡ }ddlm} ||jkr%|  d|j|f ¡ tj| _W dS W dS  t	j
yP } z|jtjjkrG|  d¡ tj| _W Y d }~dS tj| _‚ d }~w tjy™ } z=|jd tjkrt|  d| jj ¡ tj| _W Y d }~dS |jd tjkr|  d| jj ¡ tj| _W Y d }~dS tj| _‚ d }~ww )	Nr   )ÚrpcinterfacezsSorry, this version of supervisorctl expects to talk to a server with API version %s, but the remote version is %s.FzìSorry, 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_VERSIONrg   r   r   rU   r   ÚFaultÚ	faultCoder   r   ÚUNKNOWN_METHODr   r   Úsocketr—   r~   ÚerrnoÚECONNREFUSEDr.   r;   r   ÚENOENTr   )r3   rŸ   Úapir¦   r‘   r    r    r!   Úupcheck   sJ   
þÿúéÿ€€özController.upcheckc                 C   s´   |du rddl }| ¡ }g }| ¡ s|  |¡}n6| ¡ }|d }t|ƒdkr1| d¡s1|  |¡}n|dv r;|  |¡}n|dv rE|  |¡}n	|dv rN|  |¡}t|ƒ|krX|| S dS )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   ú rO   )ÚaddÚremoveÚupdate)	ÚclearÚfgÚpidÚrestartÚsignalr8   rs   ÚstopÚtail)	rq   Úget_line_bufferÚstripÚ_complete_actionsÚsplitÚlenÚendswithÚ_complete_groupsÚ_complete_processes)r3   ÚtextÚstaterH   rq   ÚmatchesÚwordsÚactionr    r    r!   Úcomplete%  s&   
ÿzController.completec                    s   ‡ fdd„| j D ƒS )z5Build a completion list of action names matching textc                    ó   g | ]}|  ˆ ¡r|d  ‘qS ©r²   ©rZ   )Ú.0re   ©rÅ   r    r!   Ú
<listcomp>H  ó    z0Controller._complete_actions.<locals>.<listcomp>)rS   )r3   rÅ   r    rÏ   r!   r¿   F  s   zController._complete_actionsc                    s>   g }|   ¡ D ]}|d |vr| |d ¡ q‡ fdd„|D ƒS )z4Build a completion list of group names matching textÚgroupc                    rË   rÌ   rÍ   )rÎ   ÚgrÏ   r    r!   rÐ   P  rÑ   z/Controller._complete_groups.<locals>.<listcomp>©Ú_get_complete_infor]   )r3   rÅ   ÚgroupsÚinfor    rÏ   r!   rÃ   J  s   €zController._complete_groupsc                    sˆ   g }|   ¡ D ]4}dˆ v s|d |d kr3| d|d |d f ¡ d|d  |vr2| d|d  ¡ q| |d ¡ q‡ fdd„|D ƒS )z6Build a completion list of process names matching textri   r^   rÒ   ú%s:%sz%s:*c                    rË   rÌ   rÍ   )rÎ   ÚprÏ   r    r!   rÐ   \  rÑ   z2Controller._complete_processes.<locals>.<listcomp>rÔ   )r3   rÅ   Ú	processesr×   r    rÏ   r!   rÄ   R  s   €zController._complete_processesc                 C   s   | j du r|  ¡  ¡ | _ | j S )zÁGet 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.N)rT   r¡   ÚgetAllProcessInfor9   r    r    r!   rÕ   ^  s   
zController._get_complete_infoc                 C   s4   |  ¡ dkr|  ¡  d S | jjD ]}| |¡ qd S )NrO   )r¾   Ú	help_helpr.   rR   Údo_help)r3   rG   rd   r    r    r!   rÝ   f  s
   ÿzController.do_helpc                 C   s   |   d¡ |   d¡ d S )Nz'help		Print a list of available actionsz%help <action>	Print help for <action>©rg   r9   r    r    r!   rÜ   m  s   
zController.help_helpc                 C   s   |   d¡ dS )Nrj   r   rÞ   ©r3   rG   r    r    r!   Údo_EOFq  s   
zController.do_EOFc                 C   s   |   d¡ d S )Nz(To quit, type ^D or use the quit commandrÞ   r9   r    r    r!   Úhelp_EOFu  ó   zController.help_EOF)rN   NNr4   )r   r   r   r'   rf   rh   r€   r…   r   rˆ   rg   r¡   r    r±   rÊ   r¿   rÃ   rÄ   rÕ   rÝ   rÜ   rà   rá   r    r    r    r!   rM   w   s.    
ÿ
 -


%!rM   c                 C   sB   g }| j g}|r| d¡}|jr|t|jƒ }|t|ƒ }|s|S )Nr   )Ú	__class__ÚpopÚ	__bases__ÚlistrY   )ÚinstÚnamesÚclassesÚaclassr    r    r!   Ú	get_namesx  s   
ürë   c                   @   s0   e Zd ZdZdd„ Zdd„ ZeeƒZdd„ ZdS )	ÚControllerPluginBaseÚunnamedc                 C   s
   || _ d S r4   )r*   )r3   Ú
controllerr    r    r!   r'   …  r¢   zControllerPluginBase.__init__c                 C   s
   d| j  S )Nz %s commands (type help <topic>):)r^   r9   r    r    r!   Ú_doc_headerˆ  r¢   z ControllerPluginBase._doc_headerc                 C   sj  |rFz	t | d| ƒ}W n5 ty@   zt | d| ƒj}|r'| j |¡ W Y d S W n	 ty1   Y nw | j | jj|f ¡ Y d S w |ƒ  d S t| ƒ}g }g }i }|D ]}|d d… dkrdd||dd … < qR| ¡  d}	|D ]5}|d d… dkr¢||	kr|qm|}	|dd … }
|
|v r‘| |
¡ ||
= qmt | |ƒjr| |
¡ qm| |
¡ qm| j d¡ | j 	| j
|dd¡ d S )	NÚhelp_rP   r   r   rj   r   é   éP   )r\   ÚAttributeErrorrL   r*   rg   Únohelprë   Úsortr]   Úprint_topicsÚ
doc_header)r3   rG   r™   Údocrè   Úcmds_docÚ
cmds_undocrO   r^   ÚprevnamerV   r    r    r!   rÝ   Œ  sT   þÿ÷

€

€zControllerPluginBase.do_helpN)	r   r   r   r^   r'   rï   Úpropertyr÷   rÝ   r    r    r    r!   rì   ‚  s    rì   c                  C   s,   t tjdd ƒpd} |  ¡  d¡rd S tjjS )NÚencodingrj   Úutf)r\   r>   ra   ÚlowerrZ   rý   )Úencr    r    r!   Únot_all_langs·  s   r  c                 C   s    t ƒ }|r|  d| ¡ d S d S )NzWarning: sys.stdout.encoding is set to %s, so Unicode output may fail. Check your LANG and PYTHONIOENCODING environment settings.)r  rg   )r*   Úproblematic_encr    r    r!   Úcheck_encoding»  s   
þÿr  c                   @   s¤  e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Z	dd„ Z
dd„ Ze
Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd „ Zd!d"„ Zdfd$d%„Zd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Z d:d;„ Z!d<d=„ Z"d>d?„ Z#d@dA„ Z$dBdC„ Z%dDdE„ Z&dFdG„ Z'dHdI„ Z(dJdK„ Z)dLdM„ Z*dNdO„ Z+dPdQ„ Z,dRdS„ Z-dTdU„ Z.dVdW„ Z/dXdY„ Z0dZd[„ Z1d\d]„ Z2d^d_„ Z3d`da„ Z4dbdc„ Z5dgddde„Z6dS )hÚDefaultControllerPluginrh   Nc                 C   s¤   t | jƒ | j d¡ | jjj}| jjj}d }z$| jd u r"t ¡ }n| j}t 	|||¡}| 
| jjj|¡ t ¡  W d S  tyQ   |rH| ¡  | j d¡ Y d S w )Nú==> Press Ctrl-C to exit <==rj   )r  r*   rg   r.   r/   r0   r,   r   r+   r-   r:   r;   r<   r=   r}   rJ   )r3   Úpathr/   r0   Úhandlerr,   r    r    r!   Ú_tailfÅ  s$   




üzDefaultControllerPlugin._tailfc              
   C   s  | j  ¡ sd S | ¡ }t|ƒdk r"| j  d¡ tj| j _|  ¡  d S t|ƒdkr9| j  d¡ tj| j _|  ¡  d S d }|d  	d¡rG| 
d¡}t|ƒdkrT|d }d}n-|rt|d }|d  ¡ }|d	vrs| j  d
| ¡ tj| j _d S n| j  d¡ tj| j _d S d}|d ur®|dd … }|dkr”d }nzt|ƒ}W n   | j  d| ¡ tj| j _Y d S | j  ¡ }|d u rÀ|  d||f ¡S t| j ƒ z|dkrÓ| || d¡}	n| || d¡}	W nc tjy? }
 zUtj| j _d}|
jtjjkrÿ| j  ||df ¡ n'|
jtjjkr| j  ||df ¡ n|
jtjjkr%| j  ||df ¡ n‚ W Y d }
~
d S W Y d }
~
d S W Y d }
~
d S d }
~
ww | j  |	¡ d S )Nr   zError: too few argumentsr   úError: too many argumentsr   rl   éÿÿÿÿra   )Ústderrra   zError: bad channel %rz!Error: tail requires process nameé@  ÚfúError: bad argument %sz/logtail/%s/%sú%s: ERROR (%s)úno log fileúunknown error reading logzno such process name)r*   r±   rÀ   rÁ   rg   r   r   rU   Ú	help_tailrZ   rä   rÿ   Úintr¡   r  r  ÚreadProcessStdoutLogÚreadProcessStderrLogr   r©   rª   r   r   ÚNO_FILEÚFAILEDÚBAD_NAME)r3   rG   r~   Úmodifierr^   ÚchannelÚbytesÚwhatrŸ   rg   r‘   Útemplater    r    r!   Údo_tailà  s”   




ý



ÿÿ€


ÿ

ÿø€÷zDefaultControllerPlugin.do_tailc                 C   ó   | j  d¡ d S )Nzëtail [-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©r*   rg   r9   r    r    r!   r  3  ó   ÿz!DefaultControllerPlugin.help_tailc           
   
   C   sœ  | j  ¡ sd S | ¡ }t|ƒdkr"| j  d¡ tj| j _|  ¡  d S t|ƒdkrr|d  	d¡ra|d dd … }|dkrBd}|  
|¡S zt|ƒ}W n   | j  d|d  ¡ tj| j _Y d S |}n| j  d|d  ¡ tj| j _d S d}| j  ¡ }z	| | d¡}W nC tjyÅ } z6tj| j _d	}	|jtjjkr¢| j  |	d
 ¡ n|jtjjkr²| j  |	d ¡ n‚ W Y d }~d S W Y d }~d S d }~ww | j  |¡ d S )Nr   r	  r   rl   r  z/mainlogtailr  r  r  )Úsupervisordr  )r"  r  )r*   r±   rÀ   rÁ   rg   r   r   rU   Úhelp_maintailrZ   r  r  r¡   ÚreadLogr   r©   rª   r   r   r  r  )
r3   rG   r~   r  r  r  rŸ   rg   r‘   r  r    r    r!   Údo_maintail=  sR   






û€úz#DefaultControllerPlugin.do_maintailc                 C   r  )Nz½maintail -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
r   r9   r    r    r!   r#  p  r!  z%DefaultControllerPlugin.help_maintailc                 C   s   | j  |¡S r4   )r*   rà   rß   r    r    r!   Údo_quitx  s   zDefaultControllerPlugin.do_quitc                 C   r  )Nzquit	Exit the supervisor shell.r   r9   r    r    r!   Ú	help_quit{  ó   z!DefaultControllerPlugin.help_quitc                 C   r  )Nzexit	Exit the supervisor shell.r   r9   r    r    r!   Ú	help_exit€  r(  z!DefaultControllerPlugin.help_exitc                 C   s¢   g d}}t |ƒD ]\}}| t|d |d ƒ¡ t|| ƒ|kr't|| ƒ}q	dt|d ƒ d }t |ƒD ]\}}||| |d |d d	œ }| j |¡ q6d S )
Né   rÒ   r^   z%(namespec)-r   zs%(state)-10s%(desc)sÚ	statenameÚdescription)ÚnamespecrÆ   Údesc)Ú	enumerater]   r
   rÁ   Ústrr*   rg   )r3   Úprocess_infosÚ	namespecsÚmaxlenÚir×   r  rH   r    r    r!   Ú_show_statusesƒ  s   
€þüz&DefaultControllerPlugin._show_statusesc                 C   s
  | j  ¡ stj| j _d S | j  ¡ }| ¡ }t|ƒ ¡ }|r!d|v r$|}nIg }|D ]D}d}t	|ƒ\}}	|D ]}
|
d |k}|	d urH|oG|
d |	k}|rQd}| 
|
¡ q4|rl|	d u r]d| }nd| }| j  |¡ tj| j _q(|  |¡ |D ]}
|
d tjv r‚tj| j _qtd S )	NÚallTrÒ   r^   Fú%s: ERROR (no such group)z%s: ERROR (no such process)rÆ   )r*   r±   r"   r#   rU   r¡   rÛ   r   rÀ   r   r]   rg   r5  r   ÚSTOPPED_STATESr   )r3   rG   rŸ   Ú	all_infosrè   Úmatching_infosr^   Úbad_nameÚ
group_nameÚprocess_namer×   ÚmatchedÚmsgr    r    r!   Ú	do_status‘  sB   



€

€

€þz!DefaultControllerPlugin.do_statusc                 C   ó4   | j  d¡ | j  d¡ | j  d¡ | j  d¡ d S )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 infor   r9   r    r    r!   Úhelp_status¼  s   z#DefaultControllerPlugin.help_statusc                 C   s  | j  ¡ }| j  ¡ sd S | ¡ }|s | ¡ }| j  t|ƒ¡ d S d|v r7| ¡ D ]}| j  t|d ƒ¡ q(d S |D ]H}z| |¡}W n) t	j
yk } ztj| j _|jtjjkr`| j  d| ¡ n‚ W Y d }~q9d }~ww |d }| j  t|ƒ¡ |dkrtj| j _q9d S )Nr6  r¸   zNo such process %sr   )r*   r¡   r±   rÀ   ÚgetPIDrg   r0  rÛ   ÚgetProcessInfor   r©   r   r   rU   rª   r   r   r  r   )r3   rG   rŸ   rè   r¸   r×   r^   r‘   r    r    r!   Údo_pidÄ  s8   

ÿ
þ€ý
€ózDefaultControllerPlugin.do_pidc                 C   ó(   | j  d¡ | j  d¡ | j  d¡ d S )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.r   r9   r    r    r!   Úhelp_pidß  s   z DefaultControllerPlugin.help_pidc                 C   sÒ   t |d |d ƒ}|d }d}|tjjkr||df S |tjjkr'||df S |tjjkr3||df S |tjjkr?||df S |tjjkrK||d	f S |tjjkrW||d
f S |tjj	krad| S t
d||f ƒ‚)NrÒ   r^   rs   r  úno such processzno such filezfile is not executablezalready startedzspawn errorzabnormal terminationú%s: startedúUnknown result code %s for %s)r
   r   r   r  r  ÚNOT_EXECUTABLEÚALREADY_STARTEDÚSPAWN_ERRORÚABNORMAL_TERMINATIONr   Ú
ValueError©r3   Úresultr^   Úcoder  r    r    r!   Ú_startresultæ  s$   z$DefaultControllerPlugin._startresultc                 C   sÚ  | j  ¡ sd S | ¡ }| j  ¡ }|s#| j  d¡ tj| j _|  ¡  d S d|v rF| 	¡ }|D ]}| j  |  
|¡¡ | j  |d tjj¡ q-d S |D ]¢}t|ƒ\}}|d u r¥z | |¡}|D ]}| j  |  
|¡¡ | j  |d tjj¡ q\W qH tjy¤ }	 z#|	jtjjkr”d| }
| j  |
¡ tj| j _ntj| j _‚ W Y d }	~	qHd }	~	ww z| |¡}W n0 tjyÜ }	 z#|	j|||	jdœ}
| j  |  
|
¡¡ | j  |
d tjj¡ W Y d }	~	qHd }	~	ww t||ƒ}| j  d| ¡ qHd S )Nz$Error: start requires a process namer6  rs   r7  ©rs   r^   rÒ   r,  rI  )r*   r±   rÀ   r¡   rg   r   r   rU   Ú
help_startÚstartAllProcessesrS  r…   r   r   rL  r   ÚstartProcessGroupr   r©   rª   r  r   ÚstartProcessÚfaultStringr
   ©r3   rG   rè   rŸ   ÚresultsrQ  r^   r<  r=  r‘   r—   r    r    r!   Údo_startû  sb   


þ
þ
ý€ü	ý"€ú
äz DefaultControllerPlugin.do_startc                 C   rA  )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 processesr   r9   r    r    r!   rU  ,  s   ÿz"DefaultControllerPlugin.help_startÚ	signalledc                 C   s¦   t |d |d ƒ}|d }|d }d}|tjjkr||df S |tjjkr+||df S |tjjkr7||df S |tjjkrCd	||f S |tjjkrK|S td
||f ƒ‚)NrÒ   r^   rs   r,  r  rH  zbad signal nameznot runningú%s: %srJ  )	r
   r   r   r  Ú
BAD_SIGNALr   r   r  rO  )r3   rQ  Úsuccessr^   rR  Úfault_stringr  r    r    r!   Ú_signalresult3  s   z%DefaultControllerPlugin._signalresultc                 C   s   | j |ddS )NÚstopped)r`  )rb  )r3   rQ  r    r    r!   Ú_stopresultE  râ   z#DefaultControllerPlugin._stopresultc                 C   sÐ  | j  ¡ sd S | ¡ }| j  ¡ }|s#| j  d¡ tj| j _|  ¡  d S d|v rF| 	¡ }|D ]}| j  |  
|¡¡ | j  |d tjj¡ q-d S |D ]}t|ƒ\}}|d u r z | |¡}|D ]}| j  |  
|¡¡ | j  |d tjj¡ q\W qH tjyŸ }	 ztj| j _|	jtjjkr”d| }
| j  |
¡ n‚ W Y d }	~	qHd }	~	ww z| |¡ W n0 tjy× }	 z#|	j|||	jdœ}
| j  |  
|
¡¡ | j  |
d tjj¡ W Y d }	~	qHd }	~	ww t||ƒ}| j  d| ¡ qHd S )Nz#Error: stop requires a process namer6  rs   r7  rT  z%s: stopped)r*   r±   rÀ   r¡   rg   r   r   rU   Ú	help_stopÚstopAllProcessesrd  r…   r   r   r   r   ÚstopProcessGroupr   r©   rª   r  ÚstopProcessrY  r
   rZ  r    r    r!   Údo_stopH  s`   


þ
þ
þ€üý"€ú
äzDefaultControllerPlugin.do_stopc                 C   rA  )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 processesr   r9   r    r    r!   re  y  ó   z!DefaultControllerPlugin.help_stopc                 C   sà  | j  ¡ sd S | ¡ }t|ƒdk r"| j  d¡ |  ¡  tj| j _d S |d }|dd … }| j  	¡ }d|v rR| 
|¡}|D ]}| j  |  |¡¡ | j  |d ¡ q<d S |D ]™}t|ƒ\}	}
|
d u rªz| |	|¡}|D ]}| j  |  |¡¡ | j  |d ¡ qiW qT tjy© } z|jtjjkržd|	 }| j  |¡ tj| j _n‚ W Y d }~qTd }~ww z| ||¡ W n- tjyß } z |j|
|	|jdœ}| j  |  |¡¡ | j  |d ¡ W Y d }~qTd }~ww t|	|
ƒ}| j  d	| ¡ qTd S )
Nr   z7Error: signal requires a signal name and a process namer   r   r6  rs   r7  rT  z%s: signalled)r*   r±   rÀ   rÁ   rg   Úhelp_signalr   r   rU   r¡   ÚsignalAllProcessesrb  r…   r   ÚsignalProcessGroupr   r©   rª   r   r   r  ÚsignalProcessrY  r
   )r3   rG   r~   Úsigrè   rŸ   r[  rQ  r^   r<  r=  r‘   r—   r    r    r!   Ú	do_signal  sl   
ÿ


þÿþþ€üý€ú
ãz!DefaultControllerPlugin.do_signalc                 C   rA  )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 processesr   r9   r    r    r!   rk  µ  rj  z#DefaultControllerPlugin.help_signalc                 C   sT   | j  ¡ sd S | ¡ }|s| j  d¡ tj| j _|  ¡  d S |  |¡ |  	|¡ d S )Nz&Error: restart requires a process name)
r*   r±   rÀ   rg   r   r   rU   Úhelp_restartri  r\  )r3   rG   rè   r    r    r!   Ú
do_restart»  s   


z"DefaultControllerPlugin.do_restartc                 C   s@   | j  d¡ | j  d¡ | j  d¡ | j  d¡ | j  d¡ d S )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.r   r9   r    r    r!   rq  Ê  s
   z$DefaultControllerPlugin.help_restartc              
   C   sd  |r| j  d¡ tj| j _|  ¡  d S | j jjr$tdƒ}| 	¡  
d¡}nd}|r°| j  ¡ }z| ¡  W nt tjy[ } z|jtjjkrJ| j  d¡ ntj| j _‚ W Y d }~d S d }~w tjy§ } z@tj| j _|jd tjkr~d}| j  || j jj ¡ n|jd tjkr”d}| j  || j jj ¡ n‚ W Y d }~d S W Y d }~d S d }~ww | j  d	¡ d S d S )
Nz$Error: shutdown accepts no argumentsz5Really shut the remote supervisord process down y/N? Úyr   úERROR: already shutting downr   z1ERROR: %s refused connection (already shut down?)z+ERROR: %s no such file (already shut down?)z	Shut down)r*   rg   r   r   rU   Úhelp_shutdownr.   r‹   r   rÿ   rZ   r¡   Úshutdownr   r©   rª   r   r   ÚSHUTDOWN_STATEr¬   r—   r~   r­   r®   r;   r¯   )r3   rG   ÚyesnoÚreallyrŸ   r‘   r?  r    r    r!   Údo_shutdownÓ  sF   



ý€
û€ùëz#DefaultControllerPlugin.do_shutdownc                 C   r  )Nz+shutdown 	Shut the remote supervisord down.r   r9   r    r    r!   ru  ø  r(  z%DefaultControllerPlugin.help_shutdownc              
   C   sÌ   |r| j  d¡ tj| j _|  ¡  d S | j jjr$tdƒ}| 	¡  
d¡}nd}|rd| j  ¡ }z| ¡  W n( tjy[ } ztj| j _|jtjjkrO| j  d¡ n‚ W Y d }~d S d }~ww | j  d¡ d S d S )Nz"Error: reload accepts no argumentsz3Really restart the remote supervisord process y/N? rs  r   rt  zRestarted supervisord)r*   rg   r   r   rU   Úhelp_reloadr.   r‹   r   rÿ   rZ   r¡   r¹   r   r©   rª   r   r   rw  )r3   rG   rx  ry  rŸ   r‘   r    r    r!   Ú	do_reloadû  s.   



þ€ýõz!DefaultControllerPlugin.do_reloadc                 C   r  )Nz(reload 		Restart the remote supervisord.r   r9   r    r    r!   r{    r(  z#DefaultControllerPlugin.help_reloadc           
   	   C   sš   |\}}}i }|df|df|dffD ]\}}|  tt||gt|ƒ ƒƒ¡ q|rEt| ¡ ƒ}| ¡  |D ]}	| j d|	||	 f ¡ q4d S | j d¡ d S )NÚ	availableÚchangedÚdisappearedr^  zNo config updates to processes)	rµ   ÚdictÚziprÁ   ræ   Úkeysrõ   r*   rg   )
r3   Úadded_changed_dropped_tupleÚaddedr~  ÚdroppedÚ
changedictÚnr”   rè   r^   r    r    r!   Ú_formatChanges  s   
þ ÿz&DefaultControllerPlugin._formatChangesc                 C   sr   t |d |d ƒ}d|i}|d rd|d< nd|d< |d r#d|d< nd|d< d	|d
 |d f |d< d}|| S )NrÒ   r^   Úinusezin useÚavailÚ	autostartÚautoÚmanualrØ   Ú
group_prioÚprocess_prioÚpriorityz4%(name)-32s %(inuse)-9s %(autostart)-9s %(priority)sr	   )r3   Ú
configinfor^   Ú	formattedr  r    r    r!   Ú_formatConfigInfo(  s   


ÿz)DefaultControllerPlugin._formatConfigInfoc              
   C   s®   |r| j  d¡ tj| j _|  ¡  d S | j  ¡ }z| ¡ }W n( tj	yF } ztj| j _|j
tjjkr:| j  d¡ n‚ W Y d }~d S d }~ww |D ]}| j  |  |¡¡ qId S )Nz!Error: avail accepts no argumentsúERROR: supervisor shutting down)r*   rg   r   r   rU   Ú
help_availr¡   ÚgetAllConfigInfor   r©   rª   r   r   rw  r“  )r3   rG   rŸ   r‘  r‘   Úpinfor    r    r!   Údo_avail9  s&   


þ€ýÿz DefaultControllerPlugin.do_availc                 C   r  )Nz(avail			Display all configured processesr   r9   r    r    r!   r•  M  r(  z"DefaultControllerPlugin.help_availc              
   C   sÐ   |r| j  d¡ tj| j _|  ¡  d S | j  ¡ }z| ¡ }W n@ tj	y^ } z3tj| j _|j
tjjkr:| j  d¡ n|j
tjjkrK| j  d|j ¡ n‚ W Y d }~d S W Y d }~d S d }~ww |  |d ¡ d S )Nz"Error: reread accepts no argumentsr”  z	ERROR: %sr   )r*   rg   r   r   rU   Úhelp_rereadr¡   ÚreloadConfigr   r©   rª   r   r   rw  ÚCANT_REREADrY  rˆ  )r3   rG   rŸ   rQ  r‘   r    r    r!   Ú	do_rereadP  s(   


ü€û	z!DefaultControllerPlugin.do_rereadc                 C   r  )NzDreread 			Reload the daemon's configuration files without add/remover   r9   r    r    r!   r™  e  r(  z#DefaultControllerPlugin.help_rereadc                 C   sÞ   |  ¡ }| j ¡ }|D ]a}z| |¡ W nO tjyc } zB|jtjj	kr0| j 
d¡ tj| j_n)|jtjjkr>| j 
d¡ n|jtjjkrS| j 
d| ¡ tj| j_ntj| j_‚ W Y d }~qd }~ww | j 
d| ¡ qd S )NzERROR: shutting downz#ERROR: process group already activeú ERROR: no such process/group: %sz%s: added process group)rÀ   r*   r¡   ÚaddProcessGroupr   r©   rª   r   r   rw  rg   r   r   rU   ÚALREADY_ADDEDr  ©r3   rG   rè   rŸ   r^   r‘   r    r    r!   Údo_addh  s(   

€õðzDefaultControllerPlugin.do_addc                 C   r  )NzBadd <name> [...]	Activates any updates in config for process/groupr   r9   r    r    r!   Úhelp_add~  r(  z DefaultControllerPlugin.help_addc                 C   s²   |  ¡ }| j ¡ }|D ]K}z| |¡ W n9 tjyM } z,tj| j_|j	t
jjkr2| j d| ¡ n|j	t
jjkrB| j d| ¡ n‚ W Y d }~qd }~ww | j d| ¡ qd S )Nz&ERROR: process/group still running: %sr  z%s: removed process group)rÀ   r*   r¡   ÚremoveProcessGroupr   r©   r   r   rU   rª   r   r   ÚSTILL_RUNNINGrg   r  r   r    r    r!   Ú	do_remove‚  s$   

ÿ€ø
óz!DefaultControllerPlugin.do_removec                 C   r  )Nz<remove <name> [...]	Removes process/group from active configr   r9   r    r    r!   Úhelp_remove•  r(  z#DefaultControllerPlugin.help_removec              
      sâ  ‡ fdd„}ˆ j  ¡ }z| ¡ }W n' tjy8 } ztjˆ j _|jt	j
jkr3ˆ j  d¡ W Y d }~d S ‚ d }~ww |d \}}}t| ¡ ƒ}	d|	v rMtƒ }	|	r{tƒ }
| ¡ D ]	}|
 |d ¡ qV|
 |¡ |	D ]}||
vrzˆ j  d| ¡ tjˆ j _qg|D ]6}|	r†||	vr†q}| |¡}||dƒ d	d
„ |D ƒ}|r©ˆ j  d|df ¡ tjˆ j _q}| |¡ ||dƒ q}|D ]"}|	r¿||	vr¿q¶| |¡ ||dƒ | |¡ | |¡ ||dƒ q¶|D ]}|	rä||	vräqÛ| |¡ ||dƒ qÛd S )Nc                    s   ˆ j  d| |f ¡ d S )Nr^  r   )r^   rž   r9   r    r!   Úlogš  s   z.DefaultControllerPlugin.do_update.<locals>.logrt  r   r6  rÒ   zERROR: no such group: %src  c                 S   s    g | ]}|d  t jjkr|‘qS )rs   )r   r   r  )rÎ   Úresr    r    r!   rÐ   Ä  s    ÿz5DefaultControllerPlugin.do_update.<locals>.<listcomp>r^  zhas problems; not removingzremoved process groupzupdated process groupzadded process group)r*   r¡   rš  r   r©   r   r   rU   rª   r   r   rw  rg   ÚsetrÀ   rÛ   r³   rµ   rg  r£  rž  )r3   rG   r§  rŸ   rQ  r‘   r„  r~  ÚremovedÚvalid_gnamesrÖ   r×   Úgnamer[  Úfailsr    r9   r!   Ú	do_update™  sh   

€ú

€








üz!DefaultControllerPlugin.do_updatec                 C   rF  )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 groupsr   r9   r    r    r!   Úhelp_updateÝ  s   z#DefaultControllerPlugin.help_updatec                 C   sr   t |d |d ƒ}|d }d}|tjjkr||df S |tjjkr'||df S |tjjkr1d| S td||f ƒ‚)	NrÒ   r^   rs   r  rH  Úfailedú%s: clearedrJ  )r
   r   r   r  r  r   rO  rP  r    r    r!   Ú_clearresultâ  s   z$DefaultControllerPlugin._clearresultc                 C   s$  | j  ¡ sd S | ¡ }|s| j  d¡ tj| j _|  ¡  d S | j  ¡ }d|v rC| 	¡ }|D ]}| j  |  
|¡¡ | j  |d ¡ q-d S |D ]J}t|ƒ\}}z| |¡ W n- tjy }	 z |	j|||	jdœ}
| j  |  
|
¡¡ | j  |
d ¡ W Y d }	~	qEd }	~	ww t||ƒ}| j  d| ¡ qEd S )Nz$Error: clear requires a process namer6  rs   rT  r±  )r*   r±   rÀ   rg   r   r   rU   Ú
help_clearr¡   ÚclearAllProcessLogsr²  r…   r   ÚclearProcessLogsr   r©   rª   rY  r
   rZ  r    r    r!   Údo_clearî  s@   


þý€ú
óz DefaultControllerPlugin.do_clearc                 C   rF  )Nz)clear <name>		Clear a process' log files.z5clear <name> <name>	Clear multiple process' log filesz'clear all		Clear all process' log filesr   r9   r    r    r!   r³    s
   ÿz"DefaultControllerPlugin.help_clearc                 C   s`   |  ¡ }t |¡}|d dvr| j d¡ tj| j_d S || jj_| jj}|  	d¡ || j_d S )Nr   )ÚunixÚhttpz%ERROR: url must be http:// or unix://rj   )
r¾   r   r*   rg   r   r   rU   r.   r;   r@  )r3   rG   ÚurlÚpartsÚold_exitstatusr    r    r!   Údo_open  s   



zDefaultControllerPlugin.do_openc                 C   ó   | j  d¡ | j  d¡ d S )Nz3open <url>	Connect to a remote supervisord process.z3		(for UNIX domain socket, use unix:///socket/path)r   r9   r    r    r!   Ú	help_open$  ó   z!DefaultControllerPlugin.help_openc                 C   sR   |r| j  d¡ tj| j _|  ¡  d S | j  ¡ sd S | j  ¡ }| j  | ¡ ¡ d S )Nz#Error: version accepts no arguments)	r*   rg   r   r   rU   Úhelp_versionr±   r¡   ÚgetSupervisorVersion)r3   rG   rŸ   r    r    r!   Ú
do_version(  s   


z"DefaultControllerPlugin.do_versionc                 C   r  )Nz<version			Show the version of the remote supervisord processr   r9   r    r    r!   rÀ  4  r!  z$DefaultControllerPlugin.help_versionc           	   
   C   s@  | j  ¡ sd S | ¡ }|s| j  d¡ tj| j _|  ¡  d S t|ƒdkr1| j  d¡ tj| j _d S |d }| j  	¡ }z| 
|¡}W n1 tjyr } z$|jtjjkr]| j  d¡ tj| j _n
| j  dt|ƒ ¡ W Y d }~d S d }~ww |d tjjkrˆ| j  d¡ tj| j _d S | j  d	¡ d }zrt|| j ƒ}| ¡  	 tƒ d }z| ||¡ W n7 tjyà } z*|jtjjkrÀ| j  d¡ n
| j  dt|ƒ ¡ | j  d¡ | ¡  W Y d }~W d S d }~ww | 
|¡}|d tjjkr| j  d¡ | j  d¡ | ¡  W d S qœ ttfy   | j  d¡ |r| ¡  Y d S Y d S 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  Trš   zProcess got killedzExiting foreground)r*   r±   rÀ   rg   r   r   rU   Úhelp_fgrÁ   r¡   rD  r   r©   rª   r   r   r  r0  r   ÚProcessStatesÚRUNNINGr$   r8   r   ÚsendProcessStdinr   rK   r}   ÚEOFError)	r3   rG   rè   r^   rŸ   r×   r‘   re   Úinpr    r    r!   Údo_fg9  sv   



€ú

€ù
	îÿþzDefaultControllerPlugin.do_fgc                 C   r½  )Nz4fg <process>	Connect to a process in foreground modez		Ctrl-C to exitr   )r3   r~   r    r    r!   rÃ  {  r¿  zDefaultControllerPlugin.help_fg)r]  r4   )7r   r   r   r^   r,   r  r  r  r%  r#  r&  r'  Údo_exitr)  r5  r@  rB  rE  rG  rS  r\  rU  rb  rd  ri  re  rp  rk  rr  rq  rz  ru  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  Â  sj    S
3+1
16	%D#Br  c                 C   sl   |d u rt ƒ }|j| td t|ƒ}|jr$| d |j¡¡ t |j	¡ |j
r4| | |¡ t d¡ d S d S )N)rø   r²   r   )r   ÚrealizerL   rM   r~   r   Újoinr>   ÚexitrU   r‹   r€   )r~   r.   Úcr    r    r!   Úmain€  s   þrÏ  Ú__main__)NN)*rL   rV   r­   rŒ   r¬   r>   r%   Úsupervisor.compatr   r   r   r   r   Úsupervisor.medusar   r<   Úsupervisor.optionsr   r
   r   rŸ   r   r   r   r   r"   r   rM  rN  r   r‚   r&   r$   rW   rM   rë   rì   r  r  r  rÏ  r   r    r    r    r!   Ú<module>   sZ   	þ7  
5       
E
ÿ