ó
    x[hg  ã                   ó6  • S r SSKrSSKrSSKrSSKrSSKrSSKJr  SSKJ	r	J
r
Jr  SSKJrJr  \R                  " \5      rSrS rS\S	\4S
 jrS	\R.                  \   4S jrS rS rS rS rS r " S S\	R<                  5      r\\	R@                  44/r!S r"g)zr
This file contains code used to gather the user data passed to an
instance on rootbox / hyperone cloud platforms
é    N)ÚIPv4Address)ÚsourcesÚsubpÚutil)Ú
EventScopeÚ	EventTypez
/etc/hostsc                  óš   • [         R                  " [        SS9n U (       a  [        R	                  S5        g[        R	                  S5        g)NT)Úquietz5/etc/hosts exists - setting manage_etc_hosts to FalseFz=/etc/hosts does not exists - setting manage_etc_hosts to True)r   Úload_text_fileÚ	ETC_HOSTSÚLOGÚdebug)Úhostss    ÚF/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceRbxCloud.pyÚget_manage_etc_hostsr      s7   € Ü×Ò¤	°Ñ6€EÞÜ�	‰	ÐIÔJØÜ‡I�IÐMÔNØó    ÚincÚreturnc           	      óT   • [        [        [        [        U 5      5      U-   5      5      $ ©N)Ústrr   Úint)Úaddrr   s     r   Úincrement_ipr   #   s!   € ÜŒ{œ3œ{¨4Ó0Ó1°CÑ7Ó8Ó9Ð9r   c                 ó4   • U [        U S5      [        U S5      /$ )zŠReturn a list of 3 IP addresses: [addr, addr + 2, addr + 3]

@param addr: an object that is passed to IPvAddress
@return: list of strings
é   é   )r   )r   s    r   Úget_three_ipsr   '   s%   € ð 	Ü�T˜1ÓÜ�T˜1Óðð r   c                 ó6   • [         R                   " S/U -   5      $ )z™
Uses the preferred cloud-init subprocess def of subp.subp
and runs arping.  Breaking this to a separate function
for later use in mocking and unittests
Úarping)r   )Úcmds    r   Ú_sub_arpr"   4   s   € ô �9Š9�h�Z #Ñ%Ó&Ð&r   c           	      óê   • SnUR                   S;   a  SnU  H  n [        SSX#S   US   /5        M     g ! [        R                   a)  n[        R                  SUS   US   U5         S nAMV  S nAff = f)	Nz-S)ÚfedoraÚcentosÚrhelz-sz-cÚ2ÚsourceÚdestinationz&Failed to arping from "%s" to "%s": %s)Únamer"   r   ÚProcessExecutionErrorr   Úwarning)ÚitemsÚdistroÚsource_paramÚitemÚerrors        r   Úgratuitous_arpr2   =   s…   € Ø€LØ‡{�{Ð2Ó2ØˆÛˆð	ÜØ�s˜L¨x©.¸$¸}Ñ:MÐNöò øô
 ×)Ñ)ó 		ô �K‰KØ8Ø�X‘Ø�]Ñ#Ø÷	ò ûð			ús   ›5µA2Á	A-Á-A2c                  óþ  • [        [        R                  " S5      [        R                  " S5      -   5      n U (       d  gU  H+  n [        R                  " U[        / SQS9nU(       a  Us  $ M-     [        R                  SS	R                  U 5      5        g! [
         a*  nUR                  [        R                  :w  a  e  SnAM„  SnAf[        R                   a     [        R                  " [        SU5         Mº  f = f)
zAReturns False (not found or error) or a dictionary with metadata.zLABEL=CLOUDMDzLABEL=cloudmdF)ÚvfatÚfatÚmsdosfs)ÚdeviceÚcallbackÚmtypeNz-Failed to mount %s when looking for user dataz0Did not find RbxCloud data, searched devices: %sÚ,)Úsetr   Úfind_devs_withÚmount_cbÚread_user_data_callbackÚOSErrorÚerrnoÚENOENTÚMountFailedErrorÚlogexcr   r   Újoin)Údevicesr7   Úrbx_dataÚerrs       r   Úget_mdrH   R   s×   € äÜ×Ò˜OÓ,Ü
×
Ò
˜oÓ
.ñ	/ó€Gö ØÛˆð	Ü—}’}ØÜ0Ú0ñˆHö
 Ø’ñ ñ ô" ‡I�IØ:¸C¿H¹HÀWÓ<Môð øô ó 	Ø�y‰yœEŸL™LÓ(Øõ )ûä×$Ñ$ó 	Ü�KŠKÜÐDÀf÷ð	ús   Á$BÂ
C<Â CÃ3C<Ã;C<c                 ó&  • S[        U 5       VVVs/ s Hh  u  pSSR                  [        U5      5      US   R                  5       US    Vs/ s H$  nSUS   US   S	   S
US   S   US   S   S   S.PM&     snS.PMj     snnnS.$ s  snf s  snnnf )zGenerate network configuration

@param netadps: A list of network adapter settings

@returns: A dict containing network config
é   Úphysicalzeth{}Ú
macaddressÚipÚstaticÚaddressÚnetworkÚnetmaskÚautoÚgatewayÚdnsÚnameservers)ÚtyperO   rQ   ÚcontrolrS   Údns_nameservers)rV   r*   Úmac_addressÚsubnets)ÚversionÚconfig)Ú	enumerateÚformatr   Úlower)ÚnetadpsÚiÚnetadprM   s       r   Úgenerate_network_configrc   q   sÌ   € ð ô( ' wÔ/õ'
ò& 0‘	�ð# #ØŸ™¤s¨1£vÓ.Ø% lÑ3×9Ñ9Ó;ð % Tšlóò +˜ð !)Ø#% i¡=Ø#)¨)Ñ#4°YÑ#?Ø#)Ø#)¨)Ñ#4°YÑ#?Ø+1°)Ñ+<¸UÑ+CØ)ñ,ô	ñ +ñô	ñ$ 0ó'
ñð ùòùô
s   ‘;B
Á+BÁ7	B
ÂB
c                 ó”  • [         R                  " [         R                  " [        R                  R                  U S5      S9S9n[         R                  " [        R                  R                  U S5      SS9nSU;  d  SU;  a  [         R                  " [        S	5        g
UR                  S0 5      R                  S5      nUR                  S0 5      R                  S/ 5      nS
nUR                  S0 5      R                  S5      (       a  US   S   S   n[        US   5      nUUS   S   US   S   / S.US    VVV	s/ s H1  nUS     H$  n[        US   S   5        H  n	US   U	S.PM     M&     M3     sn	nnSSSUUS/USUS.0U[        5       S.S.n
[        R                  S5        [        R                  U
5        U
$ s  sn	nnf )zìThis callback will be applied by util.mount_cb() on the mounted
drive.

@param mount_dir: String representing path of directory where mounted drive
is available

@returns: A dict containing userdata, metadata and cfg based on metadata.
z
cloud.json)Úfname)Útextz	user.dataT)re   r
   Úvmrb   z(Failed to load metadata. Invalid format.NÚadditionalMetadataÚusernameÚsshKeysÚpasswordÚsha512Ú_idr*   )zinstance-idzlocal-hostnameúpublic-keysrM   rP   rS   rO   )r(   r)   Údefault_userzALL=(ALL) NOPASSWD:ALLF)r*   ÚgecosÚsudoÚpasswdÚlock_passwdÚssh_authorized_keys)Ú
ssh_pwauthÚdisable_rootÚsystem_infoÚnetwork_configÚmanage_etc_hosts)ÚuserdataÚmetadatar2   Úcfgzreturning DATA object:)r   Ú	load_jsonÚload_binary_fileÚosÚpathrD   r   rC   r   Úgetrc   r   r   r   )Ú	mount_dirÚ	meta_dataÚ	user_datari   Ússh_keysÚhashrP   rb   rM   ÚtargetÚdatas              r   r>   r>   ’   sÝ  € ô —’Ü×"Ò"¬¯©¯©°iÀÓ)NÑOñ€Iô ×#Ò#Ü�g‰g�l‰l˜9 kÓ2¸$ñ€Ið �9Ó °	Ó 9Ü�Š”CÐCÔDØØ�}‰}Ð1°2Ó6×:Ñ:¸:ÓF€HØ�}‰}Ð1°2Ó6×:Ñ:¸9ÀbÓI€Hà€DØ‡}�}Ð)¨2Ó.×2Ñ2°:×>Ñ>ØÐ-Ñ.¨zÑ:¸8ÑDˆä% i°Ñ&9Ó:€Gð à$ T™?¨5Ñ1Ø'¨™o¨fÑ5Øñ
ð $ HÒ-õ
â-�Ø˜T•l�Ü'¨¨yÑ(9¸)Ñ(D×E�ð ˜)‘}°VÔ<ñ Fñ =á"ñ =Ù-ó
ð Ø àØ$Ø%Ø5Ð6Ø"Ø#(Ø+3ñ!ð	ð &Ü 4Ó 6ñ
ñ€Dô> ‡I�IÐ&Ô'Ü‡I�Iˆd„Oà€Kùô7
s   Ä?8Gc                   ó°   • \ rS rSrSr\R                  \R                  \R                  \R                  10rS rS rS r\S 5       rS rS rS	 rS
 rSrg)ÚDataSourceRbxCloudéÒ   ÚRbxCloudc                 ón   • [         R                  R                  XX#5        S U l        S U l        S U l        g r   )r   Ú
DataSourceÚ__init__Úseedr2   r|   )ÚselfÚsys_cfgr.   Úpathss       r   r�   ÚDataSourceRbxCloud.__init__Ü   s.   € Ü×Ñ×#Ñ# D°6ÔAØˆŒ	Ø"ˆÔØˆ�r   c                 óh   • [         R                  R                  U 5      nU< SU R                  < S3$ )Nz [seed=Ú])r   rŽ   Ú__str__r�   )r‘   Úroots     r   r—   ÚDataSourceRbxCloud.__str__â   s'   € Ü×!Ñ!×)Ñ)¨$Ó/ˆÛ!% t§y¤yÐ1Ð1r   c                 ót   • [        5       nUSL a  gUS   U l        US   U l        US   U l        US   U l        g)z_
Metadata is passed to the launching instance which
is used to perform instance configuration.
Frz   r{   r2   r|   T)rH   Úuserdata_rawr{   r2   r|   )r‘   rF   s     r   Ú	_get_dataÚDataSourceRbxCloud._get_dataæ   sK   € ô
 “8ˆØ�uÒØØ$ ZÑ0ˆÔØ  Ñ,ˆŒØ&Ð'7Ñ8ˆÔØ˜E‘?ˆŒØr   c                 ó    • U R                   S   $ )Nrx   ©r|   ©r‘   s    r   rx   Ú!DataSourceRbxCloud.network_configô   s   € à�x‰xÐ(Ñ)Ð)r   c                 ó    • U R                   S   $ )Nrn   )r{   r    s    r   Úget_public_ssh_keysÚ&DataSourceRbxCloud.get_public_ssh_keysø   s   € Ø�}‰}˜]Ñ+Ð+r   c                 ó   • U R                   $ r   )r›   r    s    r   Úget_userdata_rawÚ#DataSourceRbxCloud.get_userdata_rawû   s   € Ø× Ñ Ð r   c                 ó   • U R                   $ r   rŸ   r    s    r   Úget_config_objÚ!DataSourceRbxCloud.get_config_objþ   s   € Ø�x‰xˆr   c                 óD   • [        U R                   U R                  5        g r   )r2   r.   )r‘   r|   Úis_new_instances      r   ÚactivateÚDataSourceRbxCloud.activate  s   € Ü�t×*Ñ*¨D¯K©KÕ8r   )r|   r2   r{   r�   r›   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Údsnamer   ÚNETWORKr   ÚBOOT_NEW_INSTANCEÚBOOTÚBOOT_LEGACYÚdefault_update_eventsr�   r—   rœ   Úpropertyrx   r£   r¦   r©   r­   Ú__static_attributes__© r   r   rŠ   rŠ   Ò   sm   † Ø€Fà×ÑØ×'Ñ'Ø�N‰NØ×!Ñ!ð
ðÐòò2òð ñ*ó ð*ò,ò!òõ9r   rŠ   c                 ó8   • [         R                  " U [        5      $ r   )r   Úlist_from_dependsÚdatasources)Údependss    r   Úget_datasource_listrÀ     s   € Ü×$Ò$ W¬kÓ:Ð:r   )#Ú__doc__r@   Úloggingr   Úos.pathÚtypingÚ	ipaddressr   Ú	cloudinitr   r   r   Úcloudinit.eventr   r   Ú	getLoggerr¯   r   r   r   r   r   r   ÚListr   r"   r2   rH   rc   r>   rŽ   rŠ   ÚDEP_FILESYSTEMr¾   rÀ   r»   r   r   Ú<module>rË      s¶   ðñó Û Û 	Û Û Ý !ç )Ñ )ß 1à×Ò˜Ó!€Ø€	òð:˜Cð : Cô :ð
˜6Ÿ;™; sÑ+ô 
ò'òò*ò>òB=ô@09˜×+Ñ+ô 09ðj ˜'×0Ñ0Ð2Ð3ð€ó;r   