a )gK@sddlmZmZmZeZddlZddlZddl 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/0dZ1ej2fe1j3_4ej5ej6fe1j7_4de8ej6dddZ9ddZ:Gddde j;Ze?edr,ej@ZAeAre jABeAre CeAe jDse Ce jAEeAe jDre jFeAe jGdde HdZ>e jIjJD](ZKeKLemz,FilterBlackList.__init__..) blacklist)selfr4r*r*r+__init__lszFilterBlackList.__init__cstfdd|jD S)Nc3s|]}|VqdSN)filterr0frecordr*r+ pr3z)FilterBlackList.filter..)anyr4r5r<r*r;r+r8oszFilterBlackList.filterN)__name__ __module__ __qualname__r6r8r*r*r*r+r-ksr-c@sDeZdZdZz eZWney6de ZYn0ddZ 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)rCusernameuserr?r*r*r+r8szFilterUserInjector.filterN) r@rArB__doc__getpassZgetuserrDKeyErrorosgetuidr8r*r*r*r+rCss   rCDEFAULT_LOG_PATHz=%(asctime)s p=%(process)d u=%(user)s n=%(name)s | %(message)s)filenamelevelformatansibleZDEFAULT_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)Ncstfdd}|S)Ncs6|i|WdS1s(0YdSr7r*)argskwargsr:lockr*r+locking_wrapperszL_synchronize_textiowrapper.._wrap_with_lock..locking_wrapperr)r:rTrUr*rSr+_wrap_with_locksz3_synchronize_textiowrapper.._wrap_with_lock)bufferwriteflush)ZtiorTrVrWr*r*r+_synchronize_textiowrappersrZc@seZdZd2ddZddZddZd3d d Zd4d dZd5ddZd6ddZ d7ddZ d8ddZ d9ddZ d:ddZ d;ddZdd"d#Zd$d%Zd?d&d'Zd@d(d)ZdAd*d+ZedBd,d-ZdCd.d/Zd0d1ZdS)DDisplayrc Csd|_t|_d|_||_i|_i|_i|_d|_ t j |_ | |j rzltj|j dgtjtjd}|\}}|jr|tdd|D|_t jrtt jrtt j|j|_Wntyd|_ Yn0|z ttj|jttj|jWn6ty.}z|d|WYd}~n d}~00z tjj ddtjj ddWn6ty}z|d |WYd}~n d}~00dS) Nz-lstdoutstderrcSsh|] }t|qSr*)r )r0rr*r*r+ r3z#Display.__init__..Fz/failed to patch stdout/stderr for fork-safety: replaceerrorszDfailed to reconfigure stdout/stderr with the replace error handler: )!_final_q threadingRLock_lockcolumns verbosity _deprecations_warns_errorsb_cowsayCZANSIBLE_COW_SELECTIONnoncowset_cowsay_info subprocessPopenPIPE communicate returncode Exceptionsplitcows_availableZANSIBLE_COW_ACCEPTLISTr>set intersection_set_column_widthrZsysr]r^warning reconfigure)r5rhcmdouterrexr*r*r+r6s@    &zDisplay.__init__cCstdurtd||_dS)zSet 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_queues zDisplay.set_queuecCs:tjr dStjrtj|_ntD]}tj|r||_qdSr7)rmZANSIBLE_NOCOWSZANSIBLE_COW_PATHrl b_COW_PATHSrIpathexists)r5Z b_cow_pathr*r*r+ros  zDisplay.set_cowsay_infoNFTc Cs|jr|jj||||||dS|}|s|d}|rB|dd} n|} |rTt| |} |s\|rd| d} |sptj} ntj} |j| | Wdn1s0Yt r|s| d} t j } |rz t |} Wntytd|Yn0t | | dS)zy Display a message to the user Note: msg *must* be a unicode string to prevent UnicodeError tracebacks. )colorr^ screen_onlylog_onlynewline Nrz%Invalid color supplied to display: %s)rcZ send_displayendswithrr{r]r^rfrXloggerlstripr.INFOcolor_to_log_levelrHr log) r5msgrr^rrrZnocolorZ has_newlineZmsg2ZfileobjZlvlr*r*r+displays8   (   zDisplay.displaycCs|j||ddS)Nrhostcaplevelverboser5rrr*r*r+vDsz Display.vcCs|j||ddS)Nrrrrr*r*r+vvGsz Display.vvcCs|j||ddS)Nrrrrr*r*r+vvvJsz Display.vvvcCs|j||ddS)Nrrrr*r*r+vvvvMsz Display.vvvvcCs|j||ddS)Nrrrr*r*r+vvvvvPsz Display.vvvvvcCs|j||ddS)Nrrrr*r*r+vvvvvvSszDisplay.vvvvvvcCsZtjrV|dur2|jdtt|ftjdn$|jdtt||ftjddS)Nz %6d %0.5f: %srz%6d %0.5f [%s]: %s)rmZ DEFAULT_DEBUGrrIgetpidtime COLOR_DEBUGrr*r*r+debugVs$z Display.debugrcCsJtj}|j|krF|dur,|j|tj|dn|jd||ftj|ddS)Nrr^z<%s> %s)rmZVERBOSE_TO_STDERRrhr COLOR_VERBOSE)r5rrrZ to_stderrr*r*r+r]s  zDisplay.verbosec Cs|}|r |ddvr |d7}|dkr,d}|rDd|}d}d}nd |}d }d }|rfd |} nd } |rzd|} n|rd|} nd} ddd||| | |fD} | S)z) used to print out a deprecation message.r)!?.rzansible.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..)striprNjoin) r5rversionremoveddatecollection_nameheaderZremoval_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 ddd|j|<dS)N)rrrrF)Zdrop_whitespacerTrr) rmZDEPRECATION_WARNINGSrr textwrapwraprgrrirrCOLOR_DEPRECATE)r5rrrrrrwrappedr*r*r+ deprecateds  zDisplay.deprecatedcCs\|s*d|}t||j}d|d}nd|}||jvrX|j|tjddd|j|<dS)Nz [WARNING]: %srz [WARNING]: %sTrr)rrrgrrjrrm COLOR_WARN)r5r formattednew_msgrr*r*r+r|s zDisplay.warningcCstjr||dSr7)rmZSYSTEM_WARNINGSr|)r5rr*r*r+system_warningszDisplay.system_warningcCst|}|jr@|r@z||WdSty>|dYn0|}z|jt|}Wn tyz|jt |}Yn0|dkrd}d|}|j d||f|ddS)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_cowsayOSErrorr|rrgr,r&lenr)r5rrZcowsZstar_lenZstarsr*r*r+banners     zDisplay.bannercCsd|vr*|dd}|dr*|dd}|jddg}|jrr|j}|dkrZtt|j}|d |t ||t |t j |t j t j d }| \}}|jd t||d dS) Nz: [[r]rs-Ws60randoms-fr\z%s r)r`rrlrnrchoicelistrwappendr rprqrrrsrr )r5rrZruncmdZthecowr~rrr*r*r+rs      zDisplay.banner_cowsaycCs\|r*d|}t||j}d|d}nd|}||jvrX|j|tjddd|j|<dS)Nz [ERROR]: %srz ERROR! %sTrr)rrrgrrkrrm COLOR_ERROR)r5rZ wrap_textrrr*r*r+errors z Display.errorcCs|rt|St|SdSr7)rGinput)rprivater*r*r+prompts zDisplay.promptc Csd} tjr|j} |r.|dur.d||f} n|rsn         3 <