
    Vh}A                        d dl mZ d dl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mZmZ d d	lmZ d d
lmZ d dlmZmZ  e       Z G d de      ZddZedk(  r e        yy)    )annotations)CLIN)	constants)context)option_helpers)AnsibleErrorAnsibleOptionsError)to_bytes	to_nativeto_text)combine_vars)Display)get_vars_from_inventory_sourcesget_vars_from_pathc                       e Zd ZdZdZddiZ fdZ fdZ fdZ fdZ	e
d	        Zd
 Zd Zd Ze
d        Ze
d        Ze
d        Ze
dd       ZddZd Zd Zd Zd Z xZS )InventoryCLIzE used to display or dump the configured inventory as Ansible sees it zansible-inventorygroupAThe name of a group in the inventory, relevant when using --graphc                V    t         t        |   |       d | _        d | _        d | _        y N)superr   __init__vmloader	inventory)selfargs	__class__s     E/home/dcms/DCMS/lib/python3.12/site-packages/ansible/cli/inventory.pyr   zInventoryCLI.__init__#   s'    lD*40    c                (   t         t        |   dd       t        j                  | j
                         t        j                  | j
                         t        j                  | j
                         t        j                  | j
                         | j
                  j                  dt        j                  t        j                         | j
                  j                  dddd	
       | j
                  j                  dd      }|j                  ddddd       |j                  ddd dd       |j                  ddddd       | j
                  j                  |       | j
                  j                  dddddd       | j
                  j                  ddddd        | j
                  j                  d!ddd"d#       | j
                  j                  d$dt        j                  d%d&       | j
                  j                  d'd d(d)*       y )+Nzusage: %prog [options] [group]zWShow Ansible inventory information, by default it uses the inventory script JSON format)usagedescz--list-hosts)helpactionr   r   ?r   )metavarnargsr$   Actionsz6One of following must be used on invocation, ONLY ONE!z--list
store_trueFlistz0Output all hosts info, works as inventory script)r%   defaultdestr$   z--hoststorehostzJOutput specific host info, works as inventory script. It will ignore limitz--graphgraphz`create inventory graph, if supplying pattern it must be a valid group name. It will ignore limitz-yz--yamlyamlz<Use YAML format instead of default JSON, ignored for --graphz--tomltomlz<Use TOML format instead of default JSON, ignored for --graphz--vars	show_varsz;Add vars to graph display, ignored unless used with --graphz--exportexportzWhen doing --list, represent in a way that is optimized for export,not as an accurate representation of how Ansible has processed itz--outputoutput_filezHWhen doing --list, send the inventory to a file instead of to the screen)r,   r-   r$   )r   r   init_parseropt_helpadd_inventory_optionsparseradd_vault_optionsadd_basedir_optionsadd_runtask_optionsadd_argumentargparseSUPPRESSUnrecognizedArgumentadd_argument_groupCINVENTORY_EXPORT)r   action_groupr   s     r   r6   zInventoryCLI.init_parser*   s   lD-2j 	. 	l 	&&t{{3""4;;/$$T[[1$$T[[1 	  h6G6GPXPmPm n    KN   	O {{55iAyz!!(<U[  cU!  	V!!(7Dv's 	" 	u!!)L%V] (J 	" 	K&&|4 	  xeZ`&d 	! 	f  ,TZ&d 	! 	f  ,T_&c 	! 	e 	  L!J\J\ck'j 	! 	k 	  T&p 	! 	rr    c                j   t         t        |   |      }|j                  t        _        | j                  |       d}|j                  |j                  |j                  fD ]
  }|s|dz  } |dk(  rt        d      |dkD  rt        d      |j                  r|j                  |_        |S d|_        |S )Nr      zTNo action selected, at least one of --host, --graph or --list needs to be specified.z]Conflicting options used, only one of --host, --graph or --list can be used at the same time.all)r   r   post_process_args	verbositydisplayvalidate_conflictsr+   r/   r0   r	   r   pattern)r   optionsusedoptr   s       r   rH   zInventoryCLI.post_process_argsS   s    d=gF#--( LL',,> 	C		 19%&|}}AX%  'F  G  G <<%llGO  $GOr    c           	        t         t        |           | j                         \  | _        | _        | _        d }t        j                  d   rl| j
                  j                  t        j                  d         }t        |      dk7  rt        d      | j                  |d         }| j                  |      }nt        j                  d   r,| j
                  j                  t        j                  d          t        j                  d   r| j                         }nt        j                  d   r}| j!                  d	      }t        j                  d
   r| j#                  |      }n6t        j                  d   r| j%                  |      }n| j'                  |      }| j                  |      }|ryt        j                  d   }|t(        j)                  |       n9	 t+        t-        |      d      5 }|j/                  t-        |             d d d        t9        j:                  d       t9        j:                  d       y # 1 sw Y   4xY w# t0        t2        f$ r(}t5        dt7        |      dt7        |            d }~ww xY w)Nr/   rF   z5You must pass a single valid host to --host parameterr   r/   subsetr0   r+   rG   r1   r2   r5   wbz%Unable to write to destination file (z): )r   r   run_play_prereqsr   r   r   r   CLIARGS	get_hostslenr	   _get_host_variablesdumprR   inventory_graph
_get_groupyaml_inventorytoml_inventoryjson_inventoryrJ   openr
   writeOSErrorIOErrorr   r   sysexit)	r   resultshostsmyvarstopoutfilefer   s	           r   rT   zInventoryCLI.runk   s   lD%' 04/A/A/C,T^TW??6"NN,,W__V-DEE5zQ)*abb--58-<F ii'G x(%%gooh&?@w'..0(ooe,??6*"11#6G__V,"11#6G"11#6G))G,oom4G(|hw/6 3! 123 HHQK3 3) |&YbcjYkmvwxmy'z{{|s0   I .H<	I <II I?#I::I?c           	     6   t         j                  d   r*dd l}ddlm} t        |j                  | |dd            }|S t         j                  d   rddlm} 	  ||       }|S dd l}ddlm} 	 |j!                  | |dddd      }|S # t        $ r}t        d	|z        d }~wt        $ r }t        d
|j                  d   z        d }~ww xY w# t        $ rC}|j!                  | |dddd      }t"        j%                  dt'        |      z         Y d }~|S d }~ww xY w)Nr1   r   )AnsibleDumperFT)Dumperdefault_flow_styleallow_unicoder2   )
toml_dumpszLThe source inventory contains a value that cannot be represented in TOML: %sa  The source inventory contains a non-string key (%s) which cannot be represented in TOML. The specified key will need to be converted to a string. Be aware that if your playbooks expect this key to be non-string, your playbooks will need to be modified to support this change.)AnsibleJSONEncoder   )cls	sort_keysindentpreprocess_unsafeensure_asciiz?Could not sort JSON output due to issues while sorting keys: %s)r   rV   r1   ansible.parsing.yaml.dumperrn   r   rZ   ansible.plugins.inventory.tomlrr   	TypeErrorr   KeyErrorr   jsonansible.parsing.ajsonrs   dumpsrJ   warningr   )stuffr1   rn   rf   rr   rl   r~   rs   s           r   rZ   zInventoryCLI.dump   sK    ??6"AdiimX]mqirsG2 1 __V$A$U+*  @r**U0Bd[\pt  DI*  J
 )  "beff   " !"q	*   r**U0Be\]qu  EJ*  K admnodp pqq	rs<   B -C 	C	BC	)CC		D8DDc           	     |   |j                         }t        |t        | j                  | j                  j
                  |gd            }t        j                  d   r4t        |t        | j                  t        j                  d   |gd            }|j                  dk7  r|j                  |d<   | j                  |      S )NrG   basedirrF   ansible_group_priority)get_varsr   r   r   r   _sourcesr   rV   r   priority_remove_internal)r   r   ress      r   _get_group_variablesz!InventoryCLI._get_group_variables   s     nn 3 ?T^^MdMdglfmot uv??9%s$6t{{GOOT]D^af`gin$opC>>Q,1NNC()$$S))r    c           	        t         j                  d   r|j                         }t        |t	        | j
                  | j                  j                  |gd            }t         j                  d   rSt        |t        | j
                  t         j                  d   |gd            }n| j                  j                  |dd      }| j                  |      S )Nr4   rG   r   F)r/   include_hostvarsstage)r   rV   r   r   r   r   r   r   r   r   r   )r   r/   hostvarss      r   rY   z InventoryCLI._get_host_variables   s    ??8$}}H $H.Mdkk[_[i[i[r[ruytz  }B  /C  DHy)'2DT[[RYRaRabkRlosntv{2|} ww''TEQV'WH$$X..r    c                P    | j                   j                  j                  |      }|S r   )r   groupsget)r   gnamer   s      r   r\   zInventoryCLI._get_group   s!    %%))%0r    c                @    t         j                  D ]
  }|| v s| |=  | S r   )rB   INTERNAL_STATIC_VARS)rZ   internals     r   r   zInventoryCLI._remove_internal   s/     .. 	#H4N	# r    c                .    dD ]  }|| v s| |   r| |=  y )N)rg   varschildren )rZ   xs     r   _remove_empty_keyszInventoryCLI._remove_empty_keys   s'     / 	ADyaG	r    c           
         g }t        | j                               D ]1  \  }}|j                  t        j	                  d|d|d|             3 |S )N{z = })sorteditemsappendr   _graph_name)rZ   depthresultnamevals        r   
_show_varszInventoryCLI._show_vars   sJ    !$**,/ 	VKT3MM,22$3LeTU	Vr    c                     |rd|z  d| z  z   } | S )Nz  |z--%sr   )r   r   s     r   r   zInventoryCLI._graph_name   s    E?Vd]2Dr    c                ^   | j                  d|j                  z  |      g}|dz   }|j                  D ]#  }|j                  | j	                  ||             % |j                  dk7  r|j
                  D ]t  }|j                  | j                  |j                  |             t        j                  d   sB|j                  | j                  | j                  |      |dz                v t        j                  d   r0|j                  | j                  | j                  |      |             |S )Nz@%s:rF   rG   r3   )r   r   child_groupsextend_graph_grouprg   r   r   rV   r   rY   r   )r   r   r   r   kidr/   s         r   r   zInventoryCLI._graph_group   s   ""6EJJ#6>?	%% 	9CMM$++C78	9 :: ^d..tyy%@A??;/MM$//$2J2J42PRWZ[R["\]^
 ??;'MM$//$*C*CE*JERSr    c                    | j                  t        j                  d         }|r dj                  | j	                  |            S t        d      )NrL   
z3Pattern must be valid group name when using --graph)r\   r   rV   joinr   r	   )r   start_ats     r   r[   zInventoryCLI.inventory_graph  sB    ??7??9#=>99T..x899%&[\\r    c                    t                fd j                  j                  |j                        } |t	        d |D                    }di i|d<   |D ]+  } j                  |      }|s||d   d   |j                  <   - |S )Nc                   i }i || j                   <   | j                   dk7  rC| j                  D cg c]  }|j                   |v s|j                    c}|| j                      d<   g || j                      d<   | j                  D ]o  }|| j                      d   j                  |j                          |j                   vs=|j	                   ||             j                  |j                          q t        j                  d   r!j                  |       || j                      d<   j                  || j                             || j                      s|| j                   = |S c c}w )NrG   rg   r   r4   r   )
r   rg   r   r   updateaddr   rV   r   r   )r   available_hostsrf   hsubgroupformat_groupseen_groupsr   s        r   r   z1InventoryCLI.json_inventory.<locals>.format_group  s1   G"$GEJJzzU"@E/i1qvvYhOh/i

#G,.0GEJJ
+!.. 3

#J/66x}}E==3NN</#JKOOHMM2	3
 x(.2.G.G.N

#F+##GEJJ$785::&EJJ'N 0js   E%E%c              3  4   K   | ]  }|j                     y wr   r   .0r   s     r   	<genexpr>z.InventoryCLI.json_inventory.<locals>.<genexpr>2  s     -Daff-D   r   _meta)setr   rW   r   	frozensetrY   )r   ri   rg   rf   r/   hvarsr   r   s   `     @@r   r_   zInventoryCLI.json_inventory  s    e	* ((2sI-De-D$DE '+ 	@D,,T2E:? ,TYY7	@
 r    c                     t               t                fdt        d  j                  j                  |j                        D              } ||      S )Nc                   i }i || j                   <   i || j                      d<   | j                  D ]  }|j                   dk7  s|j                   v r.|| j                      d   j                  |j                   i i       O|| j                      d   j                   ||             j                  |j                           i || j                      d<   | j                   dk7  r|| j                  D ]m  }|j                   |vri }|j                   	vr-	j                  |j                          
j                  |      }||| j                      d   |j                   <   o t        j                  d   r%
j                  |       }|r||| j                      d<   
j                  || j                             || j                      s|| j                   = |S )Nr   rG   rg   rQ   r4   r   )
r   r   r   r   rg   rY   r   rV   r   r   )r   r   rf   r   r   rh   gvarsr   r   
seen_hostsr   s          r   r   z1InventoryCLI.yaml_inventory.<locals>.format_groupB  s   G #%GEJJ /1GEJJ
+!.. 7==E)}}3

+J7>>r?RS

+J7>>|HVe?fg#67 ,.GEJJ(zzU" BAvv_4 FvvZ/"qvv.!%!9!9q!9!A;AGEJJ'08B x(11%827GEJJ'/##GEJJ$785::&EJJ'Nr    c              3  4   K   | ]  }|j                     y wr   r   r   s     r   r   z.InventoryCLI.yaml_inventory.<locals>.<genexpr>j       #WqAFF#Wr   )r   r   r   rW   r   )r   ri   r   r   r   r   s   `  @@@r   r]   zInventoryCLI.yaml_inventory=  sI    U
e&	P $#WDNN4L4LSXX4V#WWC11r    c                    t               t               t        t        d |j                  D                     fdt	        d  j
                  j                  |j                        D              } ||      }|S )Nc              3  T   K   | ]   }|j                   d k(  s|j                   " yw)	ungroupedN)r   rg   )r   gs     r   r   z.InventoryCLI.toml_inventory.<locals>.<genexpr>p  s      !]aqvvQ\G\!''!]s   ((c                   i }i || j                   <   g || j                      d<   | j                  D ]f  }|j                   dk(  rs| j                   dk7  r+|| j                      d   j                  |j                          |j                   ||             h | j                   dk7  r~| j                  D ]o  }|j                   |vr|j                   vr.j                  |j                          	j                  |      }ni }	 ||| j                      d   |j                   <   q t        j                  d   r!	j                  |       || j                      d<   	j                  || j                             || j                      s|| j                   = |S # t        $ r" |j                   |i|| j                      d<   Y w xY w)Nr   r   rG   rQ   rg   r4   r   )r   r   r   r   rg   r   rY   r}   r   rV   r   r   )
r   r   rf   r   r/   	host_varsr   has_ungroupedr   r   s
         r   r   z1InventoryCLI.toml_inventory.<locals>.format_groupr  s   G"$GEJJ.0GEJJ
+!.. H==K/::&EJJ'
3::8==I|HoFGH zzU"!KK NDyy7 yy
2"tyy1$($<$<$$<$G	$&	NBK

+G4TYY?N x(.2.G.G.N

#F+##GEJJ$785::&EJJ'N $ N8<		97M

+G4Ns   F'GGc              3  4   K   | ]  }|j                     y wr   r   r   s     r   r   z.InventoryCLI.toml_inventory.<locals>.<genexpr>  r   r   )r   boolnextr   r   r   rW   r   )r   ri   r   rf   r   r   r   s   `   @@@r   r^   zInventoryCLI.toml_inventorym  sh    U
U
T!]33C3C!]]^"	H $#WDNN4L4LSXX4V#WWsO4r    )r   )__name__
__module____qualname____doc__r   	ARGUMENTSr   r6   rH   rT   staticmethodrZ   r   rY   r\   r   r   r   r   r   r[   r_   r]   r^   __classcell__)r   s   @r   r   r      s    OD]`I%rR00d  @*/         
$]#J.2`,r    r   c                .    t         j                  |        y r   )r   cli_executor)r   s    r   mainr     s    d#r    __main__r   )
__future__r   ansible.clir   rd   r>   ansibler   rB   r   ansible.cli.argumentsr   r7   ansible.errorsr   r	   +ansible.module_utils.common.text.convertersr
   r   r   ansible.utils.varsr   ansible.utils.displayr   ansible.vars.pluginsr   r   rJ   r   r   r   r   r    r   <module>r      s_    #  
  "  < < T T + ) T
)}3 }@$ zF r    