a -@=j4-ã@sðddlZddlZddlZddlmZddlmZmZmZddl m Z ddl m Z m Z ddl mZddl mZddlmZdd lmZdd lmZe e¡ZGd d „d ƒZGd d„de jƒZdd„Zdd„Zdd„Zee j e j!ffgZ"dd„Z#dS)éN)Úsuppress)ÚgaierrorÚ getaddrinfoÚ inet_ntoa)Úpack)ÚsourcesÚsubp)Ú url_helper)Úutil)Údhcp)ÚNoDHCPLeaseError)Úec2c@s(eZdZdZdd„Zdd„Zdd„ZdS) ÚCloudStackPasswordServerClienta– Implements password fetching from the CloudStack password server. http://cloudstack-administration.readthedocs.org/ en/latest/templates.html#adding-password-management-to-your-templates has documentation about the system. This implementation is following that found at https://github.com/shankerbalan/cloudstack-scripts/ blob/master/cloud-set-guest-password-debian cCs ||_dS©N)Úvirtual_router_address)Úselfr©rúJ/usr/lib/python3.9/site-packages/cloudinit/sources/DataSourceCloudStack.pyÚ__init__,sz'CloudStackPasswordServerClient.__init__cCs:t ddddddddd d  |¡d  |j¡g ¡\}}| ¡S) NZwgetz--quietz--triesÚ3z --timeoutZ20z--output-documentú-z--headerzDomU_Request: {0}z{0}:8080)rÚformatrÚstrip)rZ domu_requestÚoutputÚ_rrrÚ _do_request/s õÿz*CloudStackPasswordServerClient._do_requestcCs4| d¡}|dvrdS|dkr&tdƒ‚| d¡|S)NZsend_my_password)ÚÚsaved_passwordZ bad_requestz-Error when attempting to fetch root password.r)rÚ RuntimeError)rÚpasswordrrrÚ get_passwordDs  z+CloudStackPasswordServerClient.get_passwordN)Ú__name__Ú __module__Ú __qualname__Ú__doc__rrr rrrrr s rcsfeZdZdZdZdZdd„Zdd„Zd‡fd d „ Zd d „Z d d„Z dd„Z dd„Z e dd„ƒZ‡ZS)ÚDataSourceCloudStackZ CloudStackéxé2cCsdtj ||||¡tj |jd¡|_d|_||_t |jƒ|_ |j sJt dƒ‚d|j ›d�|_ i|_ dS)NÚcsZlatestzNo virtual router found!zhttp://ú/)rÚ DataSourcerÚosÚpathÚjoinÚseed_dirÚapi_verÚdistroÚget_vr_addressÚvr_addrrÚmetadata_addressÚcfg)rZsys_cfgr0ÚpathsrrrrVs zDataSourceCloudStack.__init__c Csöt d¡dD]}t |¡}|r| ¡Sqt d¡ttjƒ�<t ¡ |j d¡}|rp| ¡WdƒSWdƒn1s„0Yt d|j j j ¡z.|j j   |j j ¡}| d¡}|rÌ| ¡WSWntttfyæYn0t d¡dS) zêTry obtaining a "domain-name" DHCP lease parameter: - From systemd-networkd lease (case-insensitive) - From ISC dhclient - From dhcpcd (ephemeral) - Return empty string if not found (non-fatal) z.Try obtaining domain name from networkd leases)Z DOMAINNAMEZDomainú domain-namezHCould not obtain FQDN from networkd leases. Falling back to ISC dhclientr6NzBCould not obtain FQDN from ISC dhclient leases. Falling back to %sz7No domain name found in any DHCP lease; returning emptyr)ÚLOGÚdebugr Únetworkd_get_option_from_leasesrrÚNoDHCPLeaseMissingDhclientErrorÚ IscDhclientÚget_key_from_latest_leaser0Ú dhcp_clientÚ client_nameÚget_newest_leaseÚfallback_interfaceÚgetr ÚFileNotFoundErrorÚAttributeError)rÚkeyÚ domainnameZ domain_nameÚ latest_leaserrrÚ_get_domainnameds:  ÿ ÿ4ýÿ  z$DataSourceCloudStack._get_domainnameFcsntƒ |||¡}|rjd|jvrjt d¡| ¡}|r^|j›d|›�}t d|¡t ||j¡St d|¡|S)zá Returns instance's hostname / fqdn First probes the parent class method. If fqdn is requested, and the parent method didn't return it, then attach the domain-name from DHCP response. Ú.zFQDN requestedzObtained the following FQDN: %szNCould not determine domain name for FQDN. Fall back to hostname as an FQDN: %s) ÚsuperÚ get_hostnameÚhostnamer7r8rGrZDataSourceHostnameZ is_default)rZfqdnZ resolve_ipZ metadata_onlyrKrE©Ú __class__rrrJ�s   ýz!DataSourceCloudStack.get_hostnamecCs~| ¡}|jdkrdSt |jd¡g}t ¡}tj||j|jt j d�\}}|r\t   d|¡nt   d|t t ¡|ƒ¡t|ƒS)NrFzlatest/meta-data/instance-id)ÚurlsZmax_waitÚtimeoutZ status_cbzUsing metadata source: '%s'z>Giving up on waiting for the metadata from %s after %s seconds)Zget_url_paramsZmax_wait_secondsÚuhelpZ combine_urlr3ÚtimeÚ monotonicZ wait_for_urlZtimeout_secondsr7Zwarningr8ZcriticalÚintÚbool)rZ url_paramsrNÚ start_timeÚurlZ _responserrrÚwait_for_metadata_service«s, ÿÿü üz.DataSourceCloudStack.wait_for_metadata_servicecCs|jSr)r4©rrrrÚget_config_objÊsz#DataSourceCloudStack.get_config_objcCsi}tj||jdd�r>|d|_|d|_t d|j¡dSz¨| ¡sNWdSt  ¡}t   |j |j ¡|_t  |j |j ¡|_t dtt  ¡|ƒ¡t|jƒ}z | ¡}Wn"tyÊt td |j¡Yn0|râd|d did œ|_WdSt�y t td |j ¡YdS0dS) Nr))Úbasez user-dataz meta-dataz%Using seeded cloudstack data from: %sTFz)Crawl of metadata service took %s secondsz/Failed to fetch password from virtual router %sZexpire)Z ssh_pwauthrZchpasswdz(Failed fetching from metadata service %s)r Zread_optional_seedr.Z userdata_rawÚmetadatar7r8rWrQrRr Zget_instance_userdatar/r3Zget_instance_metadatarSrr2r Ú ExceptionZlogexcr4)rZseed_retrUZpassword_clientZ set_passwordrrrÚ _get_dataÍsV  ÿÿþ   ý ÿýýzDataSourceCloudStack._get_datacCs |jdS)Nz instance-id©r[rXrrrÚget_instance_idýsz$DataSourceCloudStack.get_instance_idcCs |jdS)Nzavailability-zoner^rXrrrÚavailability_zonesz&DataSourceCloudStack.availability_zone)FFF)r!r"r#ZdsnameZ url_max_waitZ url_timeoutrrGrJrWrYr]r_Úpropertyr`Ú __classcell__rrrLrr%Ns-ü0r%cCsBztddƒ}Wnty,t d¡YdS0|dddSdS)Nz data-serveréPzDNS Entry data-server not foundré)rrr7r8)ZaddrinforrrÚget_data_servers   recCs^t d¡ ¡}|D]F}| d¡}|ddkrttdt|ddƒƒƒ}t d|¡|SqdS) Nz/proc/net/routeú éZ00000000zro)r0Zlatest_addressrFrrrr1sBþ ÿ ÿ 0 ÿý0 r1cCs t |t¡Sr)rZlist_from_dependsÚ datasources)ZdependsrrrÚget_datasource_listVsrq)$Zloggingr+rQÚ contextlibrZsocketrrrÚstructrZ cloudinitrrr rPr Z cloudinit.netr Zcloudinit.net.dhcpr Zcloudinit.sources.helpersr Z getLoggerr!r7rr*r%reror1ZDEP_FILESYSTEMZ DEP_NETWORKrprqrrrrÚs*        .8  4ÿ