PNG  IHDR;IDATxܻn0K )(pA 7LeG{ §㻢|ذaÆ 6lذaÆ 6lذaÆ 6lom$^yذag5bÆ 6lذaÆ 6lذa{ 6lذaÆ `}HFkm,mӪôô! x|'ܢ˟;E:9&ᶒ}{v]n&6 h_tڠ͵-ҫZ;Z$.Pkž)!o>}leQfJTu іچ\X=8Rن4`Vwl>nG^is"ms$ui?wbs[m6K4O.4%/bC%t Mז -lG6mrz2s%9s@-k9=)kB5\+͂Zsٲ Rn~GRC wIcIn7jJhۛNCS|j08yiHKֶۛkɈ+;SzL/F*\Ԕ#"5m2[S=gnaPeғL lذaÆ 6l^ḵaÆ 6lذaÆ 6lذa; _ذaÆ 6lذaÆ 6lذaÆ RIENDB`  4h^c@sgddlZddlZddlZddlZddlZddlZddlZddlmZdZ dZ d>Z d?Z d Z dZdZdZdZdd@dYZdAZedfZdZddBdYZee ddddjZdZddCdYZd dDd!YZd"efd#YZd$efd%YZd&Zd'Z d(Z!d)Z"d*Z#d+Z$d,Z%d-Z&d.dEd/YZ'e'id0d16dFd26dHd46Z(d5Z)ge*eD]$Z+e+j,d6re-ee+^qZ.d7Z/d8dId9YZ0d:dJd;YZ1d<Z2d=Z3dS(KiN(tgetLevelNumByDescriptioncCsLt|j}x3dD]+}||krtd||fqqW|S(sEnsures that a process or group name is not created with characters that break the eventlistener protocol or web UI URLss :/s)Invalid name: %r because of character: %r(tstrtstript ValueError(tnametst character((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pytprocess_or_group_name s   cCs3yt|SWnttfk r.t|SXdS(N(tintRt OverflowErrortlong(tvalue((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pytintegerstyesttruetont1tnotfalsetofft0cCsLt|j}|tkr"tS|tkr2tStdt|dS(s*Convert a string value to a boolean value.snot a valid boolean value: N(RtlowertTRUTHY_STRINGStTruet FALSY_STRINGStFalseRtrepr(Rtss((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pytbooleans   cCsX|s gSy*g|jdD]}|j^qSWntdt|nXdS(Nt,snot a valid list of strings: (tsplitRRR(targtx((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pytlist_of_strings&s *cCsH|s gSytt|jdSWntdt|nXdS(NRsnot a valid list of ints: (tmapRRRR(R((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyt list_of_ints.s cCstyPt|}x9|D]1}|dks4|dkrtd|qqW|SWntdt|nXdS(NiisInvalid exit code "%s"s not a valid list of exit codes: (R#RR(Rtvalstval((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pytlist_of_exitcodes7s  cCstjt|}|jd7_t|}t|}i}d}x{||kr|||d!}t|dks|ddkrtd|n|djd||d<|d 7}qKW|S( sw parse KEY=val,KEY2=val2 into {'KEY':'val', 'KEY2':'val2'} Quotes can be used to allow commas in the value s/.+-():iiit=s/Unexpected end of key/value pairs in value '%s'is'"i(tshlexRt wordcharstlisttlenRR(Rtlexerttokenst tokens_lentDtitk_eq_v((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pytdict_of_key_value_pairsAs  "t AutomaticcBseZRS((t__name__t __module__(((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyR3VstnonetautocCsRt|dr|j}n|}|tkr4dS|tkrDtSt|SdS(NR(thasattrRt LOGFILE_NONEStNonet LOGFILE_AUTOSR3texisting_dirpath(R%tcoerced((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyt logfile_name\s  tRangeCheckedConversioncBs&eZdZdddZdZRS(s7Conversion helper that range checks another conversion.cCs||_||_||_dS(N(t_mint_maxt _conversion(tselft conversiontmintmax((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyt__init__ls  cCs|j|}|jdk rU||jkrUtdt|t|jfn|jdk r||jkrtdt|t|jfn|S(Ns%s is below lower bound (%s)s%s is above upper bound (%s)(RBR@R:RRRA(RCR tv((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyt__call__qs""N(R4R5t__doc__R:RGRI(((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyR?isREiRFicCsd}d}d|krd|jdd\}}|sItd|nt|}|j}n4yt|}Wn!tk rtd|nX| s|dkrd}n||fS(Ntt:isno port number specified in %rsnot a valid port number: %r t*(R:RRt port_numberR(Rthosttport((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyt inet_address}s    t SocketAddresscBseZdZRS(cCspd|ks0|jtjdks0d|krQttdd|_||_ntj|_t ||_dS(Nt/iRLtAF_UNIX( tfindtostseptgetattrtsocketR:tfamilytaddresstAF_INETRQ(RCR((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyRGs 0  (R4R5RG(((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyRRst SocketConfigcBs_eZdZdZd Zd ZdZdZdZ dZ dZ dZdZ RS( sV Abstract base class which provides a uniform abstraction for TCP vs Unix sockets RKcCsd|jt||jfS(Ns<%s at %s for %s>(t __class__tidturl(RC((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyt__repr__s  cCs t|jS(N(RR`(RC((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyt__str__scCs-t|tstS|j|jkr)tStS(N(t isinstanceR]RR`R(RCtother((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyt__eq__s cCs|j| S(N(Re(RCRd((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyt__ne__scCs|jS(N(tbacklog(RC((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyt get_backlogscCs tdS(N(tNotImplementedError(RC((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pytaddrscCs tdS(N(Ri(RC((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pytcreate_and_bindsN( R4R5RJR`R:RjRgRaRbReRfRhRk(((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyR]s     tInetStreamSocketConfigcBs5eZdZdZdZdZdZdZRS(s TCP socket config helper cKsP|j|_t||_d|j|jf|_|jdd|_dS(Ns tcp://%s:%dRg(RRORNRPR`tgetR:Rg(RCRORPtkwargs((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyRGscCs|j|jfS(N(RORP(RC((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyRjscCsctjtjtj}y0|jtjtjd|j|jWn|jnX|S(Ni( RYR\t SOCK_STREAMt setsockoptt SOL_SOCKETt SO_REUSEADDRtbindRjtclose(RCtsock((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyRks N( R4R5RJR:RORPRGRjRk(((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyRls   tUnixStreamSocketConfigcBseeZdZdZdZdZdZdZdZ dZ dZ dZ dZ dZRS( s" Unix domain socket config helper cKsY||_d||_|jdd|_|jdd|_|jdd|_dS(Ns unix://%stmodetownerRg(tpathR`RmR:RwRxRg(RCRyRn((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyRGs   cCs|jS(N(Ry(RC((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyRjscCstjj|jr(tj|jntjtjtj}y+|j|j|j |j Wn<|j tjj|jrtj|jnnX|S(N( RVRytexiststunlinkRYRTRoRsRjt_chownt_chmodRt(RCRu((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyRks  cCs|jS(N(Rw(RC((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pytget_modescCs|jS(N(Rx(RC((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyt get_ownerscCsZ|jdk rVytj|j|jWqVtk rR}tdd|qVXndS(Ns'Could not change permissions of socket sfile: %s(RwR:RVtchmodRyt ExceptionR(RCte((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyR}s cCsh|jdk rdy(tj|j|jd|jdWqdtk r`}tdd|qdXndS(Niis+Could not change ownership of socket file: s%s(RxR:RVtchownRyRR(RCR((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyR|s (N(R4R5RJR:RyRwRxRuRGRjRkR~RR}R|(((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyRvs      cCsyk|jdd}t|dkr@t|d}d}n t|d}t|d}||fSWntd|nXdS(s! Find a user ID and group ID from a string like 'user:group'. Returns a tuple (uid, gid). If the string only contains a user like 'user' then (uid, -1) will be returned. Raises ValueError if either the user or group can't be resolved to valid IDs on the system. RLiiis Invalid user:group definition %sN(RR+t name_to_uidt name_to_gidR(Rtpartstuidtgid((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pytcolon_separated_user_groups cCsyt|}WnRtk rdytj|}Wn!tk rVtd|nX|d}n6Xytj|Wn!tk rtd|nX|S(s Find a user ID from a string containing a user name or ID. Raises ValueError if the string can't be resolved to a valid user ID on the system. sInvalid user name %sisInvalid user id %s(RRtpwdtgetpwnamtKeyErrortgetpwuid(RRtpwdrec((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyRs   cCsyt|}WnRtk rdytj|}Wn!tk rVtd|nX|d}n6Xytj|Wn!tk rtd|nX|S(s Find a group ID from a string containing a group name or ID. Raises ValueError if the string can't be resolved to a valid group ID on the system. sInvalid group name %sisInvalid group id %s(RRtgrptgetgrnamRtgetgrgid(RRtgrprec((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyR2s   cCstj|}|dS(Ni(RR(Rtpwrec((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyt gid_for_uidEscCs?yt|dSWn'ttfk r:td|nXdS(Nis(%s can not be converted to an octal type(Rt TypeErrorR(R((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyt octal_typeIscCs<tjj|}tjj|r(|Std|dS(Ns%s is not an existing directory(RVRyt expandusertisdirR(RHtnv((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pytexisting_directoryOscCsXtjj|}tjj|}|s.|Stjj|rD|Std|dS(Ns9The directory named as part of the path %s does not exist(RVRyRtdirnameRR(RHRtdir((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyR<UscCsAt|j}t|}|dkr=td|n|S(Nsbad logging level name %r(RRRR:R(R Rtlevel((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyt logging_level`s   tSuffixMultipliercBseZddZdZRS(icCsr||_||_d|_xP|jD]B}|jdkrOt||_q(|jt|ks(tq(WdS(N(t_dt_defaultR:t_keysztkeysR+tAssertionError(RCtdtdefaulttk((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyRGks   cCsg|j}xG|jjD]6\}}||j |krt||j |SqWt||jS(N(RRtitemsRRR(RCRHRtm((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyRIvs  (R4R5RGRI(((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyRgs itkbtmbltgbcCsf|jdddj}tj|\}}}}}}|rR|sN|rR|Std|dS(Nsunix://shttp://isvalue %r is not a URL(treplaceRturlparseR(R turitschemetnetlocRytparamstquerytfragment((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyR`s !tSIGcCsyt|}Wnvttfk r|jj}|jdsTd|}ntt|d}|dkrtd|qnX|t krtd|n|S(NRs#value %r is not a valid signal names%value %r is not a valid signal number( RRRRtuppert startswithRXtsignalR:tSIGNUMS(R tnumR((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyt signal_numbers   tRestartWhenExitUnexpectedcBseZRS((R4R5(((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyRstRestartUnconditionallycBseZRS((R4R5(((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyRscCst|j}|}|tkr-t}n*|tkrBt}n|dkrWt}n|tttfkrtd|n|S(Nt unexpectedsinvalid 'autorestart' value %r(RRRRRRRR(R tcomputed_value((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyt auto_restarts      cCsngt|D]}|j^q }g}t}x0|D](}|dkrZ|j|q8t}q8W||fS(Ntcallers(R!RRtappendR(R R toptionst sort_optionsRtthing((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pytprofile_optionss%   (syesRRR(RRRR((R6RN((((iil(((4RRVRRRYR(Rtsupervisor.loggersRRR RRRR!R#R&R2R3R:R9R;R>R?RIRNRQRRR]RlRvRRRRRRR<RRt byte_sizeR`RRRRXRRRRRR(((s8/usr/lib/python2.7/site-packages/supervisor/datatypes.pyts\              $7          7