a ì)g]Rã@s ddlmZmZmZeZdddddddd d d d d dddddddddœZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlZddlmZmZzddl Z dZ!Wne"y.dZ!Yn0z(ddl#m$Z$m%Z&e'e$dƒoTe& (¡Z)Wne"e*fytdZ)Yn0dZ+zddl,m-Z-dZ+Wne"y¢Yn0edƒZ.ddl,m/Z/dd l0m1Z1m2Z2m3Z3dd!l4m5Z5m6Z7m8Z9dd"l:m;Z;dd#lZ>m?Z?m@Z@zdd$lAmBZBWnBe"yVZCz(eDd% Ee1eCƒ¡ƒe Fd¡WYdZC[Cn dZC[C00eGƒZHz†ddlIZId&D]ZJeKeIeJdƒZLeLrlqŒqleLduršd'ZLeLD]ZMeKeIeMƒeHeM<qžz eI N¡Wn eOyàeH Pd(d¡Yn0WnReQy6ddlRZRd)eRjRiZHzddlNZNeNjNeHd(<WneQy0Yn0Yn0dd*lSmTZTmUZUmVZVmWZWmXZXmYZYmZZZdd+l[m\Z\dd,l]m^Z^dd-l_m`ZambZcmdZemfZfmgZgmhZhdd.limjZjmkZkmlZldd/lmmnZnmoZodd0lpmqZqmrZrmsZsmtZtmuZumvZvdd1lwmxZxmyZymzZzdd2l{m|Z|m}Z}m~Z~mZm€Z€mZm‚Z‚mƒZƒdd3l„m…Z…m†Z†m‡Z‡dd4lˆm‰Z‰mŠZŠdd5l‹mŒZdd6lŽmZmZm‘Z‘m’Z’dd7l“m”Z”m•Z•m–Z–m—Z—e˜eTeWfZ™e šd8ej›¡Zœe…ZzežWneŸy°eƒZžYn0ze WneŸyÒe‚Z Yn0eoZ¡da¢eGeGd9d:eGd;d:eGd;d:eGd;d:eGd;d:eGd;d:eGd;d:eGd;ddeqd?gfd@dA Z£e šdB¡Z¤e šdC¡Z¥e šdD¡Z¦e šdE¡Z§ej¨dFkZ©dGej¨ko‚dHknZªe©peªZ«e«sºeDdIdJ ¬ej­ ®¡¡ƒe Fd¡dKdL„Z¯dMdN„Z°dOdP„ZŒd[dQdR„Z±dSdT„Z²d\dUdV„Z³GdWdX„dXe´ƒZµdYdZ„Z¶dS)]é)Úabsolute_importÚdivisionÚprint_functionZnoatimeÚappendÚ compressedZnocowZnodumpZdirsyncZextentsZ encryptedÚ blocksizeZ immutableZindexedZ journalledZinlineZzeroZ synchronousZnotailZ blockrootZundeleteZ compressedrawZcompresseddirty)ÚAÚaÚcÚCÚdÚDÚeÚEÚhÚiÚIÚjÚNÚsÚSÚtÚTÚuÚXÚZN)ÚchainÚrepeatTF)ÚjournalÚdaemonZsendv)Úselinux)Ú selectorsé)Ú to_nativeÚto_bytesÚto_text)ÚjsonifyÚcontainer_to_bytesÚcontainer_to_text)ÚModuleArgumentSpecValidator)Úlenient_lowercaseÚbytes_to_humanÚhuman_to_bytesÚ SIZE_RANGES)ÚjsonzJ {{"msg": "Error: ansible requires the stdlib json: {0}", "failed": true}})Zavailable_algorithmsÚ algorithms)Úmd5Úsha1Zsha224Úsha256Zsha384Zsha512r0r1)ÚKeysViewÚMappingÚMutableMappingÚSequenceÚMutableSequenceÚSetÚ MutableSet)Úget_best_parsable_locale)Ú get_bin_path)Ú _PERM_BITSÚ_EXEC_PERM_BITSÚ _DEFAULT_PERMÚ is_executableÚformat_attributesÚget_flags_from_attributes)Úget_distributionÚget_distribution_versionÚget_platform_subclass)Ú get_exceptionÚ literal_eval)Ú env_fallbackÚ remove_valuesÚ sanitize_keysÚDEFAULT_TYPE_VALIDATORSÚ PASS_VARSÚ PASS_BOOLS)ÚAnsibleFallbackNotFoundÚAnsibleValidationErrorMultipleÚUnsupportedError)ÚPY2ÚPY3ÚbÚ binary_typeÚ integer_typesÚ iteritemsÚ string_typesÚ text_type)ÚmapÚreduceÚ shlex_quote)Úcheck_missing_parametersÚ safe_eval)Úget_all_subclasses)ÚBOOLEANSÚBOOLEANS_FALSEÚ BOOLEANS_TRUEÚboolean)Ú deprecateÚget_deprecation_messagesÚget_warning_messagesÚwarnzB^(?:.+[-_\s])?pass(?:[-_\s]?(?:word|phrase|wrd|wd)?)(?:[-_\s].+)?$Úraw)ÚtypeÚstrÚattr)rgÚaliasesÚboolZANSIBLE_UNSAFE_WRITES)rgÚdefaultÚfallback) ÚmodeÚownerÚgroupÚseuserÚseroleÚselevelÚsetypeÚ attributesÚ unsafe_writesz^[-]{0,2}pass[-]?(word|wd)?z[+=-]z[^ugo]z [^rwxXstugo])éé)éé)rwz~ {"failed": true, "msg": "ansible-core requires a minimum of Python2 version 2.7 or Python3 version 3.5. Current version: %s"}ÚcCst ¡S)a+ **Deprecated** Use :py:func:`platform.system` directly. :returns: Name of the platform the module is running on in a native string Returns a native string that labels the platform ("Linux", "Solaris", etc). Currently, this is the result of calling :py:func:`platform.system`. )ÚplatformÚsystem©r~r~ú>/usr/lib/python3.9/site-packages/ansible/module_utils/basic.pyÚ get_platform s r€cOst|ƒ}t||ƒ |¡S)zV**Deprecated**: Use ansible.module_utils.common.sys_info.get_platform_subclass instead)rDÚsuperÚ__new__)ÚclsÚargsÚkwargsZ platform_clsr~r~rÚload_platform_subclasssr†cCs tt|ƒƒS)zQ**Deprecated**: Use ansible.module_utils.common._utils.get_all_subclasses instead)ÚlistÚ_get_all_subclasses)rƒr~r~rr]$sr]c CsLt|ƒ}g}t|ƒ}|}d}|r.z| dd|¡}Wn,ty`| d|d|…¡Yq.Yn0d}|}|sìz| dd|¡}Wnty–d}Yn0z| d|d|¡}Wqjtyè|dkrÜ| d|d|…¡Yqì|}YqjYqj0qj|r| d|||…¡| dd¡| d|||d…¡|}qd  |¡}|rHt||ƒ}|S) z; Remove strings that look like passwords from log messages r"ú@rNz://ú:rwú********r{)r#ÚlenÚrindexÚ ValueErrorÚinsertÚindexÚjoinrH)ÚdataÚ no_log_valuesÚoutputZbeginZ prev_beginÚsepÚendZsep_search_endr~r~rÚheuristic_log_sanitize,sF          r—cCs tdurt}n€ttjƒdkrntj tjd¡rPttjddƒ}| ¡}|  ¡qŠtjd}t rŠ|j ddd}nt r~tj  ¡}n tj j ¡}|azt | d¡¡}Wn$tyÆtdƒt d¡Yn0t rÔt|ƒ}z |dWStytd ƒt d¡Yn0dS) a1 read the modules parameters and store them globally. This function may be needed for certain very dynamic custom modules which want to process the parameters that are being handed the module. Since this is so closely tied to the implementation of modules we cannot guarantee API stability for it (it may change between versions) however we will try not to break it gratuitously. It is certainly more future-proof to call this function and consume its outputs than to implement the logic inside it as a copy in your own code. Nr"Úrbúutf-8Úsurrogateescape©Úerrorsz {"msg": "Error: Module unable to decode valid JSON on stdin. Unable to figure out what parameters were passed", "failed": true}ZANSIBLE_MODULE_ARGSz™ {"msg": "Error: Module unable to locate ANSIBLE_MODULE_ARGS in json data from stdin. Unable to figure out what parameters were passed", "failed": true})Ú _ANSIBLE_ARGSrŒÚsysÚargvÚosÚpathÚisfileÚopenÚreadÚcloserQÚencoderPÚstdinÚbufferr.ÚloadsÚdecoderŽÚprintÚexitÚjson_dict_unicode_to_bytesÚKeyError)r¨ÚfdÚparamsr~r~rÚ _load_paramsms4       r±cCsDt ¡}d||tjf}|r(|d|7}|r8|d|7}|d7}|S)NzDFailed to import the required Python library (%s) on %s's Python %s.z This is required %s.z See %s for more info.zé Please read the module documentation and install it in the appropriate location. If the required library is installed, but Ansible is using the wrong Python interpreter, please consult the documentation on ansible_python_interpreter)r|ZnoderžÚ executable)ZlibraryÚreasonÚurlÚhostnameÚmsgr~r~rÚmissing_required_lib¥s  r·c@sLeZdZd…dd„Zedd„ƒZdd„Zd†d d „Zd‡d d „Zd d„Z dd„Z dd„Z dˆdd„Z dd„Z d‰dd„Zdd„Zdd„Zdd „ZdŠd!d"„Zd‹d#d$„ZdŒd%d&„Zdd'd(„ZdŽd)d*„Zdd+d,„Zed-d.„ƒZed/d0„ƒZed1d2„ƒZdd3d4„Zd5d6„Zd‘d7d8„Zd’d9d:„Z d;d<„Z!d=d>„Z"d“d?d@„Z#d”dAdB„Z$dCdD„Z%dEdF„Z&dGdH„Z'd•dIdJ„Z(dKdL„Z)dMdN„Z*d–dOdP„Z+dQdR„Z,dSdT„Z-dUdV„Z.dWdX„Z/dYdZ„Z0d[d\„Z1d]d^„Z2d_d`„Z3d—dadb„Z4dcdd„Z5dedf„Z6dgdh„Z7didj„Z8dkdl„Z9dmdn„Z:dodp„Z;d˜dqdr„Zdwdx„Z?d™d{d|„Z@d}d~„ZAdd€„ZBeBZCdšdd‚„ZDeEZEedƒd„„ƒZFdS)›Ú AnsibleModuleFNc Cstj t¡|_||_||_d|_||_||_ ||_ ||_ ||_ | |_ | |_g|_d|_d|_d|_d|_d|_d|_i|_i|_d|_i|_g|_tƒ|_d|_|rÊt ¡D]\} } | |jvr¬| |j| <q¬t ƒ|_!| "¡| #¡| $¡t%|j|j |j |j |j |jƒ|_&|j& '|j(¡|_)|j( *|j)j+¡|j! *|j)j,¡|j *|j)j-¡z|j)j.d} Wnt/yrd} Yn0| r®|j)j.j0}t1| t2ƒr¢dj3|jd|d}|j4|d |jrÒ|jsÒ|j5d d |jd t6|_7|j sè| 8¡d|_9d|_:d|_;| <¡dS) a7 Common code for quickly building an ansible module in Python (although you can write modules with anything that can return JSON). See :ref:`developing_modules_general` for a general introduction and :ref:`developing_program_flow_modules` for more detailed explanation. FNÚLOG_USERrr{z1Unsupported parameters for ({name}) {kind}: {msg}Úmodule)ÚnameÚkindr¶©r¶Tz.remote module (%s) does not support check mode)Zskippedr¶)=r r¡ÚbasenameÚ__file__Ú_nameÚ argument_specÚsupports_check_modeÚ check_modeÚ bypass_checksÚno_logÚmutually_exclusiveÚrequired_togetherÚrequired_one_ofÚ required_ifÚ required_byÚ cleanup_filesÚ_debugZ_diffZ _socket_pathÚ_shellÚ_syslog_facilityÚ _verbosityÚrun_command_environ_updateÚ_cleanZ_string_conversion_actionrjZ _legal_inputsr‡Z_options_contextÚ_tmpdirÚFILE_COMMON_ARGUMENTSÚitemsÚsetr“Ú _check_localer±Ú_set_internal_propertiesr)Z validatorZvalidater°Zvalidation_resultÚupdateZvalidated_parametersZ_no_log_valuesÚ_aliasesrœÚ IndexErrorr¶Ú isinstancerOÚformatÚ fail_jsonÚ exit_jsonrJZ _CHECK_ARGUMENT_TYPES_DISPATCHERÚ_log_invocationÚ_selinux_enabledÚ_selinux_mls_enabledÚ_selinux_initial_contextÚ_set_cwd)ÚselfrÁrÄrÅrÆrÇrÈZadd_file_common_argsrÂrÉrÊÚkÚvÚerrorr¶r~r~rÚ__init__´s|   û    zAnsibleModule.__init__c Cs.|jdur(d}|jdur0tj tj |j¡¡}|dur¨tj |¡s¨ztj|ddWnBtt fy˜}z&|  d|t |ƒf¡d}WYd}~nd}~00|  d|¡dt   ¡}zt j||d}WnDtt fy }z&|jd||t |ƒfdWYd}~n d}~00|js"t tj|¡||_|jS) NiÀ)rnzCUnable to use %s as temporary directory, failing back to system: %szÊModule remote_tmp %s did not exist and was created with a mode of 0700, this may cause issues when running as another user. To avoid this, create the remote_tmp dir with the correct permissions manuallyzansible-moduletmp-%s-)ÚprefixÚdirzDFailed to create remote module tmp path at dir %s with prefix %s: %sr½)rÒZ _remote_tmpr r¡Ú expanduserÚ expandvarsÚexistsÚmakedirsÚOSErrorÚIOErrorrer#ÚtimeÚtempfileZmkdtemprÝZ_keep_remote_filesÚatexitÚregisterÚshutilÚrmtree)räZbasedirrZbasefileÚtmpdirr~r~rr÷s8   ÿü  ÿÿzAnsibleModule.tmpdircCst|ƒ| d|¡dS)Nz [WARNING] %s)reÚlog)räZwarningr~r~rre@szAnsibleModule.warncCsZ|dur|durtdƒ‚t||||d|durD| d||f¡n| d||f¡dS)Nz=implementation error -- version and date must not both be set©ÚversionÚdateÚcollection_namezEPRECATION WARNING] %s %s)ÚAssertionErrorrbrø)rär¶rúrûrür~r~rrbDs zAnsibleModule.deprecatec CsH|dur| d| dd¡¡}|dur(iStj tj |¡¡}t|dd}| dd¡rttj |¡rttj |¡}t|ƒ}| dd¡}| d d¡}| d d¡}| d d¡}| d d¡}| d d¡} | dd¡} ||| g} |  ¡rä|   | ¡|  |¡} t t | ƒƒD]$} | durú| | dkrú| | | | <qú| dd¡}t||||||| | | |d S)a many modules deal with files, this encapsulates common options that the file module accepts such that it is directly available to all modules and they can share code. Allows to overwrite the path/dest module argument by providing path. Nr¡ÚdestÚsurrogate_or_strictr›ÚfollowFrnrorprqrrrtrsZ_defaultru) r¡rnrorprqrrrtrsÚ secontextru)Úgetr r¡rërìr$ÚislinkÚrealpathr#Úselinux_mls_enabledrÚselinux_default_contextÚrangerŒÚdict)rär°r¡Úb_pathrnrorprqrrrtrsrZdefault_secontextrrur~r~rÚload_file_common_argumentsOs:              ýz(AnsibleModule.load_file_common_argumentscCs"|jdurtot ¡dk|_|jS©Nr")ráÚ HAVE_SELINUXr Zis_selinux_mls_enabled©rär~r~rr†s z!AnsibleModule.selinux_mls_enabledcCs"|jdurtot ¡dk|_|jSr )ràr r Zis_selinux_enabledr r~r~rÚselinux_enabledŒs zAnsibleModule.selinux_enabledcCs.|jdur(gd¢|_| ¡r(|j d¡|jS)N)NNN)rârrr r~r~rÚselinux_initial_context“s    z%AnsibleModule.selinux_initial_contextrcCsh| ¡}| ¡s|Szt t|dd|¡}WntyB|YS0|ddkrT|S|d dd¡}|S)Nrÿr›réÿÿÿÿr"rŠrw)rrr Z matchpathconr#rïÚsplit)rär¡rnÚcontextÚretr~r~rrœs   z%AnsibleModule.selinux_default_contextc Cs¢| ¡}| ¡s|Szt t|dd¡}WnRty|}z:|jtjkrZ|j|d|dn|j|ddWYd}~n d}~00|ddkrŽ|S|d  d d ¡}|S) Nrÿr›zpath %s does not exist©r¡r¶z"failed to retrieve selinux contextrrr"rŠrw) rrr Zlgetfilecon_rawr#rïÚerrnoÚENOENTrÝr)rär¡rrrr~r~rÚselinux_context«s $ zAnsibleModule.selinux_contextTcCsBt|dd}|r$tj tj |¡¡}t |¡}|j}|j}||fS©Nrÿr›)r$r r¡rërìÚlstatÚst_uidÚst_gid)rär¡Úexpandr ÚstÚuidÚgidr~r~rÚuser_and_group½s  zAnsibleModule.user_and_groupcCsJtj ttj tj |¡¡dd¡}tj |¡s>tj |¡}q$t|ddS)z· Takes a path and returns it's mount point :param path: a string type with a filesystem path :returns: the path to the mount point as a text type rÿr›) r r¡rr$rërìÚismountÚdirnamer%)rär¡r r~r~rÚfind_mount_pointÆs$ zAnsibleModule.find_mount_pointc Cs ztddƒ}| ¡}| ¡Wnty2YdS0| |¡}|D]X}| dd¡\}}}} } t|ƒt|ƒkrB|jD]&} | |vrr| |¡} d| fSqrqBdS)zº Returns a tuple containing (True, selinux_context) if the given path is on a NFS or other 'special' fs mount point, otherwise the return will be (False, None). z /proc/mountsÚr)FNú éT) r£Ú readlinesr¥Ú Exceptionr#rr$Z_selinux_special_fsr) rär¡ÚfZ mount_dataZpath_mount_pointÚlineZdeviceZ mount_pointZfstypeÚoptionsÚrestZfsZspecial_contextr~r~rÚis_special_selinux_pathÔs      z%AnsibleModule.is_special_selinux_pathcCs$| ¡s |S| |¡}| ||d¡S)NF)rrÚset_context_if_different)rär¡Úchangedrr~r~rÚset_default_selinux_contextìs z)AnsibleModule.set_default_selinux_contextc Csx| ¡s |S| |¡rdS| |¡}t|ƒ}| |¡\}}|rD|}n`tt|ƒƒD]R} t|ƒ| krP|| durŠ|| || krŠ|| || <qP|| durP|| || <qP||krt|durîd|vrÆi|d<||dd<d|vrâi|d<||dd<z&|jrüWdSt  t |ƒd  |¡¡} WnBt yV} z(|j |dt | ƒ|||dWYd} ~ n d} ~ 00| dkrp|j |d d d}|S) NTÚbeforerÚafterrŠzinvalid selinux context: %s)r¡r¶Ú new_contextÚ cur_contextZ input_wasrzset selinux context failedr)rÚcheck_file_absent_if_check_moderr‡r-rrŒrÃr Z lsetfileconr#r‘rïrÝ) rär¡rr/Údiffr4r3Z is_special_seZ sp_contextrÚrcrr~r~rr.òsF       ÿ z&AnsibleModule.set_context_if_differentc Csf|dur |St|dd}|r0tj tj |¡¡}| |¡r>dS| ||¡\}}z t|ƒ} WnPtyªzt   |¡j } Wn,t y¤t |ƒ}|j|d|dYn0Yn0|| krb|duröd|vrÎi|d<||dd<d|vrêi|d<| |dd<|jrdSzt || d ¡WnHttfy\} z*t |ƒ}|j|d t | ƒdWYd} ~ n d} ~ 00d}|S) Nrÿr›Tz'chown failed: failed to look up user %srr1ror2rzchown failed: %s)r$r r¡rërìr5r ÚintrŽÚpwdÚgetpwnamÚpw_uidr®r%rÝrÃÚlchownrðrï) rär¡ror/r6rr Úorig_uidÚorig_gidrrr~r~rÚset_owner_if_differentsB        ,z$AnsibleModule.set_owner_if_differentc CsH|dur |St|dd}|r0tj tj |¡¡}| |¡r>dS| ||¡\}}z t|ƒ} WnPtyªzt   |¡j } Wn,t y¤t |ƒ}|j|d|dYn0Yn0|| krD|duröd|vrÎi|d<||dd<d|vrêi|d<| |dd<|jrdSzt |d | ¡Wn*ty>t |ƒ}|j|d dYn0d}|S) Nrÿr›Tz(chgrp failed: failed to look up group %srr1rpr2rz chgrp failed)r$r r¡rërìr5r r8rŽÚgrpÚgetgrnamÚgr_gidr®r%rÝrÃr<rï) rär¡rpr/r6rr r=r>rr~r~rÚset_group_if_differentHsB        z$AnsibleModule.set_group_if_differentc Cs®|dur |St|dd}|r0tj tj |¡¡}| |¡r>dSt |¡}t|tƒsìzt|dƒ}WnŠt yêz|  ||¡}Wn@t y¾}z(t |ƒ}|j |dt |ƒdWYd}~n d}~00|t |¡kræt |ƒ}|j |d|dYn0t |j¡} | |krª|durPd|vri|d<d | |dd <d |vr@i|d <d ||d d <|jr\dSz|ttd ƒrxt ||¡n^tj |¡s”t ||¡nBt |¡} t ||¡t |¡} | j| jkrÖt |t | j¡¡Wn¬ty>}zLtj |¡r|jtjtjtjfvrn|jtjtjfvr(n‚WYd}~nPd}~0t y„}z.t |ƒ}|j |d t |ƒt ¡dWYd}~n d}~00t |¡}t |j¡} | | krªd}|S)Nrÿr›Téz&mode must be in octal or symbolic form)r¡r¶Údetailsz6Invalid mode supplied, only permission info is allowedr1ú0%03ornr2Úlchmodz chmod failed©r¡r¶rEÚ exception)r$r r¡rërìr5rrÛr8r(Ú_symbolic_mode_to_octalr%rÝr#ÚstatÚS_IMODEÚst_moderÃÚhasattrrGrÚchmodrïrÚEACCESÚEPERMZEROFSrÚELOOPÚ tracebackÚ format_exc) rär¡rnr/r6rr Ú path_statrÚ prev_modeZunderlying_statZnew_underlying_statÚnew_moder~r~rÚset_mode_if_differentqs€     þ         ýÿ   z#AnsibleModule.set_mode_if_differentc Cs‚|dur |St|dd}|r0tj tj |¡¡}| |¡r>dS|j|dd}d}| d¡rn|d}|d d…}| d d ¡|ksˆ|d kr~|  d ¡} | r~| d||f|g} d}|durüd|vrÆi|d<| d ¡|dd<d|vrèi|d<d||f|dd<|j s~z4|  | ¡\} } } | dks&| r6t d| | ƒ‚WnDt y|} z*|j t|ƒdt| ƒt ¡dWYd} ~ n d} ~ 00|S)Nrÿr›TF©Úinclude_versionú=)ú-ú+rr"Ú attr_flagsr{r\Zchattrz%s%sr1rur2z"Error while setting attributes: %sz chattr failedrH)r$r r¡rërìr5Úget_file_attributesÚ startswithrr;rÃÚ run_commandr(rÝr%r#rSrT)rär¡rur/r6rr ÚexistingZattr_modÚattrcmdr7ÚoutÚerrrr~r~rÚset_attributes_if_differentÆsD       ÿz)AnsibleModule.set_attributes_if_differentc Csªi}| dd¡}|r¦|rdnd}|||g}zh| |¡\}}}|dkr| ¡} d} |rhd} | d ¡|d<| |  dd ¡ ¡|d <t|d ƒ|d <Wnty¤Yn0|S) NZlsattrFz-vdz-drr"rúr\r{r^ru)r;rarÚstripÚreplacer@r() rär¡rZr”rcÚflagsr7rdreÚresZattr_flags_idxr~r~rr_ñs$    z!AnsibleModule.get_file_attributesc CsÆt |j¡}| d¡D]ª}t |¡}t |¡}| d¡}|dk}|dksP|dkrTd}t |¡rjt d|ƒ‚t |ƒD]L\} } t  | ¡rt d|ƒ‚|D](} |  || | |¡} |  | || | |¡}q”qrq|S)z› This enables symbolic chmod string parsing as stated in the chmod man-page This includes things like: "u=rw-x+X,g=r-x+X,o=r-x+X" ú,rr{r Zugoz$bad symbolic permission for mode: %s)rKrLrMrÚMODE_OPERATOR_REÚfindallÚpopÚUSERS_REÚmatchrŽÚ enumerateÚPERMS_REÚ#_get_octal_mode_from_symbolic_permsÚ_apply_operation_to_mode) rƒrUZ symbolic_moderWrnZpermlistZopersZusersÚ use_umaskÚidxÚpermsÚuserÚ mode_to_applyr~r~rrJs"        z%AnsibleModule._symbolic_mode_to_octalcCsˆ|dkr^|dkrtjtjB}n*|dkr4tjtjB}n|dkrHtjtjB}|tA}||@|B}n&|dkrp||B}n|dkr„|||@}|S)Nr[rÚgÚor]r\)rKÚS_IRWXUÚS_ISUIDÚS_IRWXGÚS_ISGIDÚS_IRWXOÚS_ISVTXÚ PERM_BITS)rxÚoperatorryZ current_modeÚmaskZ inverse_maskrWr~r~rrt2s   z&AnsibleModule._apply_operation_to_modec sðt |j¡}t |j¡}|t@dk}|p*|}t d¡}t |¡|tA} |rldtjidtj idtj idœ} nddiddiddidœ} |r’| tj @ntj |r¤| tj @ntj |r¶| tj@ntjtj d|tj@|tj@d>|tj@d>dœ|rò| tj@ntj|r| tj@ntj|r| tj @ntj tjd|tj@d?|tj@|tj@d>dœ|rX| tj@ntj|rl| tj@ntj|r€| tj @ntj dtj|tj@d?|tj@d?|tj@dœdœ‰|  ¡D]\} } ˆ|  | ¡q¼‡‡fdd„} t| |dƒS) Nrr)rrzr{rwé)r$ÚwÚxrrrrzr{cs|ˆˆ|BS©Nr~)rnZperm©rxZuser_perms_to_modesr~rÚ or_reduce…szDAnsibleModule._get_octal_mode_from_symbolic_perms..or_reduce)rKrLrMÚS_ISDIRÚEXEC_PERM_BITSr Úumaskr‚ÚS_IXUSRÚS_IXGRPÚS_IXOTHÚS_IRUSRÚS_IWUSRr}r|r~r€ÚS_IRGRPÚS_IWGRPrÚS_IROTHÚS_IWOTHrrÔrØrY)rUrxrwrurVZ is_directoryZhas_x_permissionsZapply_X_permissionrZ rev_umaskZX_permsÚkeyÚvaluerŠr~r‰rrsEs`     ýý  ø   ø   øíz1AnsibleModule._get_octal_mode_from_symbolic_permscCs„| |d|d||¡}| |d|d|||¡}| |d|d|||¡}| |d|d|||¡}| |d|d|||¡}|S)Nr¡rrorprnru)r.r?rCrXrf©räZ file_argsr/r6rr~r~rÚset_fs_attributes_if_differentŠs ÿÿÿÿÿz,AnsibleModule.set_fs_attributes_if_differentcCs|jotj |¡ Srˆ)rÃr r¡rí)räZ file_pathr~r~rr5sz-AnsibleModule.check_file_absent_if_check_modecCs| ||||¡Srˆ©ršr™r~r~rÚ%set_directory_attributes_if_different sz3AnsibleModule.set_directory_attributes_if_differentcCs| ||||¡Srˆr›r™r~r~rÚ set_file_attributes_if_different£sz.AnsibleModule.set_file_attributes_if_differentc Csh| d| dd¡¡}|dur |St|dd}tj |¡rd| |¡\}}||d<||d<zt |¡d}Wnty„t |ƒ}Yn0zt   |¡d}Wnty²t |ƒ}Yn0||d <||d <t  |¡}d t  |t j¡|d <tj |¡rüd |d<n         zAnsibleModule.add_path_infoc Csœzt tjd¡Wn„tjyZt|ƒ}t tj|¡|tjd<|tjd<|tjd<Yn>ty–}z&|jdt |ƒt   ¡dWYd}~n d}~00dS)z‚ Uses the locale module to test the currently set locale (per the LANG and LC_CTYPE environment settings) r{ÚLANGÚLC_ALLÚ LC_MESSAGESzLAn unknown error was encountered while attempting to validate the locale: %s©r¶rIN) ÚlocaleÚ setlocalerªÚErrorr:r Úenvironr(rÝr#rSrT)räZ best_localerr~r~rrÖÎs  ÿÿzAnsibleModule._check_localecCs¼|dur|j}|dur|j}tD]–}d|}||vrˆ|tvr\t|t|d| ||¡ƒnt|t|d||ƒ||jvr¶|j|=q t|t|dƒs t|t|dt|dƒq dS)Nz _ansible_%srr")rÁr°rKrLÚsetattrrarN)rärÁZmodule_parametersråZ param_keyr~r~rr׿s   z&AnsibleModule._set_internal_propertiescCs t|||ƒSrˆ)r\)rär˜ÚlocalsZinclude_exceptionsr~r~rr\ýszAnsibleModule.safe_evalcCs tƒ|_dS)zÕ read the input and set the params attribute. This method is for backwards compatibility. The guts of the function were moved out in 2.1 so that custom modules could read the parameters. N)r±r°r r~r~rr±szAnsibleModule._load_paramsc Csˆtr„z>d|j}tt|jtjƒ}t t|ƒd|¡t tj|¡Wn@t y‚}z(|j dt |ƒt   ¡|dWYd}~n d}~00dS)Nú ansible-%srzƒFailed to log to syslog (%s). To proceed anyway, disable syslog logging by setting no_target_syslog to True in your Ansible config.)r¶rIZ msg_to_log)Ú HAS_SYSLOGrÀÚgetattrÚsyslogrÎr¹ZopenlogrhZLOG_INFOÚ TypeErrorrÝr#rSrT)rär¶rºÚfacilityrr~r~rÚ_log_to_syslog s þûzAnsibleModule._log_to_syslogcCs|jr| d|¡dS)Nz [debug] %s)rÌrø)rär¶r~r~rÚdebugszAnsibleModule.debugc Cs~|jsz|durtƒ}d|j}t|tƒr6| dd¡}t|ttfƒsTtdt|ƒƒ‚t|tƒrtt | dd¡|j ƒ}n t ||j ƒ}t rŠ|}n |  dd¡}t rpdtj t¡fg}|D]8}| ¡t||ƒ}} |dvrÜd|}| || f¡q²zbtr,tt|jtjƒd?} tjfd ||f| d œt|ƒ¤Žn tjfd d ||fit|ƒ¤ŽWntyl| |¡Yn0n | |¡dS) Nr³r™rhzmsg should be a string (got %s)ZMODULE) ZPRIORITYÚMESSAGEZ MESSAGE_IDZ CODE_FILEZ CODE_LINEZ CODE_FUNCÚSYSLOG_FACILITYZSYSLOG_IDENTIFIERZ SYSLOG_PIDz_%srwz%s %s)r»r¼r»)rÅrrÀrÛrSrªrWr·rgrHr“rQr¦Ú has_journalr r¡r¾r¿Úupperrhrr´rµr¶rÎr¹rÚsendrðr¹) rär¶Úlog_argsrºZ journal_msgZ syslog_msgZ journal_argsÚargr»r˜r¸r~r~rrøsP      þþÿþÿ zAnsibleModule.logcCsútƒ}|jD]°}|j ||¡}|j |i¡}| dd¡}|durbt |¡rbd||<| d|¡q | |¡rvd||<q |j|}t |t t fƒs˜t |ƒ}nt |t ƒr¬|  d¡}t||jƒ||<q dd„| ¡Dƒ}|räd d  |¡}nd }|j||d dS) z! log that ansible ran the module rÅNZNOT_LOGGING_PASSWORDz Module did not set no_log for %sZNOT_LOGGING_PARAMETERr™cSs$g|]\}}dt|ƒt|ƒf‘qS)z%s=%s©r#)Ú.0rÁÚvalr~r~rÚ sóz1AnsibleModule._log_invocation..zInvoked with %sr%ZInvoked)rÀ)rr°rjrrÁÚPASSWORD_MATCHÚsearchrerarÛrWrSrhr¦r—r“rÔr‘rø)rärÀZparamZcanonZarg_optsrÅZ param_valr¶r~r~rrßZs*        zAnsibleModule._log_invocationc Cs¢z(t ¡}t |tjtjB¡s$tƒ‚|WStyœ|jtj d¡t   ¡fD]H}z0t |tjtjB¡r€t  |¡|WYSWqNty”YqN0qNYn0dS)Nz$HOME) r ÚgetcwdÚaccessÚF_OKÚR_OKr(r÷r¡rìròZ gettempdirÚchdir)räÚcwdr~r~rrã{s   zAnsibleModule._set_cwdc Csdd}zt||d}WnJty^}z2|r:|jt|ƒdn|WYd}~SWYd}~n d}~00|S)aQ Find system executable in PATH. :param arg: The executable to find. :param required: if executable is not found and required is ``True``, fail_json :param opt_dirs: optional list of directories to search in addition to ``PATH`` :returns: if found return full path; otherwise return None N)rÁÚopt_dirsr½)r;rŽrÝr%)rärÁÚrequiredrÏZbin_pathrr~r~rr;s &zAnsibleModule.get_bin_pathc CsP|dur |Sz t|ƒWStyJ}z|jt|ƒdWYd}~n d}~00dS)z!Convert the argument to a booleanNr½)rar·rÝr#)rärÁrr~r~rra¤s  zAnsibleModule.booleanc CsDz t|ƒWSty>}z|jt|ƒdWYd}~n d}~00dS©Nr½)r&Ú UnicodeErrorrÝr%)rär’rr~r~rr&®s zAnsibleModule.jsonifycCs t |¡Srˆ)r.r©)rär’r~r~rÚ from_json´szAnsibleModule.from_jsoncCs||jvr|j |¡dSrˆ)rËr©rär¡r~r~rÚadd_cleanup_file·s zAnsibleModule.add_cleanup_filecCs|jD]}| |¡qdSrˆ)rËÚcleanuprÔr~r~rÚdo_cleanup_files»s zAnsibleModule.do_cleanup_filescCsJ| |¡d|vr d|ji|d<d|vr^t|dtƒrP|dD]}| |¡q>n| |d¡tƒ}|rp||d<d|vrt|dtƒr|dD]p}t|tƒrÄt|ƒdkrÄ|j|d|ddq’t|t ƒrø|j|d |  d ¡|  d ¡|  d ¡d q’| |¡q’n| |d¡t ƒ}|r(||d<t ||j ƒ}td| |¡ƒdS)NZ invocationZ module_argsÚwarningsÚ deprecationsryrr")rúr¶rúrûrürùz %s)r¨r°rÛr‡rerdÚ SEQUENCETYPErŒrbr4rrcrHr“r«r&)rär…r†rØr rÙr~r~rÚ_return_formatted¿s6     ÿ zAnsibleModule._return_formattedcKs | ¡| |¡t d¡dS)z' return from the module, without error rN)r×rÛržr¬)rär…r~r~rrÞås zAnsibleModule.exit_jsoncKs–d|d<||d<d|vrvt ¡drv|js4|jdkrvtrZdd t t ¡d¡¡|d<nd t t ¡d¡¡|d<| ¡|  |¡t  d ¡d S) z/ return from the module, with an error message TZfailedr¶rIryrwzIWARNING: The below traceback may *not* be related to the actual failure. r{r"N) ržÚexc_inforÌrÏrPr‘rSÚ format_tbr×rÛr¬)rär¶r…r~r~rrÝìs$ÿ  zAnsibleModule.fail_jsonc CsR|sdSzt|j|ƒWn4tyL}z|jt|ƒdWYd}~n d}~00dSrÑ)r[r°r·rÝr#)räZrequired_paramsrr~r~rÚfail_on_missing_paramss z$AnsibleModule.fail_on_missing_paramsc CsÐt|dd}tj |¡sdStj |¡r8|jd|dt|dƒrH|}n>zt|ƒ}Wn.ty„|jd||d  t¡fdYn0d }t tj  |¡d ƒ}|  |¡}|rÀ|  |¡|  |¡}q¦| ¡| ¡S) zh Return hex digest of local file for a digest_method specified by name, or None if file is not present. rÿr›Nz+attempted to take checksum of directory: %sr½Ú hexdigestzFCould not hash file '%s' with algorithm '%s'. Available algorithms: %sz, ir˜)r$r r¡rír¥rÝrNÚAVAILABLE_HASH_ALGORITHMSr®r‘r£rr¤rØr¥rß)räÚfilenameÚ algorithmZ b_filenameZ digest_methodrZinfileÚblockr~r~rÚdigest_from_files*     ÿ   zAnsibleModule.digest_from_filecCsdtvrtdƒ‚| |d¡S)a Return MD5 hex digest of local file using digest_from_file(). Do not use this function unless you have no other choice for: 1) Optional backwards compatibility 2) Compatibility with a third party protocol This function will not work on systems complying with FIPS-140-2. Most uses of this function can use the module.sha1 function instead. r0z1MD5 not available. Possibly running in FIPS mode)ràrŽrä©rärár~r~rr0$s zAnsibleModule.md5cCs | |d¡S)z@ Return SHA1 hex digest of local file using digest_from_file(). r1©rärår~r~rr13szAnsibleModule.sha1cCs | |d¡S)zC Return SHA-256 hex digest of local file using digest_from_file(). r2rærår~r~rr27szAnsibleModule.sha256c Cs’d}tj |¡rŽt dt t ¡¡¡}d|t ¡|f}z| ||¡WnDtj t fyŒ}z&|j d||t |ƒfdWYd}~n d}~00|S)z[make a date-marked backup of the specified file, return True or False on success or failurer{z%Y-%m-%d@%H:%M:%S~z%s.%s.%sz%Could not make backup of %s to %s: %sr½N) r r¡rírñÚstrftimeÚ localtimeÚgetpidÚpreserved_copyrõr¯rðrÝr#)räÚfnZ backupdestÚextrr~r~rÚ backup_local;s 0zAnsibleModule.backup_localc Cs\tj |¡rXzt |¡Wn<tyV}z$tj d|t|ƒf¡WYd}~n d}~00dS)Nzcould not cleanup %s: %s) r r¡ríÚunlinkrïržÚstderrÚwriter#)räZtmpfilerr~r~rrÖKs  zAnsibleModule.cleanupc CsÒt ||¡| ¡r,| |¡}| ||d¡zFt |¡}t |¡}|rp|j|jks^|j|jkrpt  ||j|j¡Wn2t y¤}z|j t j kr‚WYd}~n d}~00|j |dd}| dd¡}| ||d¡dS)z=Copy a file with preserved ownership, permissions and contextFNrYr^r{T)rõÚcopy2rrr.r rKrrÚchownrïrrQr_rrf)räÚsrcrþrÚ dest_statÚtmp_statrZcurrent_attribsr~r~rrêRs      zAnsibleModule.preserved_copyc Csd}d}t|dd}t|dd}tj |¡r"z¨t |¡}t ||jt@¡t ||j |j ¡t tdƒrÔt |dƒrÔzt  ||j ¡WnNtyÒ}z6dD]"} t t| ƒr˜|jtt| ƒkr˜q¾q˜‚WYd}~n d}~00Wn4ty }z|jtjkrö‚WYd}~n d}~00| ¡r6| |¡}n| ¡r6| |¡}tj |¡ } zt ||¡WnNttfy¤}z.|jtjtjtjtjtjfvr²|jd||t|ƒft ¡dnÞtj |¡} tj  |¡} d} d}z¢zt!j"d | | d \}}WnXttfy.}z$d tj |¡t|ƒf} WYd}~n d}~0t#yDd } Yn0W| r¤|rb| $||¡n|j| t ¡dn.| r¢|r| $||¡n|j| t ¡d0|rt|dd}zÊzVt %|¡zt& '||¡Wn tyøt& (||¡Yn0| ¡r| )||d ¡zBt |¡}|rR|j |j ks@|j |j krRt ||j |j ¡Wn6tyŠ}z|jtjkrv‚WYd}~n d}~00zt ||¡Wnrt&j*ttfy}zP|rØ|jtjkrØ| $||¡n"|jd|||t|ƒft ¡dWYd}~n d}~00Wnbt&j*ttfyt}z@|r@| $||¡n |jd||t|ƒft ¡dWYd}~n d}~00W| +|¡n | +|¡0WYd}~n d}~00| rt ,d¡}t ,|¡t |t-|@¡zt |t .¡t /¡¡WntyYn0| ¡r| )||d ¡dS)aatomically move src to dest, copying attributes from dest, returns true on success it uses os.rename to ensure this as it is an atomic operation, rest of the function is to work around limitations, corner cases and ensure selinux context is saved if possibleNrÿr›ÚchflagsÚst_flags)Ú EOPNOTSUPPÚENOTSUPz$Could not replace file: %s to %s: %sr¬s .ansible_tmp)rérêÚsuffixzQThe destination directory (%s) is not writable by the current user. Error was: %sz•Failed creating tmp file for atomic move. This usually happens when using Python3 less than Python3.5. Please use Python2.x or Python3.5 or greater.Fz=Unable to make %s into to %s, failed final rename from %s: %sz$Failed to replace file: %s to %s: %sr)0r$r r¡rírKrOrMr‚ròrrrNrör÷rïrrµrQrrrÚrenamerðZEXDEVrPZETXTBSYZEBUSYrÝr#rSrTr"r¾ròZmkstempr·Ú_unsafe_writesr¥rõÚmoverñr.r¯rÖrÚ DEFAULT_PERMÚgeteuidÚgetegid)rärórþrvrrôZb_srcZb_destrreZcreatingZ b_dest_dirZb_suffixZ error_msgZ tmp_dest_nameZ tmp_dest_fdZb_tmp_dest_namerõrr~r~rÚ atomic_moveusº         $  , ü   ÿ "ÿÿ 8.   zAnsibleModule.atomic_movec Cs¶zdd}}zrÆz,AnsibleModule._clean_args..r‹r[rz %s=********Tr%css|]}t|ƒVqdSrˆ)rZ)rÃrÁr~r~rr(rÆ)rÑrPrÛrWr$rSr%ÚshlexrrÚ PASSWD_ARG_RErpÚfindr—r“r‘)rär„Z to_clean_argsZ clean_argsZ is_passwdrÁZsep_idxr~r~rÚ _clean_args s4         zAnsibleModule._clean_argscCs"trtjdkrt tjtj¡dS)NÚwin32)rPržr|ÚsignalÚSIGPIPEÚSIG_DFLr r~r~rÚ_restore_signal_handlers,sz&AnsibleModule._restore_signal_handlersr™rÿc' shdˆ_t|tttfƒs*d}ˆjd||dd}| r t|tƒrRd dd„|Dƒ¡}n t|d d }|rzt|d d }|d |g}qüˆjd vrštˆjd d d |g}qüd }n\t|ttfƒrÚt rÀt|d d }nt rÐt |dd }t   |¡}|rîdd„|Dƒ}ndd„|Dƒ}d}| rnt| tƒr8t r&t| dd } nt r8t| d d } zt | tj¡}Wn"tjylˆjddYn0d}d}d}tj ¡}| ˆjp’i¡| | p¢i¡|rØ| dd¡}|rÐd||f|d<n||d<d|vrdd„|d  d¡Dƒ}|rt|ƒrd |¡|d<|r$tj}‡‡fdd„}t||||tjtj||d}t rd|rd||d<nt rx|rxd|d<|rÈttj tj |¡¡d d }tj |¡r²||d<n|sȈjd |dzJˆj r舠!d!ˆ "|¡¡tj#|fi|¤Ž}|r||ƒd"}d"} z t$ %¡}!Wn t&t'fy<t$ (¡}!Yn0|! )|j*t$j+¡|! )|j,t$j+¡tj-d#krÂt. .|j* /¡t.j0t. .|j* /¡t.j1¡tj2B¡t. .|j, /¡t.j0t. .|j, /¡t.j1¡tj2B¡|r|sÖ|d$7}t|tƒrêt|ƒ}|j3 4|¡|j3 5¡|! 6d%¡}"|"D]\\}#}$|#j7 8¡}%|%t9dƒkr:|! :|#j7¡|#j7|j*krR||%7}n|#j7|j,kr| |%7} q|r¤| ;|¡r¤|s¤| r˜t<|| |d&}d|d'fWS|"r´|! =¡sÈ| >¡durÈqðn$|! =¡s| >¡dur| ?¡qðq|j* 5¡|j, 5¡|! 5¡|j@}Wnæt't&fy†}&zTˆ !d(ˆ "|¡t<|&ƒf¡|rnˆj|&jAd"d"t<|&ƒˆ "|¡d)n|&‚WYd}&~&n~d}&~&0tByú}&z\ˆ !d(ˆ "|¡t.rÿr›s-c)Nz/bin/shTršcSs0g|](}|durttj tj |¡¡dd‘qSr)r$r r¡rërìrr~r~rrÅ—rÆcSs g|]}|durt|dd‘qSr)r$rr~r~rrÅ™rÆz6invalid prompt regular expression given to run_commandr½rÚPATHr{z%s:%sZ PYTHONPATHcSs(g|] }|r| d¡s| d¡s|‘qS)z/ansible_modlib.zipz /debug_dir)Úendswithrr~r~rrŽs  ýrŠcsˆ ¡ˆrt ˆ¡dSrˆ)r r rr~©rärr~rÚpreexecÇsz*AnsibleModule.run_command..preexec)r²ÚshellÚ close_fdsr§ÚstdoutrïZ preexec_fnÚenvÚpass_fdsrrÎz)Provided cwd is not a valid directory: %sz Executing: rÆÚposixÚ r")ÚencodingrœzQA prompt was encountered while running a command, but no input data was specifiedz#Error Executing CMD:%s Exception:%s)r7rrïr¶r)r7rrïr¶rIr)rr7rrïr¶)HrÑrÛr‡rSrWrÝr‘r$rÍrPrQr%rrÚreÚcompileÚ MULTILINErçr r°ÚcopyrØrÐrÚanyÚ subprocessÚPIPErr¡Úabspathrër¥rÌrørÚPopenr!ZDefaultSelectorrðrïZ PollSelectorrôrZ EVENT_READrïr»ÚfcntlÚfilenoZF_SETFLZF_GETFLÚ O_NONBLOCKr§rðr¥ÚselectZfileobjr¤rRZ unregisterrÈr#Zget_mapZpollÚwaitÚ returncoderr(rSrTr—Úrstripr“)'rär„Zcheck_rcrr²r’Z binary_dataZ path_prefixrÎZuse_unsafe_shellZ prompt_regexZenviron_updaterrrœZexpand_user_and_varsrZbefore_communicate_callbackZignore_invalid_cwdZhandle_exceptionsr¶rZ prompt_rer7Zst_inrr¡Zpypathsrr…rrrïÚselectorZeventsr—ZeventZb_chunkrr~rrra1sB            ø      ,,             " &  ÿzAnsibleModule.run_commandcCs4tj tj |¡¡}t|dƒ}| |¡| ¡dS)Nr )r r¡rìrër£rðr¥)rärárhZfhr~r~rÚappend_to_file>s  zAnsibleModule.append_to_filecCst|ƒSrˆ)r+)rär¡r~r~rr+DszAnsibleModule.bytes_to_humancCs t||ƒSrˆ)r,)räÚnumberZisbitsr~r~rr,JszAnsibleModule.human_to_bytesc CsJzt |d¡}Wn4tyDz tj}Wnty>d}Yn0Yn0|S)Nii(#)r&r(r)ZPIPE_BUF)r¯Z buffer_sizer~r~rÚget_buffer_sizeTs   zAnsibleModule.get_buffer_size) FFNNNFFNN)NNN)N)r)T)N)NT)NT)NT)NT)T)NT)NT)NT)NN)NF)N)FN)N)F)FTNNFNNFNNNr™rÿTNNTT)F)GÚ__name__Ú __module__Ú __qualname__rèÚpropertyr÷rerbr rrrrrr r#r-r0r.r?rCrXrfr_Ú classmethodrJÚ staticmethodrtrsršr5rœrr¨rÖr×r\r±r¹rºrørßrãr;rar&rÓrÕr×rÛrÞrÝrÞrär0r1r2rírÖrêrrürr rar.r+Z pretty_bytesr,r?r0r~r~r~rr¸³s ý e & 7   - ) ) U +  ,  D   (    =!  & # #þ  r¸cCstj tj t¡¡Srˆ)r r¡r"rr¿r~r~r~rÚget_module_pathcsr7)N)NN)·Z __future__rrrrgZ __metaclass__ZFILE_ATTRIBUTESÚ__main__rórZdatetimer@r&r­r r9r|rr)rrõr rKr"ržròrñrSÚtypesÚ itertoolsrrr¶r´Ú ImportErrorZsystemdrrZsystemd_daemonrNZbootedr½ÚAttributeErrorr Zansible.module_utils.compatr ZNoneTyper!Z_textr#r$r%Z+ansible.module_utils.common.text.convertersr&r'r­r(Zjson_dict_bytes_to_unicodeZ$ansible.module_utils.common.arg_specr)Z+ansible.module_utils.common.text.formattersr*r+r,r-Z(ansible.module_utils.common._json_compatr.rr«rÜr¬rràZhashlibZ attributerµr/râr0rŽrnr(ZshaZ/ansible.module_utils.common._collections_compatr3r4r5r6r7r8r9Z"ansible.module_utils.common.localer:Z#ansible.module_utils.common.processr;Z ansible.module_utils.common.filer<r‚r=rŒr>rþr?r@rAZ$ansible.module_utils.common.sys_inforBrCrDZansible.module_utils.pycompat24rErFZ&ansible.module_utils.common.parametersrGrHrIrJrKrLZansible.module_utils.errorsrMrNrOZansible.module_utils.sixrPrQrRrSrTrUrVrWZansible.module_utils.six.movesrXrYrZZ&ansible.module_utils.common.validationr[r\Z"ansible.module_utils.common._utilsr]rˆZ)ansible.module_utils.parsing.convert_boolr^r_r`raZ$ansible.module_utils.common.warningsrbrcrdreÚ frozensetrÚrrrÇÚimapZunicodeÚ NameErrorZ basestringZ _literal_evalrrÓrrlrorrÚ version_infoZ_PY3_MINZ_PY2_MINZ_PY_MINr‘rúÚ splitlinesr€r†r—r±r·Úobjectr¸r7r~r~r~rÚsPì            $    (      ô      ÿÿ  A8 =