
    vgjY                       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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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 d/ d0ejB                  ZC G d1 d2eD          ZE G d3 d4eE          ZF G d5 d6eF          ZG G d7 d8eF          ZH G d9 d:eE          ZI G d; d<eE          ZJ G d= d>eI          ZKd? ZLd@ ZMdA ZNdaOdB ZPdC ZQ G dD dE          ZRdF ZSdG ZTdH ZU G dI dJeV          ZW G dK dLeW          ZX G dM dNeW          ZY G dO dPeW          ZZ G dQ dReW          Z[dS )S    N)PY2)ConfigParser)as_bytes	as_string)	xmlrpclib)StringIO)
basestring)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      O/var/www/pixelcanvas.ch/venv/lib/python3.11/site-packages/supervisor/options.py_read_version_txtr6   :   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    r5   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=   r5   r?   r?   D   s        Dr=   r?   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addrH   r)   r*   r,   sysargvr.   searchpathsenviron_expansionsenvironitems)selfrU   hererY   kr;   s         r5   __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, )rY   r)   r*   existsrU   usager.   )r]   configr*   s      r5   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]   dummyrH   s      r5   rH   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)stderrrn   strrl   ro   r]   msgs     r5   rd   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 r8   rC   )argflags     r5   <lambda>zOptions.add.<locals>.<lambda>   s    T r=   z!inconsistent short/long options:  r   -z&short option should not start with '-'   ) rx   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endswithrP   rN   appendrO   rS   hasattrsetattrrM   rQ   rR   )r]   nameconfnameshortlonghandlerdefaultrequiredr|   envkeyrests               r5   rV   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   )rT   getr   )r]   attrvaluepriocurrents        r5   _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 %rrr   zinvalid environment value for )rW   rX   __main____doc__	Exceptionrl   ri   optionsargsgetoptr.   rN   rO   errorrd   rt   positional_args_allowedrP   r   getattrr   rS   keysr)   r[   rJ   rf   process_config)r]   r   ri   rl   r   excoptr{   r   r   rv   envvarr   s                r5   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   )rJ   process_config_filerM   split
configrootr   r   rQ   r\   r   rR   rd   )	r]   do_usager   r   partsobjpartr   messages	            r5   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)Nr0   )r   rJ   r)   r*   r+   r,   r^   read_configr   rd   rt   )r]   r   rv   s      r5   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 r8   )r)   r*   rc   r]   r*   s     r5   rc   zOptions.existse  s    w~~d###r=   r(   c                 "    t          ||          S r8   )r/   )r]   fnmodes      r5   r/   zOptions.openh  s    B~~r=   c                    g }|                                 D ]}|                    |          s|                    dd          d         }|                    ||d           }|t	          d|d|          	 |                     |          }n## t          $ r t	          |d|d          w xY wi }	|                    |          D ]!}
|
|k    r|                    ||
          |	|
<   "|                    |||	f           |S )Nrx   r   z	section [z] does not specify a  cannot be resolved within [])	sections
startswithr   sanegetr   import_specImportErrorr   r   )r]   parserfactory_keysection_prefix	factoriessectionr   factory_specfactoryextrasr_   s              r5   get_pluginszOptions.get_pluginsk  sR   	(( 	6 	6G%%n55 ==a((+D!>>';EEL# j")'';;"8 9 9 9,**<88 , , ,  LL'''"+ , , ,, F^^G,, ; ;## &w : :F1IdGV45555s   :B B0c                     t           j                            d|z             }t          |d          r|                                S |                    d          S )Nzx=resolveF)pkg_resources
EntryPointparser   r   load)r]   speceps      r5   r   zOptions.import_spec  sN    %++D4K882y!! 	"::<< 775>>!r=   T)	NNNNNNNNN)NNN)r(   )r@   rA   rB   rW   rs   rm   ro   warningsuidgidrX   rl   rJ   	schemadirr   r^   r   r`   rf   rH   rd   rV   r   r   r   r   rc   r/   r   r   rC   r=   r5   rE   rE   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=   rE   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 )>ServerOptionsNrC   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.nocleanupr_   
strip_ansizsupervisord.strip_ansitr"   zsupervisord.profile_optionszprofile_options=silentzsupervisord.silents)rE   r`   r?   r   supervisordrV   r   r   r   r   r   r   r   rt   tempfile
gettempdirintr"   
pidhistoryprocess_group_configsparse_criticalsparse_warningsparse_infosSignalReceiversignal_receiverr&   Pollerr]   s    r5   r`   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)rm   rn   VERSIONro   )r]   rp   s     r5   r   zServerOptions.version  s2     	&7*+++		!r=   c                 $    t          j        |i |S r8   )r#   	getLoggerr]   r   kwargss      r5   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   warnrE   rf   r  s    r5   rf   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.0re   s     r5   
<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     r5   r  z)ServerOptions.realize.<locals>.<listcomp>  s6     @ @ @v"8,>> #>>>r=   hostport	localhostzhttp://rx   )rE   r   r   r   r   r   r   rd   r   r   r   r   r   r<   r   rpcinterface_factories	serverurlserver_configs)r]   r{   kwr   r   rv   r   r   sconfigsre   r*   r   r!  s                r5   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   )rE   r   r   r   r   )r]   r   news      r5   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 )3NFr0   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  r2  common_expansionsr   s       r5   r   z&ServerOptions.read_config.<locals>.geto  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   rL   zsupervisor.rpcinterface_factoryzrpcinterface:)Or  r  r  r   r   r   rc   r   r/   IOErrorOSErrorUnhosedConfigParserrZ   r2  	read_fileAttributeErrorreadfpr   ParsingErrorrt   closeplatformnoder^   r3  has_sectionexpand_here
has_optionr   expandr   r)   r*   r,   r+   r   r.   globr   sortedr0   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   r#  process_groups_from_parserr   process_configscopyserver_configs_from_parserr%  r"   )r]   fpr   
need_closewhyr-  r2  r/  basepattern	filenamesfilenamer   r   r   tempdirenviron_strr_   r;   groupprocr   r5  r   s                         @@r5   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          $ 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	 t/          |          }n # t          $ r t          d,|z            w xY w ||d-d           }|8	 t1          |          }n'# t2          t          f$ r t          d.|z            w xY w ||d/d |0          }|st          d1|z            	 |                     |||||          } n4# t          $ r'}!t          t7          |!          d |d2          d }!~!ww xY w| 	                    ||t8                    }|                    t;          | ||	||                      |                                 |S )3Nr^   c                     |                     di           }|                               ||d<    j        | ||fi |S r1  r   r3  r   )r   r   r   r  r2  r5  r   s        r5   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:rx   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 rC   )upper)r  xs     r5   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_stderrr7  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  r2  z%[%s] section requires a "socket" linez] socket)r   r^   r   r   r   r   r   r   r   processes_from_sectionProcessConfigextendProcessGroupConfigr   r   setsupervisor.eventsre  r   r   EventListenerConfigEventListenerPoolConfigr   r   r   	TypeErrorparse_fcgi_socketrt   FastCGIProcessConfigFastCGIGroupConfigsort)#r]   r   groupsall_sectionshomogeneous_excluder   r   
group_namer[  r\  group_processesprogramprogram_sectionfcgi_section	processesrg  	pool_namer_  r`  pool_event_namesre  pool_eventspool_event_name
pool_eventrf  fcgi_expansions	proc_userproc_uidrh  rj  rk  r  socket_configer5  s#    `                                @r5   rI  z(ServerOptions.process_groups_from_parser  sm   (( #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 . . . "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.R>>S.S>>$T"	U##
V-"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   rr   )r  zBad socket format %s)r   r)   r*   isabsr   r<   r  r   r   rematchrV  r   r   )r]   sockr  rj  rk  rh  r*   r   mr   r!  s              r5   rv  zServerOptions.parse_fcgi_socketP  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   rJ   )r]   r   r   r}  klassr  rS  s          r5   rm  z$ServerOptions.processes_from_sections  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 )JNrx   r   )r^   rg  r-  r}  c                     |                     di           }|                               ||d<    j        | |g|R i |S r1  rZ  )r   r   r   r  r2  r5  r   s        r5   r   z2ServerOptions._processes_from_section.<locals>.get  sY    L"55J/000#-F< !6>'3@@@@@@@r=   r\  r]  	autostarttrueautorestart
unexpected	startsecsstartretries   
stopsignalTERMstopwaitsecsr   stopasgroupr7  killasgroup	exitcodes0rf  numprocsnumprocs_startr   r8  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  rL   r   )rm   rs   z
%s_logfilez%s_logfile_backupsz%s_logfile_maxbytesr6  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commandrl  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)rn  r   r   rA  rB  r^   r   r   r!   r   r   r   r1   rb  r   r   r   ranger3  rZ   r   rF  r\   r   
isinstancer	   r   r    r  r   ry  )2r]   r   r   r}  r  r[  rg  r-  r   r\  r  r  r  r  r  r  r  r  r  rf  r  r  environment_strstdout_cmaxbytesstdout_eventsstderr_cmaxbytesstderr_eventsr$  r   r   r   r  r  r2  r8  r_   r;   r   logfileslf_keylf_valbu_keybackupsmb_keymaxbytessy_keyr  r  pconfigr5  s2    `                                               @r5   r  z%ServerOptions._processes_from_section}  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 )Nrx   r   )r   r   r   lenr   )r]   r   styper   r   r   r   s          r5   _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         r5   _parse_username_and_passwordz*ServerOptions._parse_username_and_password5  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^   rl  zsection [%s] has no file valuechownzInvalid sockchown value %s)r   r   chmodzInvalid chmod value %sr  )r  r   r3  r  r  r  r   r   r   r^   r1   r  r<   r   r   ru  )r]   r   configsinet_serverdefsr   r   re   r   r!  r   unix_serverdefssfiler  r  s                 r5   rL  z(ServerOptions.server_configs_from_parserA  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 r8   )r&   before_daemonize
_daemonizeafter_daemonizer  s    r5   	daemonizezServerOptions.daemonizev  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   wrr   )r)   forkloggerblather_exitr   r   chdirr:  criticalr@  r/   stdinrW   	__stdin__rm   
__stdout__rs   
__stderr__setsidr   )r]   piderrs      r5   r  zServerOptions._daemonize{  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)   getpidr/   r   rn   unlink_pidfiler  r   r9  r:  r  )r]   r  r4   s      r5   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]   re   server
socketnames       r5   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r8   )r)   unlinkr:  r   s     r5   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_serversre   r  
dispatcherdispatcher_servers         r5   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 r8   )r  r@  r  s    r5   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 r8   )	r  receivesignalSIGTERMSIGINTSIGQUITSIGHUPSIGCHLDSIGUSR2)r]   r  s     r5   
setsignalszServerOptions.setsignals  s    &.fng...fmW---fng...fmW---fng...fng.....r=   c                 4    | j                                         S r8   )r  
get_signalr  s    r5   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
EADDRINUSErd   	errorcoder   r   )r]   r   rO  rH   	errornames        r5   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         r5   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)   listdirr9  r:  r  r  r  r*   r.   remove)r]   r   fnrerR  rS  pathnames         r5   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 r8   )asyncore
socket_mapr  s    r5   r  zServerOptions.get_socket_map  s    ""r=   c                 >    d}t          j        || j                   d S )N   )r)   
closeranger   )r]   starts     r5   cleanup_fdszServerOptions.cleanup_fds"  s!    
eT[)))))r=   c                 0    t          j        ||           d S r8   )r)   kill)r]   r  r  s      r5   r6  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WNOHANGr:  r   r  ECHILDEINTRr  r  r  )r]   r  stsr   codes        r5   r8  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 %rrr   r   z$Can't drop privilege as nonroot userr  	setgroupsc                 4    g | ]}|d          v |d         S )r  rr   rC   )r  grprecr   s     r5   r  z1ServerOptions.drop_privileges.<locals>.<listcomp>h  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?  r:  setgidsetuid)r]   r   r   pwreccurrent_uidr   rz  s    `     r5   drop_privilegeszServerOptions.drop_privilegesB  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   rM  r  rd   ru   s     r5   set_uid_or_exitzServerOptions.set_uid_or_exit{  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.)rv   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.rR  rS  rv   r   r   z)Increased %(name)s limit to %(min_limit)sN)r   rS  r   r   rQ  r   rT  	getrlimit	setrlimitr  localsr   r   rd   )	r]   limitslimit	min_limitresrv   r   softhards	            r5   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]   formatrv   s      r5   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      r5   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r8   )r)   r@  r:  )r]   fds     r5   close_fdzServerOptions.close_fd  s:    	HRLLLLL 	 	 	DD	r  c                 (    t          j                    S r8   )r)   r  r  s    r5   r  zServerOptions.fork  s    wyyr=   c                 ,    t          j        ||          S r8   )r)   dup2)r]   frmtos      r5   rl  zServerOptions.dup2  s    wsBr=   c                 (    t          j                    S r8   )r)   setpgrpr  s    r5   rp  zServerOptions.setpgrp  s    z||r=   c                 *    t          j        |          S r8   )r)   stat)r]   rS  s     r5   rr  zServerOptions.stat  s    wx   r=   c                 F    t          j        |t          |                    S r8   )r)   rn   r   )r]   rh  datas      r5   rn   zServerOptions.write  s    xHTNN+++r=   c                 .    t          j        |||          S r8   )r)   execve)r]   rS  rX   r   s       r5   rv  zServerOptions.execve  s    y4---r=   c                 x    d t           _        t          j        |||          \  }}t          j        |           |S r8   )r)   
_urandomfdr   mkstempr@  )r]   r   r!  r"  rh  rS  s         r5   r#  zServerOptions.mktempfile  s5     '<<H
r=   c                 .    t          j        |           d S r8   )r)   r)  r   s     r5   r)  zServerOptions.remove  s    
	$r=   c                 .    t          j        |           d S r8   )r)   r  )r]   r=  s     r5   r  zServerOptions._exit      
r=   c                 .    t          j        |           d S r8   )r)   r   )r]   masks     r5   setumaskzServerOptions.setumask
  r|  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      r5   get_pathzServerOptions.get_path  sF    555RZ
6"A +wwrz**r=   c                 (    t          j                    S r8   )r)   r  r  s    r5   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)
NotFoundrr  S_ISDIRST_MODENotExecutableS_IMODEr)   accessX_OKNoPermission)r]   rS  rX   sts       r5   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     r5   
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)   r0   r:  r   r  EWOULDBLOCKEBADFr;  )r]   rh  rt  rO  s       r5   readfdzServerOptions.readfd,  sq    	72w''DD 	 	 	x{5#4ek5;"OOODDDDDD	 s    
A3AAc                 .    t          j        |           d S r8   )r)   r  )r]   r"  s     r5   r  zServerOptions.chdir5  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  rm   child_stdoutrs   child_stderrr  r  rm   r  rs   r  )	r)   pipefcntlF_GETFLO_NDELAYF_SETFLr:  r  ri  )
r]   rs   pipesr  r  rm   r  r  rh  flagss
             r5   
make_pipeszServerOptions.make_pipes8  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  rm   rs   r   ri  r]   r  fdnamerh  s       r5   close_parent_pipesz ServerOptions.close_parent_pipesW  sD    3 	" 	"F6""B~b!!!	" 	"r=   c                 h    dD ].}|                     |          }||                     |           /d S )N)r  r  r  r  r  s       r5   close_child_pipeszServerOptions.close_child_pipes]  sD    E 	" 	"F6""B~b!!!	" 	"r=   r   r8   )Jr@   rA   rB   r   	sockchown	sockchmodr   r   r   
passwdfiler   r   r  r  r  r$   SupervisorStatesRUNNINGmoodr`   r   r  rf   r   r   r   rI  rv  rm  r  r  r  rL  r  r  r  r  r  r	  r  r  r  r  r%  r,  r  r4  r6  r8  rM  rO  r^  rd  r  ri  r  rl  rp  rr  rn   rv  r#  r)  r  r  r  r  r  r  r  r  r  r  r  rC   r=   r5   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)rU   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=)rE   r`   r?   r   supervisorctlr  r  r$  r  r  history_filesupervisor.supervisorctlr  plugin_factoriesrV   r   )r]   r  default_factorys      r5   r`   zClientOptions.__init__m  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   )rE   r   r   r  )r]   r{   r&  s      r5   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 )NFr0   r+  r(   Tr,  r  z0.ini file does not include supervisorctl sectionr$  r  r^   rl  r  r  r  r  r  r  r  zsupervisor.ctl_factoryz
ctlplugin:)r   r  r   r)   r*   r,   r<   r^   rc   r   r/   r9  r:  r;  rZ   r2  	mysectionr<  r=  r>  r@  r   r4  r   r$  r  r  r  r  r  r   )	r]   rM  r   rN  r   r   r$  r*   r  s	            r5   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    r5   getServerProxyzClientOptions.getServerProxy  sA    $ 24=37=37>C C   	r=   )r@   rA   rB   r   r  r  r$  r  r  r  r`   r   r   r  rC   r=   r5   r  r  c  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 )r;  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   RawConfigParserr`   r  r2  r  s      r5   r`   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=  r>  r   )r]   stringsources      r5   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	   	_sectionsrK  ro  r   r  r0   	frozensetr  )r]   rR  r  ok_filenamesrS  sections_origdiffr   s           r5   r0   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listr2  r\   rF  )r]   r   optionr   r  r2  optvalcombined_expansionss           r5   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   r2  )r   r  )r]   r  r   r2  r  s        r5   r4  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\   rk   rq  )r]   r^   HERE_FORMATr   r   r   s         r5   rD  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  )r@   rA   rB   r  r`   r  r0   r  r   r4  rD  rC   r=   r5   r;  r;    s        I   1 1 1 1  * 07$   & *1R = = = =2 2 2 2 2r=   r;  c                   2    e Zd Zd Zd Zd Zd Zd Zd ZdS )Configc                 .    |                      |           S r8   )__eq__r]   others     r5   __ne__zConfig.__ne__%  s    ;;u%%%%r=   c                 b    | j         |j         k    r| j        |j        k     S | j         |j         k     S r8   r\  r   r  s     r5   __lt__zConfig.__lt__(  /    =EN**9uz))}u~--r=   c                 b    | j         |j         k    r| j        |j        k    S | j         |j         k    S r8   r  r  s     r5   __le__zConfig.__le__.  /    =EN**9
**}..r=   c                 b    | j         |j         k    r| j        |j        k    S | j         |j         k    S r8   r  r  s     r5   __gt__zConfig.__gt__4  r  r=   c                 b    | j         |j         k    r| j        |j        k    S | j         |j         k    S r8   r  r  s     r5   __ge__zConfig.__ge__:  r  r=   c                 H    d| j         dt          |           d| j        dS )N<z instance at z named >)	__class__idr   r  s    r5   __repr__zConfig.__repr__@  s,     15D15< 	<r=   N)	r@   rA   rB   r  r  r  r  r  r  rC   r=   r5   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 )rn  )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  rf  r8  r$  c           	          || _         | j        D ]}t          | |||                    | j        D ]'}t          | ||                    |d                      (d S r8   )r   req_param_namesr   optional_param_namesr   )r]   r   paramsr   s       r5   r`   zProcessConfig.__init__R  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  rn  r  r  r   r   )r]   r  r   s      r5   r  zProcessConfig.__eq__Y  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  )r8  r   r   r)   r  r   r  r   s     r5   r  zProcessConfig.get_pathe  sQ     '#''//Dzz"*---|$$&&&r=   c                     | j         j        }| j         j        }| j        }| j        t
          u r |||d          | _        | j        t
          u r |||d          | _        d S d S )Nrm   rs   )r   r%  r   r   r  r   r  )r]   get_autonamesidr   s       r5   create_autochildlogsz"ProcessConfig.create_autochildlogsn  ss    |9l%y)++".,tS("C"CD)++".,tS("C"CD ,+r=   Nc                 6    ddl m}  ||           }||_        |S )Nr   )
Subprocess)supervisor.processr  rV  )r]   rV  r  processs       r5   make_processzProcessConfig.make_processx  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 )Nrm   rs   r  r   POutputDispatcherPInputDispatcherrd  )
rf  r   r  supervisor.dispatchersr  r  r   rd  ProcessCommunicationStdoutEventProcessCommunicationStderrEvent)r]   rW  
use_stderrr  	stdout_fd	stderr_fdstdin_fddispatchersr  r  rd  etypes               r5   make_dispatcherszProcessConfig.make_dispatchers~  s    --
L##J//'({1X;qzH)	<<<<<<;;;;;;%%%%%% :E%6%6tUI%N%NK	" :E%6%6tE9%M%MK	"$4$4T7H$M$MK!A~r=   r8   )r@   rA   rB   r  r  r`   r  r  r  r  r   rC   r=   r5   rn  rn  D  s        
) 
) 
)O +K98 8 8
 
 
' ' 'D D D       r=   rn  c                       e Zd Zd ZdS )rs  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 )
NTrm   rs   r  r   )PEventListenerDispatcherr  r  r  )	r   r  r  r#  r  r  r   rd  r  )r]   rW  r  r  r  r  r  r  r#  r  r  rd  r  s                r5   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)r@   rA   rB   r   rC   r=   r5   rs  rs    s#            r=   rs  c                       e Zd ZddZd ZdS )rw  Nc                 X    |t          d          ddlm}  ||           }||_        |S )Nz FastCGI programs require a groupr   )FastCGISubprocess)NotImplementedErrorr  r&  rV  )r]   rV  r&  r  s       r5   r  z!FastCGIProcessConfig.make_process  sD    =%&HIII888888##D))r=   c                     t                               | |          \  }}|d         }|||                                          ||fS )Nr  )rn  r   r@  )r]   rW  r  r  r  s        r5   r   z%FastCGIProcessConfig.make_dispatchers  sM    &77dCCQ W:!'')))A~r=   r8   )r@   rA   rB   r  r   rC   r=   r5   rw  rw    s7               r=   rw  c                   &    e Zd Zd Zd Zd Zd ZdS )rp  c                 >    || _         || _        || _        || _        d S r8   )r   r   r\  rJ  )r]   r   r   r\  rJ  s        r5   r`   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  rp  r   r\  rJ  r  s     r5   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 r8   rJ  r  r]   re   s     r5   after_setuidzProcessGroupConfig.after_setuid  3    * 	* 	*F''))))	* 	*r=   c                 $    ddl m}  ||           S )Nr   )ProcessGroup)r  r2  )r]   r2  s     r5   
make_groupzProcessGroupConfig.make_group  s$    333333|D!!!r=   Nr@   rA   rB   r`   r  r/  r3  rC   r=   r5   rp  rp    sP        / / /  * * *" " " " "r=   rp  c                   &    e Zd Zd Zd Zd Zd ZdS )rt  c                 h    || _         || _        || _        || _        || _        || _        || _        d S r8   )r   r   r\  rJ  r_  r  r`  )r]   r   r   r\  rJ  r_  r  r`  s           r5   r`   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  rt  r   r\  rJ  r_  r  r`  r  s     r5   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 r8   r-  r.  s     r5   r/  z$EventListenerPoolConfig.after_setuid  r0  r=   c                 $    ddl m}  ||           S )Nr   )EventListenerPool)r  r:  )r]   r:  s     r5   r3  z"EventListenerPoolConfig.make_group  s%    888888  &&&r=   Nr4  rC   r=   r5   rt  rt    sP        - - -  * * *' ' ' ' 'r=   rt  c                        e Zd Zd Zd Zd ZdS )rx  c                 P    t                               | ||||           || _        d S r8   )rp  r`   r  )r]   r   r   r\  rJ  r  s         r5   r`   zFastCGIGroupConfig.__init__  s9    ##	 	 	 +r=   c                     t          |t                    sdS | j        |j        k    rdS t                              | |          S )NF)r  rx  r  rp  r  r  s     r5   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     r5   r3  zFastCGIGroupConfig.make_group  s%    ::::::""4(((r=   N)r@   rA   rB   r`   r  r3  rC   r=   r5   rx  rx    sA        + + +6 6 6) ) ) ) )r=   rx  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   rr   NFAILED)	absr/   r   seektellr   r0   r:  r9  )	rS  offsetlength	absoffset	abslengthr4   szposrt  s	            r5   readFilerM    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.
    rA  Fr   rr   Tr   r=   Nr   )r/   rE  rF  r0   r   r:  r9  )rS  rG  rH  r4   overflowrK  rt  s          r5   tailFilerP  1  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.
    ri  zexit status %szterminated by %s	WCOREDUMP   z (core dumped)r   z unknown termination cause 0x%04x)r)   	WIFEXITEDWEXITSTATUSWIFSIGNALEDWTERMSIGsignamer   rR  )r<  esrv   sigiscores        r5   decode_wait_statusr\  Z  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   )rZ  s    r5   rX  rX  v  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   r^  )dr_   r;   k_startswiths       r5   r_  r_    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 r8   )_signals_recvdr  s    r5   r`   zSignalReceiver.__init__  s     r=   c                 P    || j         vr| j                             |           d S d S r8   )rh  r   )r]   rZ  frames      r5   r  zSignalReceiver.receive  s5    d)))&&s+++++ *)r=   c                 N    | j         r| j                             d          }nd }|S )Nr   )rh  pop)r]   rZ  s     r5   r  zSignalReceiver.get_signal  s/     	%))!,,CCC
r=   N)r@   rA   rB   r`   r  r  rC   r=   r5   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: rb   z is badly formatted: )rD  r  r   ry  r   rt   r.   r   )r   r2  r   ex	availables        r5   rF  rF    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 )Nrx   rC   )r}  r  r   s      r5   make_namespecrq    s+     \!!$**ll3Kr=   c                     |                      dd          }t          |          dk    r|\  }}|r|dk    rd }n| | }}||fS )Nrx   r   rr   *)r   r  )namespecnamesr}  r  s       r5   split_namespecrv    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r@   rA   rB   r   rC   r=   r5   rx  rx    s        JJJJr=   rx  c                       e Zd ZdZdS )
BadCommandz5 Indicates the command could not be parsed properly. Nry  rC   r=   r5   r{  r{    s        ????r=   r{  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. Nry  rC   r=   r5   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 Nry  rC   r=   r5   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. Nry  rC   r=   r5   r  r    s           r=   r  )\r  r   r)   rW   r   r  r  r  rB  rF  rS  rr  r   rG  rA  r   r  supervisor.compatr   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&   r6   r
  r<   r?   rE   r   r  r  r  r;  objectr  rn  rs  rw  rp  rt  rx  rM  rP  r\  r^  rX  r_  r  rF  rq  rv  r   rx  r{  r  r  r  rC   r=   r5   <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	 	 	 	 	 	 	 	E" E" E" E" E" E" E" E"P
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=   