
    Vh5-                        d dl mZ d dlmZmZ d dlZd dlZd dlmZ	 d dl
mZ d dlmZ d dlmZmZ d dlmZ d dlmZ  G d	 d
e      Zy)    )annotations)pathwalkN)AnsibleError)string_types)	to_nativeto_text)
ActionBase)combine_varsc                       e Zd ZdZg dZg dZddgZddgZdZd Z	d	 Z
d fd
	Zd Zd Zd Zd Zd ZddZd Z xZS )ActionModuleF)yamlymljson)dirdepthfiles_matchingignore_files
extensionsignore_unknown_extensionsfile_raw_paramsnamehash_behaviourc                   | j                   sd| _         | j                  r4t        j                  dj	                  | j                              | _        nd | _        | j                  st               | _        t        | j                  t              r | j                  j                         | _        y t        | j                  t              rddj	                  | j                        dS y )Nr   z{0}Tz{0} must be a list)failedmessage)r   r   recompileformatmatcherr   list
isinstancer   splitdictselfs    S/home/dcms/DCMS/lib/python3.12/site-packages/ansible/plugins/action/include_vars.py_set_dir_defaultszActionModule._set_dir_defaults   s    zzDJ::fmmD4G4G&HIDLDL   $Dd''6 $ 1 1 7 7 9D))40/66t7H7HI  1    c                   | j                   j                  j                  dd      | _        | j                   j                  j                  dd      | _        | j                   j                  j                  dd      | _        | j                   j                  j                  dd      | _        | j
                  sb| j                  sV| j                   j                  j                  d      | _        | j                  r | j                  j                  d      | _        | j                   j                  j                  dd      | _        | j                   j                  j                  d	d      | _	        | j                   j                  j                  d
d      | _
        | j                   j                  j                  dd      | _        | j                   j                  j                  d| j                        | _        t        | j                  t              rt!        | j                        | _        t        | j                  t               st#        d      y)z@ Set instance variables based on the arguments that were passed r   Nr   r   r   r   
r   r   r   Fr   r   z7Invalid type for "extensions" option, it must be a list)_taskargsgetr   return_results_as_name
source_dirsource_filerstripr   r   r   r   VALID_FILE_EXTENSIONSvalid_extensionsr#   r   r"   r   r&   s    r(   	_set_argszActionModule._set_args1   s    #jjoo112BDI&*jjoo&9&9&$&G#**//--eT:::??..vt<t'7'7#zz22=AD#'#3#3#:#:4#@ ZZ__(($7
"jjoo112BDI)-)<)<=XZ_)`& JJOO//E $

 3 3L$B\B\ ] d++\:$()>)>$?D!$//6XYY 7r*   c                (   ~|
t               }d| _        g | _        d}d}| j                  j                  D ][  }|| j
                  v r|dz  }|| j                  v r|dz  }+|| j                  v r:t        dj                  t        |                   |r|rt        d      | j                          t               }d}| j                  r| j                          | j                          t        j                   | j                        s'd}dj                  t        | j                              }nt        j"                  | j                        s'd}d	j                  t        | j                              }n| j%                         D ]0  \  }	}
| j'                  |	|
      \  }}}|r nh|j)                  |       2 nT	 | j+                  d
| j,                        | _        | j/                  | j,                        \  }}}|s|j)                  |       | j0                  rt               }||| j0                  <   |}t2        t4        | o  |      }|r||d<   |d<   ns| j8                  g| j8                  t:        j<                  k7  rJ| j8                  dk(  }|j?                         D ](  \  }}|jA                  |d      }tC        |||      ||<   * | j                  |d<   ||d<   | j                   |d<   |S # t        $ r}d}t        |      }Y d}~d}~ww xY w)z6 Load yml files recursively from a directory.
        NTr      z){0} is not a valid option in include_varszGYou are mixing file only and dir only arguments, these are incompatibleFz{0} directory does not existz{0} is not a directoryvars)	task_varsr   r   merge)r;   ansible_included_var_filesansible_facts_ansible_no_log)"r%   show_contentincluded_filesr-   r.   VALID_DIR_ARGUMENTSVALID_FILE_ARGUMENTS	VALID_ALLr   r    r   r6   r1   r)   _set_root_dirr   existsisdir_traverse_dir_depth_load_files_in_dirupdate_find_needler2   _load_filesr0   superr   runr   CDEFAULT_HASH_BEHAVIOURitemsr/   r   )r'   tmpr:   dirsfilesargresultsr   err_msgroot_dir	filenamesupdated_resultsescoperesultmerge_hasheskeyvalue	old_value	__class__s                      r(   rM   zActionModule.runI   s    I   ::?? 	gCd...	111
&"#N#U#UV_`cVd#eff	g Ehii 	&??""$ ;;t/9@@4??A[\ZZ03::9T__;UV+/+C+C+E 4'Hi8<8O8OPXZc8d4FG_NN?3	4
'#'#4#4VT=M=M#N $$T%5%56 1 NN?3 &&FE18E$--.G|T..C%F8 'F9  ,1D1DH`H`1`..'9L%mmo R
U%MM#t4	+IuLQR 04/B/B+,")(,(9(9$9 !1   '#A,'s   =AK1 1	L:LLc                   | j                   j                  r| j                  j                  d      d   dk(  r[t	        j
                  | j                   j                  j                  | j                        }t	        j                  |      rO|| _        y t	        j
                  | j                   j                  j                  d| j                        }|| _        y y t        | j                   j                  d      rgdj                  | j                   j                  j                  j                  d      d d       }t	        j
                  || j                        | _        y y )N/r   r9   _data_source)r-   _roler1   r$   r   join
_role_pathrE   hasattr_dsrd   )r'   path_to_usecurrent_dirs      r(   rD   zActionModule._set_root_dir   s   ::$$S)!,6IIdjj..994??K  ;;{+&1DO II

((33VT__ 
 #. , tzz~~~6HHTZZ^^88>>sCCRHI  #'))K"I	 7r*   c                ~    | j                   j                  dt        |j                        dt        |             y )NzIssue with walking through "z": )_displayvvvr   filename)r'   errors     r(   	_log_walkzActionModule._log_walk   s)    9U^^C\^ghm^nopr*   c              #    K   t        t        | j                  | j                  d            }|j	                  d        |D ]  \  }}}t        t        j                  |      j                  | j                        j                        dz   }| j                  dk7  r|| j                  kD  rj|j	                          ||f  yw)z Recursively iterate over a directory and sort the files in
            alphabetical order. Do not iterate pass the set depth.
            The default depth is unlimited.
        T)onerrorfollowlinksc                    | d   S )Nr    )xs    r(   <lambda>z2ActionModule._traverse_dir_depth.<locals>.<lambda>   s
    qt r*   )r^   r8   r   N)r"   r   r1   rr   sortlenpathlibPathrelative_topartsr   )r'   sorted_walkcurrent_rootrl   current_filescurrent_depths         r(   rG   z ActionModule._traverse_dir_depth   s     
 4UYZ[^,8C 	04L+}\ : F Ft W ] ]^abbMzzQ=4::#= //	0s   CCc                    | j                   D ]*  }	 t        j                  dj                  |      |      r y, y# t        $ r dj                  |      }t        |      w xY w)z Return True if a file matches the list of ignore_files.
        Args:
            filename (str): The filename that is being matched against.

        Returns:
            Boolean
        z{0}$TzInvalid regular expression: {0}F)r   r   searchr    	Exceptionr   )r'   rp   	file_typerV   s       r(   _ignore_filezActionModule._ignore_file   so     ** 	,I,99W^^I6A B	,   ,;BB9M"7++,s	   %;&A!c                    t        j                  |      }t        t        |      dkD  xr |d   dd | j                  v       S )z Verify if source file has a valid extension
        Args:
            source_file (str): The full path of source file or source file.
        Returns:
            Bool
        r8   re   N)r   splitextboolr{   r5   )r'   r2   file_exts      r(   _is_valid_file_extzActionModule._is_valid_file_ext   sA     ==-CMA%S(2,qr*:d>S>S*STTr*   c                B   t               }d}d}|rH| j                  |      s7d}dj                  t        |      dj	                  | j
                              }n| j                  j                  |      \  }}t        |d      }| xj                  |z  c_	        | j                  j                  |||      }|s
t               }t        |t               sd}d	j                  t        |            }n,| j                  j                  |       |j                  |       |||fS )
z Loads a file and converts the output into a valid Python dict.
        Args:
            filename (str): The source file.

        Returns:
            Tuple (bool, str, dict)
        F Tz({0} does not have a valid extension: {1}z, surrogate_or_strict)errors)	file_namer?   z'{0} must be stored as a dictionary/hash)r%   r   r    r   rg   r5   _loader_get_file_contentsr	   r?   loadr#   r@   appendrI   )	r'   rp   validate_extensionsrU   r   rV   b_datar?   datas	            r(   rK   zActionModule._load_files   s    &t'>'>x'HFAHHS[I\^b^g^ghlh}h}^~G#'<<#B#B8#L FL6*?@D-<<$$TXL$YDvdD)DKKIV^L_`##**84t$w''r*   c                &   t               }d}d}|D ]y  }d}| j                  j                  rOt        j                  | j                  j                  j
                  |      t        j                  |dd      k(  rd}kt        j                  ||      }| j                  r| j                  j                  |      sd}|r|r| j                  rht        j                  |      s| j                  |      r| j                  |      s| j                  |d      \  }}}	|r|j                  |	       $t        j                  |      s;| j                  |      rN| j                  |d      \  }}}	|ri|j                  |	       | |||fS )a>   Load the found yml files and update/overwrite the dictionary.
        Args:
            root_dir (str): The base directory of the list of files that is being passed.
            var_files: (list): List of files to iterate over and load into a dictionary.

        Returns:
            Tuple (bool, str, dict)
        Fr   r9   zmain.ymlT)r   )r%   r-   rf   r   rg   rh   r   r!   r   r   rE   r   r   rK   rI   )
r'   rW   	var_filesrU   r   rV   rp   	stop_iterfilepathloaded_datas
             r(   rH   zActionModule._load_files_in_dir   sW    &! 	8HIzz99TZZ--88(CtyyQY[acmGnn $Iyy84H""||**84 $IV11{{8,T5F5Fx5PUYUlUlmuUv7;7G7Gfj7G7k4%#NN;7{{8,T5F5Fx5P7;7G7Gfj7G7k4%#NN;7/	82 w''r*   )NN)F)__name__
__module____qualname__TRANSFERS_FILESr4   rA   rB   rC   _requires_connectionr)   r6   rM   rD   rr   rG   r   r   rK   rH   __classcell__)ra   s   @r(   r   r      si    O3w"M2)*I *Z0PdJ,q0"U(@%(r*   r   )
__future__r   osr   r   r   r|   ansible.constants	constantsrN   ansible.errorsr   ansible.module_utils.sixr   +ansible.module_utils.common.text.convertersr   r	   ansible.plugins.actionr
   ansible.utils.varsr   r   rw   r*   r(   <module>r      s3    #  	   ' 1 J - +Q(: Q(r*   