o nnh^}@s<ddlmZzddlZWn eydaYnwdaddlmZddlZddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZddlmZmZddlm Z!ddl"m#Z#m$Z$m%Z%m&Z&dd l'm(Z(m)Z)dd l*m+Z+dd l,m-Z-dd l.m/Z0dd l1m2Z2ddl3m4Z4ej5rddl6m7Z7e8dZ9e j:;e j<=dZ>e j?fe>j@_Ae jBe jCfe>jD_Ade Ee jCdddZFdaGdaHdDddZIGdddejJZKGdd d ejJZLdZMeNe!d!rOe!jOZPePrejPQePreRePejSseRejPTePejSrFejUePejVd"d#eWd$ZMejXjYD]ZZeZ[eKeNe!d%geZ[eLq0n e\d&ePej]d'e!j^ej_e!j`ejae!jbejVe!jcejae!jdej_e!jeejfe!jgejVe!jhejae!jiejVi Zjd(ZkdEd-d.ZlejmfdFd2d3ZndGd6d7ZodHd=d>ZpdId?d@ZqGdAdBdBe2dCZrdS)J) annotationsNFTwraps)unpackpack) constants) AnsibleErrorAnsibleAssertionErrorAnsiblePromptInterruptAnsiblePromptNoninteractive)to_bytesto_text) text_type)stringc)context) Singleton)wrap_var) FinalQueuePc stextstrreturnintc Cst|ts tdt|zt|t}Wn tjy!d}Ynw|dkr(|Sd}d}|D]1}|d7}|dvrA|d8}|d8}q.zt |}Wn tjyTd}Ynw|dkr[d}||7}q.|dkrl|rlt d||dkrr|SdS)a3Function that utilizes ``wcswidth`` or ``wcwidth`` to determine the number of columns used to display a text string. We try first with ``wcswidth``, and fallback to iterating each character and using wcwidth individually, falling back to a value of 0 for non-printable wide characters. z$get_text_width requires text, not %srr)”z3get_text_width could not calculate text width of %r) isinstancer TypeErrortype_LIBCwcswidth_MAX_INTctypes ArgumentErrorwcwidthEnvironmentError)rwidthcounterrwr0@/usr/local/lib/python3.10/dist-packages/ansible/utils/display.pyget_text_widthLs<   r2c@seZdZddZddZdS)FilterBlackListcCsdd|D|_dS)NcSsg|]}t|qSr0)loggingFilter).0namer0r0r1 sz,FilterBlackList.__init__..) blacklist)selfr9r0r0r1__init__szFilterBlackList.__init__cstfdd|jD S)Nc3s|]}|VqdSN)filterr6frecordr0r1 sz)FilterBlackList.filter..)anyr9r:rAr0r@r1r=szFilterBlackList.filterN)__name__ __module__ __qualname__r;r=r0r0r0r1r3s r3c@sDeZdZdZzeZWneyde ZYnwddZ 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|_dSNT)rHusernameuserrDr0r0r1r=szFilterUserInjector.filterN) rErFrG__doc__getpassgetuserrJKeyErrorosgetuidr=r0r0r0r1rHs   rHDEFAULT_LOG_PATHz=%(asctime)s p=%(process)d u=%(user)s n=%(name)s | %(message)s)filenamelevelformatansibleDEFAULT_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/cowsaytiot.TextIOlockthreading.RLockcCs.dd}|j}||j||_||j||_dS)Ncstfdd}|S)Ncs6|i|WdS1swYdSr<r0)argskwargsr?r[r0r1locking_wrappers $zL_synchronize_textiowrapper.._wrap_with_lock..locking_wrapperr)r?r[r`r0r_r1_wrap_with_locksz3_synchronize_textiowrapper.._wrap_with_lock)bufferwriteflush)rYr[rarbr0r0r1_synchronize_textiowrappersrefdwhenNonecCst|}|tjtjtjBtjBtjBtjB@|tj<|tj tj @|tj <|tj tj tj B@|tj <|tj tjB|tj <|tjtjtjBtjBtjB@|tj<d|tjtj<d|tjtj<t|||dS)aPut terminal into a raw mode. Copied from ``tty`` from CPython 3.11.0, and modified to not remove OPOST from OFLAG OPOST is kept to prevent an issue with multi line prompts from being corrupted now that display is proxied via the queue from forks. The problem is a race condition, in that we proxy the display over the fork, but before it can be displayed, this plugin will have continued executing, potentially setting stdout and stdin to raw which remove output post processing that commonly converts NL to CRLF rrN)termios tcgetattrttyIFLAGBRKINTICRNLINPCKISTRIPIXONOFLAGOPOSTCFLAGCSIZEPARENBCS8LFLAGECHOICANONIEXTENISIGCCVMINVTIME tcsetattr)rfrgmoder0r0r1setraws 0*rstdout t.BinaryIOcCs |dt|dtdS)Ns[%s)rc MOVE_TO_BOL CLEAR_TO_EOL)rr0r0r1 clear_linesrstdin_fd stdout_fdsecondsechoboolcCsRt|t|r t||r't|}|dtjB|d<t|tj|dSdS)N)rrPisattyrirjryrTCSANOW)rrrr new_settingsr0r0r1 setup_prompts  rc CsPztWntjttjfydaYdSwtdptatdp%t a dS)NFcrel) curses setuptermerrorr$ioUnsupportedOperation HAS_CURSEStigetstrrrr0r0r0r1rs  rc@seZdZd|d}ddZd~d d ZdddZdddZedddZedddZ edddZ e     ddd(d)Z ddd,d-Z ddd/d0Z ddd1d2Zddd3d4Zddd5d6Zddd7d8Zddd9d:Zdddd?Zeddd@dAZe edddBdCZ    dddHdIZe    dddJdKZedddMdNZeddOdPZedddRdSZedddTdUZedddWdXZedddZd[Z        dddddeZddfdgZ    dddmdnZ!    dddpdqZ"e#ddsdtZ$e#ddudvZ%e#ddxdyZ&e#ddzd{Z'dS)Displayr verbosityrrrhc Csd|_t|_d|_||_tjdur||_nt |tj|_i|_ i|_ i|_ d|_ tj|_||j rxz6tj|j dgtjtjd}|\}}|jrNtdd|D|_tjrjttjrjttj|j|_Wn tywd|_ Ynw|zttj |jttj!|jWnty}z|"d|WYd}~nd}~wwt#$d|j%ztj j&ddtj!j&ddWnty}z|"d|WYd}~nd}~wwd |_'dS) Nz-lrstderrcSsh|]}t|qSr0)r )r6rr0r0r1 'sz#Display.__init__..z/failed to patch stdout/stderr for fork-safety: _replacing_warning_handlererrorszHfailed to reconfigure stdout/stderr with custom encoding error handler: F)(_final_q threadingRLock_lockcolumnsrC LOG_VERBOSITY log_verbositymax _deprecations_warns_errorsb_cowsayANSIBLE_COW_SELECTIONnoncowset_cowsay_info subprocessPopenPIPE communicate returncode Exceptionsplitcows_availableANSIBLE_COW_ACCEPTLISTrCset intersection_set_column_widthresysrrwarningcodecsregister_errorr reconfigure setup_curses)r:rcmdouterrexr0r0r1r;sV      zDisplay.__init__ exception UnicodeErrortuple[str | bytes, int]cCs|jdddd|jfS)Nz{Non UTF-8 encoded data replaced with "?" while displaying text to stdout/stderr, this is temporary and will become an errorz2.18)version?) deprecatedend)r:rr0r0r1r@s  z"Display._replacing_warning_handlerqueuercCstdur td||_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_contextparent_process RuntimeErrorr)r:rr0r0r1 set_queueIs  zDisplay.set_queuecCs<tjrdStjrtj|_dStD] }tj|r||_qdSr<)rANSIBLE_NOCOWSANSIBLE_COW_PATHr b_COW_PATHSrPpathexists)r: b_cow_pathr0r0r1rSs  zDisplay.set_cowsay_infofunc+c.Callable[t.Concatenate[Display, P], None]c.Callable[..., None]cstd fdd }|S) Nr]P.argsr^P.kwargsrrhcs8|jr|jjjg|Ri|S|g|Ri|Sr<)r send_displayrE)r:r]r^rr0r1wrapperbszDisplay._proxy..wrapper)r]rr^rrrhrrrr0rr1_proxy^szDisplay._proxycstd d fdd }|S) zQThis method ensures that debug is enabled before delegating to the proxy Nmsgrhost str | NonerrhcstjsdS|||dS)N)r)r DEFAULT_DEBUGr:rrrr0r1rrsz%Display._meets_debug..wrapperr<rrrrrrhrrr0rr1 _meets_debuglszDisplay._meets_debugcstd d fd d }|S)zThis method ensures the verbosity has been met before delegating to the proxy Currently this method is unused, and the logic is handled directly in ``verbose`` Nrrrrcaplevelrrrhcs|j|kr ||||dSdSNrr)rr:rrrrr0r1rs z)Display._meets_verbosity..wrapperNNrrrrrrrrhrrr0rr1_meets_verbosityyszDisplay._meets_verbosityNFTrrcolorrrr screen_onlylog_onlynewlinec Cst|tstd|jj|}|sR|d}|r |dd} n|} |r)t| |} |s-|r1| d} |s7tj} ntj } |j | | Wdn1sMwYt r^|s`| ||dSdSdS)zy Display a message to the user Note: msg *must* be a unicode string to prevent UnicodeError tracebacks. z"Display message must be str, not:  Nr)r#rr$ __class__rEendswithrrrrrrclogger_log) r:rrrrrrnocolor has_newlinemsg2fileobjr0r0r1displays*    zDisplay.displayr int | NonecCsjtr1|dus |j|kr3|d}tj}|r)zt|}Wn ty(td|wt||dSdSdS)Nrz%Invalid color supplied to display: %s) rrlstripr4INFOcolor_to_log_levelrOr log)r:rrrrlvlr0r0r1rs    z Display._logrcC|j||ddS)Nrrverboserr0r0r1vz Display.vcCr)Nrrrrr0r0r1vvr z Display.vvcCr)Nrrrrr0r0r1vvvr z Display.vvvcCr)Nrrrrr0r0r1vvvvr z Display.vvvvcCr)Nrrrr0r0r1vvvvvr z Display.vvvvvcCr)Nrrrr0r0r1vvvvvvr zDisplay.vvvvvvrcCsL|j|kr |j|||d|j|jkr"|j|kr$|j|||ddSdSdSr)r_verbose_displayr _verbose_logrr0r0r1r s zDisplay.verbosecCsBtj}|dur|j|tj|ddS|jd||ftj|ddS)Nrr<%s> %s)rVERBOSE_TO_STDERRr COLOR_VERBOSE)r:rrr to_stderrr0r0r1rszDisplay._verbose_displaycCs(|dur d||f}||tj|dS)Nr)rrrrr0r0r1rs zDisplay._verbose_logcCsV|dur|jdtt|ftjddS|jdtt||ftjddS)Nz %6d %0.5f: %srz%6d %0.5f [%s]: %s)rrPgetpidtimer COLOR_DEBUGrr0r0r1debugs&(z Display.debugrremoveddatecollection_namec Cs|}|r|ddvr|d7}|dkrd}|r"d|}d}d}n d |}d }d }|r3d |} nd } |r=d|} n |rEd|} nd} ddd||| | |fD} | S)z) used to print out a deprecation message.r)!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|VqdSr<r0r>r0r0r1rB+sz2Display.get_deprecation_message..)striprUjoin) r:rrrr r!headerremoval_fragment help_text from_fragmentrg message_textr0r0r1get_deprecation_messages,      zDisplay.get_deprecation_messagecCs|stjsdS|j|||||d}|rt|tj||jdd}d|d}||jvr>|j | tj ddd|j|<dSdS)N)rrr r!F)drop_whitespacerTrr) rDEPRECATION_WARNINGSr-rtextwrapwraprr'rrr&COLOR_DEPRECATE)r:rrrr r!r,wrappedr0r0r1r/s  zDisplay.deprecated formattedcCs`|sd|}t||j}d|d}nd|}||jvr.|j|tjddd|j|<dSdS)Nz [WARNING]: %srz [WARNING]: %sTrr)r0r1rr'rrr COLOR_WARN)r:rr4new_msgr3r0r0r1rGs zDisplay.warningcCstjr ||dSdSr<)rSYSTEM_WARNINGSr)r:rr0r0r1system_warningUszDisplay.system_warningcowscCst|}|jr |r z||WdSty|dYnw|}z |jt|}Wnty=|jt |}Ynw|dkrDd}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 r banner_cowsayOSErrorrr&rr2r,lenr)r:rrr9star_lenstarsr0r0r1bannerZs$    zDisplay.bannercCsd|vr|dd}|dr|dd}|jddg}|jr9|j}|dkr-tt|j}|d |t ||t |t j |t j t j d }| \}}|jd t||d dS) Nz: [[r$]rs-Ws60randoms-frz%s r)replacerrrrCchoicelistrappendr rrrrrr )r:rrruncmdthecowrrrr0r0r1r;rs      zDisplay.banner_cowsay wrap_textcCs`|rd|}t||j}d|d}nd|}||jvr.|j|tjddd|j|<dSdS)Nz [ERROR]: %srz ERROR! %sTrr)r0r1rr'rrr COLOR_ERROR)r:rrJr6r3r0r0r1rs z Display.errorprivatecCs|rt|St|Sr<)rMinput)rrLr0r0r1prompts zDisplay.promptvarnamerNencryptconfirm salt_sizesaltdefaultunsafec Csd} tjrC|j} |r|durd||f} n |rd|} nd|} |r= | | |} | d| |} | | kr6n|dq%n | | |} nd} |d| sR|durR|} |rbdd lm}|| |||d } t| d d } | rnt | } | S) Nz %s [%s]: z%s: zinput for %s: Tzconfirm z&***** VALUES ENTERED DO NOT MATCH ****z/Not prompting as we are not in interactive moder) do_encrypt)rRrSsurrogate_or_strictr) r __stdin__rrNrransible.utils.encryptrVr r)r:rOrLrNrPrQrRrSrTrUresult do_promptrsecondrVr0r0r1 do_var_prompts:          zDisplay.do_var_promptc CsJtdrtdtdtjtdddddd}nd}td|d|_ dS)NrHHHHrO) rPrrfcntlioctlri TIOCGWINSZrrr)r:tty_sizer0r0r1rs (zDisplay._set_column_widthrinterrupt_inputc.Container[bytes] | Nonecomplete_inputbytesc Cs$|jrddlm}|jj|j|||||d|jStr&|js&t d|_|j dus;t |j r;t t |j kr?td||d}|j?t|j }z-t|j |j|| t|jtj|j| |||dWt|j tj|WdSt|j tj|w1swYdS)Nr)current_worker) worker_idrNrLrrdrfTzstdin is not interactive)rrrdrf)ransible.executor.process.workerrh send_promptri worker_queuegetrrr _stdin_fdrPrgetpgrp tcgetpgrpr rrrirjr _stdout_fdtcflush_stdinTCIFLUSH_read_non_blocking_stdinr TCSADRAIN) r:rrLrrdrfrhrZoriginal_stdin_settingsr0r0r1 prompt_untils6         zDisplay.prompt_untilrc Cs|jrt|dur t}|dur-zttjjdtj }Wn t y,d}Ynwzt|j dtj g}Wn t yHddg}Ynwd}|dusXt||kr d} zBt |j d| dur|dusrt||kr|jd} ttj| dur|dusrt||ksrWt |j d| durd} nt |j d| durd} w|dur| |ks|dur| |vrt|jtd |dur| d vs|dur| |vrt|j |S| |vrt|j|dd }|r|j||jn|| 7}|dusXt||ksX|S) NrjFrTzuser interrupt)r r)rNotImplementedErrorrrirjrstdinrbfilenoVINTRrroVERASErP set_blockingrtreadsleeprDEFAULT_INTERNAL_POLL_INTERVALlowerr_stdoutr rcrd) r:rrrdrfstart interruptbackspace_sequences result_string key_pressedr0r0r1rv s`        $ $      z Display._read_non_blocking_stdint.BinaryIO | NonecCs*|jrtztjjWStyYdSwr<)rrrrrbAttributeErrorr:r0r0r1rtBs  zDisplay._stdinc C&z|jWSttfyYdSwr<)rtr ValueErrorrrr0r0r1roK  zDisplay._stdin_fdrcCs|jrttjjSr<)rrrrrbrr0r0r1rRszDisplay._stdoutc Crr<)rrrrrr0r0r1rrXrzDisplay._stdout_fd)r)rrrrh)rrrr)rrrrhrrh)rrrr)rrrr)NFFFT)rrrrrrrrrrrrrrhr)rrrrrrr<r)Nrr)NFNN) rrrrrrr rr!rrr) rrrrrrr rr!rrrh)F)rrr4rrrh)rrrrhrI)rrrrr9rrrh)rrrrrrh)T)rrrJrrrh)rrrLrrr)TNNFNNNF)rOrrLrrNrrPrrQrrRrrSrrTrrUrrr)FNNN) rrrLrrrrdrerfrerrg) rrrrrdrerfrerrg)rr)rr)rr)(rErFrGr;rrr staticmethodrrrrrr r r rrrr rrrr-rrr8r@r;rrNr]rryrvpropertyrtrorrrr0r0r0r1rs  9     ;         *    5  ; 6   r) metaclass)rrrr)rYrZr[r\)rfrrgrrrh)rrrrh) rrrrrrrrrrhr)s __future__rr ImportErrorrcollections.abcabcrr ctypes.utilr)r`rMrr4rPrCrrrir0rrrktypingt functoolsrstructrrrVrransible.errorsrr r r +ansible.module_utils.common.text.convertersr r ansible.module_utils.sixransible.utils.colorransible.utils.multiprocessingrransible.utils.singletonransible.utils.unsafe_proxyr TYPE_CHECKING#ansible.executor.task_queue_managerr ParamSpecrcdll LoadLibraryutil find_libraryr&c_wcharr+argtypes c_wchar_pc_intr'sizeofr(rrr2r5r3rHrgetattrrRrraccessW_OKdirname basicConfigr getLoggerroothandlershandler addFilterprintrrKERRORr5WARNINGCOLOR_OK COLOR_SKIPCOLOR_UNREACHABLErDEBUG COLOR_CHANGEDr2rrrre TCSAFLUSHrrrrrr0r0r0r1s               3 <