
    Vh|9                        d dl mZ d dlmZ d dlZd dlmc mc mZ	 d dl
mZ  G d de      Z G d de      Z G d	 d
e      Z G d d      Z	 	 	 	 	 ddZd Zd Zd Zd Zd Zd Zd Zd Zd Z	 	 	 	 	 	 ddZy)    )annotations)defaultdictN)timeoutc                      e Zd ZdZy)CycleFoundInFactDepsa   Indicates there is a cycle in fact collector deps

    If collector-B requires collector-A, and collector-A requires
    collector-B, that is a cycle. In that case, there is no ordering
    that will satisfy B before A and A and before B. That will cause this
    error to be raised.
    N)__name__
__module____qualname____doc__     T/home/dcms/DCMS/lib/python3.12/site-packages/ansible/module_utils/facts/collector.pyr   r   (   s     	r   r   c                      e Zd Zy)UnresolvedFactDepNr   r	   r
   r   r   r   r   r   3       r   r   c                      e Zd Zy)CollectorNotFoundErrorNr   r   r   r   r   r   7   r   r   r   c                  d    e Zd Z e       ZdZdZ e       Zd	dZe	d        Z
d Zd Zd	dZd	dZy)
BaseFactCollectorGenericNc                    |xs g | _         || _        t        | j                  g      | _        | j                  j                  | j                         y)zzBase class for things that collect facts.

        'collectors' is an optional list of other FactCollectors for composing.N)
collectors	namespacesetnamefact_idsupdate	_fact_ids)selfr   r   s      r   __init__zBaseFactCollector.__init__B   sA     %* #TYYK(T^^,r   c                F    |j                  dd       | j                  k(  r| S y )Nsystem)get	_platform)clsplatform_infos     r   platform_matchz BaseFactCollector.platform_matchO   s#    Xt,=Jr   c                T    | j                   r| j                   j                  |      S |S N)r   	transform)r    key_names     r   _transform_namez!BaseFactCollector._transform_nameU   s#    >>>>++H55r   c                    |i S t        |j                               D ]'  }| j                  |      }|j                  |      ||<   ) |S )zKupdate a dicts keys to use new names as transformed by self._transform_name)listkeysr-   pop)r    	fact_dictold_keynew_keys       r   _transform_dict_keysz&BaseFactCollector._transform_dict_keysZ   sU     IINN,- 	8G**73G!*w!7Ig	8 r   c                f    | j                  ||      }| j                  r| j                  |      }|S )N)modulecollected_facts)collectr   r5   r    r7   r8   
facts_dicts       r   collect_with_namespacez(BaseFactCollector.collect_with_namespacef   s1    \\\Q
>>22:>Jr   c                
    i }|S )aB  do the fact collection

        'collected_facts' is a object (a dict, likely) that holds all previously
          facts. This is intended to be used if a FactCollector needs to reference
          another fact (for ex, the system arch) and should not be modified (usually).

          Returns a dict of facts.

          r   r:   s       r   r9   zBaseFactCollector.collectm   s     
r   )NN)r   r	   r
   r   r   r%   r   required_factsr!   classmethodr(   r-   r5   r<   r9   r   r   r   r   r   ;   sG    IIDUN-  

	r   r   c                F   |xs dg}| xs
 t               } |xs
 t               }|xs t        t              }t               }t               }dg}|j                  |       t               }|D ]  }	|	}
|
dk(  r|j	                  |       |
dk(  r|j	                  |        4|
j                  d      r9|	dd }	|	dk(  r|j	                  |       a|	dk(  r|j	                  | |z
         {d}nd}|r;|j	                  |j                  |	t                            |j                  |	       |
| vr)t        d|	d	d
j                  t        |                   |j                  |	       |j                  |	        |s|j	                  |        |j                  ||z
         |S )aE  return a set of FactCollector names based on gather_subset spec.

    gather_subset is a spec describing which facts to gather.
    valid_subsets is a frozenset of potential matches for gather_subset ('all', 'network') etc
    minimal_gather_subsets is a frozenset of matches to always use, even for gather_subset='!all'
    allmin!   NTFzBad subset 'z8' given to Ansible. gather_subset options allowed: all, z, )	frozensetr   r   extendr   
startswithr$   add	TypeErrorjoinsorteddifference_update)valid_subsetsminimal_gather_subsetgather_subsetaliases_mapr'   additional_subsetsexclude_subsetsgather_subset_with_minexplicitly_addedsubset	subset_idexcludes               r   get_collector_namesrX   {   s    ",eWM "0Y[M 2@Y[1S!1K eO $W!!-0 u(  +	%%&;<%%m4$ABZF&&'<=&&}7L'LMGG"";??635#AB' -!'6-3H)I!K L L   (""6*A +D !!-0((;K)KLr   c                    t               }t               }|D ]\  }d }| D ]S  }|j                  |      }|s|j                  }||vs(|j                  |       |j                  |j                         U ^ |S r*   )r   r(   r   rH   )all_collector_classescompat_platformsfound_collectorsfound_collectors_namescompat_platformr(   all_collector_classprimary_names           r   find_collectors_for_platformra      s    u U , E#8 	E 1??PN!.33L#99 $$%89&**+>+C+CD	EE  r   c                   t        t              }t        t              }| D ][  }|j                  }||   j	                  |       |j
                  D ]*  }||   j	                  |       ||   j                  |       , ] ||fS r*   )r   r/   r   r   appendr   rH   )collectors_for_platformfact_id_to_collector_maprP   collector_classr`   fact_ids         r   build_fact_id_to_collector_maprh      s    *40c"K2 3&++ .55oF&00 	3G$W-44_E%))'2	33 $[00r   c                    t               }g }| D ]B  }|j                  |g       }|D ])  }||vs|j                  |       |j                  |       + D |S r*   )r   r$   rc   rH   )collector_namesall_fact_subsetsseen_collector_classesselected_collector_classescollector_namecollector_classesrf   s          r   select_collector_classesrp      sn     U!#) <,00D0 	<O&<<*11/B&**?;	<< &%r   c                    t               }	 ||    }|D ]  }|j                  |j                          |S # t        $ r t        d| z        w xY w)NzFact collector "%s" not found)r   KeyErrorr   r   r>   )rn   rk   r>   ro   rf   s        r   _get_requires_by_collector_namers     si    UNW,^< - >o<<=>	  W$%D~%UVVWs	   5 Ac                z    t               }| D ]+  }t        ||      }|D ]  }|| vs|j                  |        - |S )zFind any collector names that have unresolved requires

    Returns a list of collector names that correspond to collector
    classes whose .requires_facts() are not in collector_names.
    )r   rs   rH   )rj   rk   
unresolvedrn   r>   required_facts         r   find_unresolved_requiresrw     sR     J) .8IYZ+ 	.MO3}-	.. r   c                    t               }g }| D ])  }||v r|j                  |       |j                  |       + |rt        ddj	                  |      z        |S )Nzunresolved fact dep %s,)r   rH   rc   r   rJ   )unresolved_requiresrk   	new_namesfailedru   s        r   resolve_requiresr}     sc    IF) &
))MM*%MM*%	&  8388F;K KLLr   c                    t        t              }| D ]=  }t               }||   D ]$  }|j                  D ]  }|j                  |        & |||<   ? |S r*   )r   r   r>   rH   )rj   rk   dep_maprn   collector_deps	collectordeps          r   build_dep_datar   ,  sl    #G) 1).9 	(I // (""3'(	( #11 Nr   c                    g }| j                         }|r[d}t        |j                               D ]*  \  }}|D ]  }||v s  d}||= |j                  ||f       , |st	        d|z        |r[|S )NFTz?Unable to tsort deps, there was a cycle in the graph. sorted=%s)copyr/   itemsrc   r   )r   sorted_listunsorted_mapacyclicnodeedgesedges          r   tsortr   7  s    K<<>L
 2 2 45 	2KD% 2<'2  &""D%=1	2 &'hkv'vww  r   c                    | j                         }| j                         }	 t        ||      }|t               k(  r	 |S t        ||      }|j	                  |       :r*   )r   rw   r   r}   r   )rj   rk   ru   	solutionsr{   s        r   _solve_depsr   M  se     %%'J$$&I
-i9IJ

  %Z1AB	# r   c                   | xs g } |xs
 t               }|xs dt        j                         i}|xs t        j                  }|t        _        |xs
 t               }t        t              }|ddig}t        | |      }t        |      \  }	}t        |	j                               }
t        |
||||      }t        ||	      }t        ||	      }t        |      }|D cg c]  }|d   	 }}t        ||	      }|S c c}w )z6return a list of collector classes that match the argsr#   r   )rM   rN   rO   rP   r'   r   )rE   platformr#   r   DEFAULT_GATHER_TIMEOUTGATHER_TIMEOUTr   r   ra   rh   r0   rX   r   r   r   rp   )rZ   rM   rN   rO   gather_timeoutr'   rP   r[   rd   rk   all_valid_subsetsrj   complete_collector_namesr   ordered_depsxordered_collector_namesrm   s                     r   $collector_classes_from_gather_subsetr   \  s&    27R1@Y[!Bh0A%BM#Ew'E'EN ,G!0Y[M c"K%)'<=:;PRbc
 %CCZ$[!k!"2"7"7"9: *8I@U8E6A8E	GO  +?<LM57GHG>L-9:qt::!9:Q:J"L &% ;s   C7)NNNNN)NNNNNN)
__future__r   collectionsr   r   "ansible.module_utils.compat.typingmodule_utilscompattypingtansible.module_utils.factsr   	Exceptionr   
ValueErrorr   rr   r   r   rX   ra   rh   rp   rs   rw   r}   r   r   r   r   r   r   r   <module>r      s   : # #  . . .	9 		
 		X 	= =@ '+.2&*$(&*	L^01 &	", @D7;?C7;8<7;7&r   