
    `iX                       d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlZd dlZd dlZd dlmZ d dlmZ d dlmZ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" 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. d dlm/Z/ d dlm0Z0 d dlm1Z1 d dlm2Z2 d d lm3Z3 d d!lm4Z4 d d"l5m6Z6 d d#l5m7Z7 d d$l5m8Z8 d d%l5m9Z9 d& Z: e:            Z;d' Z< G d( d)          Z= G d* d+          Z> G d, d-e>          Z? G d. d/e>          Z@g ZA G d0 d1ejB                  ZC G d2 d3eD          ZE G d4 d5eE          ZF G d6 d7eF          ZG G d8 d9eF          ZH G d: d;eE          ZI G d< d=eE          ZJ G d> d?eI          ZKd@ ZLdA ZMdB ZNdaOdC ZPdD ZQ G dE dF          ZRdG ZSdH ZTdI ZU G dJ dKeV          ZW G dL dMeW          ZX G dN dOeW          ZY G dP dQeW          ZZ G dR dSeW          Z[dS )T    N)PY2)ConfigParser)as_bytes	as_string)	xmlrpclib)StringIO)
basestringimport_spec)asyncore_25)process_or_group_name)boolean)integer)name_to_uid)gid_for_uid)existing_dirpath)	byte_size)signal_number)list_of_exitcodes)dict_of_key_value_pairs)logfile_name)list_of_strings)
octal_type)existing_directory)logging_level)colon_separated_user_group)inet_address)InetStreamSocketConfig)UnixStreamSocketConfig)url)	Automatic)Syslog)auto_restart)profile_options)loggers)states)xmlrpc)pollerc                  d   t           j                            t           j                            t                              } t           j                            | d          }t          |d          5 }|                                                                cd d d            S # 1 swxY w Y   d S )Nzversion.txtr)	ospathabspathdirname__file__joinopenreadstrip)mydirversion_txtfs      f/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/supervisor/options.py_read_version_txtr8   :   s    GOOBGOOH5566E',,um44K	k3		  1vvxx~~                                   s   2&B%%B),B)c                     t           j                            t           j                            t           j                            |                               S N)r+   r,   normpathr-   
expanduser)vs    r7   normalize_pathr>   A   s6    7BGOOBG,>,>q,A,ABBCCC    c                       e Zd ZdS )DummyN)__name__
__module____qualname__ r?   r7   rA   rA   D   s        Dr?   rA   c                       e Zd Zej        Zej        Zej        ZeZdxZZ	ej
        d         ZdZdZdZdZdZddZd Zd Zd Z	 	 	 	 	 	 	 	 	 ddZd	 Zdd
ZddZd Zd ZddZd Zd ZdS )OptionsNr   Tc                    g | _         g | _        g | _        i | _        i | _        i | _        i | _        i | _        || _        | 	                    dddd| j
                   | 	                    dddd| j
                   | 	                    dddd           t          j                            t          j                            t          j        d                             }t          j                            |d	d
          t          j                            |d
          d
dddg}|| _        i | _        t          j                                        D ]\  }}|| j        d|z  <   dS )znConstructor.

        Params:
        require_configfile -- whether we should fail on no config file.
        Nhhelp?
configfilezc:zconfiguration=r   etczsupervisord.confzetc/supervisord.confz/etc/supervisord.confz /etc/supervisor/supervisord.confENV_%s)
names_listshort_optionslong_optionsoptions_mapdefault_maprequired_mapenviron_mapattr_prioritiesrequire_configfileaddrJ   r+   r,   r.   sysargvr0   searchpathsenviron_expansionsenvironitems)selfrW   herer[   kr=   s         r7   __init__zOptions.__init__Y   sQ    !"4tS&$)444tS$	222tT+;<<<wrwsx{;;<<w||D%1CDDw||D*<==)-.9 '"$J$$&& 	6 	6DAq45D#HqL11	6 	6r?   c                     d}| j         D ]%}t          j                            |          r|} n&|7| j        r0|                     dd                    | j                   z             |S )z=Return the name of the found config file or print usage/exit.NzjNo config file found at default paths (%s); use the -c option to specify a config file at a different path, )r[   r+   r,   existsrW   usager0   )r_   configr,   s      r7   default_configfilezOptions.default_configfilez   s    $ 	 	Dw~~d##  >d5>JJ -/3yy9I/J/JK L L L r?   c                     | j         dz   }|                    d          dk    r|                    d| j                  }| j                            |           |                     d           dS )zxPrint a long help message to stdout and exit(0).

        Occurrences of "%s" in are replaced by self.progname.
        
z%sr   N)docfindreplaceprognamestdoutwriteexit)r_   dummyrJ   s      r7   rJ   zOptions.help   sb    
 x$99T??Q<<dm44D$		!r?   c                     | j                             dt          |          z             | j                             d| j        z             |                     d           dS )z2Print a brief error message to stderr and exit(2).z
Error: %s
zFor help, use %s -h
   N)stderrrp   strrn   rq   r_   msgs     r7   rf   zOptions.usage   sT    -#c((23331DMABBB		!r?   c
                 Z   |u|t          d          |s|st          d          |r$|                    d          rt          d          |r$|                    d          rt          d          |fd}|rC|rA|                    d          |                    d          k    rt          d|d|          |r|d	         d
k    rt          d          |dd         |dd         }}
|dvrt          d          d
|
z   }
|
| j        v rt          d|
z            ||f| j        |
<   | j                            |           |ry|d	         d
k    rt          d          |}
|
d         dk    r
|
dd         }
d|
z   }
|
| j        v rt          d|
z            ||f| j        |
<   | j                            |           |	r||f| j        |	<   |rWt          | |          st          | |d           | j	                            ||f           |
|| j
        |<   |r|| j        |<   dS dS dS )a  Add information about a configuration option.

        This can take several forms:

        add(name, confname)
            Configuration option 'confname' maps to attribute 'name'
        add(name, None, short, long)
            Command line option '-short' or '--long' maps to 'name'
        add(None, None, short, long, handler)
            Command line option calls handler
        add(name, None, short, long, handler)
            Assign handler return value to attribute 'name'

        In addition, one of the following keyword arguments may be given:

        default=...  -- if not None, the default value
        required=... -- if nonempty, an error message if no value provided
        flag=...     -- if not None, flag value for command line option
        env=...      -- if not None, name of environment variable that
                        overrides the configuration file or default
        Nz%use at most one of flag= and handler=z"flag= requires a command line flag:=c                     |S r:   rE   )argflags     r7   <lambda>zOptions.add.<locals>.<lambda>   s    T r?   z!inconsistent short/long options:  r   -z&short option should not start with '-'   ) rz   z"short option should be 'x' or 'x:'zduplicate short option key '%s'z%long option should not start with '-'z--zduplicate long option key '%s')
ValueErrorendswithrR   rP   appendrQ   rU   hasattrsetattrrO   rS   rT   )r_   nameconfnameshortlonghandlerdefaultrequiredr~   envkeyrests               r7   rX   zOptions.add   s   @ " !HIII G G !EFFF G,, G !EFFF Gc** G !EFFF'+111G 	"T 	"~~c""dmmC&8&888 jEE44"! " " "  
	-Qx3 !IJJJbqb	59C9$$ !EFFF)Cd&&& !BS!HIII%)7ODS!%%e,,, 
	+Aw#~~ !HIIIC2w#~~#2#h*Cd&&& !AC!GHHH%)7ODS!$$T*** 	4%)7ODS! 	34&& *dD)))O""D(#3444")0 & 3*2!$'''	3 	33 3r?   c                     | j                             |d          }||k    rt          | ||           || j         |<   d S d S )Nr   )rV   getr   )r_   attrvaluepriocurrents        r7   _setzOptions._set   sO    &**4447??D$&&&)-D &&& ?r?   c           
      F   |t           j        dd         }|t           j        d         }|	 ddl}|j        }n# t          $ r Y nw xY w|| _        || _        g | _        g | _        	 t          j	        |d
                    | j                  | j                  \  | _        | _        n># t          j        $ r,}|                     t          |                     Y d}~nd}~ww xY w| j        r1| j        s*|                     dt          | j                  z             | j        D ]\  }}| j        |         \  }}	|	B	  |	|          }n5# t$          $ r(}
|                     d|d|d|
           Y d}
~
nd}
~
ww xY w|rA|?t'          | |          |                     d	|z             |                     ||d
           | j                                        D ]}| j        |         \  }}	|t.          j        v rqt.          j        |         }|	B	  |	|          }n5# t$          $ r(}
|                     d|d|d|
           Y d}
~
nd}
~
ww xY w|r||                     ||d           | j        |                                 | _        |                                  dS )zRealize a configuration.

        Optional arguments:

        args     -- the command line arguments, less the program name
                    (default is sys.argv[1:])

        doc      -- usage message (default is __main__.__doc__)
        Nr   r   r   z*positional arguments are not supported: %szinvalid value for r   : z"conflicting command line option %rrt   zinvalid environment value for )rY   rZ   __main____doc__	Exceptionrn   rk   optionsargsgetoptr0   rP   rQ   errorrf   rv   positional_args_allowedrR   r   getattrr   rU   keysr+   r]   rL   rh   process_config)r_   r   rk   rn   r   excoptr}   r   r   rx   envvarr   s                r7   realizezOptions.realize   sF    <8ABB<Dx{H;&    		!&,mbggd01143D'F 'F#DL$))| 	! 	! 	!JJs3xx        	! 9 	XT9 	XJJCs49~~VWWW  
	( 
	(HC ,S1MD'"P!'#,,CC! P P PJJJSSS##NOOOOOOOOP (4&&2JJCcIJJJ		$Q''' &++-- 	. 	.F ,V4MD'##
6*&; '% ; ; ;


&,ffeeeSS$: ; ; ; ; ; ; ; ;;  .E-IIdE1---?""5577DOsX   : 
AA'A B( (C#7"CC#=E		
E;E66E;H
I&I		Ic                    | j         r|                     |           | j        D ]S\  }}|rL|                    d          }| j        }|D ]}| nt          ||          }|                     ||d           T| j                                        D ]&\  }}t          | |          t          | ||           '| j
                                        D ]*\  }}t          | |          |                     |           +dS )z}Process configuration data structure.

        This includes reading config file if necessary, setting defaults etc.
        .Nr   )rL   process_config_filerO   split
configrootr   r   rS   r^   r   rT   rf   )	r_   do_usager   r   partsobjpartr   messages	            r7   r   zOptions.process_config8  s2   
 ? 	/$$X... #o 		( 		(ND( ( s++o! - -D{!#t,,CC		$Q'''  +1133 	+ 	+KD%tT""*dE*** ".4466 	$ 	$MD'tT""*

7###	$ 	$r?   c                    t          | j        d          sFt          j                            t          j                            | j                            | _        	 |                     | j                   d S # t          $ r?}|r#| 	                    t          |                     nt          |          Y d }~d S d }~ww xY w)Nr2   )r   rL   r+   r,   r-   r.   r`   read_configr   rf   rv   )r_   r   rx   s      r7   r   zOptions.process_config_fileW  s    t// 	J(H(HIIDI	&T_----- 	& 	& 	& &

3s88$$$$ !oo% %$$$$$	&s   A9 9
C4B==Cc                 @    t           j                            |          S r:   )r+   r,   re   r_   r,   s     r7   re   zOptions.existse  s    w~~d###r?   r*   c                 "    t          ||          S r:   )r1   )r_   fnmodes      r7   r1   zOptions.openh  s    B~~r?   c                    g }|                                 D ]}|                    |          s|                    dd          d         }|                    ||d           }|t	          d|d|          	 |                     |          }n*# t          t          f$ r t	          |d|d          w xY wi }	|                    |          D ]!}
|
|k    r|                    ||
          |	|
<   "|	                    |||	f           |S )Nrz   r   z	section [z] does not specify a  cannot be resolved within [])
sections
startswithr   sanegetr   r   AttributeErrorImportErrorr   r   )r_   parserfactory_keysection_prefix	factoriessectionr   factory_specfactoryextrasra   s              r7   get_pluginszOptions.get_pluginsk  sW   	(( 	6 	6G%%n55 ==a((+D!>>';EEL# j")'';;"8 9 9 9,**<88"K0 , , ,  LL'''"+ , , ,, F^^G,, ; ;## &w : :F1IdGV45555s   :B'B7c                      t          |          S )z7On failure, raises either AttributeError or ImportErrorr
   )r_   specs     r7   r   zOptions.import_spec  s    4   r?   T)	NNNNNNNNN)NNN)r*   )rB   rC   rD   rY   ru   ro   rq   warningsuidgidrZ   rn   rL   	schemadirr   r`   r   rb   rh   rJ   rf   rX   r   r   r   r   re   r1   r   r   rE   r?   r7   rG   rG   G   sc       ZFZF8DHC#x{HJIJD  6 6 6 6B  	 	 	   R3 R3 R3 R3h. . .D D D DL$ $ $ $>& & &$ $ $     4! ! ! ! !r?   rG   c                      e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdZdZej        j        Zd Zd Zd Zd Zd Zd<d
Zd Zd Zd Z	 d=dZ	 d=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$ Z2d% Z3d& Z4d' Z5d( Z6d) Z7d* Z8d+ Z9d, Z:d- Z;d. Z<d/ Z=d0 Z>d1 Z?d2 Z@d3 ZAd4 ZBd5 ZCd6 ZDd7 ZEd8 ZFd<d9ZGd: ZHd; ZIdS )>ServerOptionsNrE   Fc           	         t                               |            t                      | _        t                      | j        _        |                     d d dd| j                   |                     dddddd           |                     d	d
dd           |                     ddddt          d           |                     ddddt                     |                     ddddt          d           |                     ddddt          d            |                     d!d"d#d$t          d%           |                     d&d'd(d)t          d*           |                     d+d,d-d.t          d/           |                     d0d1d2d3t          d4           |                     d5d6d7d8t          t          j                               |                     d9d:d;d<t           d=           |                     d>d?d@dAt           dB           |                     dCdDdEdCdd           |                     dFdGdHdFdd           |                     dIdJd@dKt"          d            |                     dLdMdNdLdd           i | _        g | _        g | _        g | _        g | _        t/                      | _        t3          j        |           | _        d S )ONr=   versionnodaemonzsupervisord.nodaemonnr   r   r~   r   userzsupervisord.useru:zuser=umaskzsupervisord.umaskzm:zumask=022r   	directoryzsupervisord.directoryzd:z
directory=logfilezsupervisord.logfilezl:zlogfile=supervisord.loglogfile_maxbyteszsupervisord.logfile_maxbyteszy:zlogfile_maxbytes=i   logfile_backupszsupervisord.logfile_backupszz:zlogfile_backups=
   loglevelzsupervisord.loglevelze:z	loglevel=infopidfilezsupervisord.pidfilezj:zpidfile=supervisord.pid
identifierzsupervisord.identifierzi:zidentifier=
supervisorchildlogdirzsupervisord.childlogdirzq:zchildlogdir=minfdszsupervisord.minfdsza:zminfds=   minprocszsupervisord.minprocsr   z	minprocs=   	nocleanupzsupervisord.nocleanupra   
strip_ansizsupervisord.strip_ansitr$   zsupervisord.profile_optionszprofile_options=silentzsupervisord.silents)rG   rb   rA   r   supervisordrX   r   r   r   r   r   r   r   rv   tempfile
gettempdirintr$   
pidhistoryprocess_group_configsparse_criticalsparse_warningsparse_infosSignalReceiversignal_receiverr(   Pollerr_   s    r7   rb   zServerOptions.__init__  sT   ''&+gg#tS)T\:::3S*1 	 	 	 	+T7;;;-tXU 	 	, 	, 	,5t\#	% 	% 	%14!+< 	 	> 	> 	>#%C*I) 	 	+ 	+ 	+ 	"$A)7B 	 	@ 	@ 	@3T; 	 	0 	0 	014!+< 	 	> 	> 	>7}l 	 	, 	, 	, 94#X-@-B-B 	 	D 	D 	D/y#t 	 	5 	5 	53[#s 	 	4 	4 	45k1 	 	6 	6 	67lA 	 	7 	7 	7"$A'$ 	 	H 	H 	H/hQ 	 	3 	3 	3%'"! -//mD))r?   c                 t    | j                             dt          z             |                     d           dS )z-Print version to stdout and exit(0).
        %s
r   N)ro   rp   VERSIONrq   )r_   rr   s     r7   r   zServerOptions.version  s2     	&7*+++		!r?   c                 $    t          j        |i |S r:   )r%   	getLoggerr_   r   kwargss      r7   r  zServerOptions.getLogger  s     $1&111r?   c                     t          j                    dk    r| j                            d           t                              |           S )Nr   a  Supervisord is running as root and it is searching for its configuration file in default locations (including its current working directory); you probably want to specify a "-c" argument specifying an absolute path to a configuration file for improved security.)r+   getuidr   warnrG   rh   r  s    r7   rh   z ServerOptions.default_configfile  sH    9;;!M   ))$///r?   c                    t          j        | g|R i | | j        j        }| j        ]	 t          | j                  }n,# t          $ r}|                     |           Y d }~nd }~ww xY w|| _        t          |          | _
        | j        s|j        | _        | j        r| j        }n|j        }|dk    rt          |          | _        | j        r| j        }n|j        }t          |          | _        |j        | _        d | _        |j        x| _        }d |D             D ]}	|	d         }
d|
z  | _         | j        0d |D             D ]%}	|	d         }|	d         }|sd}d	|d
|| _        $d S d S )Nsyslogc                 :    g | ]}|d          t           j        u |S family)socketAF_UNIX.0rg   s     r7   
<listcomp>z)ServerOptions.realize.<locals>.<listcomp>
  s3     = = =6x(FN:: :::r?   file	unix://%sc                 :    g | ]}|d          t           j        u |S r  )r  AF_INETr  s     r7   r  z)ServerOptions.realize.<locals>.<listcomp>  s6     @ @ @v"8,>> #>>>r?   hostport	localhostzhttp://rz   )rG   r   r   r   r   r   r   rf   r   r   r   r   r   r>   r   rpcinterface_factories	serverurlserver_configs)r_   r}   kwr   r   rx   r   r   sconfigsrg   r,   r  r  s                r7   r   zServerOptions.realize  s   )s)))b)))/- 9  !$),,      

3 DH"3''DH} 	-#,DM< 	&lGGoGh *'22DL< 	&lGGoG%g..&-&D#)0)??h
= =X = = = 	 	F&>D(4/DN >!@ @ @ @ @ ? ?f~f~ '&D3744!> "!? ?s   ? 
A(	A##A(Tc                 n    t                               | |           | j        j        j        }|| _        d S )N)r   )rG   r   r   r   r   )r_   r   news      r7   r   zServerOptions.process_config  s6    th777o)?%("""r?   c           	      p   g | _         g | _        g | _        | j        j        }d}t          |d          sh|                     |          st          d|z            	 |                     |d          }d}n'# t          t          f$ r t          d|z            w xY wt                      | j        _        	 	                     |           n%# t          $ r                     |           Y nw xY wn3# t"          j        $ r!}t          t'          |                    d }~ww xY w|r|                                 n# |r|                                 w w xY wt+          j                    }| j        |d}|                    | j                                       d          r                    | j                                       dd	          st          d
                              dd	          }t;          ||d          }|                                }t          |d          rBt>          j         !                    t>          j         "                    |j#                            }nd}|D ]}	t>          j         $                    ||	          }	tK          j%        |	          }
|
s| j        &                    d|	z             WtO          |
          D ]}| j        &                    d|z             	 (                    |                               t>          j         "                    t>          j         !                    |                               # t"          j        $ r!}t          t'          |                    d }~ww xY w )                                }d|vrt          d          d| j        ifd}tU           |dd                    |_+        tU           |dd                    |_,         |dd           }|d |_-        nt]          |          |_-         |dd           |_/        ta           |dd                    |_1        te           |dd                    |_3        ti           |dd                    |_5        tU           |d d!                    |_6        to           |d"d#                    |_8        te           |d$d%                    |_9         |d&d'          |_:        tw           |d(d)                    |_<        tw           |d*d)                    |_=        t}          j?                    }t]           |d+|                    |_@        tw           |d,d)                    |_A        tw           |d-d)                    |_B         |d.d/          }t;          ||d.          }t          |          |_D        |jD        E                                D ]\  }}|| j        d0|z  <   | F                    d1d2          |_G        | H                              |_I        |jI        D ]F}|jJ        D ]<}|jD        K                                }|                    |jD                   ||_D        =G| L                              |_M        d |_N        |S )3NFr2   could not find config file %sr*   Tcould not read config file %s)r`   host_node_nameincludefilesz5.ini file has [include] section, but no files settingzinclude.filesr   r   z No file matches via include "%s"z'Included extra file "%s" during parsingr   z..ini file does not include supervisord sectionr`   c                     |                     di           }|                               ||d<    j        | |fi |S N
expansions)r   update
getdefault)r   r   r
  r.  common_expansionsr   s       r7   r   z&ServerOptions.read_config.<locals>.getj  sR    L"55J/000#-F< $6$S'<<V<<<r?   r   r   r   r   r   r   r   r   r   r   r   50MBr   r   r   r   r   r   r   r   r   falser   r   r   r   environmentr   rN   zsupervisor.rpcinterface_factoryzrpcinterface:)Or   r   r   r   r   r   re   r   r1   IOErrorOSErrorUnhosedConfigParserr\   r.  	read_filer   readfpr   ParsingErrorrv   closeplatformnoder`   r/  has_sectionexpand_here
has_optionr   expandr   r+   r,   r.   r-   r   r0   globr   sortedr2   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   r4  r^   r   r  process_groups_from_parserr   process_configscopyserver_configs_from_parserr!  r$   )r_   fpr   
need_closewhyr)  r.  r+  basepattern	filenamesfilenamer   r   r   tempdirenviron_strra   r=   groupprocr   r1  r   s                         @@r7   r   zServerOptions.read_config#  s      " /-
r6"" 	G;;r?? G !@2!EFFFGYYr3''!

W% G G G !@2!EFFFG %&& 3		"  $$$$! " " "b!!!!!"( 	' 	' 	'SXX&&&	'  


  



 "!Y'57 7
$1222i(( 	ty)))$$Y88 !  "  ! ! !JJy'22E5*o>>EKKMMEr6"" wrwrw'?'?@@   ',,tW55 Ig..	  '..:WDF F F &y 1 1 
 
H$++AHLN N NH--- **GOOBGOOH,E,EFF    (4 3 3 3(S2223
 ??$$((MNNN#DI.	= 	= 	= 	= 	= 	= !Xt!4!455"33z3#7#788CT**	 $G 29 = =Gs64(("33w#6#677*33y:K+L+LMM#,SS1CV-L-L#M#M ")##.?*D*D"E"E(Z)@)@AA*33y:K+L+LMM S|<<"33z7#;#;<< Xw!7!788%''0]G1L1LMM#CCW$=$=>>$SSw%?%?@@c-,,[*mDD5kBB '--// 	7 	7DAq56D#HqL22 *.)9)9-* *&
 )-(G(G(O(O%2 	' 	'E- ' ')..00

4+,,,#&  ' "&!@!@!H!H"&sl   A7 7$B:C C6 C2/C6 1C22C6 5E  6D&D!!D&&E   E?M$$N3NNc                   " g }                                 }g }d| j        i""fd}|D ]6}|                    d          st          |                    dd          d                   }t           ||dd                     }t           ||dd                    }	g }
|D ]}d	|z  }d
|z  }||vr||vrt          d|d|          ||v r||v rt          d|d|d          ||v r|n|}|                    |           | 	                    ||t                    }|
                    |           |                    t          | ||	|
                     8|D ]}|                    d          r||v rt          |                    dd          d                   }t           ||dd                    }	| 	                    ||t                    }|                    t          | ||	|                     |D ]}|                    d          s|                    dd          d         }t           ||dd                    }	t           ||dd                    }|dk     rt          d||fz             ||dd          }	 |                     |          }n*# t          t          f$ r t          |d|d          w xY wd t           ||dd                    D             }t!          |          }|st          d|z            ddlm} g }|D ]@}t'          ||d           }|t          d|d |d!          |                    |           At)           ||d"d#                    }|rt          d$|z            | 	                    ||t*                    }|                    t-          | ||	||||                     |D ]}|                    d%          r||v rt          |                    dd          d                   }t           ||dd                    }	d&|i} ||d'd           }|d }nt/          |          } ||d(d           }|-t          |          }|dk     s|d)k    rt          d*|z             ||d+d           }|1	 t1          |          }n # t          $ r t          d,|z            w xY w ||d-d           }|8	 t3          |          }n'# t4          t          f$ r t          d.|z            w xY w ||d/d |0          }|st          d1|z            	 |                     |||||          } n4# t          $ r'}!t          t9          |!          d |d2          d }!~!ww xY w| 	                    ||t:                    }|                    t=          | ||	||                      |                                 |S )3Nr`   c                     |                     di           }|                               ||d<    j        | ||fi |S r-  r   r/  r   )r   r   r   r
  r.  r1  r   s        r7   r   z5ServerOptions.process_groups_from_parser.<locals>.get  sS    L"55J/000#-F< !6>'3BB6BBBr?   zgroup:rz   r   programspriority  z
program:%szfcgi-program:%s[z(] names unknown program or fcgi-program z] name z2 is ambiguous (exists as program and fcgi-program)zprogram:zeventlistener:r   buffer_sizer   z*[%s] section sets invalid buffer_size (%d)result_handlerz&supervisor.dispatchers:default_handlerr   r   c                 6    g | ]}|                                 S rE   )upper)r  xs     r7   r  z<ServerOptions.process_groups_from_parser.<locals>.<listcomp>  s2      M  M  Ma		  M  M  Mr?   eventsr   z&[%s] section requires an "events" liner   )
EventTypeszUnknown event type z in [z] eventsredirect_stderrr3  zx[%s] section sets redirect_stderr=true but this is not allowed because it will interfere with the eventlistener protocolzfcgi-program:program_namer   socket_backlog  zInvalid socket_backlog value %ssocket_ownerzInvalid socket_owner value %ssocket_modezInvalid socket_mode value %sr  r.  z%[%s] section requires a "socket" linez] socket) r   r`   r   r   r   r   r   r   r   processes_from_sectionProcessConfigextendProcessGroupConfigr   r   r   setsupervisor.eventsr`  r   r   EventListenerConfigEventListenerPoolConfigr   r   r   	TypeErrorparse_fcgi_socketrv   FastCGIProcessConfigFastCGIGroupConfigsort)#r_   r   groupsall_sectionshomogeneous_excluder   r   
group_namerV  rW  group_processesprogramprogram_sectionfcgi_section	processesrb  	pool_namerZ  r[  pool_event_namesr`  pool_eventspool_event_name
pool_eventra  fcgi_expansions	proc_userproc_uidrc  re  rf  r  socket_configer1  s#    `                                @r7   rD  z(ServerOptions.process_groups_from_parser  sr   (( #DI.	C 	C 	C 	C 	C 	C $ 	 	G%%h// .w}}S!/D/DQ/GHHJ&ss7J'E'EFFHss7J<<==H O# 2 2"."807:&,66||?[?[$*KR77T[T[\^ ^ ^"l22||7S7S%: '''+, , , .=-L-L//R^#**7333 778BMS S	  &&y1111MM"4XOO   
 $ 
	 
	G((44 2220sA1F1Fq1IJJLss7J<<==H11&'<2?A AIMM"4xKK   
 $ 3	 3	G%%&677 c1--a0I ss7J;;<<H!##g}b"A"ABBKQ !Mk*"+ , , , !S*:'OQ QN.!%!1!1.!A!A"K0 . . . "NNGGG"- . . .. M  M /GXr0J0J K K M  M  M"#344# * !I!(") * * * 544444K#3 / /$Z$GG
%$*&5oowww&@ A A A"":....%cc'3Dg&N&NOOO A  "68?"@ A A A 11&'92EG GI MM'i9(3[(68 8    $ 8	 8	G((99 2220sA1F1Fq1IJJLss7J<<==H-|<O GVT22I &y11 S*:DAAN)!(!8!8"Q&&.5*@*@$%F>L&M N N N 3w==L'P#=l#K#KLL! P P P$%DBN&O P P PP #g}d;;K&O",["9"9KK!:. O O O$%CBM&N O O OO S(D_MMMF * !H!(") * * *J $ 6 6vx4@+4B!D !D  J J J A!HIIIJ 11&'<2FH HIMM"4x#02 2   
 	s<   J11'K5SS"5T$T)U**
V4"VVc                 L   |                     d          r|dd          }t          j                            |          st	          d|          t          |          }|,t          j                    }|||k    r|t          |          f}|d}t          ||||          S ||t	          d          t          j
        d|          }|rI|                    d          }	t          |                    d	                    }
t          |	|
|
          S t	          d|          )Nunix://   z+Unix socket path %s is not an absolute path  )ownerr   backlogzQsocket_owner and socket_mode params should only be used with a Unix domain socketztcp://([^\s:]+):(\d+)$r   rt   )r  zBad socket format %s)r   r+   r,   isabsr   r>   r  r   r   rematchrQ  r   r   )r_   sockr  re  rf  rc  r,   r   mr  r  s              r7   rq  zServerOptions.parse_fcgi_socketK  sY   ??9%% 	H8D7==&& ' !N!%' ' '!$''D#ikk'HOO$,k(.C.C#DL"#)$l5@8FH H H H #{'> @ A A A H.55 	,771::Dqwwqzz??D)$*, , , , /666r?   c           	          	 |                      ||||          S # t          $ r=}|j                            || j                  }t          |d|d|d          d }~ww xY w)Nz in section z (file: ))_processes_from_sectionr   section_to_filer   rL   )r_   r   r   rx  klassr  rN  s          r7   rh  z$ServerOptions.processes_from_sectionn  s    	7//U4 4 4 	7 	7 	7-11'4?KKH !777HHH6 7 7 7	7s    
A!8AA!c                   1 |t           }g }t          |                    dd          d                   }t          j                    }| j        |||d11fd}t           ||dd                    }	t           ||dd                    }
t           ||d	d
                    }t           ||dd                    }t           ||dd                    }t           ||dd                    }t           ||dd                    }t           ||dd                    }t           ||d|                    }t           ||dd                    }t           ||dd                    }t           ||dd                    }t           ||dd                    } ||ddd          }t           ||dd                    }t           ||d d                    }t           ||d!d                    }t           ||d"d                    } ||d#d           }|r,|                                                                d$k    rd } ||d%d           }|d }nt          |          } ||d&d           }|t          |          }t           ||d'd(d                    }|dk    rd)|vrt!          d*          |r|st!          d+          t#          |||z             D ]} 1}!|!                    | |d,           |!                    | j                   t)          t+          ||!d                    }"|"                                D ]\  }#}$|$|!d-|#z  <    ||d.d           }%i }&d/D ]%}#d0|#z  }' |||'t.                    }(t1          |(t2                    rt+          |(|!|'          }(t5          |(          }(|(|&|'<   d1|#z  })t           |||)d                    }*|*|&|)<   d2|#z  }+t           |||+d3                    },|,|&|+<   d4|#z  }-t           |||-d                    }.|.|&|-<   |(t6          u r0| j                            d5|d6|'d7|-d8           d x|&|'<   }(d9|&|-<   |(t.          u r#|,s!| j                            d5|d:|'d;           '|r3|&d<         t.          d fvr| j                            d=|z             d |&d<<    ||d>d |!?          }/|/t!          d@|z             || fi dAt+          ||!d'          d>|/d.|%d&|d|	d|
d	|d|d|dB|dC|&dC         d|d |dD|&dD         dE|&dE         dF|&dF         d<|&d<         d!|d"|dG|&dG         dH|&dH         dI|&dI         d|d|d|d|d|d|d|"d#|}0|                    |0           |                                 |S )JNrz   r   )r`   rb  r)  rx  c                     |                     di           }|                               ||d<    j        | |g|R i |S r-  rU  )r   r   r   r
  r.  r1  r   s        r7   r   z2ServerOptions._processes_from_section.<locals>.get  sY    L"55J/000#-F< !6>'3@@@@@@@r?   rW  rX  	autostarttrueautorestart
unexpected	startsecsstartretries   
stopsignalTERMstopwaitsecsr   stopasgroupr3  killasgroup	exitcodes0ra  numprocsnumprocs_startr   r4  r   F)	do_expandstdout_capture_maxbytesstdout_events_enabledstderr_capture_maxbytesstderr_events_enabledr   AUTOr   r   process_namez%(program_name)sz%(process_num)zD%(process_num) must be present within process_name when numprocs > 1z1Cannot set stopasgroup=true and killasgroup=false)process_numr  rN   r   )ro   ru   z
%s_logfilez%s_logfile_backupsz%s_logfile_maxbytesr2  z	%s_syslogzFor [z], z9=syslog but this is deprecated and will be removed.  Use z=true to enable syslog instead.Tz], AUTO logging used for zR without rollover, set maxbytes > 0 to avoid filling up filesystem unintentionallystderr_logfilezpFor [%s], redirect_stderr=true but stderr_logfile has also been set to a filename, the filename has been ignoredcommandrg  z-program section %s does not specify a commandr   r   stdout_logfilestdout_logfile_backupsstdout_logfile_maxbytesstdout_syslogstderr_logfile_backupsstderr_logfile_maxbytesstderr_syslog)ri  r   r   r<  r=  r`   r   r   r#   r   r   r   r3   r]  r   r   r   ranger/  r\   r   rA  r^   r!   
isinstancer	   r   r"   r   r   rt  )2r_   r   r   rx  r  rV  rb  r)  r   rW  r  r  r  r  r  r  r  r  r  ra  r  r  environment_strstdout_cmaxbytesstdout_eventsstderr_cmaxbytesstderr_eventsr   r   r   r   r  r  r.  r4  ra   r=   r   logfileslf_keylf_valbu_keybackupsmb_keymaxbytessy_keyr  r  pconfigr1  s2    `                                               @r7   r  z%ServerOptions._processes_from_sectionx  s[   =!E,W]]3-B-B1-EFF!$(I%1'5#-/ /	A 	A 	A 	A 	A 	A 33w
C8899CCf==>>	"33w|#L#LMMCCa8899	ss7NA>>??"33wf#E#EFF
ss7NB??@@cc'='BBCCcc'=+FFGG%cc';&D&DEE	!##g/@"I"IJJ33w
A6677 W.>!B!BCC#g}bEJJJ$SS1J3%O%OPPG-DW M MNN$SS1J3%O%OPPG-DW M MNNCd33	 	**0022f<<I s7FD))<CCd##CGWd++u%%E,C);uMMMO O a<<#|33 !#$ $ $  	{ 	C   !N1JKK c	% c	%K*JkxPPQQQd56661
MBBD DK $))++ - -1+,
8a<((G[$77IH) "J "J%)Wfi88fj11 @#FJ??F%f--#) -1!##gvr":":;;#* .2$SS&&%A%ABB#+ $q Wfe!<!<==#)  V##'...  12 2 2 154HV$v'+HV$Y&&x&'... 9@IJ J J
  2,-i5FFF'.."$+,- - -
 .2)*c'9dzJJJG CgMO O O e% % %L*nEEE%  % $)	%
 e% "% $)% (K% $)% *\% C%  ((899% +;*:% )6% (00H'I'I%  )11J(K(K!%" '77#%$  ((899%%& +;*:'%( )6)%* (00H'I'I+%, )11J(K(K-%. '77/%0 &:1%2 *\3%4 (K5%6 (K7%8 $)9%: !0;%< (K=%> $)?%GB OOG$$$$r?   c                     g }|                                 D ]b}|                    |          rK|                    dd          }t          |          dk    r	|d         }nd }|                    ||f           c|S )Nrz   r   )r   r   r   lenr   )r_   r   styper   r   r   r   s          r7   _parse_servernamesz ServerOptions._parse_servernames$  s    (( 	0 	0G!!%(( 0c1--u::>> 8DDDg///r?   c                     |j         } ||dd           } ||dd           }||||t          d|z            ||dS )NusernamepasswordzSection [%s] contains incomplete authentication: If a username or a password is specified, both the username and password must be specified)r  r  )r   r   )r_   r   r   r   r  r  s         r7   _parse_username_and_passwordz*ServerOptions._parse_username_and_password0  sx    n3w
D113w
D118#78#3 >@GHI I I $999r?   c                 J   g }|                      |d          }|D ]\  }}i }|j        }|                    |                     ||                     ||d<   t          j        |d<    ||dd           }|t          d|z            t          |          \  }	}|	|d<   ||d<   ||d<   |                    |           |                      |d          }
|
D ]K\  }}i }|j        } ||d	d d
| j	        i          }|t          d|z            |
                                }||d<   t          j        |d<   t          |          |d	<   |                    |                     ||                      ||dd           }|1	 t          |          }n"# t          $ r t          d|z            w xY wd}||d<    ||dd           }|8	 t          |          }n)# t          t          f$ r t          d|z            w xY wd}||d<   ||d<   |                    |           M|S )Ninet_http_serverr   r  r  zsection [%s] has no port valuer  r   unix_http_serverr  r`   rg  zsection [%s] has no file valuechownzInvalid sockchown value %s)r   r   chmodzInvalid chmod value %sr  )r  r   r/  r  r  r  r   r   r   r`   r3   r  r>   r   r   rp  )r_   r   configsinet_serverdefsr   r   rg   r   r  r  unix_serverdefssfiler  r  s                 r7   rG  z(ServerOptions.server_configs_from_parser<  s   11&:LMM, 	# 	#MD'F.CMM$;;FGLLMMM!F6N%~F83w--D| !AG!KLLL%d++JD$!F6N!F6N 'F9NN6""""11&:LMM, 	# 	#MD'F.CC649:MNNNE} !AG!KLLLKKMME!F6N%~F8+E22F6NMM$;;FGLLMMMC$//E K6u==EE! K K K$%AE%IJJJK !#F7OC$//E G&u--EE!:. G G G$%=%EFFFG #F7O 'F9NN6""""s   FF/	G$G=c                     | j                                          |                                  | j                                          d S r:   )r(   before_daemonize
_daemonizeafter_daemonizer  s    r7   	daemonizezServerOptions.daemonizeq  s@    $$&&&##%%%%%r?   c                    t          j                    }|dk    r.| j                            d           t          j        d           | j                            d           | j        ry	 t          j        | j                   | j                            d| j        z             n<# t          $ r/}| j        	                    d| j        d|           Y d }~nd }~ww xY wt          j
        d           t          d          x| _        xt          _        t          _        t          j
        d           t          dd	          x| _        xt          _        t          _        t          j
        d
           t          dd	          x| _        xt          _        t          _        t          j                     t          j        | j                   d S )Nr   z"supervisord forked; parent exitingz#daemonizing the supervisord processzset current directory: %rzcan't chdir into r   z	/dev/nullr   wrt   )r+   forkloggerblather_exitr   r   chdirr6  criticalr;  r1   stdinrY   	__stdin__ro   
__stdout__ru   
__stderr__setsidr   )r_   piderrs      r7   r  zServerOptions._daemonizev  s   , gii!88K DEEEHQKKK>???> 	33(((
   !<#'>"2 3 3 3 3	  > > >$$$(,&= > > > > > > > >> 	15k1B1BB
BSY
48c4J4JJJcj3>
48c4J4JJJcj3>
	
s   *B& &
C0%CCc                 t   t          j                    }	 t          | j        d          5 }|                    d|z             d d d            n# 1 swxY w Y   d| _        | j                            d|z             d S # t          t          f$ r& | j        
                    d| j        z             Y d S w xY w)Nr  r  Tzsupervisord started with pid %szcould not write pidfile %s)r+   getpidr1   r   rp   unlink_pidfiler  r   r5  r6  r  )r_   r  r6   s      r7   write_pidfilezServerOptions.write_pidfile  s   ikk	FdlC(( &A%%%& & & & & & & & & & & & & & &
 #'DK>DEEEEE	 ! 	N 	N 	NK  !=!LMMMMMM	Ns4   B  AB  AB  AB   3B76B7c                    | j         D ]?\  }}|d         t          j        k    r$| j        r|d         }|                     |           @| j        r|                     | j                   | j                                         d S )Nr  r  )	httpserversr  r  unlink_socketfiles_try_unlinkr  r   r(   r;  )r_   rg   server
socketnames       r7   cleanupzServerOptions.cleanup  s    ". 	1 	1NFFh6>11* 1!'J$$Z000 	+T\***r?   c                 R    	 t          j        |           d S # t          $ r Y d S w xY wr:   )r+   unlinkr6  r   s     r7   r  zServerOptions._try_unlink  s:    	IdOOOOO 	 	 	DD	    
&&c                 $   g }| j         D ]l\  }}|                                 |                                                                 D ],}t	          |dd           }||u r|                    |           -m|D ]}|                                 d S )Nr  )r  r;  get_socket_mapvaluesr   r   )r_   dispatcher_serversrg   r  
dispatcherdispatcher_servers         r7   close_httpserverszServerOptions.close_httpservers  s    ". 	: 	:NFFLLNNN"1133::<< : :
$+J$$G$G!$..&--j999: ) 	 	F LLNNNN	 	r?   c                 8    | j                                          d S r:   )r  r;  r  s    r7   close_loggerzServerOptions.close_logger  s    r?   c                    | j         j        }t          j        t          j        |           t          j        t          j        |           t          j        t          j        |           t          j        t          j        |           t          j        t          j        |           t          j        t          j        |           d S r:   )	r  receivesignalSIGTERMSIGINTSIGQUITSIGHUPSIGCHLDSIGUSR2)r_   r  s     r7   
setsignalszServerOptions.setsignals  s    &.fng...fmW---fng...fmW---fng...fng.....r?   c                 4    | j                                         S r:   )r  
get_signalr  s    r7   r  zServerOptions.get_signal  s    #..000r?   c                 X   	 |                      |          | _        d| _        d S # t          j        $ r}|j        d         t          j        k    r|                     d           nd}t          j	        
                    |j        d                   }|&|                     |d|j        d                    n2|                     d|||j        d         fz             Y d }~d S Y d }~d S Y d }~d S d }~wt          $ r+}|                     |j        d                    Y d }~d S d }~ww xY w)NTr   zAnother program is already listening on a port that one of our HTTP servers is configured to use.  Shut this program down first before starting supervisord.z1Cannot open an HTTP server: socket.error reportedr   z%s errno.%s (%d))make_http_serversr  r  r  r   r   errno
EADDRINUSErf   	errorcoder   r   )r_   r   rJ  rJ   	errornames        r7   openhttpserverszServerOptions.openhttpservers  s   	$#55kBBD&*D###| 	? 	? 	?x{e...

 E F F F F
 K!O//<<	$JJ$$$<====JJ1 $i!= > ? ? ? ? ? ? ? ? ?F F F F F F >=====  	$ 	$ 	$JJsx{#########	$s!   !% D)B+C11D)> D$$D)c                 V    |d|d|d}|                      d|| j                  }|S )Nr   z---z.log)suffixprefixdir)
mktempfiler   )r_   r   r   channelr  r   s         r7   get_autochildlog_namez#ServerOptions.get_autochildlog_name   sE     $gggzzz://  " " " r?   c                    | j         }t          j        d| j        z            }	 t	          j        |          }n2# t          t          f$ r | j        	                    d           Y d S w xY w|D ]}|
                    |          rkt          j                            ||          }	 |                     |           N# t          t          f$ r  | j        	                    d|z             Y ~w xY wd S )Nz.+?---%s-\S+\.log\.{0,1}\d{0,4}zCould not clear childlog dirzFailed to clean up %r)r   r  compiler   r+   listdirr5  r6  r  r  r  r,   r0   remove)r_   r   fnrerM  rN  pathnames         r7   clear_autochildlogdirz#ServerOptions.clear_autochildlogdir  s%   &z<tNOO	
;//II! 	 	 	K;<<<FF	 " 	I 	IHzz(## I7<<X>>IKK))))) I I IK$$%<x%GHHHHHI	I	I 	Is!   : +A)(A)&B<<.C-,C-c                     t           j        S r:   )asyncore
socket_mapr  s    r7   r  zServerOptions.get_socket_map  s    ""r?   c                 >    d}t          j        || j                   d S )N   )r+   
closeranger   )r_   starts     r7   cleanup_fdszServerOptions.cleanup_fds  s!    
eT[)))))r?   c                 0    t          j        ||           d S r:   )r+   kill)r_   r  r	  s      r7   r1  zServerOptions.kill"  s    
Vr?   c                 f   	 t          j        dt           j                  \  }}n# t          $ r}}|j        d         }|t
          j        t
          j        fvr| j        	                    d|z             |t
          j        k    r| j        
                    d           d\  }}Y d }~nd }~ww xY w||fS )Nr   r   z:waitpid error %r; a process may not be cleaned up properlyzEINTR during reap)NN)r+   waitpidWNOHANGr6  r   r  ECHILDEINTRr  r  r  )r_   r  stsr   codes        r7   r3  zServerOptions.waitpid%  s    	"z"bj11HC 		" 		" 		"8A;DEL%+666$$?AEF   u{""##$7888!HC		" Cxs   "% 
B,A3B''B,c                    dS 	 t                    }	 t          j        |          }nZ# t          $ r d|z  cY S w xY w# t          $ r8 	 t          j                  }n# t          $ r
 dz  cY cY S w xY w|d         }Y nw xY wt          j                    }||k    rdS |dk    rdS |d         }t          t          d	          rd|d         fd
t          j
                    D             }|                    d|           	 t          j        |           n# t          $ r Y dS w xY w	 t          j        |           n# t          $ r Y dS w xY wt          j        |           dS )zDrop privileges to become the specified user, which may be a
        username or uid.  Called for supervisord startup and when spawning
        subprocesses.  Returns None on success or a string error message if
        privileges could not be dropped.NzNo user specified to setuid to!zCan't find uid %rzCan't find username %rrt   r   z$Can't drop privilege as nonroot userr  	setgroupsc                 4    g | ]}|d          v |d         S )r  rt   rE   )r  grprecr   s     r7   r  z1ServerOptions.drop_privileges.<locals>.<listcomp>c  sA     ! ! !FQiA  A fQi A  A  A r?   z&Could not set groups of effective userz(Could not set group id of effective user)r   pwdgetpwuidKeyErrorr   getpwnamr+   r  r   grpgetgrallinsertr:  r6  setgidsetuid)r_   r   r   pwreccurrent_uidr   ru  s    `     r7   drop_privilegeszServerOptions.drop_privileges=  s   
 <44	1d))C1S)) 1 1 1*S00001  	 	 	7T** 7 7 7/$6666667(CCC	 ikk#
 F!99Ah2{## 	@8D! ! ! !clnn ! ! !F MM!S!!!@V$$$$ @ @ @???@	>IcNNNN 	> 	> 	>===	>
	#se   A , >>
BA! B!A50B4A55BBD 
D'&D'+E   
EEc                 (   | j         5t          j                    dk    r| j                            d           dS dS |                     | j                   }|$| j                            d| j         z             dS |                     |           dS )zSet the uid of the supervisord process.  Called during supervisord
        startup only.  No return value.  Exits the process via usage() if
        privileges could not be dropped.Nr   zSupervisor is running as root.  Privileges were not dropped because no user is specified in the config file.  If you intend to run as root, you can set user=root in the config file to avoid this message.zSet uid to user %s succeeded)r   r+   r  r   r   rH  r   rf   rw   s     r7   set_uid_or_exitzServerOptions.set_uid_or_exitv  s     8y{{a$++ -1 2 2 2 2 2   &&tx00C{ ''(F(,)1 2 2 2 2 2 

3r?   c                    g }t          t          d          r)|                    d| j        t          j        dd           t          t          d          r)|                    d| j        t          j        dd           |D ]}|d         }|d         }|d         }|d	         }|}t          j        |          \  }}||k     r|d
k    r||k     r|d
k    r|}	 t          j        |||f           | j	                            dt                      z             # t          j        t          f$ r' |                     |t                      z             Y w xY wdS )zSet the rlimits of the supervisord process.  Called during
        supervisord startup only.  No return value.  Exits the process via
        usage() if any rlimits could not be set.RLIMIT_NOFILEa  The minimum number of file descriptors required to run this process is %(min_limit)s as per the "minfds" command-line argument or config file setting. The current environment will only allow you to open %(hard)s file descriptors.  Either raise the number of usable file descriptors in your environment (see README.rst) or lower the minfds setting in the config file to allow the process to start.)rx   minresourcer   RLIMIT_NPROCa  The minimum number of available processes required to run this program is %(min_limit)s as per the "minprocs" command-line argument or config file setting. The current environment will only allow you to open %(hard)s processes.  Either raise the number of usable processes in your environment (see README.rst) or lower the minprocs setting in the config file to allow the program to start.rM  rN  rx   r   r   z)Increased %(name)s limit to %(min_limit)sN)r   rN  r   r   rL  r   rO  	getrlimit	setrlimitr   localsr   r   rf   )	r_   limitslimit	min_limitresrx   r   softhards	            r7   set_rlimits_or_exitz!ServerOptions.set_rlimits_or_exit  s    8_-- 	MM/ k#1&    8^,, 	MM/ m#0%      	/ 	/EeI
#C,C=DD!+C00JD$y  trzz9$$42:: %D/&sY,=>>>$++ -028((-; < < < < 
3 / / /JJsVXX~...../'	/ 	/s   A D:EEc                    d}t          j        | j                  | _        | j        r!| j        st          j        | j        |           t          j        | j        | j        || j	          | j	        | j
                   | j        D ]}| j                            |           | j        D ]}| j                            |           | j        D ]}| j                            |           d S )Nz&%(asctime)s %(levelname)s %(message)s
)rotatingr  r  )r%   r  r   r  r   r   handle_stdouthandle_filer   r   r   r   r  r   r  r   r   )r_   formatrx   s      r7   make_loggerzServerOptions.make_logger  s   :'66= 	7 	7!$+v666KL!222*(	
 	
 	
 	
 ' 	& 	&CK  %%%%& 	" 	"CKS!!!!# 	" 	"CKS!!!!	" 	"r?   c                 &    ddl m}  || |          S )Nr   )r  )supervisor.httpr  )r_   r   r  s      r7   r  zServerOptions.make_http_servers  s'    555555  {333r?   c                 R    	 t          j        |           d S # t          $ r Y d S w xY wr:   )r+   r;  r6  )r_   fds     r7   close_fdzServerOptions.close_fd  s:    	HRLLLLL 	 	 	DD	r  c                 (    t          j                    S r:   )r+   r  r  s    r7   r  zServerOptions.fork  s    wyyr?   c                 ,    t          j        ||          S r:   )r+   dup2)r_   frmtos      r7   rg  zServerOptions.dup2  s    wsBr?   c                 (    t          j                    S r:   )r+   setpgrpr  s    r7   rk  zServerOptions.setpgrp  s    z||r?   c                 *    t          j        |          S r:   )r+   stat)r_   rN  s     r7   rm  zServerOptions.stat  s    wx   r?   c                 F    t          j        |t          |                    S r:   )r+   rp   r   )r_   rc  datas      r7   rp   zServerOptions.write  s    xHTNN+++r?   c                 .    t          j        |||          S r:   )r+   execve)r_   rN  rZ   r   s       r7   rq  zServerOptions.execve  s    y4---r?   c                 x    d t           _        t          j        |||          \  }}t          j        |           |S r:   )r+   
_urandomfdr   mkstempr;  )r_   r  r  r  rc  rN  s         r7   r  zServerOptions.mktempfile  s5     '<<H
r?   c                 .    t          j        |           d S r:   )r+   r$  r   s     r7   r$  zServerOptions.remove  s    
	$r?   c                 .    t          j        |           d S r:   )r+   r  )r_   r8  s     r7   r  zServerOptions._exit      
r?   c                 .    t          j        |           d S r:   )r+   r   )r_   masks     r7   setumaskzServerOptions.setumask  rw  r?   c                     g d}dt           j        v r3t           j        d         }|r|                    t           j                  }|S )z3Return a list corresponding to $PATH, or a default.)z/binz/usr/binz/usr/local/binPATH)r+   r]   r   pathsep)r_   r,   ps      r7   get_pathzServerOptions.get_path  sF    555RZ
6"A +wwrz**r?   c                 (    t          j                    S r:   )r+   r  r  s    r7   get_pidzServerOptions.get_pid  s    y{{r?   c                 n   |t          d|z            t          j        |t          j                           rt	          d|z            t          j        |t          j                           dz  st	          d|z            t          j        |t          j                  st          d|z            d S )Nzcan't find command %rzcommand at %r is a directoryI   zcommand at %r is not executablezno permission to run command %r)
NotFoundrm  S_ISDIRST_MODENotExecutableS_IMODEr+   accessX_OKNoPermission)r_   rN  rZ   sts       r7   check_execv_argszServerOptions.check_execv_args  s    :2X=>>>\"T\*++ 	M > IJJJ,r$,/0058 	M AH LMMM8RW-- 	M@8KLLL	M 	Mr?   c                     | j                             d           | j         j        D ]&}t          |d          r|                                 'd S )Nzsupervisord logreopenreopen)r  r   handlersr   r  )r_   r   s     r7   
reopenlogszServerOptions.reopenlogs!  sZ    0111{+ 	! 	!Gw)) !   	! 	!r?   c                     	 t          j        |d          }nJ# t          $ r=}|j        d         t          j        t          j        t          j        fvr d}Y d }~nd }~ww xY w|S )Ni   r   r?   )r+   r2   r6  r   r  EWOULDBLOCKEBADFr6  )r_   rc  ro  rJ  s       r7   readfdzServerOptions.readfd'  sq    	72w''DD 	 	 	x{5#4ek5;"OOODDDDDD	 s    
A3AAc                 .    t          j        |           d S r:   )r+   r  )r_   r  s     r7   r  zServerOptions.chdir0  s    
r?   c                 .   ddddddd}	 t          j                    \  }}||c|d<   |d<   t          j                    \  }}||c|d<   |d<   |r!t          j                    \  }}||c|d<   |d<   |d         |d         |d         fD ]P}|Lt          j        |t          j                  t           j        z  }	t          j        |t          j        |	           Q|S # t          $ r0 |                                D ]}||                     |            w xY w)	z Create pipes for parent to child stdin/stdout/stderr
        communications.  Open fd in non-blocking mode so we can read them
        in the mainloop without blocking.  If stderr is False, don't
        create a pipe for stderr. N)child_stdinr  ro   child_stdoutru   child_stderrr  r  ro   r  ru   r  )	r+   pipefcntlF_GETFLO_NDELAYF_SETFLr6  r   rd  )
r_   ru   pipesr  r  ro   r  r  rc  flagss
             r7   
make_pipeszServerOptions.make_pipes3  sI     $ $ $& &	!#E;38+0E- %.#%799 FL5;\2E(OU>2 N')wyy$9?6h~!6XhwH : :>!KEM::R[HEKEM5999L 	 	 	llnn & &>MM"%%%		s   CC :Dc                 h    dD ].}|                     |          }||                     |           /d S )N)r  ro   ru   r   rd  r_   r  fdnamerc  s       r7   close_parent_pipesz ServerOptions.close_parent_pipesR  sD    3 	" 	"F6""B~b!!!	" 	"r?   c                 h    dD ].}|                     |          }||                     |           /d S )N)r  r  r  r  r  s       r7   close_child_pipeszServerOptions.close_child_pipesX  sD    E 	" 	"F6""B~b!!!	" 	"r?   r   r:   )JrB   rC   rD   r   	sockchown	sockchmodr   r   r   
passwdfiler   r   r  r  r  r&   SupervisorStatesRUNNINGmoodrb   r   r  rh   r   r   r   rD  rq  rh  r  r  r  rG  r  r  r  r  r  r  r  r  r  r  r   r'  r  r/  r1  r3  rH  rJ  rY  r_  r  rd  r  rg  rk  rm  rp   rq  r  r$  r  rz  r  r  r  r  r  r  r  r  r  rE   r?   r7   r   r     s       DIIGHGJHFKN"*D.* .* .*`  2 2 2
0 
0 
09? 9? 9?|) ) ) )} } }~g g gR!7 !7 !7H &*7 7 7 7 '+j j j jX
 
 

: 
: 
:3 3 3j& & &
- - -h	F 	F 	F      .  / / /1 1 1$ $ $*  I I I$# # #* * *
    07 7 7r     &:/ :/ :/x" " "*4 4 4           ! ! !, , ,. . .            M M M! ! !       >" " "" " " " "r?   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d Zd ZdS )ClientOptionsr   Nc                    t                               | d           t                      | _        t                      | j        _        d | j        j        _        d| j        j        _        d | j        j        _        d | j        j        _        d | j        j        _	        d | j        j        _
        ddlm} d|i f}|g| _        |                     ddd	dd
d           |                     ddd           |                     ddddt          d           |                     dddd           |                     dddd           |                     dddd           d S ) NF)rW   r   r   )DefaultControllerPluginr   interactivezsupervisorctl.interactiveir   r   promptzsupervisorctl.promptr   r   zsupervisorctl.serverurlzs:z
serverurl=http://localhost:9001r  zsupervisorctl.usernamer   z	username=r  zsupervisorctl.passwordzp:z	password=historyzsupervisorctl.history_filezr:zhistory_file=)rG   rb   rA   r   supervisorctlr  r  r   r  r  history_filesupervisor.supervisorctlr  plugin_factoriesrX   r    )r_   r  default_factorys      r7   rb   zClientOptions.__init__h  sk   %888''(-%48%1/;%,26%/15%.15%.59%2DDDDDD$&=rB "1 1 ;SQ 	 	3 	3 	31<HHH7|5 	 	7 	7 	75t[III5t[III8$PPPPPr?   c                 P    t          j        | g|R i | | j        s	d| _        d S d S )Nr   )rG   r   r   r  )r_   r}   r"  s      r7   r   zClientOptions.realize  sD    )s)))b)))y 	! D	! 	!r?   c                    | j         j        }d}t          |d          st          j                            t          |                    | _        |                     |          st          d|z            	 | 
                    |d          }d}n'# t          t          f$ r t          d|z            w xY wt                      }| j        |_        d|_        	 |                    |           n%# t$          $ r |                    |           Y nw xY w|r|                                 |                                }d|vrt          d          |                    d	d
d| j        i          }|                    d          rt          |dd                    }d|z  }||_        |                    d|j                  |_        |                    d|j                  |_        |                    d|j                  |_        |                    d|j        d| j        i          }|rt          |          }||_        || _        nd |_        d | _        | xj        |                     |dd          z  c_        |S )NFr2   r'  r*   Tr(  r  z0.ini file does not include supervisorctl sectionr   r  r`   rg  r  r  r  r  r  r  r  zsupervisor.ctl_factoryz
ctlplugin:)r   r  r   r+   r,   r.   r>   r`   re   r   r1   r5  r6  r7  r\   r.  	mysectionr8  r   r9  r;  r   r0  r   r   r  r  r  r  r  r   )	r_   rH  r   rI  r   r   r   r,   r  s	            r7   r   zClientOptions.read_config  s   //
r6"" 	Gr(:(:;;DI;;r?? G !@2!EFFFGYYr3''!

W% G G G !@2!EFFFG %&& 3*	R     	 	 	MM"	 	HHJJJ??$$(**OPPP%%k3J	* & , ,		** 	+!)ABB-00D#d*I%  **8W^DD!,,Z9IJJ!,,Z9IJJ((9M	* ) , ,  	%),77L#/G  ,D#'G  $D!1!1$" " 	 s   8B $B5C0 0DDc                 t    t          j        dt          j        | j        | j        | j                            S )Nzhttp://127.0.0.1)	transport)r   ServerProxyr'   SupervisorTransportr  r  r   r  s    r7   getServerProxyzClientOptions.getServerProxy  sA    $ 24=37=37>C C   	r?   )rB   rC   rD   r   r  r  r   r  r  r  rb   r   r   r  rE   r?   r7   r  r  ^  sx        KFIHHLQ Q Q4! ! !
6 6 6r	 	 	 	 	r?   r  c                   F    e Zd ZdZd ZddZd Zedi fdZei fdZ	d	 Z
d
S )r7  r   c                     t           sd|vrd|d<   d|vrd|d<   t          j        j        | g|R i | i | _        i | _        d S )Ninline_comment_prefixes);#strictF)r   r   RawConfigParserrb   r  r.  r	  s      r7   rb   zUnhosedConfigParser.__init__  sn      	)(664>01v%%#(x $-dDTDDDVDDD!r?   <string>c                     	 t           j                            | ||          S # t          $ r% |                     t          |                    cY S w xY w)zParse configuration data from a string.  This is intended
        to be used in tests only.  We add this method for Py 2/3 compat.)r   r  read_stringr   r9  r   )r_   stringsources      r7   r  zUnhosedConfigParser.read_string  sd    	1/;;ff& & & 	1 	1 	1;;x//00000	1s    # ,AAc                 4   t          |t                    r|g}g }|D ]z}| j                                        }|                    t          j        j        | |gfi |           t          | j                  t          |          z
  }|D ]}|| j	        |<   {|S )a%  Attempt to read and parse a list of filenames, returning a list
        of filenames which were successfully parsed.  This is a method of
        RawConfigParser that is overridden to build self.section_to_file,
        which is a mapping of section names to the files they came from.
        )
r  r	   	_sectionsrF  rj  r   r  r2   	frozensetr  )r_   rM  r
  ok_filenamesrN  sections_origdiffr   s           r7   r2   zUnhosedConfigParser.read  s     i,, 	$"I! 	9 	9H N//11M,1$
MMfMMO O O T^,,y/G/GGD 9 908$W--9r?   Tc                 |   	 |                      ||          }n!# t          j        $ r |t          u r |}Y nw xY w|rt	          |t
                    rkt          t          | j        	                                          t          |	                                          z             }t          |||d|          }|S )Nr   )r   r   NoOptionError_markerr  r	   dictlistr.  r^   rA  )r_   r   optionr   r  r.  optvalcombined_expansionss           r7   r   zUnhosedConfigParser.saneget  s    	!XXgv..FF) 	! 	! 	!'!! 		!  	8FJ77 	8"&T_**,,--Z5E5E5G5G0H0HH#J #J F$7&-ggvv68 8F s    77c                 0     | j         | j        |f||d|S )N)r   r.  )r   r  )r_   r  r   r.  r
  s        r7   r0  zUnhosedConfigParser.getdefault  s5    t|DNF =G'1= =5;= = 	=r?   c                     d}|                                  D ]Z}|                     |          D ]B\  }}||v r9|
J d            |                    ||          }|                     |||           C[d S )Nz%(here)szhere has not been set to a path)r   r^   rm   rl  )r_   r`   HERE_FORMATr   r   r   s         r7   r?  zUnhosedConfigParser.expand_here  s     }} 	2 	2G"jj11 2 2
U%''++-N+++!MM+t<<EHHWc5111	2	2 	2r?   N)r  )rB   rC   rD   r  rb   r  r2   r  r   r0  r?  rE   r?   r7   r7  r7    s        I   1 1 1 1  * 07$   & *1R = = = =2 2 2 2 2r?   r7  c                   2    e Zd Zd Zd Zd Zd Zd Zd ZdS )Configc                 .    |                      |           S r:   )__eq__r_   others     r7   __ne__zConfig.__ne__   s    ;;u%%%%r?   c                 b    | j         |j         k    r| j        |j        k     S | j         |j         k     S r:   rW  r   r  s     r7   __lt__zConfig.__lt__#  /    =EN**9uz))}u~--r?   c                 b    | j         |j         k    r| j        |j        k    S | j         |j         k    S r:   r  r  s     r7   __le__zConfig.__le__)  /    =EN**9
**}..r?   c                 b    | j         |j         k    r| j        |j        k    S | j         |j         k    S r:   r  r  s     r7   __gt__zConfig.__gt__/  r  r?   c                 b    | j         |j         k    r| j        |j        k    S | j         |j         k    S r:   r  r  s     r7   __ge__zConfig.__ge__5  r  r?   c                 H    d| j         dt          |           d| j        dS )N<z instance at z named >)	__class__idr   r  s    r7   __repr__zConfig.__repr__;  s,     15D15< 	<r?   N)	rB   rC   rD   r  r  r  r  r  r  rE   r?   r7   r  r    sn        & & &. . ./ / /. . ./ / /< < < < <r?   r  c                   D    e Zd Zg dZddgZd Zd Zd Zd Zdd	Z	d
 Z
dS )ri  )r   r   r  r   r   rW  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  ra  r4  r   c           	          || _         | j        D ]}t          | |||                    | j        D ]'}t          | ||                    |d                      (d S r:   )r   req_param_namesr   optional_param_namesr   )r_   r   paramsr   s       r7   rb   zProcessConfig.__init__M  ss    ( 	. 	.DD$t----- 	8 	8DD$

4 6 67777	8 	8r?   c                     t          |t                    sdS | j        | j        z   D ]O}t          t          | |          t          ||          fv r*t          | |          t          ||          k    r dS PdS NFT)r  ri  r  r  r!   r   )r_   r  r   s      r7   r  zProcessConfig.__eq__T  s    %// 	5(4+DD 	 	DWT400'%2F2FGGGtT""geT&:&:::uu ; tr?   c                     | j         ;| j                             d          }||                    t          j                  S | j                                        S )z|Return a list corresponding to $PATH that is configured to be set
        in the process environment, or the system default.Nr|  )r4  r   r   r+   r}  r   r  r   s     r7   r  zProcessConfig.get_path`  sQ     '#''//Dzz"*---|$$&&&r?   c                     | j         j        }| j         j        }| j        }| j        t
          u r |||d          | _        | j        t
          u r |||d          | _        d S d S )Nro   ru   )r   r   r   r   r  r!   r  )r_   get_autonamesidr   s       r7   create_autochildlogsz"ProcessConfig.create_autochildlogsi  ss    |9l%y)++".,tS("C"CD)++".,tS("C"CD ,+r?   Nc                 6    ddl m}  ||           }||_        |S )Nr   )
Subprocess)supervisor.processr  rQ  )r_   rQ  r  processs       r7   make_processzProcessConfig.make_processs  s/    111111*T""r?   c                 .   | j          }| j                            |          }|d         |d         |d         }}}i }ddlm} ddlm}	 ddlm}
 ||
j        } ||||          ||<   ||
j	        } ||||          ||<   | |	|d|          ||<   ||fS )Nro   ru   r  r   POutputDispatcherPInputDispatcherr_  )
ra  r   r  supervisor.dispatchersr  r  r   r_  ProcessCommunicationStdoutEventProcessCommunicationStderrEvent)r_   rR  
use_stderrr~  	stdout_fd	stderr_fdstdin_fddispatchersr  r  r_  etypes               r7   make_dispatcherszProcessConfig.make_dispatchersy  s    --
L##J//'({1X;qzH)	<<<<<<;;;;;;%%%%%% :E%6%6tUI%N%NK	" :E%6%6tE9%M%MK	"$4$4T7H$M$MK!A~r?   r:   )rB   rC   rD   r  r  rb   r  r  r  r  r  rE   r?   r7   ri  ri  ?  s        
) 
) 
)O +K98 8 8
 
 
' ' 'D D D       r?   ri  c                       e Zd Zd ZdS )rn  c                     d}| j                             |          }|d         |d         |d         }}}i }ddlm} ddlm}	 ddlm}
 dd	lm} | ||d|          ||<   ||j        } |
|||          ||<   | |	|d|          ||<   ||fS )
NTro   ru   r  r   )PEventListenerDispatcherr  r  r  )	r   r  r  r  r  r  r   r_  r  )r_   rR  r  r~  r  r  r  r  r  r  r  r_  r  s                r7   r  z$EventListenerConfig.make_dispatchers  s     
L##J//'({1X;qzH)	CCCCCC;;;;;;<<<<<<%%%%%% %=%=dH>G&I &IK	" :E%6%6tUI%N%NK	"$4$4T7H$M$MK!A~r?   N)rB   rC   rD   r  rE   r?   r7   rn  rn    s#            r?   rn  c                       e Zd ZddZd ZdS )rr  Nc                 X    |t          d          ddlm}  ||           }||_        |S )Nz FastCGI programs require a groupr   )FastCGISubprocess)NotImplementedErrorr	  r!  rQ  )r_   rQ  r!  r
  s       r7   r  z!FastCGIProcessConfig.make_process  sD    =%&HIII888888##D))r?   c                     t                               | |          \  }}|d         }|||                                          ||fS )Nr  )ri  r  r;  )r_   rR  r  r~  r  s        r7   r  z%FastCGIProcessConfig.make_dispatchers  sM    &77dCCQ W:!'')))A~r?   r:   )rB   rC   rD   r  r  rE   r?   r7   rr  rr    s7               r?   rr  c                   &    e Zd Zd Zd Zd Zd ZdS )rk  c                 >    || _         || _        || _        || _        d S r:   )r   r   rW  rE  )r_   r   r   rW  rE  s        r7   rb   zProcessGroupConfig.__init__  s%    	 .r?   c                     t          |t                    sdS | j        |j        k    rdS | j        |j        k    rdS | j        |j        k    rdS dS r  )r  rk  r   rW  rE  r  s     r7   r  zProcessGroupConfig.__eq__  s]    %!344 	59
""5=EN**55#8885tr?   c                 B    | j         D ]}|                                 d S r:   rE  r  r_   rg   s     r7   after_setuidzProcessGroupConfig.after_setuid  3    * 	* 	*F''))))	* 	*r?   c                 $    ddl m}  ||           S )Nr   )ProcessGroup)r	  r-  )r_   r-  s     r7   
make_groupzProcessGroupConfig.make_group  s$    333333|D!!!r?   NrB   rC   rD   rb   r  r*  r.  rE   r?   r7   rk  rk    sP        / / /  * * *" " " " "r?   rk  c                   &    e Zd Zd Zd Zd Zd ZdS )ro  c                 h    || _         || _        || _        || _        || _        || _        || _        d S r:   )r   r   rW  rE  rZ  r  r[  )r_   r   r   rW  rE  rZ  r  r[  s           r7   rb   z EventListenerPoolConfig.__init__  s=    	 .&&,r?   c                     t          |t                    sdS | j        |j        k    rR| j        |j        k    rB| j        |j        k    r2| j        |j        k    r"| j        |j        k    r| j        |j        k    rdS dS r  )r  ro  r   rW  rE  rZ  r  r[  r  s     r7   r  zEventListenerPoolConfig.__eq__  s    %!899 	5Y%*$$]en,,!U%:::!222!222 E$8884ur?   c                 B    | j         D ]}|                                 d S r:   r(  r)  s     r7   r*  z$EventListenerPoolConfig.after_setuid  r+  r?   c                 $    ddl m}  ||           S )Nr   )EventListenerPool)r	  r5  )r_   r5  s     r7   r.  z"EventListenerPoolConfig.make_group  s%    888888  &&&r?   Nr/  rE   r?   r7   ro  ro    sP        - - -  * * *' ' ' ' 'r?   ro  c                        e Zd Zd Zd Zd ZdS )rs  c                 P    t                               | ||||           || _        d S r:   )rk  rb   r  )r_   r   r   rW  rE  r  s         r7   rb   zFastCGIGroupConfig.__init__  s9    ##	 	 	 +r?   c                     t          |t                    sdS | j        |j        k    rdS t                              | |          S )NF)r  rs  r  rk  r  r  s     r7   r  zFastCGIGroupConfig.__eq__  sF    %!344 	5!4445!((u555r?   c                 $    ddl m}  ||           S )Nr   )FastCGIProcessGroup)r	  r:  )r_   r:  s     r7   r.  zFastCGIGroupConfig.make_group  s%    ::::::""4(((r?   N)rB   rC   rD   rb   r  r.  rE   r?   r7   rs  rs    sA        + + +6 6 6) ) ) ) )r?   rs  c                    t          |          }t          |          }	 t          | d          5 }||k    r|rt          d          |                    dd           |                                }t          ||z
            }|dk     rd}|                    |           |                    |          }no||k    rt          d          |dk    r*|                    |           |                                }n*|                    |           |                    |          }ddd           n# 1 swxY w Y   n$# t          t          f$ r t          d          w xY w|S )zJ Read length bytes from the file named by filename starting at
    offset rbBAD_ARGUMENTSr   rt   NFAILED)	absr1   r   seektellr   r2   r6  r5  )	rN  offsetlength	absoffset	abslengthr6   szposro  s	            r7   readFilerH  
  s    FIFI#(D!! 	*QF"" 6$_555q!VVXX"y.))77Csvvi((&&$_555Q;;FF6NNN6688DDFF6NNN66&>>D)	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	* 	** W # # #"""# Ks/   D> C6D2&D> 2D66D> 9D6:D> >!Ec                    	 t          | d          5 }d}|                    dd           |                                }|||z   k    rd}|dz
  }||z   |k    r||dz
  k    rd}||z
  }|dk     rd}|dk     rd}|dk    rd}n*|                    |           |                    |          }|}t	          |          ||gcddd           S # 1 swxY w Y   dS # t
          t          f$ r d	|dgcY S w xY w)
a  
    Read length bytes from the file named by filename starting at
    offset, automatically increasing offset and setting overflow
    flag if log size has grown beyond (offset + length).  If length
    bytes are not available, as many bytes as are available are returned.
    r<  Fr   rt   Tr   r?   Nr   )r1   r@  rA  r2   r   r6  r5  )rN  rB  rC  r6   overflowrF  ro  s          r7   tailFilerK  ,  sx   #(D!! 	7QHFF1aLLLBVf_%%a2%%R!V$$Ffzzzz{{vvvf~~FdOOVX65	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	76 W # # #FE""""#s5   C B,C>C CC CC C10C1c                 d   t          j        |           r t          j        |           dz  }d|z  }||fS t          j        |           r`t          j        |           }dt          |          z  }t          t           d          rt          j        |           }n| dz  }|r|dz  }d|fS d| z  }d|fS )	a*  Decode the status returned by wait() or waitpid().

    Return a tuple (exitstatus, message) where exitstatus is the exit
    status, or -1 if the process was killed by a signal; and message
    is a message telling what happened.  It is the caller's
    responsibility to display the message.
    rd  zexit status %szterminated by %s	WCOREDUMP   z (core dumped)r   z unknown termination cause 0x%04x)r+   	WIFEXITEDWEXITSTATUSWIFSIGNALEDWTERMSIGsignamer   rM  )r7  esrx   sigiscores        r7   decode_wait_statusrW  U  s     
|C ^C  6)#3w			 k# 73<</2{## 	 \#&&FF4ZF 	$##C3w0363wr?   c                 j    t           t                       t                               |           pd| z  S )zReturn a symbolic name for a signal.

    Return "signal NNN" if there is no corresponding SIG name in the
    signal module.
    Nz	signal %d)	_signames_init_signamesr   )rU  s    r7   rS  rS  q  s2     ==2s!22r?   c                      i } t           j                                        D ]4\  }}t          |dd           }| |d          r |d          s|| |<   5| ad S )Nr   SIGSIG_)r	  __dict__r^   r   rY  )dra   r=   k_startswiths       r7   rZ  rZ  |  sx    
A%%''  1q,55< 	||F';'; 	AaDIIIr?   c                        e Zd Zd Zd Zd ZdS )r   c                     g | _         d S r:   )_signals_recvdr  s    r7   rb   zSignalReceiver.__init__  s     r?   c                 P    || j         vr| j                             |           d S d S r:   )rc  r   )r_   rU  frames      r7   r  zSignalReceiver.receive  s5    d)))&&s+++++ *)r?   c                 N    | j         r| j                             d          }nd }|S )Nr   )rc  pop)r_   rU  s     r7   r  zSignalReceiver.get_signal  s/     	%))!,,CCC
r?   N)rB   rC   rD   rb   r  r  rE   r?   r7   r   r     sA        ! ! !, , ,    r?   r   c                 v   	 | |z  S # t           $ ru}t          |                                          }|                                 t	          d| d|dt          |          dd                    |                    d }~wt          $ r*}t	          d| d|dt          |                    d }~ww xY w)NzFormat string z for z contains names (z-) which cannot be expanded. Available names: rd   z is badly formatted: )r?  r  r   rt  r   rv   r0   r   )r   r.  r   ex	availables        r7   rA  rA    s    
:~ 6 6 6**++	j QQc"ggggtyy33356 6 	6  
 
 
jQQc"ggg
 
 	

s!    
B8A0BB8%B33B8c                 &    | |k    r|}n| d|}|S )Nrz   rE   )rx  r  r   s      r7   make_namespecrl    s+     \!!$**ll3Kr?   c                     |                      dd          }t          |          dk    r|\  }}|r|dk    rd }n| | }}||fS )Nrz   r   rt   *)r   r  )namespecnamesrx  r  s       r7   split_namespecrq    s\    NN3""E
5zzQ#( 
L 	 |s22L $,XL
|##r?   c                       e Zd ZdZdS )ProcessExceptionz@ Specialized exceptions used when attempting to start a process NrB   rC   rD   r   rE   r?   r7   rs  rs    s        JJJJr?   rs  c                       e Zd ZdZdS )
BadCommandz5 Indicates the command could not be parsed properly. Nrt  rE   r?   r7   rv  rv    s        ????r?   rv  c                       e Zd ZdZdS )r  z Indicates that the filespec cannot be executed because its path
    resolves to a file which is not executable, or which is a directory. Nrt  rE   r?   r7   r  r    s"        M M M Mr?   r  c                       e Zd ZdZdS )r  zR Indicates that the filespec cannot be executed because it could not
    be found Nrt  rE   r?   r7   r  r    s           r?   r  c                       e Zd ZdZdS )r  z Indicates that the file cannot be executed because the supervisor
    process does not possess the appropriate UNIX filesystem permission
    to execute the file. Nrt  rE   r?   r7   r  r    s           r?   r  )\r  r   r+   rY   r   r  r	  r  r=  rA  rN  rm  rB  r<  r   r  supervisor.compatr   r   r   r   r   r   r	   r   supervisor.medusar   r)  supervisor.datatypesr   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(   r8   r  r>   rA   rG   r   r  r  r  r7  objectr  ri  rn  rr  rk  ro  rs  rH  rK  rW  rY  rS  rZ  r   rA  rl  rq  r   rs  rv  r  r  r  rE   r?   r7   <module>r~     s#     				 



    				 



 



       ! ! ! ! ! ! * * * * * * 1 1 1 1 1 1 1 1 ' ' ' ' ' ' & & & & & & ( ( ( ( ( ( ) ) ) ) ) ) 5 5 5 5 5 5 6 6 6 6 6 6 ( ( ( ( ( ( ( ( ( ( ( ( , , , , , , , , , , , , 1 1 1 1 1 1 * * * * * * . . . . . . 2 2 2 2 2 2 8 8 8 8 8 8 - - - - - - 0 0 0 0 0 0 + + + + + + 3 3 3 3 3 3 . . . . . . ; ; ; ; ; ; - - - - - - 7 7 7 7 7 7 7 7 7 7 7 7 $ $ $ $ $ $ * * * * * * ' ' ' ' ' ' - - - - - - 0 0 0 0 0 0                             
 


D D D	 	 	 	 	 	 	 	@! @! @! @! @! @! @! @!F
R" R" R" R" R"G R" R" R"h&k k k k kG k k kZ O2 O2 O2 O2 O2,6 O2 O2 O2d< < < < <V < < <@J J J J JF J J JX    -   ,    =   (" " " " " " " "8' ' ' ' 'f ' ' 'B) ) ) ) )+ ) ) )0     D%# %# %#R  4 		3 	3 	3	 	 	       "
 
 
   
$ 
$ 
$K K K K Ky K K K@ @ @ @ @! @ @ @M M M M M$ M M M           #     r?   