o
    ׹ie                     @   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re(  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    U/home/ubuntu/veenaModal/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.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_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 )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.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rd }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 )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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  )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
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 rt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 rz ||}|D ]}| j | 
| | j |d tjj q\W qH tjy }	 z#|	jtjjkrd| }
| 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 rz ||}|D ]}| j | 
| | j |d tjj q\W qH tjy }	 ztj| j _|	jtjjkrd| }
| 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 rz||	|}|D ]}| j | | | j |d  qiW qT tjy } z|jtjjkrd|	 }| 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rd}| 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rq}||}||d d	d
 |D }|r j d|df  tj j _q}|| ||d q}|D ]"}|	r||	vrq|| ||d || || ||d q|D ]}|	r||	vrq|| ||d qd 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
