
    Vho                        d dl mZ d dlZd dlZd dl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  e       Zd	 Zdd
Zd Zd Zd Zy)    )annotationsN)MutableMappingMutableSequence)	constants)AnsibleError)six)connection_loader)Displayc                    t        | t              r&| j                         }t        j                  |      }n#t        | t
              r| dd }t        |      }n| S |D ]/  \  }}t        |t        t
        f      rt        |      ||<   +|||<   1 |S )a  Function to create a deep copy of module response data

    Designed to be used within the Ansible "engine" to improve performance
    issues where ``copy.deepcopy`` was used previously, largely with CPU
    and memory contention.

    This only supports the following data types, and was designed to only
    handle specific workloads:

    * ``dict``
    * ``list``

    The data we pass here will come from a serialization such
    as JSON, so we shouldn't have need for other data types such as
    ``set`` or ``tuple``.

    Take note that this function should not be used extensively as a
    replacement for ``deepcopy`` due to the naive way in which this
    handles other data types.

    Do not expect uses outside of those listed below to maintain
    backwards compatibility, in case we need to extend this function
    to handle our specific needs:

    * ``ansible.executor.task_result.TaskResult.clean_copy``
    * ``ansible.vars.clean.clean_facts``
    * ``ansible.vars.namespace_facts``
    N)
isinstancedictcopyr   	iteritemslist	enumeratemodule_response_deepcopy)vretitemskeyvalues        B/home/dcms/DCMS/lib/python3.12/site-packages/ansible/vars/clean.pyr   r      s    : !Tffhc"	At	d# 
UedD\*/6CHCH	 J    c                   |
t               }t        | t              r-| D ]&  }t        |t        t        f      st	        ||       ( | S t        | t              r}t        | j                               D ]_  }t        |t        j                        r|j                  d      r||vr| |= 6t        | |   t        t        f      sPt	        | |   |       a | S t        dt        |       z        )N)
exceptions	_ansible_z!Cannot strip invalid keys from %s)tupler   r   r   strip_internal_keysr   keysr   string_types
startswithr   type)dirtyr   elementks       r   r   r   C   s     W
%) 	DG'NO#DE#G
C	D$ L 
E>	* ejjl# 	EA!S--.<<,*1Da%(^_$EF#E!HD	E L >eLMMr   c                   t        | j                               D ]L  }|j                  d      r|dk7  s|t        j                  v s,t
        j                  d|d| |          | |= N dD ]  }|| v s| |   r| |=  t        | j                  di       j                               D ]+  }|j                  d      s|j                  d      s&| d   |= - y	)
z5
    More nuanced version of strip_internal_keys
    r   _ansible_parsedz2Removed unexpected internal key in module return: z = )warningsdeprecationsansible_factsdiscovered_interpreter_ansible_discovered_interpreter_N)r   r   r!   CINTERNAL_RESULT_KEYSdisplaywarningget)datar   s     r   remove_internal_keysr3   `   s     DIIK  NN;'C3D,DPQPfPfIfOO[^`deh`ijkS	 , $;tCyS	
 DHH_b16689 +>>34Gh8i_%c*+r   c                \   t        |       }t               }t        |j                               }t        j                  D ]3  }|j                  |j                  t        j                  |                5 |j                  |j                  t        j                               t        j                  d      D ]  }t        j                  j                  t        j                  j                  |            d   }t        j                  dt        j                   |      z        }|D ]G  }|j#                  |      r|j%                  d      r|j'                  d      s7|j)                  |       I  t        j*                  t        j,                  z   D ]  }	|	|v s|j)                  |	        t        j                  d      }
|D ]%  }|
j#                  |      s|j)                  |       ' |D ]/  }|j'                  d      rt.        j1                  d	|z         ||= 1 t3        |      S )
zI remove facts that can override internal keys or otherwise deemed unsafe T)	path_onlyr   z^ansible_%s_)_bridge	_gwbridgeansible_become_z^ansible_.*_interpreter$ansible_ssh_host_key_z+Removed restricted key from module data: %s)r   setr   r-   MAGIC_VARIABLE_MAPPINGupdateintersectionCOMMON_CONNECTION_VARSr	   allospathsplitextbasenamerecompileescapematchendswithr!   addRESTRICTED_RESULT_KEYSr.   r/   r0   r   )factsr2   remove_keys	fact_keys	magic_var	conn_path	conn_namere_keyfact_keyhard	re_interpr_keys               r   clean_factsrV   t   s   #E*D%KDIIK I -- X	911!2J2J92UVWX y--a.F.FGH '**T: *	GG$$RWW%5%5i%@A!D	NRYYy-AAB! 	*HX&x/@/@AY/Z_g_r_r  tE  `F)	** ((1+A+AA "9OOD!"
 

56I &??8$OOH%&   78OOIUSTU
 t$$r   c                    i }| D ]=  }|j                  d      r|dvrt        | |         ||dd <   -t        | |         ||<   ? d|iS )z@ return all facts inside 'ansible_facts' w/o an ansible_ prefix ansible_)ansible_local   Nr*   )r!   r   )rK   
deprefixedr%   s      r   namespace_factsr\      sb    J ?<<
#1C(C 8q BJqu4U1X>JqM	? Z((r   )N)
__future__r   r@   rD   collections.abcr   r   ansibler   r-   ansible.errorsr   ansible.module_utilsr   ansible.plugins.loaderr	   ansible.utils.displayr
   r/   r   r   r3   rV   r\    r   r   <module>re      sD    # 	 	 ; " ' $ 4 )
),^:+((%V	)r   