Ë
    x[hg  ã                   ó2  — d 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mZ  ej                  e«      ZdZd„ Zded	efd
„Zd	ej.                  e   fd„Zd„ Zd„ Zd„ Zd„ Zd„ Z G d„ de	j<                  «      Zee	j@                  ffgZ!d„ Z"y)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                  ó”   — t        j                  t        d¬«      } | rt        j	                  d«       yt        j	                  d«       y)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   — t        t        t        t        | «      «      |z   «      «      S ©N)Ústrr   Úint)Úaddrr   s     r   Úincrement_ipr   #   s!   € ÜŒ{œ3œ{¨4Ó0Ó1°CÑ7Ó8Ó9Ð9r   c                 ó4   — | t        | d«      t        | d«      gS )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                 ó4   — t        j                   dg| z   «      S )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           	      óà   — d}|j                   dv rd}| D ]  }	 t        dd||d   |d   g«       Œ y # t        j                  $ r(}t        j                  d|d   |d   |«       Y d }~ŒSd }~ww xY w)	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   ™2²A-ÁA(Á(A-c                  óÚ  — t        t        j                  d«      t        j                  d«      z   «      } | sy| D ]'  }	 t        j                  |t        g d¢¬«      }|r|c S Œ) t        j                  dd	j                  | «      «       y# t
        $ r(}|j                  t        j                  k7  r‚ Y d}~Œ|d}~wt        j                  $ r t        j                  t        d|«       Y Œ¯w xY w)
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*ÂB6Â61C*Ã)C*c                 ó  — dt        | «      D ���cg c]e  \  }}ddj                  t        |«      «      |d   j                  «       |d   D �cg c]#  }d|d   |d   d	   d
|d   d   |d   d   d   dœ‘Œ% c}dœ‘Œg c}}}dœS c c}w c c}}}w )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Ó/÷'
ð 
ñ& ��6ð# #ØŸ™¤s¨1£vÓ.Ø% lÑ3×9Ñ9Ó;ð % T™löð ð !)Ø#% i¡=Ø#)¨)Ñ#4°YÑ#?Ø#)Ø#)¨)Ñ#4°YÑ#?Ø+1°)Ñ+<¸UÑ+CØ)ñ,ó	òó	ô
ñð ùòùô
s   ‘;B
Á(BÁ4B
ÂB
c                 óz  — t        j                  t        j                  t        j                  j                  | d«      ¬«      ¬«      }t        j                  t        j                  j                  | d«      d¬«      }d|vsd|vrt        j                  t        d	«       y
|j                  di «      j                  d«      }|j                  di «      j                  dg «      }d
}|j                  di «      j                  d«      r|d   d   d   }t        |d   «      }||d   d   |d   d   g dœ|d   D ���	cg c]*  }|d   D ]   }t        |d   d   «      D ]
  }	|d   |	dœ‘Œ Œ" Œ, c}	}}ddd||dg|d|dœi|t        «       dœdœ}
t        j                  d«       t        j                  |
«       |
S c c}	}}w )a   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Ó<ð
Ø<ð
Ø<ô
ð Ø àØ$Ø%Ø5Ð6Ø"Ø#(Ø+3ñ!ð	ð &Ü 4Ó 6ñ
ñ€Dô> ‡I�IÐ&Ô'Ü‡I�Iˆd„Oà€Kùô7
s   Ä;/F6c                   ó¨   — e Zd ZdZej
                  ej                  ej                  ej                  hiZ
d„ Zd„ Zd„ Zed„ «       Zd„ Zd„ Zd„ Zd	„ Zy
)ÚDataSourceRbxCloudÚRbxCloudc                 ór   — t         j                  j                  | |||«       d | _        d | _        d | _        y r   )r   Ú
DataSourceÚ__init__Úseedr2   r|   )ÚselfÚsys_cfgr.   Úpathss       r   rŽ   zDataSourceRbxCloud.__init__Ü   s2   € Ü×Ñ×#Ñ# D¨'°6¸5ÔAØˆŒ	Ø"ˆÔØˆ�r   c                 ód   — t         j                  j                  | «      }|›d| j                  ›d�S )Nz [seed=ú])r   r�   Ú__str__r�   )r�   Úroots     r   r•   zDataSourceRbxCloud.__str__â   s'   € Ü×!Ñ!×)Ñ)¨$Ó/ˆÚ!% t§y£yÐ1Ð1r   c                 ór   — t        «       }|du ry|d   | _        |d   | _        |d   | _        |d   | _        y)zw
        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_datazDataSourceRbxCloud._get_dataæ   sK   € ô
 “8ˆØ�uÑØØ$ ZÑ0ˆÔØ  Ñ,ˆŒØ&Ð'7Ñ8ˆÔØ˜E‘?ˆŒØr   c                 ó    — | j                   d   S )Nrx   ©r|   ©r�   s    r   rx   z!DataSourceRbxCloud.network_configô   s   € à�x‰xÐ(Ñ)Ð)r   c                 ó    — | j                   d   S )Nrn   )r{   rœ   s    r   Úget_public_ssh_keysz&DataSourceRbxCloud.get_public_ssh_keysø   s   € Ø�}‰}˜]Ñ+Ð+r   c                 ó   — | j                   S r   )r˜   rœ   s    r   Úget_userdata_rawz#DataSourceRbxCloud.get_userdata_rawû   s   € Ø× Ñ Ð r   c                 ó   — | j                   S r   r›   rœ   s    r   Úget_config_objz!DataSourceRbxCloud.get_config_objþ   s   € Ø�x‰xˆr   c                 óD   — t        | j                   | j                  «       y r   )r2   r.   )r�   r|   Úis_new_instances      r   ÚactivatezDataSourceRbxCloud.activate  s   € Ü�t×*Ñ*¨D¯K©KÕ8r   N)Ú__name__Ú
__module__Ú__qualname__Údsnamer   ÚNETWORKr   ÚBOOT_NEW_INSTANCEÚBOOTÚBOOT_LEGACYÚdefault_update_eventsrŽ   r•   r™   Úpropertyrx   rž   r    r¢   r¥   © r   r   rŠ   rŠ   Ò   sm   „ Ø€Fà×ÑØ×'Ñ'Ø�N‰NØ×!Ñ!ð
ðÐòò2òð ñ*ó ð*ò,ò!òó9r   rŠ   c                 ó6   — t        j                  | t        «      S 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à€g×Ñ˜Ó!€Ø€	òð:˜Cð : Có :ð
˜6Ÿ;™; sÑ+ó 
ò'òò*ò>òB=ô@09˜×+Ñ+ô 09ðj ˜'×0Ñ0Ð2Ð3ð€ó;r   