
    Vhq                       d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	Z	d dl
mZ d dlmZmZ d dlmZ d dlmZmZmZ d dlmZmZmZ d dlmZ d d	lmZ d d
lmZ d dlm Z  d dl!m"Z" d dl#m$Z$m%Z%m&Z&  edd      Z'ddiZ(g dZ)dddgddddigidddigiddidZ*d Z+d%dZ,d&dZ-d Z.d  Z/d&d!Z0d" Z1 G d# d$e2      Z3y)'    )annotationsN)
namedtuple)MappingSequence)NativeEnvironment)AnsibleOptionsErrorAnsibleErrorAnsibleRequiredOptionError)to_textto_bytes	to_native)	yaml_load)string_types)boolean)unquote)AnsibleVaultEncryptedUnicode)cleanup_tmp_filemakedirs_safeunfrackpathSettingzname value origin typelookup)_terms)	)urlTstr)usernameFr   )passwordFr   )tokenFr   )auth_urlFr   )api_versionFint)validate_certsFbool)	client_idFr   )timeoutFr          )defaultchoicesclinamer!   r$   r'   )r   r!   r$   r   c                B    d}| r|d| z  z  }|r|d|z  z  }|d|z  z  }|S )z& construct entry for requested config  zplugin_type: %s zplugin: %s zsetting: %s  )plugin_typeplugin_nameconfigentrys       F/home/dcms/DCMS/lib/python3.12/site-packages/ansible/config/manager.py
_get_entryr3   6   s@    E#k11][00E	^f$$EL    c           	        d}d}|rIt         j                  j                  |      r*t         j                  j                  t	        |            r|}|r|j                         }| 3|dv rt        | d      } n|dv r>t        | t              s	 t        j                  |       x}t        |      x}k(  r|} nd}n|dk(  rt        | t              st        |       } n|d	k(  r\t        | t              r7| j                  d
      D 	cg c]  }	t!        |	j#                                } }	n\t        | t$              sKd	}nG|dk(  r| dk(  rd} | 8d}n4|dk(  r#t        | t              rt'        | |      } nd}n|dv rt        | t              rt'        | |      } t         j                  j                  |       st)        | d       dt        j*                         z  }
t-        j.                  |
|       } t1        j2                  t4        | d       ntd}np|dk(  r_t        | t              r| j                  t         j6                        } t        | t$              r| D 	cg c]  }	t'        |	|       } }	nd}n|dk(  rjt        | t              r,| j                  d
      D 	cg c]  }	|	j#                          } }	t        | t$              r| D 	cg c]  }	t'        |	|       } }	nd}n|dv rt        | t8              sd}n|dv rMt        | t        t:        t<        t        t        t>        f      r tA        | d      } |rI|dk(  rDt!        |       } n8d}n5t        | t        t:        f      rtA        | d      } |r|dk(  rt!        |       } |rt        d| d |       tA        | dd!"      S # t        j                  $ r}t        |d}~ww xY wc c}	w c c}	w c c}	w c c}	w )#a   return a configuration variable with casting
    :arg value: The value to ensure correct typing of
    :kwarg value_type: The type of the value.  This can be any of the following strings:
        :boolean: sets the value to a True or False value
        :bool: Same as 'boolean'
        :integer: Sets the value to an integer or raises a ValueType error
        :int: Same as 'integer'
        :float: Sets the value to a float or raises a ValueType error
        :list: Treats the value as a comma separated list.  Split the value
            and return it as a python list.
        :none: Sets the value to None
        :path: Expands any environment variables and tilde's in the value.
        :tmppath: Create a unique temporary directory inside of the directory
            specified by value and return its path.
        :temppath: Same as 'tmppath'
        :tmp: Same as 'tmppath'
        :pathlist: Treat the value as a typical PATH string.  (On POSIX, this
            means comma separated strings.)  Split the value and then expand
            each part for environment variables and tildes.
        :pathspec: Treat the value as a PATH string. Expands any environment variables
            tildes's in the value.
        :str: Sets the value to string types.
        :string: Same as 'str'
    r,   N)r   r"   F)strict)integerr    r    floatlist,noneNonepath)basedir)tmptemppathtmppathi  zansible-local-%s)prefixdirT)warnr@   pathspecpathlist)dict
dictionaryrH   )r   stringsurrogate_or_stricterrorsinirI   zInvalid type provided for "z": passthru)rL   	nonstring)!osr=   isabsexistsr   lowerr   
isinstancer    decimalDecimalDecimalException
ValueErrorr8   r   splitr   stripr   resolve_pathr   getpidtempfilemkdtempatexitregisterr   pathsepr   r   r"   complexr   )value
value_typeoriginorigin_ftypeerrmsgr>   decimal_valueint_partexrB   s              r2   ensure_typerl   B   sc   4 FG"''--'BGGNN8F;K,L%%'
,,E%0E--eS),)0)??QTUbQcEcXd (!& 7"eU+e6!%.5:[[5EF+FFx06! 6!%.$UG<99%.$UG<ww~~e,!%/+biik9 ((EB 0%dC#:%%.BJJ/%*CHIaa9II#:%%.,1KK,<=q==%*CHIaa9II#11eW-%,,%,0LdTWY^`g!hi.CDLE$9#ENE! .JKLE*?@E 5:6(#eYOPP5!6*MMY // ,$!+, GB J > Js0   *N&  OO!OO&O9O  Oc                n    d| v r$| j                  dt        j                               } t        | d|      S )z& resolve relative or 'variable' paths z{{CWD}}F)followr>   )replacerP   getcwdr   )r=   r>   s     r2   r[   r[      s/    D||Iryy{3tE7;;r4   c                    d }| Lt         j                  j                  |       d   }|dv rd}|S |dv rd}|S t        d| dt	        |            |S )N)z.iniz.cfgrM   )z.yamlz.ymlyamlz-Unsupported configuration file extension for : )rP   r=   splitextr   r   )cfileftypeexts      r2   get_config_typery      sq    Eggu%b)""E L %%E L &_dfopsft&uvvLr4   c                    d}| 7	 | j                  |j                  dd      |j                  dd      d      }|S |S # t        $ r Y |S w xY w)z+ returns the value of last ini entry found Nsectiondefaultskeyr,   T)raw)get	Exception)pr1   rc   s      r2   get_ini_config_valuer      s`    E}	EE%))Iz:EIIeR<PVZE[E L5L  	L	s   4> 	A
Ac                   | 
t               } t        }g }t        j                  d|      }||urft	        |d      }t        j
                  j                  t        |            r t        j
                  j                  |d      }|j                  |       d}	 t        j                         }t        j                  |      }t        j
                  j                  |d      }|j                  t        j                  z  r"t        j
                  j                  |      rd}n|j                  t        |d             |j                  t	        d	d             |j                  d
       |D ]S  }t        |      }	t        j
                  j                  |	      s.t        j"                  |	t        j$                        sS n d}||k7  r|r| j'                  dt              z         |S # t         $ r Y w xY w)zO Load INI Config File order(first found is used): ENV, CWD, HOME, /etc/ansible NANSIBLE_CONFIGF)rn   zansible.cfgTrJ   rK   z~/.ansible.cfgz/etc/ansible/ansible.cfgzAnsible is being run in a world writable directory (%s), ignoring it as an ansible.cfg source. For more information see https://docs.ansible.com/ansible/devel/reference_appendices/config.html#cfg-in-world-writable-dir)setobjectrP   getenvr   r=   isdirr   joinappendrp   statst_modeS_IWOTHrR   r   OSErroraccessR_OKadd)
warningsSENTINELpotential_pathspath_from_envwarn_cmd_publiccwdpermscwd_cfgr=   b_paths
             r2   find_ini_config_filer      s    5 HO II.9MH$#M%@77==-01GGLLFM}- Oiik'',,sM2==4<<' ww~~g&"&""77;P#QR ;'7FG 56 $77>>&!bii&@
 
  { s|	$ 	% K7  s   B$G) )	G54G5c                    d }| j                         D ]+  \  }} ||       dD ]  }||v s||   D ]
  } ||         - y)zDAdd deprecation source 'ansible.builtin' to deprecations in base.ymlc                    d| v r	d| d   d<   y y )N
deprecatedzansible.builtincollection_namer-   )r1   s    r2   processz,_add_base_defs_deprecations.<locals>.process&  s    5 5FE, 12 !r4   )rM   envvarsN)items)	base_defsr   dummydatar{   r1   s         r2   _add_base_defs_deprecationsr   $  s[    G !( #t- 	#G$!'] #EEN#	##r4   c                      e Zd Zg Z e       ZddZd Zd Zd Z	ddZ
d ZddZd	 Zd
 ZddZd ZddZd ZddZddZd Zedd       Zy)ConfigManagerNc                   i | _         i | _        i | _        || _        | j	                  |xs& dt
        j                  j                  t              z        | _         t        | j                          | j                  t        | j                        | _        | j                  r| j                          d dd| j                   d<   y )Nz%s/base.ymlr=   )r'   typeCONFIG_FILE)
_base_defs_plugins_parsers_config_file_read_config_yaml_filerP   r=   dirname__file__r   r   WARNINGS_parse_config_file)self	conf_file	defs_files      r2   __init__zConfigManager.__init__7  s    %55i6nMTVT[T[TcTcdlTmDmo#DOO4$ 4T]] CD ##% 6:6)J&r4   c                      fd|r7|D ]1  st        fdt        D              } j                  d|       3 y y )Nc                    d|d| dd| z  |dgdd| j                         d|j                         ig||d	}|t        v r5|j                  t        |          |d
k(  rd|vrj                  d      |d<   |S )NzThe z of the z Galaxy serverzgalaxy_server.%s)r{   r}   r*   ANSIBLE_GALAXY_SERVER__)descriptionrM   r   requiredr   r$   r'   GALAXY_SERVER_TIMEOUT)upperGALAXY_SERVER_ADDITIONALupdateget_config_value)r{   r}   r   option_type
config_defr   s        r2   server_config_defz@ConfigManager.load_galaxy_server_defs.<locals>.server_config_defP  s    CFP $6#?" gmmosyy{[\ %#J ..!!":3"?@)#	(C,0,A,ABY,ZJy)r4   c              3  @   K   | ]  \  }}}| |||      f  y wNr-   ).0kreqrd   r   
server_keys       r2   	<genexpr>z8ConfigManager.load_galaxy_server_defs.<locals>.<genexpr>o  s,     WiWXZ]_iQ 1*aj QRs   galaxy_server)rG   GALAXY_SERVER_DEF+initialize_plugin_configuration_definitions)r   server_listdefsr   r   s   `  @@r2   load_galaxy_server_defsz%ConfigManager.load_galaxy_server_defsN  sP    	. ) d
! m~@@R\^bcd r4   c                    t        |t              rQ|j                  d      r@|j                  d      r/|-	 t	               j                  |      }|j                  |      }|S |S # t        $ r Y |S w xY w)Nz{{z}})rT   r   
startswithendswithr   from_stringrenderr   )r   rc   	variablests       r2   template_defaultzConfigManager.template_defaultr  su    e\*0@0@0F5>>Z^K_enez%'33E:+ u  s   *A$ $	A10A1c                    t        |      }t        j                  j                  |      r%t	        |d      5 }t        |      xs i cd d d        S t        dt        |      z        # 1 sw Y    xY w)Nrbz4Missing base YAML definition file (bad install?): %s)r   rP   r=   rR   openr   r	   r   )r   yml_filer   s      r2   r   z$ConfigManager._read_config_yaml_file}  sm     H%77>>(#h% 3 ,23 3BYxEXXZ 	Z3 3s   A''A0c           
     F   || j                   }t        |      }||dk(  r~t        j                  d      | j                  |<   t        t        |      d      5 }	 t        |j                         d      }	 ddd       	 | j                  |   j                         yt        dt        |      z        y# t        $ r}t        d|d	t        |            d}~ww xY w# 1 sw Y   lxY w# t        j                  $ r}t        d
|dt        |            d}~ww xY w)z1 return flat configuration settings from file(s) NrM   );)inline_comment_prefixesr   rJ   rK   zError reading config file(z0) because the config file was not utf8 encoded: zError reading config file (): z'Unsupported configuration file type: %s)r   ry   configparserConfigParserr   r   r   r   readUnicodeErrorr   r   read_stringError)r   rv   rw   fcfg_textrj   s         r2   r   z ConfigManager._parse_config_file  s9    =%%E&~'3'@'@Y_'`e$(5/40 \A\#*1668<Q#R\
lMM%(44X> **SV_`eVf*fgg#  ( \1  GL  NW  XY  NZ  3[  \  \\\ \ $)) l-V[]fgh]i.jkklsB   C"B7 C. 7	C CCC""C+.D DD c                     y)zL Load YAML Config Files in order, check merge flags, keep origin of settingsNr-   )r   s    r2   _find_yaml_config_filesz%ConfigManager._find_yaml_config_files  s    r4   c           	     r    i }| j                  ||      }|D ]  }| j                  ||||||      ||<    |S )Nr.   r*   )r.   r/   keysr   direct)get_configuration_definitionsr   )	r   r.   r*   r   r   r   optionsr   options	            r2   get_plugin_optionsz ConfigManager.get_plugin_options  se    11kPT1U 	VF"33Faelp  }F  OU3  VGFO	V r4   c                    g }| j                  ||      j                         D ]+  }d|v s|d   s|d   D ]  }|j                  |d           - |S Nr   r   r*   )r   valuesr   )r   r.   r*   pvarspdef	var_entrys         r2   get_plugin_varszConfigManager.get_plugin_vars  sh    66;UY6Zaac 	4D~$v,!%f 4ILL6!234	4 r4   c                    g }| j                  ||      j                         D ]4  \  }}d|v s|d   s|d   D ]  }||d   k(  s|j                  |        6 |S r   )r   r   r   )r   r.   r*   variabler   option_namer   r   s           r2   get_plugin_options_from_varz)ConfigManager.get_plugin_options_from_var  sv    !%!C!CP[bf!C!g!m!m!o 	4K~$v,!%f 4I9V#44{34	4
 r4   c                "   i }|| j                   j                  |d       }|S |.| j                  j                  |i       j                  |d       }|S | j                  j                  |i       j                  |i       j                  |d       }|S r   )r   r   r   )r   r*   r.   r/   rets        r2   get_configuration_definitionz*ConfigManager.get_configuration_definition  s    //%%dD1C 
  --##K488tDC 
 --##K488bIMMdTXYC
r4   c                H    d}|| j                   v r|| j                   |   v }|S )NFr   )r   r.   r*   hass       r2   has_configuration_definitionz*ConfigManager.has_configuration_definition  s+    $--'4==55C
r4   c                (   i }|| j                   }nK|| j                  j                  |i       }n,| j                  j                  |i       j                  |i       }|r3t        |j	                               D ]  }|j                  d      s||=  |S )zP just list the possible settings, either base or for specific plugins or plugin r   )r   r   r   r9   r   r   )r   r.   r*   ignore_privater  cdefs         r2   r   z+ConfigManager.get_configuration_definitions  s     //C\--##K4C--##K488rBCSXXZ( "??3'D	" 
r4   c           	        d}d}|D ]r  }|j                  d      }	 |j                  |d      }|*t        |t              rt        |d      }|}|}d|v sP| j                  j                  |d   |d   f       t ||fS # t        $ r6 | j                  j                  dj	                  t        |                   Y w xY w)z( repeat code for value entry assignment Nr*   zCvalue for config entry {0} contains invalid characters, ignoring...rJ   rK   r   )
r   UnicodeEncodeErrorr   r   formatr   rT   r   
DEPRECATEDr   )r   	container
entry_listrc   re   r1   r*   
temp_values           r2   _loop_entrieszConfigManager._loop_entries  s      	QE99V$D&]]46
 %j*FG!(<Q!RJ"  5(OO**E&M5;N+OP#	Q& f} & !!"h"o"opwx|p}"~s   B  <B?>B?c           	         	 | j                  |||||||      \  }}	|S # t        $ r  t        $ r!}
t        d|dt        |
      |
      d}
~
ww xY w)z	 wrapper )rv   r.   r/   r   r   r   z$Unhandled exception when retrieving z:
)orig_excN)get_config_value_and_originr	   r   r   )r   r0   rv   r.   r/   r   r   r   rc   _droprj   s              r2   r   zConfigManager.get_config_value  sz    	s;;F%]h  wBAEQZci < kLE5 	  	 	sPVXabcXdepqrr	ss    AAAc                R   || j                   }dk(  r|dfS d}d}	d}
| j                  ||      v rY   j                  dg       }|r,|v r|   }d}	n |D cg c]  }||v s||    }}|r|d   }d}	|6|r4   j                  d      r | j                  |   d         \  }}	d	|	z  }	|6   j                  d
      r"|r | j                  |   d
         \  }}	d|	z  }	|+|r)|v r|   }}n|r|D ]  }||v s||   }|} n |dz  }	|7d   v r0ddlm} | j                  |j                     d         \  }}	d|	z  }	|B   j                  d      r.| j                  t        j                     d         \  }}	d|	z  }	| j                  j                  |d      | j                  |       ||t        |      }|r   j                  |      r	    |   D ]  }|dk(  rt        | j                  |   |      }n|dk(  rt        d      t        d|z        |C|}|}	|}
d|v sN|dk(  r-| j                  j                  d|d   d|d   |d   f       t        d|z         	 |w   j                  dd      r<|rt*        j                  |i       vrHt-        dt)        t/        ||            z        d }	| j1                     j                  d       |      }	 t3        |   j                  d!      |	|
"      }|4d'   v r,   d'   #d(}   j                  d!      d)k(  rt=        fd*|D               }n
|   d'   v}|rt?           d'   t@              r=d+jC                     d'   jE                         D cg c]  }tG        |       c}      }nlt?           d'   tH              r	   d'   }nMt?           d'   tJ              r/d+jC                     d'   D cg c]  }tG        |       c}      }n   d'   }t9        d,|d-t)        t/        ||            d.|      d   v r4|	d k7  r/| j                  j                     j                  d      f       ||	fS t        d/t)        t/        ||            z        c c}w # t         $ r9}t"        j$                  j'                  d|dt)        |             Y d}~ud}~ww xY w# t4        $ r}|	j7                  d#      r;|dk(  r6d }	t3           j                  d          j                  d!      |	|
"      }n?t9        d$t)        t/        ||            j;                         d%|	d&t)        |            Y d}~|d}~ww xY wc c}w c c}w )0zY Given a config key figure out the actual value and report on the origin of the settings Nr   r,   r   aliasesDirectr   r   zvar: %skeywordzkeyword: %sr)   )contextzcli: %sr   zenv: %srM   rs   z4YAML configuration type has not been implemented yetz#Invalid configuration file type: %sr   [r{   ]r}   zUnimplemented file type: %szError while loading config rt   r   Fz5No setting was provided for required configuration %sr'   r   )re   rf   zenv:z&Invalid type for configuration option z (from r   r(   Tr9   c              3  2   K   | ]  }|   d    v   yw)r(   Nr-   )r   choicer0   r   s     r2   r   z<ConfigManager.get_config_value_and_origin.<locals>.<genexpr>  s      -dTZfVY8O.O-ds   z, zInvalid value "z" for configuration option "z", valid values are: z6Requested entry (%s) was not defined in configuration.)&r   r   r   r  ansibler  CLIARGSrP   environr   r   ry   r   r	   r  r   r   sysstderrwriter   INTERNAL_DEFSr
   r3   r   rl   rX   r   r   rZ   allrT   r   r   r   r   r   r   )r   r0   rv   r.   r/   r   r   r   rc   re   rf   r  aliasdirect_aliasesr  r  rw   r1   r  rj   invalid_choicesr   validcr   s    `                      @r2   r  z)ConfigManager.get_config_value_and_origin  s   =%%E]""9 11kP[1\T>6l&&y"5G V#"6NE%FAH%\EU[OfUm%\N%\% .q 1!)}tF|/?/?/G $ 2 29d6l6>R Sv"V+ }f!1!1)!< $ 2 24fi9P Qv&/ }T> LE$G!( " D=$(KE&+G!	" $*W4F}$v,!6+ $ 2 27??DLQVDW Xv"V+ }f!1!1%!8 $ 2 22::tF|E?R Sv"V+ }}  -5''. }!2'.T&\--e4f%)&\%%8 bE$~-A$--PUBVX]-^
!&&&23i&j j&23X[`3`&a a)5(2)./4#/5#8',~(,(>(>ER[L\^cdi^j@kmrs  nA  @B  )C.:;X[`;`.a(a%b0 }<##J6&&8I8I+WY8Z*Z89p9B:k[fhnCo9p:q r r 'F 11$v,2B2B92MyYE
G#E4<+;+;F+CFamn  Y$v,%>4<PYCZCf"&<##F+v5*--d^c-d*d&dO ',4<	3J&JO"!$v,y"97C $		tF|I?V?[?[?]*^!71:*^ _#DL$;\J $VY 7#DL$;XF $		tF|I?V*W!71:*W X $VY 7-/4i
;Xcek@l6mot/v w w tF|+)0C&&V0@0@0N'OP f} WZcdnoz  }H  JP  eQ  [R   R  S  Sy &]P % f

((PUW`abWc)deef  G$$V,"&F'V(8(8(CT&\EUEUV\E]fl  |H  IE-/8KQ\^d9e/f/l/l/npv  yB  CD  yE/F G G 	G, +_ +XsW   	R3)R3(A
R8 3
R8 >AR8 :!S= $VV$8	S:.S55S:=	VBVVc                b    || j                   vri | j                   |<   || j                   |   |<   y r   r  )r   r.   r*   r   s       r2   r   z9ConfigManager.initialize_plugin_configuration_definitions  s/    dmm+)+DMM+&+/k"4(r4   c                    d}|rd| v r
d| d    d}n	d| d    d}| j                  d| j                  dd	            }d
| d    d| d| S )Nr,   removed_at_datez#Will be removed in a release after z
	zWill be removed in: Ansible 
removed_inalternativesalternativer;   zReason: whyzAlternatives: )r   )dep_docsinclude_removalremovalalts       r2   get_deprecated_msg_from_configz,ConfigManager.get_deprecated_msg_from_config  sz      H,?IZ@[?\\`a8,9O8PPTU ll>8<<v+NO(5/*$wi~cUKKr4   NNr   )NNN)NNF)NNNNNN)F)__name__
__module____qualname__r  r   r   r   r   r   r   r   r   r   r   r  r  r  r   r  r   r  r   staticmethodr9  r-   r4   r2   r   r   2  s{    JuHK."dH	Zh6
"4
Wr0 L Lr4   r   r:  r   )4
__future__r   r_   rU   r   rP   os.pathr$  r   r]   collectionsr   collections.abcr   r   jinja2.nativetypesr   ansible.errorsr   r	   r
   +ansible.module_utils.common.text.convertersr   r   r    ansible.module_utils.common.yamlr   ansible.module_utils.sixr   )ansible.module_utils.parsing.convert_boolr   ansible.parsing.quotingr   ansible.parsing.yaml.objectsr   ansible.utils.pathr   r   r   r   r'  r   r   r3   rl   r[   ry   r   r   r   r   r   r-   r4   r2   <module>rL     s    #    	  
   " - 0 X X T T 6 1 = + E K K Y 8
9;'
   $A7(89:;+,-	 yNz< >B#GLF GLr4   