o
    r¨ÊhjY ã                   @   s®  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%d&„ Z:e:ƒ Z;d'd(„ Z<G d)d*„ d*ƒZ=G d+d,„ d,ƒZ>G d-d.„ d.e>ƒZ?G d/d0„ d0e>ƒZ@g ZAG d1d2„ d2ejBƒZCG d3d4„ d4eDƒZEG d5d6„ d6eEƒZFG d7d8„ d8eFƒZGG d9d:„ d:eFƒZHG d;d<„ d<eEƒZIG d=d>„ d>eEƒZJG d?d@„ d@eIƒZKdAdB„ ZLdCdD„ ZMdEdF„ ZNdaOdGdH„ ZPdIdJ„ ZQG dKdL„ dLƒZRdMdN„ ZSdOdP„ ZTdQdR„ ZUG dSdT„ dTeVƒZWG dUdV„ dVeWƒZXG dWdX„ dXeWƒZYG dYdZ„ dZeWƒZZG d[d\„ d\eWƒZ[d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                  C   s\   t j t j t¡¡} t j | d¡}t|dƒ�}| ¡  ¡ W  d   ƒ S 1 s'w   Y  d S )Nzversion.txtÚr)	ÚosÚpathÚabspathÚdirnameÚ__file__ÚjoinÚopenÚreadÚstrip)ÚmydirÚversion_txtÚf© r3   úD/var/www/html/env/lib/python3.10/site-packages/supervisor/options.pyÚ_read_version_txt:   s
   
$ÿr5   c                 C   s   t j t j t j | ¡¡¡S ©N)r'   r(   Únormpathr)   Ú
expanduser)Úvr3   r3   r4   Únormalize_pathA   s   r:   c                   @   s   e Zd ZdS )ÚDummyN)Ú__name__Ú
__module__Ú__qualname__r3   r3   r3   r4   r;   D   s    r;   c                   @   sÌ   e Zd ZejZejZejZeZd ZZ	ej
d ZdZdZdZdZdZddd„Zdd„ Zdd	„ Zd
d„ Z									d dd„Zdd„ Zd!dd„Zddd„Zdd„ Zdd„ Zd"dd„Zdd„ Zdd„ ZdS )#ÚOptionsNr   Tc                 C   sà   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| < qbd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ÚaddrA   r'   r(   r*   ÚsysÚargvr,   ÚsearchpathsÚenviron_expansionsÚenvironÚitems)ÚselfrN   ÚhererR   Úkr9   r3   r3   r4   Ú__init__Y   s2   ûÿzOptions.__init__c                 C   sL   d}| j D ]}tj |¡r|} nq|du r$| jr$|  dd | j ¡ ¡ |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ú, )rR   r'   r(   ÚexistsrN   Úusager,   )rV   Úconfigr(   r3   r3   r4   Údefault_configfilez   s   
þ
þzOptions.default_configfilec                 C   s@   | j d }| 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)rV   ÚdummyrA   r3   r3   r4   rA   ‡   s
   
zOptions.helpc                 C   s4   | j  dt|ƒ ¡ | j  d| j ¡ |  d¡ dS )z2Print a brief error message to stderr and exit(2).z
Error: %s
zFor help, use %s -h
é   N)Ústderrre   Ústrrc   rf   ©rV   Úmsgr3   r3   r4   r\   ’   s   zOptions.usagec
                 C   sÚ  |dur0|durt dƒ‚|s|st dƒ‚|r| d¡rt dƒ‚|r*| d¡r*t dƒ‚|fdd„}|rF|rF| d¡| d¡krFt d||f ƒ‚|rƒ|d	 d
krRt dƒ‚|dd… |dd… }
}|dvrgt dƒ‚d
|
 }
|
| jv rvt d|
 ƒ‚||f| j|
< | j |¡ |r¹|d	 d
kr�t dƒ‚|}
|
d dkr�|
dd… }
d|
 }
|
| jv r¬t d|
 ƒ‚||f| j|
< | j |¡ |	rÂ||f| j|	< |rét| |ƒsÏt| |dƒ | j	 ||f¡ |durà|| 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   s   |S r6   r3   )ÚargÚflagr3   r3   r4   Ú<lambda>Á   s    zOptions.add.<locals>.<lambda>z&inconsistent short/long options: %r %rr   ú-z&short option should not start with '-'é   )Ú rm   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ÚendswithrI   rG   ÚappendrH   rL   ÚhasattrÚsetattrrF   rJ   rK   )rV   ÚnameÚconfnameÚshortÚlongÚhandlerÚdefaultÚrequiredrp   ÚenvÚkeyÚrestr3   r3   r4   rO   ˜   sb    ÿ



ùzOptions.addc                 C   s4   | j  |d¡}||krt| ||ƒ || j |< d S d S )Nru   )rM   Úgetrz   )rV   ÚattrÚvalueÚprioÚcurrentr3   r3   r4   Ú_setì   s
   þzOptions._setc                 C   sP  |du rt jdd… }|du rt jd }|du r+z	ddl}|j}W n	 ty*   Y nw || _|| _g | _g | _zt	 	|d 
| j¡| j¡\| _| _W n t	jyc } z|  t|ƒ¡ W Y d}~nd}~ww | jrt| jst|  dt| jƒ ¡ | jD ]M\}}| j| \}}	|	dur©z|	|ƒ}W n ty¨ }
 z|  d|||
f ¡ W Y d}
~
nd}
~
ww |rÄ|durÄt| |ƒdur½|  d| ¡ |  ||d¡ qw| j ¡ D ]L}| j| \}}	|tjv �rtj| }|	du�rz|	|ƒ}W n t�y }
 z|  d	|||
f ¡ W Y d}
~
nd}
~
ww |�r|du�r|  ||d¡ qÊ| jdu �r"|  ¡ | _|  ¡  dS )
zôRealize 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__)
        Nrs   r   rt   z*positional arguments are not supported: %szinvalid value for %s %r: %sz"conflicting command line option %rrh   z'invalid environment value for %s %r: %s)rP   rQ   Ú__main__Ú__doc__Ú	Exceptionrc   r`   ÚoptionsÚargsÚgetoptr,   rG   rH   Úerrorr\   rj   Úpositional_args_allowedrI   rv   ÚgetattrrŠ   rL   Úkeysr'   rT   rC   r^   Úprocess_config)rV   r�   r`   rc   r‹   ÚexcÚoptro   r{   r   rl   Úenvvarr‡   r3   r3   r4   Úrealizeò   st   

ÿÿ€ÿ €ÿ€

ÿ€ÿ€
zOptions.realizec           	      C   sÀ   | j r|  |¡ | jD ]%\}}|r0| d¡}| j}|D ]}|du r# nt||ƒ}q|  ||d¡ q| j ¡ D ]\}}t| |ƒdu rGt	| ||ƒ q6| j
 ¡ D ]\}}t| |ƒdu r]|  |¡ qMdS )z}Process configuration data structure.

        This includes reading config file if necessary, setting defaults etc.
        Ú.Nr   )rC   Úprocess_config_filerF   ÚsplitÚ
configrootr“   rŠ   rJ   rU   rz   rK   r\   )	rV   Údo_usager{   r|   ÚpartsÚobjÚpartr‡   Úmessager3   r3   r4   r•   8  s*   

€€
€þzOptions.process_configc              
   C   sz   t | jdƒstj tj | j¡¡| _z	|  | j¡ W d S  ty< } z|r-|  	t
|ƒ¡ nt|ƒ‚W Y d }~d S d }~ww )Nr.   )ry   rC   r'   r(   r)   r*   rW   Úread_configrv   r\   rj   )rV   rž   rl   r3   r3   r4   r›   W  s   ý€ýzOptions.process_config_filec                 C   s   t j |¡S r6   )r'   r(   r[   ©rV   r(   r3   r3   r4   r[   e  ó   zOptions.existsr&   c                 C   s
   t ||ƒS r6   )r-   )rV   ÚfnÚmoder3   r3   r4   r-   h  ó   
zOptions.openc              	   C   sÂ   g }|  ¡ D ]X}| |¡sq| dd¡d }| ||d ¡}|d u r)td||f ƒ‚z|  |¡}W n ty?   td||f ƒ‚w i }	| |¡D ]}
|
|krU| ||
¡|	|
< qG| |||	f¡ q|S )Nrm   rs   z"section [%s] does not specify a %sú!%s cannot be resolved within [%s])	ÚsectionsÚ
startswithrœ   Úsanegetrv   Úimport_specÚImportErrorrŽ   rx   )rV   ÚparserÚfactory_keyÚsection_prefixÚ	factoriesÚsectionr{   Úfactory_specÚfactoryÚextrasrX   r3   r3   r4   Úget_pluginsk  s0   
ÿÿÿ€zOptions.get_pluginsc                 C   s,   t j d| ¡}t|dƒr| ¡ S | d¡S )Nzx=ÚresolveF)Úpkg_resourcesÚ
EntryPointÚparsery   r¸   Úload)rV   ÚspecÚepr3   r3   r4   r­   …  s   

zOptions.import_spec©T)	NNNNNNNNN)NNN)r&   )r<   r=   r>   rP   ri   rd   rf   ÚwarningsÚuidÚgidrQ   rc   rC   Ú	schemadirr�   rW   r’   rY   r^   rA   r\   rO   rŠ   r™   r•   r›   r[   r-   r·   r­   r3   r3   r3   r4   r?   G   sD    

!
÷T

F
r?   c                   @   s  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d„ Zdd„ Zdd	„ Zd
d„ Zdd„ Zdsdd„Zdd„ Zdd„ Zdd„ Z	dtdd„Z	dtdd„Zdd„ Zdd„ Zdd „ Z d!d"„ Z!d#d$„ Z"d%d&„ Z#d'd(„ Z$d)d*„ Z%d+d,„ Z&d-d.„ Z'd/d0„ Z(d1d2„ Z)d3d4„ Z*d5d6„ Z+d7d8„ Z,d9d:„ Z-d;d<„ Z.d=d>„ Z/d?d@„ Z0dAdB„ Z1dCdD„ Z2dEdF„ Z3dGdH„ Z4dIdJ„ Z5dKdL„ Z6dMdN„ Z7dOdP„ Z8dQdR„ Z9dSdT„ Z:dUdV„ Z;dWdX„ Z<dYdZ„ Z=d[d\„ Z>d]d^„ Z?d_d`„ Z@dadb„ ZAdcdd„ ZBdedf„ ZCdgdh„ ZDdidj„ ZEdkdl„ ZFdsdmdn„ZGdodp„ ZHdqdr„ ZIdS )uÚServerOptionsNr3   Fc                 C   sÖ  t  | ¡ tƒ | _tƒ | j_|  d d dd| j¡ | jddddddd� |  d	d
dd¡ | jddddtdd� |  ddddt¡ | jddddt	dd� | jddddt
d d� | jd!d"d#d$td%d� | jd&d'd(d)td*d� | jd+d,d-d.t	d/d� | jd0d1d2d3td4d� | jd5d6d7d8tt ¡ d� | jd9d:d;d<td=d� | jd>d?d@dAtdBd� | jdCdDdEdCddd� | jdFdGdHdFddd� | jdIdJd@dKtd d� | jdLdMdNdLddd� i | _g | _g | _g | _g | _tƒ | _t | ¡| _d S )ONr9   ÚversionÚnodaemonzsupervisord.nodaemonÚnrs   r   ©rp   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.minprocsrt   z	minprocs=éÈ   Ú	nocleanupzsupervisord.nocleanuprX   Ú
strip_ansizsupervisord.strip_ansiÚtr!   zsupervisord.profile_optionszprofile_options=Úsilentzsupervisord.silentÚs)r?   rY   r;   r�   ÚsupervisordrO   rÅ   r   r   r   r   r   r   rj   ÚtempfileÚ
gettempdirÚintr!   Ú
pidhistoryÚprocess_group_configsÚparse_criticalsÚparse_warningsÚparse_infosÚSignalReceiverÚsignal_receiverr%   ÚPoller©rV   r3   r3   r4   rY   ž  sz   

ÿÿÿÿþÿÿÿÿÿÿÿÿÿÿÿzServerOptions.__init__c                 C   s   | j  dt ¡ |  d¡ dS )z-Print version to stdout and exit(0).
        ú%s
r   N)rd   re   ÚVERSIONrf   )rV   rg   r3   r3   r4   rÅ   Î  s   zServerOptions.versionc                 O   s   t j|i |¤ŽS r6   )r"   Ú	getLogger©rV   r�   Úkwargsr3   r3   r4   ró   Õ  ó   zServerOptions.getLoggerc                 C   s"   t  ¡ 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À   Úwarnr?   r^   rð   r3   r3   r4   r^   Ø  s
   ÿ
z ServerOptions.default_configfilec              
   O   sV  t j| g|¢R i |¤Ž | jj}| jd ur<zt| jƒ}W n ty3 } z|  |¡ W Y d }~nd }~ww || _t	|ƒ| _
| jsC|j| _| jrJ| j}n|j}|dkrVt|ƒ| _| jr]| j}n|j}t|ƒ| _|j| _d | _|j | _}dd„ |D ƒD ]}	|	d }
d|
 | _ | jd u r§dd„ |D ƒD ]}	|	d }|	d }|sŸd	}d
||f | _q‘d S d S )NÚsyslogc                 S   ó   g | ]}|d  t ju r|‘qS ©Úfamily)ÚsocketÚAF_UNIX©Ú.0r]   r3   r3   r4   Ú
<listcomp>  ó    ÿz)ServerOptions.realize.<locals>.<listcomp>Úfileú	unix://%sc                 S   rú   rû   )rý   ÚAF_INETrÿ   r3   r3   r4   r    r  ÚhostÚportÚ	localhostzhttp://%s:%s)r?   r™   r�   rä   rÉ   r   rv   r\   rÁ   r   rÂ   rÔ   rÏ   r:   rÖ   Úrpcinterface_factoriesÚ	serverurlÚserver_configs)rV   ro   Úkwr³   rÁ   rl   rÏ   rÖ   Úsconfigsr]   r(   r  r  r3   r3   r4   r™   ä  sL   
€ÿ




ùzServerOptions.realizeTc                 C   s"   t j| |d� | jjj}|| _d S )N)rž   )r?   r•   r�   rä   ré   )rV   rž   Únewr3   r3   r4   r•   "  s   

zServerOptions.process_configc                    s*  g | _ g | _g | _| jj}d}t|dƒs9|  |¡std| ƒ‚z
|  |d¡}d}W n t	t
fy8   td| ƒ‚w tƒ ‰| jˆ_z4zzˆ |¡ W n tyW   ˆ |¡ Y nw W n tjyl } ztt|ƒƒ‚d }~ww W |rt| ¡  n|r|| ¡  w w t ¡ }| j|dœ}| | j¡ ˆ d¡�rˆ | j¡ ˆ dd	¡s£td
ƒ‚ˆ dd	¡}t||dƒ}| ¡ }t|dƒrÄtj  !tj  "|j#¡¡}nd}|D ]Q}	tj  $||	¡}	t% %|	¡}
|
sá| j &d|	 ¡ qÈt'|
ƒD ]3}| j &d| ¡ zˆ (|¡ W n tj�y
 } ztt|ƒƒ‚d }~ww ˆ tj  "tj  !|¡¡¡ qåqÈˆ )¡ }d|v�r'tdƒ‚d| ji‰ ‡ ‡fdd„}t*|ddƒƒ|_+t*|ddƒƒ|_,|dd ƒ}|d u �rQd |_-nt.|ƒ|_-|dd ƒ|_/t0|ddƒƒ|_1t2|ddƒƒ|_3t4|dd ƒƒ|_5t*|d!d"ƒƒ|_6t7|d#d$ƒƒ|_8t2|d%d&ƒƒ|_9|d'd(ƒ|_:t;|d)d*ƒƒ|_<t;|d+d*ƒƒ|_=t> ?¡ }t.|d,|ƒƒ|_@t;|d-d*ƒƒ|_At;|d.d*ƒƒ|_B|d/d0ƒ}t||d/ƒ}tC|ƒ|_D|jD E¡ D ]\}}|| jd1| < �qÓ|  Fˆd2d3¡|_G|  Hˆ¡|_I|jID ]}|jJD ]}|jD K¡ }| |jD¡ ||_D�qö�qñ|  Lˆ¡|_Md |_N|S )4NFr.   úcould not find config file %sr&   Túcould not read config file %s)rW   Ú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 sectionrW   c                    s2   |  di ¡}| ˆ ¡ ||d< ˆj| |fi |¤ŽS ©NÚ
expansions)r…   ÚupdateÚ
getdefault)r—   r€   rõ   r  ©Úcommon_expansionsr¯   r3   r4   r…   o  s   
z&ServerOptions.read_config.<locals>.getrÛ   rÜ   rÝ   rÞ   rÎ   rÉ   rË   rÌ   rÏ   rÐ   rÑ   Ú50MBrÒ   rÓ   rÔ   rÕ   rÖ   r×   rØ   rÙ   rÆ   Úfalserâ   rÚ   rß   rà   Úenvironmentrt   rE   zsupervisor.rpcinterface_factoryzrpcinterface:)Orê   rë   rì   r�   rä   ry   r[   rv   r-   ÚIOErrorÚOSErrorÚUnhosedConfigParserrS   r  Ú	read_fileÚAttributeErrorÚreadfpr   ÚParsingErrorrj   ÚcloseÚplatformÚnoderW   r  Úhas_sectionÚexpand_hereÚ
has_optionr…   Úexpandrœ   r'   r(   r*   r)   r{   r,   Úglobrx   Úsortedr.   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  rU   r·   r	  Úprocess_groups_from_parserré   Úprocess_configsÚcopyÚserver_configs_from_parserr  r!   )rV   Úfpr³   Ú
need_closeÚwhyr  r  r  ÚbaseÚpatternÚ	filenamesÚfilenamerª   r…   rÎ   ÚtempdirÚenviron_strrX   r9   ÚgroupÚprocr‚   r3   r  r4   r£   (  sè   

ÿÿ€€ÿ€€ÿ
ÿÿ

ÿÿ€ÿÿø






ý



ýzServerOptions.read_configc           "         s¶  g }ˆ  ¡ }g }d| ji‰ ‡ ‡fdd„}|D ]u}| d¡sqt| dd¡d ƒ}t||dd ƒƒ}t||dd	ƒƒ}	g }
|D ]D}d
| }d| }||vrV||vrVtd||f ƒ‚||v rf||v rftd||f ƒ‚||v rl|n|}| |¡ |  	ˆ||t
¡}|
 |¡ q<| t| ||	|
ƒ¡ q|D ]0}| d¡r™||v ršqŽt| dd¡d ƒ}t||dd	ƒƒ}	|  	ˆ||t
¡}| t| ||	|ƒ¡ qŽ|D ]°}| d¡sÉqÁ| dd¡d }t||ddƒƒ}	t||ddƒƒ}|dk rítd||f ƒ‚||ddƒ}z|  |¡}W n t�y
   td||f ƒ‚w dd„ t||ddƒƒD ƒ}t|ƒ}|�s%td| ƒ‚ddlm} g }|D ]}t||d ƒ}|d u �rDtd||f ƒ‚| |¡ �q/t||dd ƒƒ}|�r\td!| ƒ‚|  	ˆ||t¡}| t| ||	||||ƒ¡ qÁ|D ]à}| d"¡�r�||v �rƒ�qtt| dd¡d ƒ}t||dd	ƒƒ}	d#|i}||d$d ƒ}|d u �r§d }nt|ƒ}||d%d ƒ}|d u�rÊt|ƒ}|dk �sÄ|d&k�rÊtd'| ƒ‚||d(d ƒ}|d u�rêzt|ƒ}W n t�yé   td)| ƒ‚w ||d*d ƒ}|d u�rzt|ƒ}W n ttf�y   td+| ƒ‚w ||d,d |d-�}|�std.| ƒ‚z|  |||||¡} W n t�y? }! z
td/t|!ƒ|f ƒ‚d }!~!ww |  	ˆ||t¡}| t| ||	|| ƒ¡ �qt| ¡  |S )0NrW   c                    s4   |  di ¡}| ˆ ¡ ||d< ˆj| ||fi |¤ŽS r  ©r…   r  r¬   )r³   r—   r€   rõ   r  r  r3   r4   r…   ­  s   
z5ServerOptions.process_groups_from_parser.<locals>.getzgroup:rm   rs   ÚprogramsÚpriorityéç  z
program:%szfcgi-program:%sz-[%s] names unknown program or fcgi-program %sz>[%s] name %s is ambiguous (exists as program and fcgi-program)zprogram:zeventlistener:ru   Úbuffer_sizerÓ   z*[%s] section sets invalid buffer_size (%d)Úresult_handlerz&supervisor.dispatchers:default_handlerr©   c                 S   s   g | ]}|  ¡ ‘qS r3   )Úupper)r   Úxr3   r3   r4   r  ó  s    z<ServerOptions.process_groups_from_parser.<locals>.<listcomp>Úeventsrt   z&[%s] section requires an "events" liner   )Ú
EventTypesz$Unknown event type %s in [%s] eventsÚredirect_stderrr  zx[%s] section sets redirect_stderr=true but this is not allowed because it will interfere with the eventlistener protocolzfcgi-program:Úprogram_namerÉ   Úsocket_backlogéÿÿ  zInvalid socket_backlog value %sÚsocket_ownerzInvalid socket_owner value %sÚsocket_modezInvalid socket_mode value %srý   ©r  z%[%s] section requires a "socket" linez%s in [%s] socket)rª   rW   r«   r
   rœ   r   r   rv   rx   Úprocesses_from_sectionÚProcessConfigÚextendÚProcessGroupConfigr­   r®   ÚsetÚsupervisor.eventsrE  r“   r   ÚEventListenerConfigÚEventListenerPoolConfigr   r   r   Ú	TypeErrorÚparse_fcgi_socketrj   ÚFastCGIProcessConfigÚFastCGIGroupConfigÚsort)"rV   r¯   ÚgroupsÚall_sectionsÚhomogeneous_excluder…   r³   Ú
group_namer=  r>  Úgroup_processesÚprogramÚprogram_sectionÚfcgi_sectionÚ	processesrG  Ú	pool_namer@  rA  Úpool_event_namesrE  Úpool_eventsÚpool_event_nameÚ
pool_eventrF  Úfcgi_expansionsÚ	proc_userÚproc_uidrH  rJ  rK  rý   Úsocket_configÚer3   r  r4   r-  §  s:  


ÿÿÿ
ÿÿ

ÿÿ
ÿÿÿÿÿÿ
ÿþ
ÿ
þÿ


ÿ
ÿÿ
ÿÿÿþ€ÿ
ÿ
ÿÿz(ServerOptions.process_groups_from_parserc                 C   sÔ   |  d¡r>|dd … }tj |¡std|ƒ‚t|ƒ}|d u r0t ¡ }|d ur0||kr0|t|ƒf}|d u r6d}t||||d�S |d usF|d urJtdƒ‚t	 
d|¡}|re| d¡}	t| d	¡ƒ}
t|	|
|d
�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+)$rs   rh   )rq  zBad socket format %s)r«   r'   r(   Úisabsrv   r:   r÷   r   r   ÚreÚmatchr:  rç   r   )rV   Úsockrj  rJ  rK  rH  r(   rÁ   Úmr  r  r3   r3   r4   rV  P  s6   
ÿþ
ÿ
zServerOptions.parse_fcgi_socketc              
   C   sN   z	|   ||||¡W S  ty& } z|j || j¡}td|||f ƒ‚d }~ww )Nz%s in section %r (file: %r))Ú_processes_from_sectionrv   Úsection_to_filer…   rC   )rV   r¯   r³   r]  Úklassrl  r7  r3   r3   r4   rM  s  s   ÿÿ€þz$ServerOptions.processes_from_sectionc           1   	      sØ  |d u rt }g }t| dd¡d ƒ}t ¡ }| j|||dœ‰ ‡ ‡f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dƒƒ}t||d|ƒƒ}t
||ddƒƒ}t||ddƒƒ}t||ddƒƒ}t||d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 u rÔd }nt|ƒ}||d'd ƒ}|d uræt|ƒ}t||d(d)dd�ƒ}|dkrüd*|vrütd+ƒ‚|�r|�std,ƒ‚t||| ƒD �]W} ˆ }!|! | |d-œ¡ |! | j¡ tt||!dƒƒ}"|" ¡ D ]\}#}$|$|!d.|# < �q,||d/d ƒ}%i }&d0D ]}}#d1|# }'|||'tƒ}(t|(tƒ�rZt|(|!|'ƒ}(t|(ƒ}(|(|&|'< d2|# })t|||)dƒƒ}*|*|&|)< d3|# }+t|||+d4ƒƒ},|,|&|+< d5|# }-t|||-dƒƒ}.|.|&|-< |(tu �r¬| j d6||'|-f ¡ d  |&|'< }(d7|&|-< |(tu �r¾|,�s¾| j d8||'f ¡ �qB|�rØ|&d9 td fv�rÔ| j d:| ¡ d |&d9< ||d;d |!d<�}/|/d u �rëtd=| ƒ‚|| fi d>t||!d(ƒ“d;|/“d/|%“d'|“d|	“d|
“d
|“d|“d|“d?|“d@|&d@ “d |“d!|“dA|&dA “dB|&dB “dC|&dC “d9|&d9 “d"|“d#|“dD|&dD “dE|&dE “dF|&dF “d|“d|“d|“d|“d|“d|“d|"“d$|“Ž}0| |0¡ �q| ¡  |S )GNrm   rs   )rW   rG  r  r]  c                    s8   |  di ¡}| ˆ ¡ ||d< ˆj| |g|¢R i |¤ŽS r  r<  )r³   r—   r�   rõ   r  r  r3   r4   r…   ‰  s   
z2ServerOptions._processes_from_section.<locals>.getr>  r?  Ú	autostartÚtrueÚautorestartÚ
unexpectedÚ	startsecsÚstartretriesé   Ú
stopsignalÚTERMÚstopwaitsecsrÓ   Ústopasgroupr  ÚkillasgroupÚ	exitcodesÚ0rF  ÚnumprocsÚnumprocs_startr   r  rt   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ˆ  rE   rÎ   )rd   ri   z
%s_logfilez%s_logfile_backupsz%s_logfile_maxbytesr  z	%s_syslogzfFor [%s], %s=syslog but this is deprecated and will be removed.  Use %s=true to enable syslog instead.TztFor [%s], AUTO logging used for %s 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œ   r%  r&  rW   r   r   r    r   r   r   r/   rB  r   r   rv   Úranger  rS   r   r*  rU   r   Ú
isinstancer   r   r   rë   rx   rY  )1rV   r¯   r³   r]  ry  r=  rG  r  r…   r>  rz  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‘  r  r  rX   r9   rÎ   ÚlogfilesÚlf_keyÚlf_valÚbu_keyÚbackupsÚmb_keyÚmaxbytesÚsy_keyrù   r“  Úpconfigr3   r  r4   rw  }  sZ  ýÿÿÿ
ÿ
ÿÿÿþÿ€þÿ
ÿÿþýüûúùø	÷
öõôóòñðïîíìëêéèçæåäãâá!z%ServerOptions._processes_from_sectionc                 C   sT   g }|  ¡ D ]!}| |¡r'| dd¡}t|ƒdkr|d }nd }| ||f¡ q|S )Nrm   rs   )rª   r«   rœ   Úlenrx   )rV   r¯   ÚstyperŽ   r³   rŸ   r{   r3   r3   r4   Ú_parse_servernames)  s   

€z ServerOptions._parse_servernamesc                 C   sT   |j }||dd ƒ}||dd ƒ}|d us|d ur%|d u s|d u r%td| ƒ‚||dœS )NÚusernameÚpasswordz‹Section [%s] contains incomplete authentication: If a username or a password is specified, both the username and password must be specified)r®  r¯  )r¬   rv   )rV   r¯   r³   r…   r®  r¯  r3   r3   r4   Ú_parse_username_and_password5  s   þÿ
z*ServerOptions._parse_username_and_passwordc              
   C   sÊ  g }|   |d¡}|D ]B\}}i }|j}| |  ||¡¡ ||d< tj|d< ||dd ƒ}|d u r5td| ƒ‚t|ƒ\}	}|	|d< ||d< ||d< | |¡ q
|   |d¡}
|
D ]�\}}i }|j}||d	d d
| j	id�}|d u rstd| ƒ‚| 
¡ }||d< tj|d< t|ƒ|d	< | |  ||¡¡ ||dd ƒ}|d ur­zt|ƒ}W n ty¬   td| ƒ‚w d}||d< ||dd ƒ}|d urÓzt|ƒ}W n ttfyÒ   td| ƒ‚w d}||d< ||d< | |¡ qU|S )NÚinet_http_serverr{   rü   r  zsection [%s] has no port valuer  r³   Úunix_http_serverr  rW   rL  zsection [%s] has no file valueÚchownzInvalid sockchown value %s)ru   ru   ÚchmodzInvalid chmod value %sro  )r­  r¬   r  r°  rý   r  rv   r   rx   rW   r/   rþ   r:   r   r   rU  )rV   r¯   ÚconfigsÚinet_serverdefsr{   r³   r]   r…   r  r  Úunix_serverdefsÚsfiler³  r´  r3   r3   r4   r0  A  sb   

ÿÿz(ServerOptions.server_configs_from_parserc                 C   s    | j  ¡  |  ¡  | j  ¡  d S r6   )r%   Úbefore_daemonizeÚ
_daemonizeÚafter_daemonizerð   r3   r3   r4   Ú	daemonizev  s   
zServerOptions.daemonizec              
   C   s  t  ¡ }|dkr| j d¡ t  d¡ | j d¡ | jrKzt  | j¡ W n tyA } z| j 	d| j|f ¡ W Y d }~nd }~ww | j d| j ¡ t  
d¡ tdƒ | _ t_t_t  
d¡ tddƒ | _ t_t_t  
d	¡ tddƒ | _ t_t_t  ¡  t  | j¡ d S )
Nr   z"supervisord forked; parent exitingz#daemonizing the supervisord processzcan't chdir into %r: %szset current directory: %rz	/dev/nullrs   Úwrh   )r'   ÚforkÚloggerÚblatherÚ_exitrÕ   rÎ   Úchdirr  Úcriticalr$  r-   ÚstdinrP   Ú	__stdin__rd   Ú
__stdout__ri   Ú
__stderr__ÚsetsidrË   )rV   ÚpidÚerrr3   r3   r4   rº  {  s2   
ÿ€ÿÿ


zServerOptions._daemonizec              	   C   sŒ   t  ¡ }zt| jdƒ�}| d| ¡ W d   ƒ n1 sw   Y  W n ttfy8   | j d| j ¡ Y d S w d| _	| j 
d| ¡ d S )Nr½  rñ   zcould not write pidfile %sTzsupervisord started with pid %s)r'   Úgetpidr-   rÖ   re   r  r  r¿  rÃ  Úunlink_pidfilerÕ   )rV   rÉ  r2   r3   r3   r4   Úwrite_pidfile¯  s   ÿ€ÿzServerOptions.write_pidfilec                 C   sV   | j D ]\}}|d tjkr| jr|d }|  |¡ q| jr$|  | j¡ | j ¡  d S )Nrü   r  )	Úhttpserversrý   rþ   Úunlink_socketfilesÚ_try_unlinkrÌ  rÖ   r%   r$  )rV   r]   ÚserverÚ
socketnamer3   r3   r4   Úcleanupº  s   
€zServerOptions.cleanupc                 C   ó&   zt  |¡ W d S  ty   Y d S w r6   )r'   Úunlinkr  r¤   r3   r3   r4   rÐ  Ä  ó
   ÿzServerOptions._try_unlinkc                 C   sb   g }| j D ] \}}| ¡  |  ¡  ¡ D ]}t|dd ƒ}||u r$| |¡ qq|D ]}| ¡  q(d S )NrÑ  )rÎ  r$  Úget_socket_mapÚvaluesr“   rx   )rV   Údispatcher_serversr]   rÑ  Ú
dispatcherÚdispatcher_serverr3   r3   r4   Úclose_httpserversÊ  s   
€ý
ôzServerOptions.close_httpserversc                 C   s   | j  ¡  d S r6   )r¿  r$  rð   r3   r3   r4   Úclose_loggerá  ó   zServerOptions.close_loggerc                 C   s`   | j j}t tj|¡ t tj|¡ t tj|¡ t tj|¡ t tj|¡ t tj|¡ d S r6   )	rî   ÚreceiveÚsignalÚSIGTERMÚSIGINTÚSIGQUITÚSIGHUPÚSIGCHLDÚSIGUSR2)rV   rß  r3   r3   r4   Ú
setsignalsä  s   zServerOptions.setsignalsc                 C   s
   | j  ¡ S r6   )rî   Ú
get_signalrð   r3   r3   r4   rè  í  r¨   zServerOptions.get_signalc              
   C   s   z|   |¡| _d| _W d S  tjye } zL|jd tjkr#|  d¡ n0d}tj	 
|jd ¡}|d u r?|  d||jd f ¡ n|  d|||jd f ¡ W Y d }~d S W Y d }~d S W Y d }~d S d }~w ty } z|  |jd ¡ W Y d }~d S d }~ww )NTr   zœAnother 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 reportedz%s %sz%s errno.%s (%d))Úmake_http_serversrÎ  rÏ  rý   r‘   r�   ÚerrnoÚ
EADDRINUSEr\   Ú	errorcoder…   rv   )rV   rä   r3  rA   Ú	errornamer3   r3   r4   Úopenhttpserversð  s(   ÿö€€ÿzServerOptions.openhttpserversc                 C   s$   d|||f }| j d|| jd�}|S )Nz%s-%s---%s-z.log)ÚsuffixÚprefixÚdir)Ú
mktempfilerÚ   )rV   r{   rØ   Úchannelrð  rÏ   r3   r3   r4   Úget_autochildlog_name  s   ýz#ServerOptions.get_autochildlog_namec              
   C   s¦   | j }t d| j ¡}zt |¡}W n ttfy$   | j 	d¡ Y d S w |D ])}| 
|¡rPtj ||¡}z|  |¡ W q' ttfyO   | j 	d| ¡ Y q'w q'd S )Nz.+?---%s-\S+\.log\.{0,1}\d{0,4}zCould not clear childlog dirzFailed to clean up %r)rÚ   rs  ÚcompilerØ   r'   Úlistdirr  r  r¿  rø   rt  r(   r,   Úremove)rV   rÚ   Úfnrer6  r7  Úpathnamer3   r3   r4   Úclear_autochildlogdir  s$   þ
ÿüÿz#ServerOptions.clear_autochildlogdirc                 C   s   t jS r6   )ÚasyncoreÚ
socket_maprð   r3   r3   r4   r×    s   zServerOptions.get_socket_mapc                 C   s   d}t  || j¡ d S )Né   )r'   Ú
closerangerÛ   )rV   Ústartr3   r3   r4   Úcleanup_fds"  s   zServerOptions.cleanup_fdsc                 C   s   t  ||¡ d S r6   )r'   Úkill)rV   rÉ  rà  r3   r3   r4   r  '  rö   zServerOptions.killc              
   C   s�   zt  dt j¡\}}W ||fS  tyG } z-|jd }|tjtjfvr+| j 	d| ¡ |tjkr6| j 
d¡ d\}}W Y d }~||fS d }~ww )Nru   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À  )rV   rÉ  Ústsr–   Úcoder3   r3   r4   r  *  s"   
ö
ÿÿ
€özServerOptions.waitpidc                    s>  ˆ du rdS zt ˆ ƒ}W n$ ty0   zt ˆ ¡}W n ty)   dˆ   Y  Y S w |d }Y nw zt |¡}W n tyE   d|  Y S w t ¡ }||krPdS |dkrVdS |d }ttd	ƒr†|d ‰ ‡ fd
d„t	 
¡ D ƒ}| d|¡ zt |¡ W n
 ty…   Y dS w zt |¡ W n
 ty—   Y dS w t |¡ dS )züDrop 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 username %rrh   zCan't find uid %rr   z$Can't drop privilege as nonroot userr€  Ú	setgroupsc                    s    g | ]}ˆ |d  v r|d ‘qS )r€  rh   r3   )r   Úgrprec©rÉ   r3   r4   r  h  s   
 ÿz1ServerOptions.drop_privileges.<locals>.<listcomp>z&Could not set groups of effective userz(Could not set group id of effective user)rç   rv   ÚpwdÚgetpwnamÚKeyErrorÚgetpwuidr'   r÷   ry   ÚgrpÚgetgrallÚinsertr  r  ÚsetgidÚsetuid)rV   rÉ   rÁ   ÚpwrecÚcurrent_uidrÂ   rZ  r3   r
  r4   Údrop_privilegesB  sL   ÿûÿ
ÿÿzServerOptions.drop_privilegesc                 C   sb   | j du rt ¡ dkr| j d¡ dS dS |  | j ¡}|du r*| j d| j  ¡ dS |  |¡ dS )zµSet 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   zËSupervisor 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ê   rx   r  rì   r\   rk   r3   r3   r4   Úset_uid_or_exit{  s   
ÿ
ÿzServerOptions.set_uid_or_exitc           	   
   C   sü   g }t tdƒr| d| jtjddœ¡ t tdƒr$| d| jtjddœ¡ |D ]U}|d }|d }|d }|d	 }|}t |¡\}}||k r{|d
kr{||k rS|d
krS|}zt |||f¡ | j	 dt
ƒ  ¡ W q& tjtfyz   |  |t
ƒ  ¡ Y q&w q&dS )z¶Set 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.)rl   Ú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.r  r  rl   r{   ru   z)Increased %(name)s limit to %(min_limit)sN)ry   r  rx   rÛ   r  rÝ   r  Ú	getrlimitÚ	setrlimitrì   Úlocalsr‘   rv   r\   )	rV   ÚlimitsÚlimitÚ	min_limitÚresrl   r{   ÚsoftÚhardr3   r3   r4   Úset_rlimits_or_exitŽ  sJ   
	ôÿ
	ôÿ
ÿÿ€íz!ServerOptions.set_rlimits_or_exitc                 C   sœ   d}t  | j¡| _| jr| jst  | j|¡ t j| j| j|| j	  | j	| j
d� | jD ]}| j |¡ q+| jD ]}| j |¡ q7| jD ]}| j |¡ qCd 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Õ   )rV   Úformatrl   r3   r3   r4   Úmake_loggerÊ  s&   ú


ÿzServerOptions.make_loggerc                 C   s   ddl m} || |ƒS )Nr   )ré  )Úsupervisor.httpré  )rV   rä   ré  r3   r3   r4   ré  ß  s   
zServerOptions.make_http_serversc                 C   rÔ  r6   )r'   r$  r  )rV   Úfdr3   r3   r4   Úclose_fdã  rÖ  zServerOptions.close_fdc                 C   ó   t  ¡ S r6   )r'   r¾  rð   r3   r3   r4   r¾  é  ó   zServerOptions.forkc                 C   s   t  ||¡S r6   )r'   Údup2)rV   ÚfrmÚtor3   r3   r4   r0  ì  r¥   zServerOptions.dup2c                 C   r.  r6   )r'   Úsetpgrprð   r3   r3   r4   r3  ï  r/  zServerOptions.setpgrpc                 C   s
   t  |¡S r6   )r'   Ústat)rV   r7  r3   r3   r4   r4  ò  r¨   zServerOptions.statc                 C   s   t  |t|ƒ¡S r6   )r'   re   r   )rV   r,  Údatar3   r3   r4   re   õ  rö   zServerOptions.writec                 C   s   t  |||¡S r6   )r'   Úexecve)rV   r7  rQ   r‚   r3   r3   r4   r6  ø  rÞ  zServerOptions.execvec                 C   s&   d t _t |||¡\}}t  |¡ |S r6   )r'   Ú
_urandomfdrå   Úmkstempr$  )rV   rï  rð  rñ  r,  r7  r3   r3   r4   rò  û  s   
zServerOptions.mktempfilec                 C   ó   t  |¡ d S r6   )r'   r÷  r¤   r3   r3   r4   r÷    rÞ  zServerOptions.removec                 C   r9  r6   )r'   rÁ  )rV   r  r3   r3   r4   rÁ    rÞ  zServerOptions._exitc                 C   r9  r6   )r'   rË   )rV   Úmaskr3   r3   r4   Úsetumask
  rÞ  zServerOptions.setumaskc                 C   s0   g d¢}dt jv rt jd }|r| t j¡}|S )z3Return a list corresponding to $PATH, or a default.)z/binz/usr/binz/usr/local/binÚPATH)r'   rT   rœ   Úpathsep)rV   r(   Úpr3   r3   r4   Úget_path  s   

zServerOptions.get_pathc                 C   r.  r6   )r'   rË  rð   r3   r3   r4   Úget_pid  r/  zServerOptions.get_pidc                 C   sn   |d u r
t d| ƒ‚t |tj ¡rtd| ƒ‚t |tj ¡d@ s(td| ƒ‚t |tj¡s5t	d| ƒ‚d S )Nzcan't find command %rzcommand at %r is a directoryéI   zcommand at %r is not executablezno permission to run command %r)
ÚNotFoundr4  ÚS_ISDIRÚST_MODEÚNotExecutableÚS_IMODEr'   ÚaccessÚX_OKÚNoPermission)rV   r7  rQ   Ústr3   r3   r4   Úcheck_execv_args  s   ÿzServerOptions.check_execv_argsc                 C   s0   | j  d¡ | j jD ]}t|dƒr| ¡  q
d S )Nzsupervisord logreopenÚreopen)r¿  rÕ   Úhandlersry   rL  )rV   r   r3   r3   r4   Ú
reopenlogs&  s   
€þzServerOptions.reopenlogsc              
   C   sZ   z	t  |d¡}W |S  ty, } z|jd tjtjtjfvr‚ d}W Y d }~|S d }~ww )Ni   r   ó    )r'   r.   r  r�   rê  ÚEWOULDBLOCKÚEBADFr  )rV   r,  r5  r3  r3   r3   r4   Úreadfd,  s   ü€üzServerOptions.readfdc                 C   r9  r6   )r'   rÂ  )rV   rñ  r3   r3   r4   rÂ  5  rÞ  zServerOptions.chdirc           
      C   sð   dddddddœ}zVt  ¡ \}}|||d< |d< t  ¡ \}}|||d< |d< |r9t  ¡ \}}|||d< |d< |d |d |d fD ]}|dur\t |tj¡t jB }	t |tj|	¡ qD|W S  tyw   | ¡ D ]}|duru|  |¡ qj‚ 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Ä  rd   Úchild_stdoutri   Úchild_stderrrS  rÄ  rd   rT  ri   rU  )	r'   ÚpipeÚfcntlÚF_GETFLÚO_NDELAYÚF_SETFLr  rØ  r-  )
rV   ri   ÚpipesrÄ  rS  rd   rT  rU  r,  Úflagsr3   r3   r4   Ú
make_pipes8  s8   û€
€üzServerOptions.make_pipesc                 C   ó*   dD ]}|  |¡}|d ur|  |¡ qd S )N)rÄ  rd   ri   ©r…   r-  ©rV   r[  Úfdnamer,  r3   r3   r4   Úclose_parent_pipesW  ó   

€ýz ServerOptions.close_parent_pipesc                 C   r^  )N)rS  rT  rU  r_  r`  r3   r3   r4   Úclose_child_pipes]  rc  zServerOptions.close_child_pipesr¿   r6   )Jr<   r=   r>   rÉ   Ú	sockchownÚ	sockchmodrÏ   rÔ   rÖ   Ú
passwdfilerÆ   râ   rÎ  rÌ  rÏ  r#   ÚSupervisorStatesÚRUNNINGÚmoodrY   rÅ   ró   r^   r™   r•   r£   r-  rV  rM  rw  r­  r°  r0  r¼  rº  rÍ  rÓ  rÐ  rÜ  rÝ  rç  rè  rî  rô  rú  r×  r   r  r  r  r  r%  r*  ré  r-  r¾  r0  r3  r4  re   r6  rò  r÷  rÁ  r;  r?  r@  rK  rN  rR  rÂ  r]  rb  rd  r3   r3   r3   r4   rÄ   �  s’    0
> *$
ÿ
ÿ -54
	9<			
rÄ   c                   @   sH   e Zd ZdZdZdZdZdZdZdZ	dd„ Z
dd„ Zdd„ Zd	d
„ ZdS )ÚClientOptionsrs   Nc                 C   sê   t j| d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| _| jddd	dd
dd� | jdddd� | jddddtdd� |  dddd¡ |  dddd¡ |  dddd¡ d S ) NF)rN   rÙ   r   )ÚDefaultControllerPluginr€   Úinteractivezsupervisorctl.interactiveÚirs   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=)r?   rY   r;   r�   Úsupervisorctlrm  ro  r
  r®  r¯  Úhistory_fileÚsupervisor.supervisorctlrl  Úplugin_factoriesrO   r   )rV   rl  Údefault_factoryr3   r3   r4   rY   m  s,   








ÿÿzClientOptions.__init__c                 O   s,   t j| g|¢R i |¤Ž | jsd| _d S d S )Nrs   )r?   r™   r�   rm  )rV   ro   r  r3   r3   r4   r™   ‡  s   
ÿzClientOptions.realizec           	   	   C   sž  | j j}d}t|dƒs9tj t|ƒ¡| _|  |¡st	d| ƒ‚z
|  
|d¡}d}W n ttfy8   t	d| ƒ‚w tƒ }| j|_d|_z| |¡ W n tyX   | |¡ Y nw |r_| ¡  | ¡ }d|vrkt	dƒ‚|jd	d
d| jid�}| d¡r‡t|dd … ƒ}d| }||_| d|j¡|_| d|j¡|_| d|j¡|_|jd|jd| jid�}|r»t|ƒ}||_|| _nd |_d | _|  j|  |dd¡7  _|S )NFr.   r  r&   Tr  rr  z0.ini file does not include supervisorctl sectionr
  rp  rW   rL  rm  rn  r  ro  r®  r¯  rs  zsupervisor.ctl_factoryz
ctlplugin:)r�   rr  ry   r'   r(   r*   r:   rW   r[   rv   r-   r  r  r  rS   r  Ú	mysectionr   r!  r"  r$  rª   r  r«   r
  ro  r®  r¯  rs  ru  r·   )	rV   r1  r³   r2  r¯   rª   r
  r(   rs  r3   r3   r4   r£   Œ  sd   

ÿÿÿ

ÿ
ýzClientOptions.read_configc                 C   s   t jdt | j| j| j¡d�S )Nzhttp://127.0.0.1)Ú	transport)r   ÚServerProxyr$   ÚSupervisorTransportr®  r¯  r
  rð   r3   r3   r4   ÚgetServerProxyÅ  s   þûzClientOptions.getServerProxy)r<   r=   r>   r’   rm  ro  r
  r®  r¯  rs  rY   r™   r£   r{  r3   r3   r3   r4   rk  c  s    9rk  c                   @   sP   e Zd ZdZdd„ Zddd„Zdd„ Zed	i fd
d„Zei fdd„Z	dd„ Z
dS )r  rä   c                 O   sN   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   ÚRawConfigParserrY   rx  r  rô   r3   r3   r4   rY   Õ  s   
zUnhosedConfigParser.__init__ú<string>c                 C   s4   z	t j | ||¡W S  ty   |  t|ƒ¡ Y S w )z‚Parse 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   )rV   ÚstringÚsourcer3   r3   r4   r‚  å  s   ÿÿzUnhosedConfigParser.read_stringc                 K   sp   t |tƒr|g}g }|D ])}| j ¡ }| tjj| |gfi |¤Ž¡ t| jƒt|ƒ }|D ]}|| j	|< q-q|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   Ú	_sectionsr/  rO  r   r€  r.   Ú	frozensetrx  )rV   r6  rõ   Úok_filenamesr7  Úsections_origÚdiffr³   r3   r3   r4   r.   î  s   

ÿÿzUnhosedConfigParser.readTc                 C   sx   z|   ||¡}W n tjy   |tu r‚ |}Y nw |r:t|tƒr:tt| j 	¡ ƒt| 	¡ ƒ ƒ}t
||d||f ƒ}|S )Nz%s.%s)r…   r   ÚNoOptionErrorÚ_markerrœ  r   ÚdictÚlistr  rU   r*  )rV   r³   Úoptionr€   rŠ  r  ÚoptvalÚcombined_expansionsr3   r3   r4   r¬     s   üÿ
ÿzUnhosedConfigParser.sanegetc                 K   s   | j | j|f||dœ|¤ŽS )N)r€   r  )r¬   rw  )rV   rŽ  r€   r  rõ   r3   r3   r4   r    s
   ÿÿzUnhosedConfigParser.getdefaultc                 C   s\   d}|   ¡ D ]%}|  |¡D ]\}}||v r*|d usJ dƒ‚| ||¡}|  |||¡ qqd S )Nz%(here)szhere has not been set to a path)rª   rU   rb   rQ  )rV   rW   ÚHERE_FORMATr³   rƒ   r‡   r3   r3   r4   r(    s   €üÿzUnhosedConfigParser.expand_hereN)r�  )r<   r=   r>   rw  rY   r‚  r.   r‹  r¬   r  r(  r3   r3   r3   r4   r  Ò  s    
	
ÿr  c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )ÚConfigc                 C   s   |   |¡ S r6   )Ú__eq__©rV   Úotherr3   r3   r4   Ú__ne__%  r¥   zConfig.__ne__c                 C   s$   | j |j kr| j|jk S | j |j k S r6   ©r>  r{   r”  r3   r3   r4   Ú__lt__(  ó   zConfig.__lt__c                 C   s$   | j |j kr| j|jkS | j |j kS r6   r—  r”  r3   r3   r4   Ú__le__.  r™  zConfig.__le__c                 C   s$   | j |j kr| j|jkS | j |j kS r6   r—  r”  r3   r3   r4   Ú__gt__4  r™  zConfig.__gt__c                 C   s$   | j |j kr| j|jkS | j |j kS r6   r—  r”  r3   r3   r4   Ú__ge__:  r™  zConfig.__ge__c                 C   s   d| j t| ƒ| jf S )Nz<%s instance at %s named %s>)Ú	__class__Úidr{   rð   r3   r3   r4   Ú__repr__@  s   ÿzConfig.__repr__N)	r<   r=   r>   r–  r˜  rš  r›  rœ  rŸ  r3   r3   r3   r4   r’  $  s    r’  c                   @   sN   e Zd Zg d¢ZddgZdd„ Zdd„ Zdd	„ Zd
d„ Zddd„Z	dd„ Z
dS )rN  )r{   rÁ   r“  rÎ   rË   r>  rz  r|  r~  r  r”  r‹  rŒ  r—  r•  r–  r’  r�  r˜  r™  rŽ  rš  r�  rƒ  r„  r…  r†  rF  r  r
  c                 K   sF   || _ | jD ]
}t| ||| ƒ q| jD ]}t| || |d ¡ƒ qd S r6   )rŽ   Úreq_param_namesrz   Úoptional_param_namesr…   )rV   rŽ   Úparamsr{   r3   r3   r4   rY   R  s   

ÿzProcessConfig.__init__c                 C   sX   t |tƒsdS | j| j D ]}tt| |ƒt||ƒfv rqt| |ƒt||ƒkr) dS qdS ©NFT)rœ  rN  r   r¡  r   r“   )rV   r•  r{   r3   r3   r4   r“  Y  s   
ÿzProcessConfig.__eq__c                 C   s4   | j dur| j  d¡}|dur| 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<  )r  r…   rœ   r'   r=  rŽ   r?  r¤   r3   r3   r4   r?  e  s
   

zProcessConfig.get_pathc                 C   sN   | j j}| j j}| j}| jtu r|||dƒ| _| jtu r%|||dƒ| _d S d S )Nrd   ri   )rŽ   rô  rØ   r{   r”  r   r’  )rV   Úget_autonameÚsidr{   r3   r3   r4   Úcreate_autochildlogsn  s   

ÿz"ProcessConfig.create_autochildlogsNc                 C   s   ddl m} || ƒ}||_|S )Nr   )Ú
Subprocess)Úsupervisor.processr§  r:  )rV   r:  r§  Úprocessr3   r3   r4   Úmake_processx  s   zProcessConfig.make_processc                 C   s´   | j  }| j |¡}|d |d |d }}}i }ddlm} ddlm}	 ddlm}
 |d ur;|
j}||||ƒ||< |d urJ|
j	}||||ƒ||< |d urV|	|d|ƒ||< ||fS )Nrd   ri   rÄ  r   ©ÚPOutputDispatcher©ÚPInputDispatcher©rD  )
rF  rŽ   r]  Úsupervisor.dispatchersr¬  r®  rÙ   rD  ÚProcessCommunicationStdoutEventÚProcessCommunicationStderrEvent)rV   r;  Ú
use_stderrr>  Ú	stdout_fdÚ	stderr_fdÚstdin_fdÚdispatchersr¬  r®  rD  Úetyper3   r3   r4   Úmake_dispatchers~  s    zProcessConfig.make_dispatchersr6   )r<   r=   r>   r   r¡  rY   r“  r?  r¦  rª  r¹  r3   r3   r3   r4   rN  D  s    	

rN  c                   @   s   e Zd Zdd„ ZdS )rS  c                 C   s¶   d}| j  |¡}|d |d |d }}}i }ddlm} ddlm}	 ddlm}
 dd	lm} |d ur<||d|ƒ||< |d urK|j}|
|||ƒ||< |d urW|	|d|ƒ||< ||fS )
NTrd   ri   rÄ  r   )ÚPEventListenerDispatcherr­  r«  r¯  )	rŽ   r]  r°  rº  r®  r¬  rÙ   rD  r²  )rV   r;  r³  r>  r´  rµ  r¶  r·  rº  r®  r¬  rD  r¸  r3   r3   r4   r¹  ‘  s$   ÿz$EventListenerConfig.make_dispatchersN)r<   r=   r>   r¹  r3   r3   r3   r4   rS  �  s    rS  c                   @   s   e Zd Zddd„Zdd„ ZdS )rW  Nc                 C   s.   |d u rt dƒ‚ddlm} || ƒ}||_|S )Nz FastCGI programs require a groupr   )ÚFastCGISubprocess)ÚNotImplementedErrorr¨  r»  r:  )rV   r:  r»  r©  r3   r3   r4   rª  ¨  s   z!FastCGIProcessConfig.make_processc                 C   s4   t  | |¡\}}|d }|d ur||  ¡  ||fS )NrÄ  )rN  r¹  r$  )rV   r;  r·  r>  r¶  r3   r3   r4   r¹  °  s
   z%FastCGIProcessConfig.make_dispatchersr6   )r<   r=   r>   rª  r¹  r3   r3   r3   r4   rW  ¦  s    
rW  c                   @   ó,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
rP  c                 C   s   || _ || _|| _|| _d S r6   )rŽ   r{   r>  r.  )rV   rŽ   r{   r>  r.  r3   r3   r4   rY   »  s   
zProcessGroupConfig.__init__c                 C   sB   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>  r.  r”  r3   r3   r4   r“  Á  s   
zProcessGroupConfig.__eq__c                 C   ó   | j D ]}| ¡  qd S r6   ©r.  r¦  ©rV   r]   r3   r3   r4   Úafter_setuidÎ  ó   

ÿzProcessGroupConfig.after_setuidc                 C   ó   ddl m} || ƒS )Nr   )ÚProcessGroup)r¨  rÄ  )rV   rÄ  r3   r3   r4   Ú
make_groupÒ  ó   zProcessGroupConfig.make_groupN©r<   r=   r>   rY   r“  rÁ  rÅ  r3   r3   r3   r4   rP  º  s
    rP  c                   @   r½  )
rT  c                 C   s.   || _ || _|| _|| _|| _|| _|| _d S r6   )rŽ   r{   r>  r.  r@  re  rA  )rV   rŽ   r{   r>  r.  r@  re  rA  r3   r3   r4   rY   ×  s   
z EventListenerPoolConfig.__init__c                 C   s^   t |tƒsdS | j|jkr-| j|jkr-| j|jkr-| j|jkr-| j|jkr-| j|jkr-dS dS r£  )rœ  rT  r{   r>  r.  r@  re  rA  r”  r3   r3   r4   r“  á  s   
zEventListenerPoolConfig.__eq__c                 C   r¾  r6   r¿  rÀ  r3   r3   r4   rÁ  ï  rÂ  z$EventListenerPoolConfig.after_setuidc                 C   rÃ  )Nr   )ÚEventListenerPool)r¨  rÈ  )rV   rÈ  r3   r3   r4   rÅ  ó  rÆ  z"EventListenerPoolConfig.make_groupNrÇ  r3   r3   r3   r4   rT  Ö  s
    
rT  c                   @   ó$   e Zd Zdd„ Zdd„ Zdd„ ZdS )rX  c                 C   s   t  | ||||¡ || _d S r6   )rP  rY   rk  )rV   rŽ   r{   r>  r.  rk  r3   r3   r4   rY   ø  s   û
zFastCGIGroupConfig.__init__c                 C   s*   t |tƒsdS | j|jkrdS t | |¡S )NF)rœ  rX  rk  rP  r“  r”  r3   r3   r4   r“    s
   
zFastCGIGroupConfig.__eq__c                 C   rÃ  )Nr   )ÚFastCGIProcessGroup)r¨  rÊ  )rV   rÊ  r3   r3   r4   rÅ    rÆ  zFastCGIGroupConfig.make_groupN)r<   r=   r>   rY   r“  rÅ  r3   r3   r3   r4   rX  ÷  s    
	rX  c           	   	   C   s  t |ƒ}t |ƒ}zwt| dƒ�g}||kr:|rtdƒ‚| dd¡ | ¡ }t|| ƒ}|dk r/d}| |¡ | |¡}n)||krBtdƒ‚|dkrP| |¡ | ¡ }n| |¡ | |¡}W d  ƒ W |S W d  ƒ W |S W d  ƒ W |S 1 sxw   Y  W |S  ttfyŒ   tdƒ‚w )zJ Read length bytes from the file named by filename starting at
    offset ÚrbÚBAD_ARGUMENTSr   rh   NÚFAILED)	Úabsr-   rv   ÚseekÚtellrç   r.   r  r  )	r7  ÚoffsetÚlengthÚ	absoffsetÚ	abslengthr2   ÚszÚposr5  r3   r3   r4   ÚreadFile  sD   



ìóõùïèýÿr×  c              	   C   sô   zit | dƒ�Y}d}| dd¡ | ¡ }||| krd}|d }|| |kr1||d kr-d}|| }|dk r7d}|dk r=d}|dkrDd}n
| |¡ | |¡}|}t|ƒ||gW  d  ƒ W S 1 sbw   Y  W dS  ttfyy   d	|dg Y S w )
a  
    Read length bytes from the file named by filename starting at
    offset, automatically increasing offset and setting overflow
    flag if log size has grown beyond (offset + length).  If length
    bytes are not available, as many bytes as are available are returned.
    rË  Fr   rh   Trs   rO  Nrt   )r-   rÏ  rÐ  r.   r   r  r  )r7  rÑ  rÒ  r2   ÚoverflowrÕ  r5  r3   r3   r4   ÚtailFile1  s4   

(æÿrÙ  c                 C   sŠ   t  | ¡rt  | ¡d@ }d| }||fS t  | ¡r=t  | ¡}dt|ƒ }tt dƒr/t  | ¡}n| d@ }|r9|d7 }d|fS d|  }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)ru   z unknown termination cause 0x%04x)r'   Ú	WIFEXITEDÚWEXITSTATUSÚWIFSIGNALEDÚWTERMSIGÚsignamery   rÚ  )r  Úesrl   ÚsigÚiscorer3   r3   r4   Údecode_wait_statusZ  s   



rä  c                 C   s    t du rtƒ  t  | ¡pd|  S )z‚Return 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…   )râ  r3   r3   r4   rà  v  s   rà  c                  C   sN   i } t j ¡ D ]\}}t|dd ƒ}|d u rq|dƒr"|dƒs"|| |< q| ad S )Nr«   ÚSIGÚSIG_)rà  Ú__dict__rU   r“   rå  )ÚdrX   r9   Úk_startswithr3   r3   r4   ræ  �  s   €ræ  c                   @   rÉ  )rí   c                 C   s
   g | _ d S r6   )Ú_signals_recvdrð   r3   r3   r4   rY   �  r¨   zSignalReceiver.__init__c                 C   s   || j vr| j  |¡ d S d S r6   )rì  rx   )rV   râ  Úframer3   r3   r4   rß  �  s   
ÿzSignalReceiver.receivec                 C   s   | j r| j  d¡}|S d }|S )Nr   )rì  Úpop)rV   râ  r3   r3   r4   rè  ”  s
   ÿzSignalReceiver.get_signalN)r<   r=   r>   rY   rß  rè  r3   r3   r3   r4   rí   Œ  s    rí   c                 C   s‚   z| | W S  t y* } zt| ¡ ƒ}| ¡  td| |t|ƒd |¡f ƒ‚d }~w ty@ } ztd| |t|ƒf ƒ‚d }~ww )NzYFormat string %r for %r contains names (%s) which cannot be expanded. Available names: %srZ   z.Format string %r for %r is badly formatted: %s)r  r�  r”   rY  rv   rj   r,   r�   )rã   r  r{   ÚexÚ	availabler3   r3   r4   r*  �  s&   
þÿ€ÿÿ€ÿr*  c                 C   s    | |kr|}|S d| |f }|S )Nz%s:%sr3   )r]  r�  r{   r3   r3   r4   Úmake_namespec­  s
   ÿrñ  c                 C   sJ   |   dd¡}t|ƒdkr|\}}|r|dkrd }||fS | | }}||fS )Nrm   rs   rh   Ú*)rœ   r«  )ÚnamespecÚnamesr]  r�  r3   r3   r4   Úsplit_namespec·  s   
ÿrõ  c                   @   ó   e Zd ZdZdS )ÚProcessExceptionz@ Specialized exceptions used when attempting to start a process N©r<   r=   r>   rŒ   r3   r3   r3   r4   r÷  Å  ó    r÷  c                   @   rö  )Ú
BadCommandz5 Indicates the command could not be parsed properly. Nrø  r3   r3   r3   r4   rú  È  rù  rú  c                   @   rö  )rE  zŠ Indicates that the filespec cannot be executed because its path
    resolves to a file which is not executable, or which is a directory. Nrø  r3   r3   r3   r4   rE  Ë  rù  rE  c                   @   rö  )rB  zR Indicates that the filespec cannot be executed because it could not
    be found Nrø  r3   r3   r3   r4   rB  Ï  rù  rB  c                   @   rö  )rI  z¤ Indicates that the file cannot be executed because the supervisor
    process does not possess the appropriate UNIX filesystem permission
    to execute the file. Nrø  r3   r3   r3   r4   rI  Ó  rù  rI  )\rý   r�   r'   rP   rå   rê  rà  rs  r  r  r  r4  r¹   r+  r%  rÀ   rW  Ú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%   r5   rò   r:   r;   r?   rÄ   rk  r‹  r€  r  Úobjectr’  rN  rS  rW  rP  rT  rX  r×  rÙ  rä  rå  rà  ræ  rí   r*  rñ  rõ  r�   r÷  rú  rE  rB  rI  r3   r3   r3   r4   Ú<module>   s¼      J         ]mR L!")
