o m[h?@s:ddlZddlZddlZddlmZddlmZmZmZm Z ddl m Z e e ZGdddejZdddZdd d Zdd d Zd dZGdddeZeejffeejejffgZddZe dkrddlmZejejdedZe e\Z Z!Z"Z#e$de e$de!e$de"e$de#dSdS)N)partial)dmi lifecyclesourcesutil)enicsveZdZdZddZfddZddZdd Zed d Z d e fd dZ ddZ ddZ ddZeddZZS)DataSourceNoCloudNoCloudcCsVtj||||d|_tj|jdtj|jdg|_d|_d|_ d|_ d|_ dS)Nnocloud nocloud-net)/file://) r DataSource__init__seedospathjoinseed_dir seed_dirssupported_seed_starts_network_config _network_eniselfsys_cfgdistropathsrE/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceNoCloud.pyrs zDataSourceNoCloud.__init__csFtd|jrd|jdnd|jtjkr d|jdSdS)z@append seed and dsmode info when they contain non-default values z[seed=]z[dsmode=)super__str__rdsmoderDSMODE_NETWORKr __class__rrr$&s  zDataSourceNoCloud.__str__cCs|td}|tdtd|}|td||td|tt|t|@}|jdd|S)Nz TYPE=vfatz TYPE=iso9660zLABEL=%szLABEL_FATBOOT=%sT)reverse)rfind_devs_withextendupperlowerlistsetsort)rlabelfslist label_listdevlistrrr _get_devices3s  zDataSourceNoCloud._get_devicesc Csd|jd}g}idddd}zi}td}|r*t||r*|dt|d|i}Wnty;tt dYd Swzi}t|rO|d t|d|i}Wnty`tt d Yd Swd dgd dgd}|j D]'}ztj |fi|}||t d|t||}Wn t yYqmw|jdr|d|jd|dd<d |jvrd|jvrt||j}|ddd} |jdd} | durE| dkrtjdddd|| D]c} z5t d| z t| | |}Wnt yt d| | YWqwt||}t d| || Wn,ty3} z| jtjkr)WYd} ~ qd} ~ wtjyDtt d| Yqw|sJd Sd|dvr|dd} d }|jD] }| |rh|}nq\|st|| d St| } tj| dd \}}}}t d!| t|d|g|d<||d <||d <|| t|d|g|d<| |dd"g|_|jt!j"krt d#||jd Sd$#||_$|d|_%|d |_&|d |_'|d|_(|dd%|_)d&S)'Nr ) instance-idr%r") meta-data user-data vendor-datanetwork-configsystem-serial-numberrr8zUnable to parse dmi dataFcmdlinez!Unable to parse command line datar9r:r;)requiredoptionalzUsing seeded data from %sseedfromds_config_seedfrom ds_configcSstj|fi|SN)rpathprefix2dict)mpdatarrr_pp2d_callbacksz3DataSourceNoCloud._get_data.._pp2d_callbackfs_labelcidatazCustom fs_label keys24.3z(This key isn't supported by ds-identify. deprecateddeprecated_version extra_messagezAttempting to use data from %sz)device %s with label=%s not a valid seed.zUsing data from %sz(Failed to mount %s when looking for data)timeoutzUsing seeded cache data from %sr%z&%s: not claiming datasource, dsmode=%s,znetwork-interfacesT)*r%r read_dmi_dataload_cmdline_dataappend_merge_new_seed ExceptionrlogexcLOGrrDdebug ValueErrords_cfggetr.r deprecater6mount_cbwarningOSErrorerrnoENOENTMountFailedErrorr startswith_log_unusable_seedfrom sub_dmi_vars read_seeded mergemanydict_determine_dsmoderDSMODE_DISABLEDrrmetadata userdata_rawvendordata_rawrr)rdefaultsfoundmydatamdserial pp2d_kwargsrseededrGr2dever@ seedfoundprotomd_seedudvd_rrr _get_data?s                                     zDataSourceNoCloud._get_datacCs|js tr dnd|_|jS)Nlxdr )_platform_typeris_lxdr'rrr platform_typeszDataSourceNoCloud.platform_typer@cCtd||j|dS)!Stage-specific level and message.zN%s only uses seeds starting with %s - will try to use %s in the network stage.N)rWinforrr@rrrrds z(DataSourceNoCloud._log_unusable_seedfromcCstjS)z=Return unknown when 'cloud-name' key is absent from metadata.)rMETADATA_UNKNOWNr'rrr_get_cloud_namesz!DataSourceNoCloud._get_cloud_namecCs$|jdr d}nd}d||jfS)z/Return the subplatform metadata source details.z/devz config-diskzseed-dirz%s (%s))rrc)rsubplatform_typerrr_get_subplatforms z"DataSourceNoCloud._get_subplatformcCs:|}|sdSt|d|jg}t|d}|sdS||kS)Nr)dirs)get_instance_idgetattrr_quick_read_instance_id)rrcurrentrquick_idrrrcheck_instance_ids z#DataSourceNoCloud.check_instance_idcCs8|jdur|jdurtjddddt|j|_|jS)Nz$Eni network configuration in NoCloudrJz,You can use network v1 or network v2 insteadrK)rrrr\rconvert_eni_datar'rrrnetwork_configs  z DataSourceNoCloud.network_config)__name__ __module__ __qualname__dsnamerr$r6r|propertyrstrrdrrrr __classcell__rrr(rrs   %  rc Cs|durg}d}i}t|r||vr||S|D].}|durqztj|dgd}t|d}|r<||vr<||WSWqtyFYqwdS)Nr7r8)r>)rRrrD load_yamlrY)riid_keyfilldrFrprrrrs&  rcCsdtjfdtjfg}|D]9\}}t|||sq d|vrdS|d}|r?|dr2tj|d<dS|drs:      !( E