
    VhZ)                        d dl m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 d dlmZ d dlmZ d d	lmZ d d
lmZ  e       Z G d de      Zy)    )annotationsN)	constants)AnsibleError)Group)Host)string_types)Display)combine_vars)basedirc                  `    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 ZddZd Zd Zd Zd Zy
)InventoryDataz
    Holds inventory data (host and group objects).
    Using it's methods should guarantee expected relationships and data.
    c                    i | _         i | _        i | _        d | _        d | _        g | _        dD ]  }| j                  |        | j                  dd       y )N)all	ungroupedr   r   )groupshosts_groups_dict_cache	localhostcurrent_sourceprocessed_sources	add_group	add_child)selfgroups     F/home/dcms/DCMS/lib/python3.12/site-packages/ansible/inventory/data.py__init__zInventoryData.__init__)   s^    
 #% "!# * 	"ENN5!	"uk*    c                    d | _         | j                  | j                  | j                  | j                  | j
                  d}|S )N)r   r   localsourcer   )r   r   r   r   r   r   r   datas     r   	serializezInventoryData.serialize<   s?    "&kkZZ^^))!%!7!7
 r   c                    i | _         |j                  d      | _        |j                  d      | _        |j                  d      | _        |j                  d      | _        |j                  d      | _        y )Nr   r   r   r    r   )r   getr   r   r   r   r   r!   s     r   deserializezInventoryData.deserializeG   s]    "$XXg&
hhx('*"hhx0!%*=!>r   c                   | j                   r| j                   }|S t        |      }d|_        d|_        t        j
                  }|sd}t        j                  d       |j                  d|       |j                  dd       || _         |S )Nz	127.0.0.1Tz/usr/bin/pythonzUnable to determine python interpreter from sys.executable. Using /usr/bin/python default. You can correct this by setting ansible_python_interpreter for localhostansible_python_interpreteransible_connectionr   )	r   r   addressimplicitsys
executabledisplaywarningset_variable)r   patternnew_host	py_interps       r   _create_implicit_localhostz(InventoryData._create_implicit_localhostO   s    >>~~H& # G}H*H $H I-	 !k l!!">	J!!"6@%DNr   c                V   t         j                  d       d| _        t               }| j                  D ]i  }| j                  |   }|j                  |j                         |j                  dk7  s=|j                         rN| j                  d|j                         k t               }| j                  j                         D ].  }|j                  |j                         |j                         }| j                  d   |v r^t        |      j                  t        | j                  d   | j                  d   g            rm| j                  d   j                  |       nN|j                  sBt        |      }|dk(  s|dk(  r-| j                  d   |v r| j                  d|j                         |j                  st!        | j                  d   j#                         |j$                        |_        1 |j'                  |      D ]  }t         j)                  d|z          i | _        y)z1 Ensure inventory basic rules, run after updates z(Reconcile groups and hosts in inventory.Nr   r   r      z,Found both group and host with same name: %s)r.   debugr   setr   addnameget_ancestorsr   r   values
get_groups
differenceremove_hostr+   lenr
   get_varsvarsintersectionr/   r   )	r   group_namesgr   
host_nameshostmygroupslengthconflicts	            r   reconcile_inventoryz!InventoryData.reconcile_inventoryg   s    	@A"e 	2AKKNEOOEJJ' zzU"5+>+>+@uejj1	2 U
JJ%%' 	SDNN499%(H{{;'83x=++CU1CT[[Q\E]0^,_`KK,88>]]XQ;6Q;4;;u3E3QNN;		: }}(U);)D)D)F		R	%	S* $00< 	WHOOJXUV	W #%r   c                    | j                   j                  |d      }|#|t        j                  v r| j	                  |      }|S )z; fetch host object using name deal with implicit localhost N)r   r%   C	LOCALHOSTr4   )r   hostnamematching_hosts      r   get_hostzInventoryData.get_host   sA     

x6  X%< ;;HEMr   c                   |rt        |t              st        dt        |      d|      || j                  vrit        |      }|j                  | j                  vr8|| j                  |j                  <   i | _        t        j                  d|z         |j                  }|S t        j                  d|z         |S t        d|z        )zM adds a group to inventory if not there already, returns named actually used z7Invalid group name supplied, expected a string but got  for zAdded group %s to inventoryzgroup %s already in inventoryz+Invalid empty/false group name provided: %s)

isinstancer   r   typer   r   r:   r   r.   r7   )r   r   rE   s      r   r   zInventoryData.add_group   s     e\2"imnsitv{#|}}DKK'%L66,*+DKK'.0D+MM"?%"GH 	 =EF  LuTUUr   c                    || j                   v r,| j                   |= t        j                  d|z         i | _        | j                  D ]"  }| j                  |   }|j                  |       $ y )NzRemoved group %s from inventory)r   r.   r7   r   r   remove_group)r   r   rG   hs       r   rW   zInventoryData.remove_group   sa    DKKE"MM;eCD&(D#JJ 	"D

4 ANN5!	"r   Nc                   |rt        |t              st        dt        |      d|      d}|r,|| j                  v r| j                  |   }nt        d|z        || j
                  vr$t        ||      }|| j
                  |<   | j                  rD| j                  |d| j                         | j                  |dt        | j                               n&| j                  |dd       | j                  |dd       t        j                  d|z         |t        j                  v rx| j                  -| j
                  |   | _        t        j                  d|z         n?t        j!                  d	|d
| j                  j"                         n| j
                  |   }|r3|j%                  |       i | _        t        j                  d|d|       |S t        d|z        )zD adds a host to inventory and possibly a group if not there already z6Invalid host name supplied, expected a string but got rS   Nz$Could not find group %s in inventoryinventory_fileinventory_dirzAdded host %s to inventoryzSet default localhost to %sz,A duplicate localhost-like entry was found (z). First found localhost was zAdded host z
 to group z$Invalid empty host name provided: %s)rT   r   r   rU   r   r   r   r   r0   r   r.   r7   rM   rN   r   vvvvr/   r:   add_hostr   )r   rG   r   portrE   rX   s         r   r]   zInventoryData.add_host   s    dL1"hlmqhrtx#yzz ADKK'E*A&'MPU'UVV4::%t$#$

4 &&%%d,<d>Q>QR%%dOWTEXEX=YZ%%d,<dC%%dOTB:dCD 1;;&~~-)-D)9%BQ%FG{|  C  M  M  R  R  )S  TJJt$

1*,'T5IJ  ELMMr   c                    |j                   | j                  v r| j                  |j                   = | j                  D ]"  }| j                  |   }|j                  |       $ y )N)r:   r   r   r?   )r   rG   r   rE   s       r   r?   zInventoryData.remove_host   sO    99

"

499%[[ 	 EE"AMM$	 r   c                    || j                   v r| j                   |   }n,|| j                  v r| j                  |   }nt        d|z        |j                  ||       t        j                  d|d|       y)z) sets a variable for an inventory object z)Could not identify group or host named %szset rS   N)r   r   r   r0   r.   r7   )r   entityvarnamevalue
inv_objects        r   r0   zInventoryData.set_variable   sj     T[[ V,Jtzz!F+JJVSTT/&9:r   c                t   d}|| j                   v r| j                   |   }|| j                   v r|j                  | j                   |         }n;|| j                  v r|j                  | j                  |         }nt	        d|z        i | _        t        j                  d|d|       |S t	        d|z        )z Add host or group to group Fz %s is not a known host nor groupzGroup z now contains z%s is not a known group)r   add_child_groupr   r]   r   r   r.   r7   )r   r   childaddedrE   s        r   r   zInventoryData.add_child  s    DKKE"A#))$++e*<=$**$

4::e#45"#E#MNN&(D#MMuEF  85@AAr   c                    | j                   sW| j                  j                         D ]:  \  }}|j                         D cg c]  }|j                   c}| j                   |<   < | j                   S c c}w )z
        We merge a 'magic' var 'groups' with group name keys and hostname list values into every host variable set. Cache for speed.
        )r   r   items	get_hostsr:   )r   
group_namer   rX   s       r   get_groups_dictzInventoryData.get_groups_dict  sj     &&'+{{'8'8': Z#UGLGX6Y!qvv6Y''
3Z &&& 7Zs   A0)NN)__name__
__module____qualname____doc__r   r#   r&   r4   rK   rQ   r   rW   r]   r?   r0   r   rm    r   r   r   r   #   sJ    
+&	?0*%X
(	"+Z ;"'r   r   )
__future__r   r,   ansibler   rM   ansible.errorsr   ansible.inventory.groupr   ansible.inventory.hostr   ansible.module_utils.sixr   ansible.utils.displayr	   ansible.utils.varsr
   ansible.utils.pathr   r.   objectr   rr   r   r   <module>r}      s:   & # 
 " ' ) ' 1 ) + &
)w'F w'r   