3 cjZ@sdZddlZddlZddlZddlZddlZddlmZddlm Z m Z m Z ddl m Z mZejeZdZddZeed d d Zejed d dZddZddZddZddZddZGddde jZee j ffgZ!ddZ"dS)zr This file contains code used to gather the user data passed to an instance on rootbox / hyperone cloud platforms N) IPv4Address)sourcessubputil) EventScope EventTypez /etc/hostscCs.tjtdd}|r tjddStjddS)NT)quietz5/etc/hosts exists - setting manage_etc_hosts to FalseFz=/etc/hosts does not exists - setting manage_etc_hosts to True)r load_file ETC_HOSTSLOGdebug)Zhostsr (/usr/lib/python3.6/DataSourceRbxCloud.pyget_manage_etc_hostss   r)increturncCstttt||S)N)strrint)addrrr r r increment_ip#sr)rcCs|t|dt|dgS)zReturn 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)rr r r get_three_ips'srcCstjdg|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 Zarping)r)cmdr r r_sub_arp4srcCsd}|jd krd}xh|D]`}ytdd ||d |d gWqtjk rv}ztjd |d |d |WYdd}~XqXqWdS)Nz-S almalinuxfedoracentos cloudlinuxrhelz-sz-c2source destinationz&Failed to arping from "%s" to "%s": %s)rrrrr)namerrZProcessExecutionErrorr Zwarning)itemsdistroZ source_paramitemerrorr r rgratuitous_arp=s  r(cCsttjdtjd}|s dSx|D]z}y"tj|tdddgd}|rJ|SWq&tk r|}z|jtjkrlWYdd}~Xq&tjk rtj t d |Yq&Xq&Wt j d d j |dS) zAReturns False (not found or error) or a dictionary with metadata.z LABEL=CLOUDMDz LABEL=cloudmdFZvfatZfatZmsdosfs)devicecallbackZmtypeNz-Failed to mount %s when looking for user dataz0Did not find RbxCloud data, searched devices: %s,) setrZfind_devs_withZmount_cbread_user_data_callbackOSErrorerrnoENOENTZMountFailedErrorlogexcr r join)Zdevicesr)rbx_dataerrr r rget_mdRs,  r5cCsdddt|DdS)zGenerate network configuration @param netadps: A list of network adapter settings @returns: A dict containing network config csBg|]:\}ddjt|djfdddDdqS)Zphysicalzeth{}Z macaddressc s>g|]6}d|ddddddddddqS) ZstaticaddressnetworknetmaskautogatewayZdnsZ nameservers)typer7r9Zcontrolr;Zdns_nameserversr ).0ip)netadpr r s z6generate_network_config...r>)r<r#Z mac_addressZsubnets)formatrlower)r=ir )r?rr@{sz+generate_network_config..)versionconfig) enumerate)Znetadpsr r rgenerate_network_configqsrGc Cstjtjtjj|dddd}tjtjj|ddd}d|ksHd |krXtjtd d S|jd ijd }|jd ijdg}d }|jd ijdr|d dd}t |d }||dd|ddgddd|d Dddd||dg|d|di|t dd}tj dtj ||S)aThis 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.jsonF)fnamedecode)textz user.dataT)rHrZvmr?z(Failed to load metadata. Invalid format.NZadditionalMetadatausernameZsshKeysZpasswordZsha512Z_idr#)z instance-idzlocal-hostnamez public-keyscSs>g|]6}|dD](}t|ddD]}|d|dq$qqS)r>r8r;r7)r!r")r)r=r?r>targetr r rr@s z+read_user_data_callback..Z default_userzALL=(ALL) NOPASSWD:ALL)r#ZgecosZsudoZpasswdZ lock_passwdZssh_authorized_keys)Z ssh_pwauthZ disable_rootZ system_infonetwork_configZmanage_etc_hosts)userdatametadatar(cfgzreturning DATA object:) rZ load_jsonr ospathr2r1r getrGrr )Z mount_dirZ meta_dataZ user_datarKZssh_keyshashr8datar r rr-sD        r-c@sjeZdZdZejejejej hiZ ddZ ddZ ddZ edd Zd d Zd d ZddZddZdS)DataSourceRbxCloudZRbxCloudcCstjj||||d|_dS)N)r DataSource__init__seed)selfZsys_cfgr%pathsr r rrXszDataSourceRbxCloud.__init__cCstjj|}d||jfS)Nz %s [seed=%s])rrW__str__rY)rZrootr r rr\s zDataSourceRbxCloud.__str__cCs>t}|dkrdS|d|_|d|_|d|_|d|_dS)zw Metadata is passed to the launching instance which is used to perform instance configuration. FrNrOr(rPT)r5 userdata_rawrOr(rP)rZr3r r r _get_datas    zDataSourceRbxCloud._get_datacCs |jdS)NrM)rP)rZr r rrMsz!DataSourceRbxCloud.network_configcCs |jdS)Nz public-keys)rO)rZr r rget_public_ssh_keyssz&DataSourceRbxCloud.get_public_ssh_keyscCs|jS)N)r^)rZr r rget_userdata_rawsz#DataSourceRbxCloud.get_userdata_rawcCs|jS)N)rP)rZr r rget_config_objsz!DataSourceRbxCloud.get_config_objcCst|j|jdS)N)r(r%)rZrPZis_new_instancer r ractivateszDataSourceRbxCloud.activateN)__name__ __module__ __qualname__ZdsnamerZNETWORKrZBOOT_NEW_INSTANCEZBOOTZ BOOT_LEGACYZdefault_update_eventsrXr\r_propertyrMr`rarbrcr r r rrVs  rVcCs tj|tS)N)rZlist_from_depends datasources)Zdependsr r rget_datasource_list sri)#__doc__r/ZloggingrQZos.pathZtypingZ ipaddressrZ cloudinitrrrZcloudinit.eventrrZ getLoggerrdr r rrrrZListrrr(r5rGr-rWrVZDEP_FILESYSTEMrhrir r r r s*     !B3