
    VhH                        d dl mZmZmZ eZ	 d dlZd dlZd dlZd dl	Z	d dl
Z
d dlZd dlZd dlmZ d dlmZmZmZ d dlmZ 	 d dlmZ  ej0                  d
      j3                   e               ej0                  d      j3                   e              d dlmZ d dlmZ d dlmZm Z m!Z!m"Z" d dl#m$Z%  G d de&      Z'd Z(e)dk(  r e(        yy# e$ r d dlmZ  G d d	e      ZY w xY w)    )absolute_importdivisionprint_functionN)MutableMapping)integer_types	text_typestring_types)configparser)NullHandler)Handlerc                       e Zd Zd Zy)r   c                      y N )selfrecords     m/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/community/vmware/scripts/inventory/vmware.pyemitzNullHandler.emit7   s        N)__name__
__module____qualname__r   r   r   r   r   r   6   s    	r   r   pspheresuds)Client)ObjectNotFoundError)
HostSystemVirtualMachineManagedObjectClusterComputeResource)Objectc                   \    e Zd ZddZd ZddZddZddZddZddZ	d	 Z
d
 ZddZd Zy)VMwareInventoryNc                 \   t        j                         | _        t        j                  j                  dd      rt        j                  d   g}nDt        j                  j                  t        j                  d         j                  d      dz   dg}|D ]>  }t        j                  j                  |      s#| j                  j                  |        n ||| _        nE| j                  j                  dd      r"| j                  j                  dd      | _        nd	| _        t        j                  j                  d
      }|s8| j                  j                  dd      r| j                  j                  dd      }t        j                  j                  d      }|s8| j                  j                  dd      r| j                  j                  dd      }t        j                  j                  d      }|s8| j                  j                  dd      r| j                  j                  dd      }t        j                  j                  d      }|s8| j                  j                  dd      r| j                  j                  dd      }|sd	}n|j!                         dv rd}nd	}t        j                  j                  d      | _        | j"                  s=| j                  j                  dd      r!| j                  j                  dd      | _        | j"                  rM| j"                  j%                  d      D cg c]#  }|j'                         s|j'                         % c}| _        |s)t)        t*        d      rt*        j,                  t*        _        t1        |||      | _        y c c}w )N
VMWARE_INI r   .pyz.iniz
vmware.inidefaultsguests_onlyTVMWARE_HOSTauthhostVMWARE_USERuserVMWARE_PASSWORDpasswordVMWARE_SSLCHECKsslcheck)nofalseFVMWARE_CLUSTERSclusters,_create_unverified_context)r
   ConfigParserconfigosenvirongetpathabspathsysargvrstripexistsreadr)   
has_option
getbooleanlowerfilter_clusterssplitstriphasattrsslr8   _create_default_https_contextr   client)	r   r)   config_filesconfig_file	auth_host	auth_userauth_passwordr2   xs	            r   __init__zVMwareInventory.__init__E   s   "//1::>>,+JJ|45LGGOOCHHQK8??FOQ]^L' 	Kww~~k*  -	 "*D[[##J>#{{55j-PD#D JJNN=1	T[[33FFC7IJJNN=1	T[[33FFC7I

'89!7!7
!K KKOOFJ?M::>>"34DKK226:F{{vz:HH~~?2   "zz~~.?@##(>(>z:(V#';;??:z#JD 7;7K7K7Q7QRU7V#d!Z[ZaZaZcAGGI#dD  s89474R4R1 Y	=A $es   ;N)N)c                    | j                   j                  dd      rt        j                  j	                  | j                   j                  dd            }t        j                  j                  |      st        j                  |       t        j                  j                  ||      }t        |d      5 }t        j                  ||       ddd       yy# 1 sw Y   yxY w)z?
        Saves the value to cache with the name given.
        r(   	cache_dirwN)r:   rE   r;   r>   
expanduserr=   rC   makedirsjoinopenjsondump)r   namevaluerW   
cache_filecaches         r   
_put_cachezVMwareInventory._put_cache}   s     ;;!!*k:**4;;??:{+STI77>>),I&i6Jj#& (%		%'( ( ;
( (s   6CC c                 J   | j                   j                  dd      r| j                   j                  dd      }t        j                  j                  ||      }t        j                  j                  |      r| j                   j                  dd      r| j                   j                  dd      }nd}t        j                  |      }|j                  |z   t        j                         k\  r*t        |      5 }t        j                  |      cddd       S |S # 1 sw Y   |S xY w)zD
        Retrieves the value from cache for the given name.
        r(   rW   cache_max_ager   N)r:   rE   r=   r;   r>   r[   rC   getintstatst_mtimetimer\   r]   load)r   r_   defaultrW   ra   re   
cache_statrb   s           r   
_get_cachezVMwareInventory._get_cache   s     ;;!!*k:
K@Ii6Jww~~j);;))*oF$(KK$6$6z?$SM$%MWWZ0
''-7DIIKGj) 0U#yy/0 00s   7DD"c                    g }|j                         D ]  \  }}|j                  d      r|r||z   |z   n|}t        |t              r1|j	                  | j                  |||      j                                et        |t        t        f      r't        d |D              s|j                  ||f       |j                  ||f        t        |      S )z
        Flatten nested dicts by combining keys with a separator.  Lists with
        only string items are included as is; any other lists are discarded.
        _c              3   <   K   | ]  }t        |t                y wr   )
isinstancer	   ).0rT   s     r   	<genexpr>z0VMwareInventory._flatten_dict.<locals>.<genexpr>   s     ?
1l3?s   )items
startswithrq   r   extend_flatten_dictlisttupleallappenddict)r   d
parent_keyseprt   kvnew_keys           r   rw   zVMwareInventory._flatten_dict   s    
 GGI 
	+DAq||C .8j3&*aG!^,T//7C@FFHIAe}-?Q?@LL'1.gq\*
	+ E{r   c                 2   |xs
 t               }t        |t              r	 t        t	        |d            }||v r|S |j                  |       |dk  r|S i }t        |      D ]A  }|j                  d      r	 t	        ||      }| j                  ||dz
  |      }|dk7  r|||<   C |S t        |t              r5i }t        |      D ]#  \  }
}| j                  |||      }|dk7  s|||
<   % |S t        |t        t        f      r>g }t        |      D ],  }| j                  |||      }|dk7  s|j                  |       . |S t        |t!        d      t"        t$        ft&        z   t(        z         r|S y# t
        $ r d}Y Iw xY w# t        $ r}	Y d}	~	1d}	~	ww xY w)z
        Recursively build a data structure for the given pSphere object (depth
        only applies to ManagedObject instances).
        r_   r   r   ro      N)setrq   r   r   getattrAttributeErroradddirru   _get_obj_info	Exception
SudsObjectiterrx   ry   r{   typeboolfloatr	   r   )r   objdepthseenobj_unicoder}   attrvalobj_infoekeyls               r   r   zVMwareInventory._get_obj_info   s   
 }suc=)!'V(<= d{""HHSMz""AC 	??3'!#t,C#11#uqy$GH2~"*$	 HZ(A I &S--c5$?r>%AcF& HdE]+ACy '--c5$?r>HHX&' Hd4j$6EUVJI " ! !  ! s#   E0 6,F0E?>E?	FFc                    d|j                   i}dD ](  }	 t        ||      }| j                  |d      |d|z  <   * | j                  |j                  d      j                         D ]>  \  }}t        |t              r|j                         D ]
  \  }}	|	||<    4|dk7  s:|||<   @ 	 |j                  j                  j                  d   j                  j                  j                  |d<   | j%                  ||      }d
|z  |v r|d
|z     |d<   |S # t        $ r g |d|z  <   Y w xY w# t        $ r%}
t        |
t         j"                         Y d	}
~
gd	}
~
ww xY w)zP
        Return a flattened dict with info about the given host system.
        r_   )	datastorenetworkvmr   r   %ssr,   	ipAddress)fileN%s_ipAddressansible_ssh_host)r_   r   r   r   summaryrt   rq   r   r:   r   vnicspecipr   r   printr@   stderrrw   )r   r,   prefix	host_infor   r`   r   r   k2v2r   s              r   _get_host_infozVMwareInventory._get_host_info   su   
 DII
	 3 	-D-d+*.*<*<U!*<*L	%$,'	- &&t||1&=CCE 	!DAq!^,ggi 'FB$&IbM'f 	!	!	&%)[[%8%8%=%=a%@%E%E%H%H%R%RIk" &&y&9	V#	1,5nv6M,NI() " -*,	%$,'-  	&!#**%%	&s*   %D)AD+ D('D(+	E4EEc                    d|j                   i}dD ](  }	 t        ||      }| j                  |d      |d|z  <   * 	 | j                  |j                  d      |d<   	 |j
                  j                  |d<   | j                  |j                  d      j                         D ]E  \  }}t        |t              r%|j                         D ]  \  }}	|d	k(  rd
}|	||<    ;|dk7  sA|||<   G | j                  ||      }d|z  |v r|d|z     |d<   |S # t        $ r g |d|z  <   Y w xY w# t        $ r d|d<   Y w xY w# t        $ r d|d<   Y w xY w)zT
        Return a flattened dict with info about the given virtual machine.
        r_   )r   r   r   r   r   resourcePoolr&   
guestStater,   
hostSystemr   r   r   )r_   r   r   r   r   guestr   r   rt   rq   r   rw   )
r   r   r   vm_infor   r`   r   r   r   r   s
             r   _get_vm_infozVMwareInventory._get_vm_info   s   
 BGG
 - 	+D+D)(,(:(:5(:(J%	+	)&*&8&8PQ&8&RGN#	'$&HH$7$7GL! &&rzz&;AAC 	DAq!^,ggi %FBV|)"$GBK% d
	 $$Wf5V#/*1.62I*JG&'+ " +(*%+  	)&(GN#	)  	'$&GL!	's4   %D D( D< D%$D%(D98D9<EEc                     |j                  |g       }t        |t              r|j                  dg       }n|}||vr|j                  |       yy)zJ
        Add the host to the parent group in the given inventory.
        hostsN
setdefaultrq   r|   r{   )r   invparent_group	host_namep_groupgroup_hostss         r   	_add_hostzVMwareInventory._add_host  sP     ..r2gt$!,,Wb9K!KK'y) (r   c                     |dk7  rU|j                  |i       }t        |t              sd|i||<   ||   }|j                  dg       }||vr|j                  |       |j                  |g        y)zM
        Add a child group to a parent group in the given inventory.
        rz   r   childrenNr   )r   r   r   child_groupr   group_childrens         r   
_add_childzVMwareInventory._add_child'  su     5 nn\26Ggt,%,g$6L!l+$//
B?N.0%%k2{B'r   c                 	   | j                   rd}nd}| j                  |d      }||S ddg ii}|rdi i|d<   t        j                  j	                  t
        j                  d         j                  d	      }| j                   s>| j                  j                  d
d      r| j                  j                  d
d      }n|dz   }| j                  j                  d
d      r| j                  j                  d
d      }n|dz   }| j                  j                  d
d      r| j                  j                  d
d      }nd}| j                  rbg }t        j                  | j                        D ]=  }	|	j                  | j                  v s|	j                   D ]  }
|j#                  |
        ? nt%        j                  | j                        }|D ]  }
| j                   s~| j'                  |d|
j                         | j'                  ||
j                         | j)                  |
      }|r||d   d   |
j                  <   | j+                  |
j                  |       |
j,                  D ]G  }|r|j                  j/                  |      r"| j'                  |d|j                         | j'                  |||j                         | j1                  |      }|r||d   d   |j                  <   | j+                  |j                  |       |j                  dd      }|rC| j3                  ||d       | j3                  |d|       | j'                  |||j                         |j                  dg       D ]E  }| j3                  ||d       | j3                  |d|       | j'                  |||j                         G |j                  dg       D ]E  }| j3                  ||d       | j3                  |d|       | j'                  |||j                         G |j                  dd      }|rC| j3                  ||d       | j3                  |d|       | j'                  |||j                         |j                  dd      }|s| j3                  ||d       | j'                  |d|j                         J  | j+                  ||       |S )zK
        Reads the inventory from cache or VMware API via pSphere.
        __inventory_guests____inventory_all__Nrz   r   hostvars_metar   r'   r(   hw_group_hwvm_group_vmprefix_filtervmware_resourcePoolresource_poolsvmware_datastores
datastoresvmware_networksnetworksvmware_guestIdguestsvmware_templateF	templates)r)   rm   r;   r>   basenamer@   rA   rB   r:   rE   r=   rH   r    rz   rN   r_   r,   r{   r   r   r   rc   r   ru   r   r   )r   meta_hostvars
cache_namer   default_groupr   r   r   r   clusterr,   r   r   r   vm_resourcePoolvm_datastore
vm_network
vm_guestIdvm_templates                      r   get_inventoryzVMwareInventory.get_inventory5  s   
 /J,Jooj$/?Jwm$&+CL((!5<<UC{{%%j*=;;??:zB(50;;!!*j9{{z:>H$u,H;;!!*o> KKOOJHM ME155dkkB +<<4#7#77 ' +T*++ NN4;;/E  4	>D##sE4995sHdii8 //5	 :CCL,TYY7		95 gg )> ww))-8 sE2773sHbgg6++B/ 8?CL,RWW51 #*++.CT"J"OOC3CDOOC)9?KNN3A %,KK0CR$H ?LOOC<@OOC|DNN3bgg>? #*++.?"D =JOOC:>OOCZ@NN3
BGG<= %[[)94@
OOC8<OOC:>NN3
BGG< &kk*;UCOOC;?NN3RWW=S)>4	>l 	
C(
r   c                    | j                  |d      }||S | j                  s3	 t        j                  | j                  |      }| j                  |      }|3	 t        j                  | j                  |      }| j                  |      }|| j                  ||       |xs i S # t        $ r Y Zw xY w# t        $ r Y 4w xY w)zQ
        Read info about a specific host or VM from cache or VMware API.
        N)r_   )
rm   r)   r   r=   rN   r   r   r   r   rc   )r   hostnamer   r,   r   s        r   get_hostzVMwareInventory.get_host  s     ooh-?J!~~dkkA))$/ ;#''(C''+ ?OOHc*yb '  ' s#   2B% 2B4 %	B10B14	C ?C r   )r&   ro   )c   N)vmware)T)r   r   r   rU   rc   rm   rw   r   r   r   r   r   r   r   r   r   r   r#   r#   C   s?    6Bp
($&-^8 D
*(gRr   r#   c                     t        j                         } | j                  ddddd       | j                  ddd d	d
       | j                  ddddd       | j                  ddddd       | j                  ddddd       | j                         \  }}|j                  rt        d      }n
t               }|j                  |j                  |j                        }n|j                  |j                        }i }|j                  r|j                  ddd       t        j                  |t        j                  fi | y )Nz--list
store_truerx   Fz!Output inventory groups and hosts)actiondestrk   helpz--hostr,   HOSTz,Output variables only for the given hostname)r   rk   metavarr   z--prettyprettyzOutput nicely-formatted JSONz--include-host-systemsinclude_host_systemsz'Include host systems in addition to VMsz--no-meta-hostvarsstore_falser   Tz)Exclude ['_meta']['hostvars'] with --list)r)      )indent	sort_keys)optparseOptionParser
add_option
parse_argsr   r#   r,   r   r   r   r   updater]   r^   r@   stdout)parseroptionsargsvmware_inventory	inventoryjson_kwargss         r   mainr    sP   ""$F
h|&#*M  O
hVT6I  K jH#*H  J
.|15D  F *=*DJ  L %%'MGT##*u=*,||$--gll;	$2273H3HI	K~~ad;<IIi3{3r   __main__)*
__future__r   r   r   r   __metaclass__r]   loggingr   r;   rL   r@   ri   /ansible.module_utils.common._collections_compatr   ansible.module_utils.sixr   r   r	   ansible.module_utils.six.movesr
   r   ImportErrorr   	getLogger
addHandlerpsphere.clientr   psphere.errorsr   psphere.managedobjectsr   r   r   r    suds.sudsobjectr!   r   objectr#   r  r   r   r   r   <module>r     s    A @8    	 
 
  J K K 7#   )  ' ' 6   &  $ $[] 3 ! . d d 0sf sl4B zF O  g s   C C&%C&