a ì)gòKã@sšddlmZmZmZeZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlmZmZddlmZddlmZddlmZmZddlmZmZddl m!Z!dd l"m#Z#dd l$m%Z&dd l'm(Z(dd l)m*Z*dd l+m,Z,ej- .ej/ 0d¡¡Z1ej2fe1j3_4ej5ej6fe1j7_4de 8ej6¡dddZ9dd„Z:Gdd„de j;ƒZe?edƒ�r,ej@ZAeA�r²e jA BeA¡�r²e  CeAe jD¡�sÊe  Ce jA EeA¡e jD¡�re jFeAe jGdd�e  Hd¡Z>e jIjJD](ZKeK Lemóz,FilterBlackList.__init__..)Ú blacklist)Úselfr4r*r*r+Ú__init__lszFilterBlackList.__init__cst‡fdd„|jDƒƒ S)Nc3s|]}| ˆ¡VqdS©N)Úfilter©r0Úf©Úrecordr*r+Ú pr3z)FilterBlackList.filter..)Úanyr4©r5r<r*r;r+r8oszFilterBlackList.filterN)Ú__name__Ú __module__Ú __qualname__r6r8r*r*r*r+r-ksr-c@sDeZdZdZz e ¡ZWney6de  ¡ZYn0dd„Z dS)ÚFilterUserInjectorzë This is a filter which injects the current user as the 'user' attribute on each record. We need to add this filter to all logger handlers so that 3rd party libraries won't print an exception due to user not being defined. zuid=%scCs tj|_dS)NT)rCÚusernameÚuserr?r*r*r+r8szFilterUserInjector.filterN) r@rArBÚ__doc__ÚgetpassZgetuserrDÚKeyErrorÚosÚgetuidr8r*r*r*r+rCss   rCÚDEFAULT_LOG_PATHz=%(asctime)s p=%(process)d u=%(user)s n=%(name)s | %(message)s)ÚfilenameÚlevelÚformatÚansibleZDEFAULT_LOG_FILTERzM[WARNING]: log file at %s is not writeable and we cannot create it, aborting )Úfile)s/usr/bin/cowsays/usr/games/cowsays/usr/local/bin/cowsays/opt/local/bin/cowsaycCs.dd„}|j}||j|ƒ|_||j|ƒ|_dS)Ncstˆƒ‡‡fdd„ƒ}|S)Ncs6ˆ�ˆ|i|¤ŽWdƒS1s(0YdSr7r*)ÚargsÚkwargs©r:Úlockr*r+Úlocking_wrapper¬szL_synchronize_textiowrapper.._wrap_with_lock..locking_wrapperr)r:rTrUr*rSr+Ú_wrap_with_lock«sz3_synchronize_textiowrapper.._wrap_with_lock)ÚbufferÚwriteÚflush)ZtiorTrVrWr*r*r+Ú_synchronize_textiowrapper§srZc@säeZdZd2dd„Zdd„Zdd„Zd3d d „Zd4d d„Zd5dd„Zd6dd„Z d7dd„Z d8dd„Z d9dd„Z d:dd„Z d;dd„Zdd"d#„Zd$d%„Zd?d&d'„Zd@d(d)„ZdAd*d+„ZedBd,d-„ƒZdCd.d/„Zd0d1„ZdS)DÚDisplayrc CsŒd|_t ¡|_d|_||_i|_i|_i|_d|_ t j |_ |  ¡|j rÐzltj|j dgtjtjd�}| ¡\}}|jr|t‚dd„| ¡Dƒ|_t jr´tt jƒr´tt jƒ |j¡|_WntyÎd|_ Yn0| ¡z ttj|jƒttj|jƒWn6t�y.}z| d|›�¡WYd}~n d}~00z tjj dd�tjj dd�Wn6t�y†}z| d |›�¡WYd}~n d}~00dS) Nz-l©ÚstdoutÚstderrcSsh|] }t|ƒ’qSr*)r )r0rr*r*r+Ú ×r3z#Display.__init__..Fz/failed to patch stdout/stderr for fork-safety: Úreplace©ÚerrorszDfailed to reconfigure stdout/stderr with the replace error handler: )!Ú_final_qÚ threadingÚRLockÚ_lockÚcolumnsÚ verbosityÚ _deprecationsÚ_warnsÚ_errorsÚb_cowsayÚCZANSIBLE_COW_SELECTIONÚnoncowÚset_cowsay_infoÚ subprocessÚPopenÚPIPEÚ communicateÚ returncodeÚ ExceptionÚsplitÚcows_availableZANSIBLE_COW_ACCEPTLISTr>ÚsetÚ intersectionÚ_set_column_widthrZÚsysr]r^ÚwarningÚ reconfigure)r5rhÚcmdÚoutÚerrÚexr*r*r+r6¼s@    &zDisplay.__init__cCst ¡durtdƒ‚||_dS)zèSet the _final_q on Display, so that we know to proxy display over the queue instead of directly writing to stdout/stderr from forks This is only needed in ansible.executor.process.worker:WorkerProcess._run Nz%queue cannot be set in parent process)Úmultiprocessing_contextZparent_processÚ RuntimeErrorrc)r5Zqueuer*r*r+Ú set_queueís zDisplay.set_queuecCs:tjr dStjrtj|_ntD]}tj |¡r||_qdSr7)rmZANSIBLE_NOCOWSZANSIBLE_COW_PATHrlÚ b_COW_PATHSrIÚpathÚexists)r5Z b_cow_pathr*r*r+ro÷s  zDisplay.set_cowsay_infoNFTc Csþ|jr|jj||||||d�S|}|s¦| d¡}|rB|dd…} n|} |rTt| |ƒ} |s\|rd| d} |sptj} ntj} |j�|  | ¡Wdƒn1sœ0Yt rú|sú|  d¡} t j } |rîz t |} Wntyìtd|ƒ‚Yn0t  | | ¡dS)zy Display a message to the user Note: msg *must* be a unicode string to prevent UnicodeError tracebacks. )Úcolorr^Ú screen_onlyÚlog_onlyÚnewlineÚ Nrz%Invalid color supplied to display: %s)rcZ send_displayÚendswithrr{r]r^rfrXÚloggerÚlstripr.ÚINFOÚcolor_to_log_levelrHr Úlog) r5Úmsgrˆr^r‰rŠr‹ZnocolorZ has_newlineZmsg2ZfileobjZlvlr*r*r+Údisplays8 ÿ  (   zDisplay.displaycCs|j||dd�S)Nr©ÚhostÚcaplevel©Úverbose©r5r“r–r*r*r+ÚvDsz Display.vcCs|j||dd�S)Nrr•r˜ršr*r*r+ÚvvGsz Display.vvcCs|j||dd�S)Nrr•r˜ršr*r*r+ÚvvvJsz Display.vvvcCs|j||dd�S)Nér•r˜ršr*r*r+ÚvvvvMsz Display.vvvvcCs|j||dd�S)Nér•r˜ršr*r*r+ÚvvvvvPsz Display.vvvvvcCs|j||dd�S)Nér•r˜ršr*r*r+ÚvvvvvvSszDisplay.vvvvvvcCsZtjrV|dur2|jdt ¡t ¡|ftjd�n$|jdt ¡t ¡||ftjd�dS)Nz %6d %0.5f: %s©rˆz%6d %0.5f [%s]: %s)rmZ DEFAULT_DEBUGr”rIÚgetpidÚtimeÚ COLOR_DEBUGršr*r*r+ÚdebugVs$z Display.debugrcCsJtj}|j|krF|dur,|j|tj|d�n|jd||ftj|d�dS)N©rˆr^z<%s> %s)rmZVERBOSE_TO_STDERRrhr”Ú COLOR_VERBOSE)r5r“r–r—Z to_stderrr*r*r+r™]s  zDisplay.verbosec Cs°| ¡}|r |ddvr |d7}|dkr,d}|rDd |¡}d}d}nd  |¡}d }d }|rfd  |¡} nd } |rzd |¡} n|rŠd |¡} nd} d dd„||| | |fDƒ¡} | S)z) used to print out a deprecation message.r)ú!ú?Ú.r­zansible.builtinz ansible-corez[DEPRECATED]: {0}zThis feature was removedzPlease update your playbooks.z[DEPRECATION WARNING]: {0}zThis feature will be removedzZDeprecation warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.zfrom {0}Úzin a release after {0}.zin version {0}.zin a future release.ú css|]}|r|VqdSr7r*r9r*r*r+r=…r3z2Display.get_deprecation_message..)ÚstriprNÚjoin) r5r“ÚversionÚremovedÚdateÚcollection_nameÚheaderZremoval_fragmentÚ help_textZ from_fragmentZwhenÚ message_textr*r*r+Úget_deprecation_messagefs,     zDisplay.get_deprecation_messagecCs||stjsdS|j|||||d�}|r.t|ƒ‚tj||jdd�}d |¡d}||jvrx|j |  ¡tj dd�d|j|<dS)N)r²r³r´rµF)Zdrop_whitespacerŒTr©r) rmZDEPRECATION_WARNINGSr¹r ÚtextwrapÚwraprgr±rir”r°ÚCOLOR_DEPRECATE)r5r“r²r³r´rµr¸Úwrappedr*r*r+Ú deprecated‰s  zDisplay.deprecatedcCs\|s*d|}t ||j¡}d |¡d}nd|}||jvrX|j|tjdd�d|j|<dS)Nz [WARNING]: %srŒz [WARNING]: %sTr©r)rºr»rgr±rjr”rmÚ COLOR_WARN)r5r“Ú formattedÚnew_msgr½r*r*r+r|™s zDisplay.warningcCstjr| |¡dSr7)rmZSYSTEM_WARNINGSr|)r5r“r*r*r+Úsystem_warning¦szDisplay.system_warningcCsªt|ƒ}|jr@|r@z| |¡WdSty>| d¡Yn0| ¡}z|jt|ƒ}Wn tyz|jt |ƒ}Yn0|dkrˆd}d|}|j d||f|d�dS)zw Prints a header-looking line with cowsay or stars with length depending on terminal width (3 minimum) NzFsomebody cleverly deleted cowsay or something during the PB run. heh.ržÚ*z %s %sr¤) r rlÚ banner_cowsayÚOSErrorr|r°rgr,r&Úlenr”)r5r“rˆZcowsZstar_lenZstarsr*r*r+Úbannerªs     zDisplay.bannercCsºd|vr*| dd¡}| d¡r*|dd…}|jddg}|jrr|j}|dkrZt t|jƒ¡}| d ¡| t |ƒ¡| t |ƒ¡t j |t j t j d �}|  ¡\}}|jd t|ƒ|d �dS) Nz: [ú[r®ú]rs-Ws60Úrandoms-fr\z%s r¤)r`r�rlrnrÊÚchoiceÚlistrwÚappendr rprqrrrsr”r )r5r“rˆZruncmdZthecowr~rr€r*r*r+rÄÁs      zDisplay.banner_cowsaycCs\|r*d|}t ||j¡}d |¡d}nd|}||jvrX|j|tjdd�d|j|<dS)Nz [ERROR]: %srŒz ERROR! %sTr©r)rºr»rgr±rkr”rmÚ COLOR_ERROR)r5r“Z wrap_textrÁr½r*r*r+ÚerrorÒs z Display.errorcCs|rt |¡St|ƒSdSr7)rGÚinput)r“Úprivater*r*r+ÚpromptÝs zDisplay.promptc CsÜd} tj ¡r„|j} |r.|dur.d||f} n|rsn         3 < ÿ  ø