x[hD VdZddlZddlZddlZddlZddlZddlmZmZddl m Z ddl m Z m Z mZmZmZmZmZddlZddlmZddlmZddlmZdd lmZmZmZmZmZdd l m!Z!ejDe#Z$d Z%d Z&d Z'dddddddZ(de)fdZ* d1deee)de e)e ffdZ+GddeZ,GddeZ-GddeZ.de)de/fdZ0GddejbZ2 d2d ejfd!e)d"e4fd#Z5 d2d ejfd!e)d"e4dejlfd$Z7Gd%d&eZ8Gd'd(Z9e&e8jtfd)e)d*e8de/fd+Z;e2ejxffgZ=d,Z>e#d-k(rSddl?Z?d.Z@e?je@/ZBeBjeDeje;e8jt0yy)3aDatasource for LXD, reads /dev/lxd/sock representation of instance data. Notes: * This datasource replaces previous NoCloud datasource for LXD. * Older LXD images may not have updates for cloud-init so NoCloud may still be detected on those images. * Detect LXD datasource when /dev/lxd/sock is an active socket file. * Info on dev-lxd API: https://documentation.ubuntu.com/lxd/en/latest/dev-lxd/ N)Flagauto)JSONDecodeError)AnyDictListOptionalTupleUnioncast) HTTPAdapter)HTTPConnection)HTTPConnectionPool) atomic_helpersourcessubp url_helperutil)find_fallback_nicz /dev/lxd/sockz1.0z http://lxd user-datanetwork-config vendor-data)cloud-init.user-datazcloud-init.network-configcloud-init.vendor-datauser.user-datazuser.network-configuser.vendor-datareturncJd}tjdrS tjdg\}}|j dvr't jdd}|dk(ry|d k(ry y |S#tj$r"}tj d||cYd}~Sd}~wwxYw) Neth0zsystemd-detect-virtzHUnable to run systemd-detect-virt: %s. Rendering default network config.)kvmqemuunameppc64leenp0s5s390xenc9enp5s0)rwhichProcessExecutionErrorLOGwarningstripr system_info) default_name virt_type_errarchs A/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceLXD.py_get_fallback_interface_namer5/sL zz'( 99&;%<=LIq ?? !  ##%g.q1Dy  %)) KK5     sA--B"BB"B"nicsct}|rtjd|n t}tjd|dd|dddgdgd S) zCReturn network config V1 dict representing instance network config.zCLXD datasource generating network from discovered active device: %szVLXD datasource generating network from systemd-detect-virt platform default device: %sphysicaldhcpr)typecontrol)r;namesubnets)versionconfig)rr+debugr5)r6 primary_nics r4generate_network_configrCIsm$%K    34   +  ##%+?@    c$eZdZfdZdZxZS)SocketHTTPConnectionc@t|d||_d|_yN localhost)super__init__ socket_pathsockselfrL __class__s r4rKzSocketHTTPConnection.__init__ps %& rDctjtjtj|_|jj |j yN)socketAF_UNIX SOCK_STREAMrMconnectrLrOs r4rVzSocketHTTPConnection.connectus6MM&..&2D2DE  $**+rD)__name__ __module__ __qualname__rKrV __classcell__rPs@r4rFrFos  ,rDrFc$eZdZfdZdZxZS)SocketConnectionPoolc2||_t| dyrH)rLrJrKrNs r4rKzSocketConnectionPool.__init__{s& %rDc,t|jSrR)rFrLrWs r4 _new_connzSocketConnectionPool._new_conns#D$4$455rD)rXrYrZrKrar[r\s@r4r^r^zs &6rDr^ceZdZddZ ddZy)LXDSocketAdapterNc ttSrR)r^LXD_SOCKET_PATH)rOurlproxiess r4get_connectionzLXDSocketAdapter.get_connections #O44rDc:|j|j|SrR)rhrf)rOrequestverifyrgcerts r4get_connection_with_tls_contextz0LXDSocketAdapter.get_connection_with_tls_contexts""7;;88rDrR)NN)rXrYrZrhrmrDr4rcrcs5 379rDrc metadata_typect|tr|S|iS tj|}|&t j dj|||S#t$r,}t j dj|||d}~wwxYw)a6Convert raw instance data from str, bytes, YAML to dict :param metadata_type: string, one of as: meta-data, vendor-data, user-data network-config :param metadata_value: str, bytes or dict representing or instance-data. :raises: InvalidMetaDataError on invalid instance-data content. NzAInvalid {md_type}. Expected str, bytes or dict but found: {value})md_typevaluez:Invalid {md_type} format. Expected YAML but found: {value}) isinstancedictr load_yamlAttributeErrorrInvalidMetaDataExceptionformat)rometadata_valueparsed_metadataexcs r4_raw_instance_data_to_dictr|s.$' ..8 .. vm>vJ    .. vm>vJ  sA B  'BB c&eZdZUdZej Zeee fe d<ej Z e eee fe d<ejjdzZee dfe d<dZded d ffd Zed efd Zd efd Zd e fdZd e fdZed efdZxZS) DataSourceLXDLXD_network_config_crawled_metadata)user.meta-datarrrr.sensitive_metadata_keysTci_pkl_versionrNc2t||d|_y)NT)rJ _unpickleskip_hotplug_detect)rOrrPs r4rzDataSourceLXD._unpickles .)#' rDc"tjjtstj dtyt jtjtjstj dtyy)z@Check platform environment to report if this datasource may run.z%s does not exist.Fz%s is not a socketT) ospathexistsrer+r,statS_ISSOCKlstatst_modernrDr4 ds_detectzDataSourceLXD.ds_detectsVww~~o. KK,o >rxx8@@A KK,o >rDct|_td|jjd|_|jjdi}|jdi}|r%|jj td|d|jvr|jd|_d|jvrtd|jd|_d|jvr|jd|_y)z=Crawl LXD socket API instance data and return True on success meta-datar@rrrrT) read_metadatarr|getmetadataupdate userdata_rawrvendordata_raw)rOr@ user_metadatas r4 _get_datazDataSourceLXD._get_datas!.2 //33K@  ''++Hb9 #3R8  MM *+;]K  $00 0 $ 6 6{ CD  t55 5#= $"8"89I"J$D  D22 2"&"8"8"GD rDc8djttS)z.Return subplatform details for this datasourcez"LXD socket API v. {ver} ({socket}))verrS)rxLXD_SOCKET_API_VERSIONrerWs r4_get_subplatformzDataSourceLXD._get_subplatforms3::&;  rDcttj}|jdi}t |t st j|}|jd|jjdk(S)z%Return True if instance_id unchanged. metadata_keysrz instance-id) r MetaDataKeys META_DATArrsrtrrur)rOsys_cfgresponsemds r4check_instance_idzDataSourceLXD.check_instance_ids] |/E/EF \\+r *"d##Bvvm$ (9(9-(HHHrDc|jtjk(r|jtjk(r|j t |jt r|jjdr*tjd|jd|_nb|jjdrG|jdjDcgc]\}}|ddk(r|}}}t||_|jtjk(r$tjdt|_tt |jScc}}w)zNetwork config read from LXD socket config/user.network-config. If none is present, then we generate fallback configuration. rz,LXD datasource using provided network configdevicesr;nicz8LXD datasource generating network config using fallback.) rrUNSETrrrsrtrr+rAitemsrCr )rOkvrs r4network_configzDataSourceLXD.network_configs)   7== 0%%6 $00$7))--.>?IILM+/+A+A(,D(++// : %)$:$:9$E$K$K$M* AqV9-*G* ,C7+KD(   7== 0 IIJ $;#$$    II"H$8$8#> .. A H H))%%,,W5 I    OrDcTeZdZeZeZeZeZeezezZy)rN) rXrYrZrNONECONFIGDEVICESrALLrnrDr4rrIs- 6D VFfGI 7 Y &CrDrcPeZdZefdefdZdejdefdZ de defdZ y) _MetaDataReader api_versioncd||_tjt|j|_yrR)rr combine_urlLXD_URL _version_url)rOrs r4rKz_MetaDataReader.__init__Rs%&&227D-> J,WcEJ$+ByM%   s DD&&D/N) rXrYrZrrrKrrrtrrrrnrDr4rrQs@*@NCN4x'7'74D4l$rDrrrc(t||S)a/Fetch metadata from the /dev/lxd/socket routes. Perform a number of HTTP GETs on known routes on the devlxd socket API. Minimally all containers must respond to /meta-data when the LXD configuration setting `security.devlxd` is true. When `security.devlxd` is false, no /dev/lxd/socket file exists. This datasource will return False from `ds_detect` in that case. Perform a GET of /config` and walk all `user.*` configuration keys, storing all keys and values under a dict key LXD_SOCKET_API_VERSION: config {...}. In the presence of the following optional user config keys, create top level aliases: - user.user-data -> user-data - user.vendor-data -> vendor-data - user.network-config -> network-config :param api_version: LXD API version to operated with. :param metadata_keys: Instance of `MetaDataKeys` indicating what keys to fetch. :return: A dict with the following optional keys: meta-data, user-data, vendor-data, network-config, network_mode, devices. Below is a dict representation of all raw configuration keys and values provided to the container surfaced by the socket under the /1.0/config/ route. )rr)r)rrs r4rrsF 4?{ 3# rDc6tj|tSrR)rlist_from_depends datasources)dependss r4get_datasource_listrs  $ $Wk ::rD__main__z*Query LXD metadata and emit a JSON object.) descriptionrrR)T)F__doc__loggingrrSrrenumrr json.decoderrtypingrrrr r r r rrequests.adaptersr urllib3.connectionrurllib3.connectionpoolr cloudinitrrrrr cloudinit.netr getLoggerrXr+rerrrrr5rCrFr^rcrtr|rr~rrrResponserrrrrDEP_FILESYSTEMrrargparserArgumentParserparser parse_argsprint json_dumpsrnrDr4r s  (@@@).5DD+g!! (!1+!+% c6!%# 49 # #s(^#L,>,6-6 9{ 9cd:f0G&&f0T;?   $'370;?   $'37 :'4'NNd."."2"2%%% %TW++-. ; zBK $X $ $ =F     \=M=M!NO rD