Ë
    x[hO3  ã                   ób  — d 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Zddlm	Z	m
Z
mZ  ej                  e«      Z G d„ de	j                  «      Z G d„ de«      Zdd	„Zd
„ Zd„ Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ Z G d„ de«      Zee	j:                  ffee	j:                  e	j<                  fffZd„ Z d„ Z!y)zZCloud-Init DataSource for OVF

This module provides a cloud-init datasource for OVF data.
é    N)Úminidom)ÚsourcesÚsubpÚutilc                   óD   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	e
d„ «       Zy	)
ÚDataSourceOVFÚOVFc                 óì   — t         j                  j                  | |||«       d | _        t        j
                  j                  |j                  d«      | _        d | _        i | _	        d| _
        d | _        y )NÚovf)ú/zfile://)r   Ú
DataSourceÚ__init__ÚseedÚosÚpathÚjoinÚseed_dirÚenvironmentÚcfgÚsupported_seed_startsÚ_network_config©ÚselfÚsys_cfgÚdistroÚpathss       úA/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceOVF.pyr   zDataSourceOVF.__init__    s\   € Ü×Ñ×#Ñ# D¨'°6¸5ÔAØˆŒ	ÜŸ™Ÿ™ U§^¡^°UÓ;ˆŒØˆÔØˆŒØ%5ˆÔ"Ø#ˆÕó    c                 ód   — t         j                  j                  | «      }|›d| j                  ›d�S )Nz [seed=ú])r   r   Ú__str__r   )r   Úroots     r   r!   zDataSourceOVF.__str__)   s'   € Ü×!Ñ!×)Ñ)¨$Ó/ˆÚ!% t§y£yÐ1Ð1r   c                 óÐ  — g }i }d}d}ddi}t        | j                  j                  «      \  }}|r\t        j                  j                  | j                  j                  |«      }t        |«      \  }}}	|| _        |j                  |«       nddt        fdt        fg}
d }|
D ]  \  }} |«       }|sŒ n |r;t        |d«      \  }}}	|| _        d|v r|d   r
|d   | _        |j                  |«       |syd	|v r¦|d	   r¡|d	   }d}| j                  D ]  }|j                  |«      sŒ|} n |st        j                  d
|| «       yt!        j"                  |d ¬«      \  }}}}t        j                  d|«       t!        j$                  ||g«      }|j                  |«       t!        j$                  ||g«      }dj                  |«      | _        || _        || _        || _        	| _        y)NÚ úinstance-idz	iid-dsovfzcom.vmware.guestInfoÚisoTúnetwork-configFÚseedfromz Seed from %s not supported by %s)ÚtimeoutzUsing seeded cache data from %sú,)Úget_ovf_envr   r   r   r   r   Úread_ovf_environmentr   ÚappendÚtransport_vmware_guestinfoÚtransport_iso9660r   r   Ú
startswithÚLOGÚdebugr   Úread_seededÚmergemanydictr   ÚmetadataÚuserdata_rawÚvendordata_rawr   )r   ÚfoundÚmdÚudÚvdÚdefaultsÚseedfileÚcontentsr   r   ÚnpÚnameÚ	transfuncr(   Ú	seedfoundÚprotoÚmd_seedÚ_s                     r   Ú	_get_datazDataSourceOVF._get_data-   s  € ØˆØˆØˆØˆð ˜;ð
ˆô  +¨4¯:©:×+>Ñ+>Ó?Ñˆ�8áä—7‘7—<‘< §
¡
× 3Ñ 3°XÓ>ˆDÜ0°Ó:‰MˆR��SØ'ˆDÔØ�L‰L˜Õð (Ô)CÐDØÔ)Ð*ðˆBð ˆDØ#%ò ‘��iÙ$›;�ÚÙðñ Ü 4°X¸tÓ D‘��R˜Ø#+�Ô Ø# rÑ)¨bÐ1AÒ.BØ+-Ð.>Ñ+?�DÔ(Ø—‘˜TÔ"ñ Øà˜Ñ  :¢Ø˜*‘~ˆHØˆIØ×3Ñ3ò �Ø×&Ñ& uÕ-Ø %�IÙðñ Ü—	‘	Ð<¸hÈÔMØä#'×#3Ñ#3°HÀdÔ#KÑ ˆW�b˜"˜aÜ�I‰IÐ7¸ÔBä×#Ñ# R¨ MÓ2ˆBØ�L‰L˜Ô"ô ×Ñ  X Ó/ˆà—H‘H˜U“OˆŒ	ØˆŒØˆÔØ ˆÔØˆŒØr   c                 ó    — d| j                   z  S )Nzovf (%s))r   ©r   s    r   Ú_get_subplatformzDataSourceOVF._get_subplatformo   s   € Ø˜DŸI™IÑ%Ð%r   c                 ój   — d| j                   vrg S | j                   d   }t        |t        «      r|S |gS )Núpublic-keys)r5   Ú
isinstanceÚlist)r   Úpkss     r   Úget_public_ssh_keysz!DataSourceOVF.get_public_ssh_keysr   s7   € Ø §¡Ñ-ØˆIØ�m‰m˜MÑ*ˆÜ�cœDÔ"ØˆJà�5ˆLr   c                 ó   — | j                   S ©N)r   rH   s    r   Úget_config_objzDataSourceOVF.get_config_obj~   s   € Ø�x‰xˆr   c                 ó   — | j                   S rQ   )r   rH   s    r   Únetwork_configzDataSourceOVF.network_config�   s   € à×#Ñ#Ð#r   N)Ú__name__Ú
__module__Ú__qualname__Údsnamer   r!   rF   rI   rO   rR   ÚpropertyrT   © r   r   r   r      s;   „ Ø€Fò$ò2ò@òD&òòð ñ$ó ñ$r   r   c                   ó   — e Zd Zd„ Zy)ÚDataSourceOVFNetc                 ó    — t         j                  | |||«       t        j                  j	                  |j
                  d«      | _        d| _        y )Nzovf-net)zhttp://zhttps://)r   r   r   r   r   r   r   r   s       r   r   zDataSourceOVFNet.__init__‡   s8   € Ü×Ñ˜t W¨f°eÔ<ÜŸ™Ÿ™ U§^¡^°YÓ?ˆŒØ%<ˆÕ"r   N)rU   rV   rW   r   rZ   r   r   r\   r\   †   s   „ ó=r   r\   c                 ó  — t        | «      }i }i }d }dg}g d¢}dg}|j                  «       D ]’  \  }	}
|	dk(  rd}	|	|v r|
||	<   Œ|	|v r|
||	<   Œ!|	|v rD|rB	 t        j                  |
j	                  «       «      }t        |«      j                  d«      ||	<   Œi|	dk(  sŒo	 t        j                  |
j	                  «       «      }Œ” |||fS # t        $ r t        j                  d«       Y Œºw xY w# t        $ r |
j	                  «       }Y ŒÙw xY w)	NÚpassword)r(   úlocal-hostnamerK   r%   r'   Úhostnamer`   Únetworkz%Ignore network-config in wrong formatz	user-data)
Úget_propertiesÚitemsÚbase64Ú	b64decodeÚencodeÚsafeload_yaml_or_dictÚgetÚ	Exceptionr1   r2   )r>   Úread_networkÚpropsr9   r   r:   Ú	cfg_propsÚmd_propsÚnetwork_propsÚpropÚvalrT   s               r   r,   r,   �   s$  € Ü˜8Ó$€EØ	€BØ
€CØ	€BØ�€IÚK€HØ%Ð&€MØ—[‘[“]ò "‰	ˆˆcØ�:ÒØ#ˆDØ�8ÑØˆBˆtŠHØ�YÑØˆC�ŠIØ�]Ñ"¡|ðCÜ!'×!1Ñ!1°#·*±*³,Ó!?�Ü0°Ó@×DÑDÀYÓO��4’ð �[Ó ð"Ü×%Ñ% c§j¡j£lÓ3‘ð"ð$ ��Cˆ=Ðøô ò CÜ—	‘	ÐAÖBðCûô
 ò "Ø—Z‘Z“\’ð"ús%   ÁA CÂ#C*ÃC'Ã&C'Ã*DÄDc                 ó   — d}|D ]]  }t         j                  j                  | |«      }t         j                  j                  |«      sŒC	 t	        j
                  |«      }||fc S  y# t        $ r t	        j                  t        d|«       Y Œ‡w xY w)N)zovf-env.xmlzovf_env.xmlzOVF_ENV.XMLzOVF-ENV.XMLzFailed loading ovf file %s)NF)	r   r   r   Úisfiler   Úload_text_filerj   Úlogexcr1   )ÚdirnameÚ	env_namesÚfnameÚfull_fnr>   s        r   r+   r+   ®   s†   € ØL€IØò HˆÜ—'‘'—,‘,˜w¨Ó.ˆÜ�7‰7�>‰>˜'Õ"ðHÜ×.Ñ.¨wÓ7�Ø˜xÐ(Ò(ðHð øô ò HÜ—‘œCÐ!=¸wÖGðHús   Á	A&Á&$BÂBc                 óÜ  — | syt        | t        «      st        d| z  «      ‚t        j                  j                  | «      } | j                  d«      r| j                  d«      d   } | j                  d«      r| j                  d«      d   } n| j                  d«      dkD  ry| syd}t        j                  j                  d|«      }t        j                  |«      }|j                  | «      d	uS )
zûTest if devname matches known list of devices which may contain iso9660
       filesystems.

    Be helpful in accepting either knames (with no leading /dev/) or full path
    names, but do not allow paths outside of /dev/, like /dev/foo/bar/xxx.
    Fz Unexpected input for devname: %sz/dev/éÿÿÿÿr   r   z^(sr[0-9]+|hd[a-z]|xvd.*)ÚCLOUD_INIT_CDROM_DEV_REGEXN)rL   ÚstrÚ
ValueErrorr   r   Únormpathr0   Ú	partitionÚsplitÚcountÚenvironri   ÚreÚcompileÚmatch)ÚdevnameÚdefault_regexÚdevname_regexÚcdmatchs       r   Úmaybe_cdrom_devicer‹   »   sÝ   € ñ ØÜ˜¤Ô%ÜÐ;¸gÑEÓFÐFô �g‰g×Ñ˜wÓ'€Gð ×Ñ˜'Ô"à×#Ñ# GÓ,¨RÑ0ˆð ×Ñ˜#ÔØ—-‘- Ó$ RÑ(‰Ø	�‰�sÓ	˜aÒ	Øñ Øð 1€MÜ—J‘J—N‘NÐ#?ÀÓO€MÜ�j‰j˜Ó'€Gà�=‰=˜Ó!¨Ð-Ð-r   c                 ó   — t        j                  «       }|j                  «       D ]9  \  }}|d   }|dk7  r| rŒt        |«      sŒ|d   }t	        |«      \  }}|dusŒ7|c S  | rd}nd }t        j
                  |rd|z  nd «      D �cg c]  }t        |«      r|‘Œ }	}|	D ]*  }	 t        j                  |t        |¬«      \  }}|dusŒ(|c S  y c c}w # t         j                  $ r t        j                  d|«       Y Œ^w xY w)NÚfstypeÚiso9660Ú
mountpointFzTYPE=%s)Úmtypez%s not mountable as iso9660)
r   Úmountsrd   r‹   r+   Úfind_devs_withÚmount_cbÚMountFailedErrorr1   r2   )
Úrequire_isor‘   ÚdevÚinfor�   ÚmpÚ_fnamer>   r�   Údevss
             r   r/   r/   ä   s%  € ä�[‰[‹]€FØ—\‘\“^ò 	‰	ˆˆTØ�h‘ˆØ�YÒ¡;ØÜ! #Ô&ØØ�,ÑˆÜ(¨›_Ñˆ�Ø˜5Ò ØŠOð	ñ Ø‰àˆô
 ×&Ñ&¹E y°5Ò'8ÀtÓLöàÜ˜cÔ"ò 	ð€Dð ð
 ò ˆð	Ü!%§¡¨s´KÀuÔ!MÑˆV�Xð
 ˜5Ò ØŠOðð ùòøô ×$Ñ$ò 	Ü�I‰IÐ3°SÔ9Ùð	ús   ÂCÂ"CÃ)C=Ã<C=c                 óD   — | |g}t        j                   |«      \  }}|||fS rQ   ©r   ©ÚrpctoolÚargÚcmdÚstdoutÚstderrs        r   Úexec_vmware_rpctoolr£   
  s*   € Ø�Cˆ.€CÜ—y‘y “~Ñ€VˆVØ�˜Ð Ð r   c                 óF   — | d|g}t        j                   |«      \  }}|||fS )Nz--cmdrœ   r�   s        r   Úexec_vmtoolsdr¥     s-   € Ø�G˜SÐ
!€CÜ—y‘y “~Ñ€VˆVØ�˜Ð Ð r   c                  óö  — d\  } }t        j                  d«      }t        j                  d«      }|r|t        }} t        j	                  d|«       |r |s|t
        }} t        j	                  d|«       | st        j	                  d«       y d„ }	  || |«      S # t         j                  $ rÎ}|r4| |k(  r/|j                  dk7  rt        j                  t        d	|«       Y d }~y |st        j                  d
«       Y d }~y 	 t        j                  d«        ||t
        «      cY d }~S # t         j                  $ r4}|j                  dk7  rt        j                  t        d	|«       Y d }~nd }~ww xY wY d }~y d }~ww xY w)N)NNÚvmtoolsdzvmware-rpctoolzdiscovered vmware-rpctool: %szdiscovered vmtoolsd: %szno rpctool discoveredc                 ó  — t         j                  d| «       	  || d«      \  }}}|r|S t         j                  d|«       y # t        j                  $ r7}|j
                  dk7  r!t         j                  d| |j
                  «       |‚d }~ww xY w)Nzquery guestinfo.ovfEnv with %szinfo-get guestinfo.ovfEnvz!cmd %s exited 0 with empty stdouté   z%s exited with code %d)r1   r—   r2   r   ÚProcessExecutionErrorÚ	exit_codeÚwarning)rž   Ú
rpctool_fnr    r¡   rE   Úerrors         r   Úquery_guestinfoz3transport_vmware_guestinfo.<locals>.query_guestinfo-  s   € Ü�‰Ð1°7Ô;ð		Ù'¨Ð1LÓM‰NˆC�˜ÙØ�Ü�I‰IÐ9¸3Ô?ØøÜ×)Ñ)ò 	Ø�‰ !Ò#Ü—‘Ð4°g¸u¿¹ÔOØˆKûð	ús   ˜A  ©A  Á B
Á2BÂB
r©   z+vmtoolsd failed to get guestinfo.ovfEnv: %sz$vmtoolsd fallback option not presentzfallback to vmtoolsd)r   Úwhichr£   r1   r2   r¥   rª   r«   r   ru   r—   )rž   r­   r§   Úvmware_rpctoolr¯   r®   s         r   r.   r.     sJ  € Ø$Ñ€GˆZÜ�z‰z˜*Ó%€HÜ—Z‘ZÐ 0Ó1€Nñ Ø,Ô.A�ˆÜ�	‰	Ð1°>ÔBáñ Ø"*¬M�ZˆGÜ�	‰	Ð+¨XÔ6ñ Ü�	‰	Ð)Ô*Øòðñ ˜w¨
Ó3Ð3øÜ×%Ñ%ò ñ ˜ 8Ò+à�‰ !Ò#Ü—‘ÜÐFÈôô áÜ�H‰HÐ;Ô<Üð	Ü�H‰HÐ+Ô,Ù" 8¬]Ó;Õ;øÜ×)Ñ)ò 	à�‰ !Ò#Ü—‘ÜÐFÈôÿøð	þð ûð9úsH   ÂB ÂE8Â*1E3Ã E3Ã=!D$ÄE8Ä$E+Ä7*E&Å!E3Å&E+Å+E3Å3E8c                 ó„   — g }| j                  «       s|S | j                  D ]  } ||«      sŒ|j                  |«       Œ |S rQ   )ÚhasChildNodesÚ
childNodesr-   )ÚnodeÚfilter_funcÚretÚchilds       r   Ú
find_childr¹   ]  sF   € Ø
€CØ×ÑÔØˆ
Ø—‘ò ˆÙ�uÕØ�J‰J�uÕðð €Jr   c                 óâ  — t        j                  | «      }|j                  j                  dk7  rt	        d«      ‚|j                  j                  «       st	        d«      ‚d}t        |j                  d„ «      }|st	        d«      ‚i }t        |d   d„ «      }|D ]S  }|j                  j                  |d	«      j                  }|j                  j                  |d
«      j                  }|||<   ŒU |S )NÚEnvironmentzNo Environment NodezNo Child Nodesz)http://schemas.dmtf.org/ovf/environment/1c                 ó    — | j                   dk(  S )NÚPropertySection©Ú	localName©Úns    r   ú<lambda>z get_properties.<locals>.<lambda>t  s   €  q§{¡{Ð6GÑ'G€ r   zNo 'PropertySection'sr   c                 ó    — | j                   dk(  S )NÚPropertyr¾   rÀ   s    r   rÂ   z get_properties.<locals>.<lambda>|  s   €  A§K¡K°:Ñ$=€ r   ÚkeyÚvalue)
r   ÚparseStringÚdocumentElementr¿   ÚXmlErrorr³   r¹   Ú
attributesÚgetNamedItemNSrÆ   )	r>   ÚdomÚenvNsURIÚpropSectionsrl   Ú	propElemsÚelemrÅ   rq   s	            r   rc   rc   g  sð   € Ü
×
Ñ
˜hÓ
'€CØ
×Ñ×$Ñ$¨Ò5ÜÐ,Ó-Ð-à×Ñ×,Ñ,Ô.ÜÐ'Ó(Ð(à:€Hô Ø×ÑÑGó€Lñ ÜÐ.Ó/Ð/à€EÜØ�Q‰Ñ=ó€Ið ò ˆØ�o‰o×,Ñ,¨X°uÓ=×CÑCˆØ�o‰o×,Ñ,¨X°wÓ?×EÑEˆØˆˆcŠ
ðð
 €Lr   c                   ó   — e Zd Zy)rÉ   N)rU   rV   rW   rZ   r   r   rÉ   rÉ   ‡  s   „ Ør   rÉ   c                 ó6   — t        j                  | t        «      S rQ   )r   Úlist_from_dependsÚdatasources)Údependss    r   Úget_datasource_listrÖ   “  s   € Ü×$Ñ$ W¬kÓ:Ð:r   c                 ó4   — | si S t        j                  | «      S )z¶
    The meta data could be JSON or YAML. Since YAML is a strict superset of
    JSON, we will unmarshal the data as YAML. If data is None then a new
    dictionary is returned.
    )ÚyamlÚ	safe_load)Údatas    r   rh   rh   —  s   € ñ Øˆ	Ü�>‰>˜$ÓÐr   )F)T)"Ú__doc__re   Úloggingr   r„   Úxml.domr   rØ   Ú	cloudinitr   r   r   Ú	getLoggerrU   r1   r   r   r\   r,   r+   r‹   r/   r£   r¥   r.   r¹   rc   rj   rÉ   ÚDEP_FILESYSTEMÚDEP_NETWORKrÔ   rÖ   rh   rZ   r   r   ú<module>râ      sÒ   ðñó
 Û Û 	Û 	Ý ã ç )Ñ )à€g×Ñ˜Ó!€ôf$�G×&Ñ&ô f$ôR=�}ô =óò>
ò$.óR#òL!ò!òDòNòô@	ˆyô 	ð �W×+Ñ+Ð-Ð.Ø˜×.Ñ.°×0CÑ0CÐDÐEð€ò;ó r   