o x[h>@s ddlZddlZddlZddlZddlZddlZddlZddlZddlm Z m Z m Z m Z m Z eeZdZdZdgZdZGddde jZGd d d eZGd d d eZGd ddZddZddZddZdddZdddZddZ eZ!ee j"ffgZ#ddZ$dS)N) atomic_helpernetsourcessubputilziid-dsopennebulanobody context.sh) EPOCHREALTIME EPOCHSECONDSRANDOMLINENOSECONDS_SRANDOM__vc@sFeZdZdZddZddZddZdd Zed d Z dd dZ dS)DataSourceOpenNebula OpenNebulacCs4tj||||d|_tj|jd|_d|_dS)N opennebula) r DataSource__init__seedospathjoinseed_dirnetwork)selfsys_cfgdistropathsr H/usr/lib/python3/dist-packages/cloudinit/sources/DataSourceOpenNebula.pyr/s zDataSourceOpenNebula.__init__cCstj|}d||j|jfS)Nz%s [seed=%s][dsmode=%s])rr__str__rdsmode)rrootr r r!r"5s zDataSourceOpenNebula.__str__c Csldti}d}d}t}d|jvr|jd}|jg}|t|D]Z}z&tj |jr4t ||j |d}n| drHt jt ||j d}t||}Wn%tyRYq!ty_}z|d}~wtjyntd|Ynw|r{|}td|nq!|sdS|d } t| |g} ||d |jd g|_|jtjkrdS||_|d |_| |_|d |_dS)Nz instance-id parseuserasuserz/dev)r'rz%s was not mountablezfound datasource in %sFmetadataDSMODEr#network-interfacesuserdataT) DEFAULT_IIDDEFAULT_PARSEUSERds_cfggetrextendfind_candidate_devsrrisdirread_context_disk_dirr startswith functoolspartialrmount_cbNonContextDiskDirBrokenContextDiskDirMountFailedErrorLOGwarningdebug mergemanydict_determine_dsmoder#rDSMODE_DISABLEDrrr( userdata_raw) rdefaultsresultsrr% candidatescdevpartially_applied_funcexcmdr r r! _get_data9sb          zDataSourceOpenNebula._get_datacCs$|j|jvr d}nd}d||jfS)z/Return the subplatform metadata source details.zseed-dirz config-diskz%s (%s))rr)rsubplatform_typer r r!_get_subplatformvs z%DataSourceOpenNebula._get_subplatformcCs|jdur|jSdSN)r)rr r r!network_config~s z#DataSourceOpenNebula.network_configFcCs.|dur|jtjkr d}nd}tj|||S)NTF)r#rDSMODE_NETWORKr get_hostname)rfqdn resolve_ip metadata_onlyr r r!rOs  z!DataSourceOpenNebula.get_hostnameN)FFF) __name__ __module__ __qualname__dsnamerr"rIrKpropertyrMrOr r r r!r+s= rc@ eZdZdS)r8NrSrTrUr r r r!r8r8c@rX)r9NrYr r r r!r9rZr9c@speZdZdddZddZddZdd Zd d Zd d ZddZ ddZ ddZ ddZ dddZ ddZdS)OpenNebulaNetworkNcCs|||_|dur t|}tddt|dddD|_i|_|D]\}}t d|}|r;| d|j| <q%dS)NcSsg|]}|qSr r .0kr r r! sz.OpenNebulaNetwork.__init__..cSst|dS)N)rnatural_sort_key)r^r r r!sz,OpenNebulaNetwork.__init__..)keyz ^(.+)_MAC$r`) contextget_physical_nics_by_mac collections OrderedDictsorteditemsifacescontext_devnamerematchgrouplower)rrdrsystem_nics_by_macr^vmr r r!rs$  zOpenNebulaNetwork.__init__cCs"ddd|dddDS)N.cSsg|] }tt|dqS))strint)r]cr r r!r_sz,OpenNebulaNetwork.mac2ip..:)rsplit)rmacr r r!mac2ips"zOpenNebulaNetwork.mac2ipcCs\i}||dd}||jdd|r||d<||dd}|r,||d<|S)NdnsDNS addresses search_domainsearch) get_fieldrzr0rdr/)rdev nameserversr}rr r r!get_nameserverssz!OpenNebulaNetwork.get_nameserverscC ||dS)Nmturrrr r r!get_mtu zOpenNebulaNetwork.get_mtucCs||d||S)Nip)rr|)rrr{r r r!get_ipszOpenNebulaNetwork.get_ipcCs<g}||d}|r||||d}|r|||S)Nip6ip6_ula)rappend)rr addresses6rrr r r!get_ip6s    zOpenNebulaNetwork.get_ip6cC||ddS)Nip6_prefix_length64rrr r r!get_ip6_prefixz OpenNebulaNetwork.get_ip6_prefixcCr)Ngatewayrrr r r! get_gatewayrzOpenNebulaNetwork.get_gatewaycCs||d||dS)N ip6_gatewaygateway6rrr r r! get_gateway6szOpenNebulaNetwork.get_gateway6cCr)Nmaskz 255.255.255.0rrr r r!get_maskrzOpenNebulaNetwork.get_maskcCs*|jd||f}|dvr|S|S)zreturn the field name in context for device dev. context stores _ (example: eth0_DOMAIN). an empty string for value will return default.r)Nr~)rdr/rupper)rrnamedefaultvalr r r!rs zOpenNebulaNetwork.get_fieldcs0i}d|d<i|d<i}|jD]\}}|}|j||}i}d|i|d<g|d<||}tt|}|d | ||d|| |} | ra| ||d fdd | D||} | rl| |d <||} | rw| |d <||} | r| |d <||} | r| |d <|||<q||d<|S)Nryversion ethernets macaddressrmr/csg|]}|dqS)rr )r]iprefix6r r!r_ sz.OpenNebulaNetwork.gen_conf..gateway4rrr)rjrirorkr/rruripv4_mask_to_net_prefixrrrrr0rrrr)rnetconfrr{rc_devdevconfrprefixrrrrrr rr!gen_confsD         zOpenNebulaNetwork.gen_confrL)rSrTrUrr|rrrrrrrrrrr r r r!r[s     r[cCs@g}dD]}t|}||D] }||vr||qq|S)zE Return a list of devices that may contain the context disk. )z LABEL=CONTEXTz LABEL=CDROMz TYPE=iso9660)rfind_devs_withsortr)combinedfdevsdr r r!r1&s  r1cCs dd|gS)Nsudoz-ur userr r r!switch_user_cmd5s rcCs tdS)zDprint the shell environment variables within delimiters to be parsedz printf "%s\0" _start_ [ $0 != 'sh' ] && set -o posix set [ $0 != 'sh' ] && set +o posix printf "%s\0" _start_ )textwrapdedentr r r r! varprinter9src Csd|vr tdtd|td}g}|dur!t|}|ddgtj||dj}i}|d d d}|d |d }}t d dt |D} t ddt |D} t |  t | D]} | tvrpqi| | } | dur| | | kr| || <qi|S)a<run content and return environment variables which changed WARNING: the special variable _start_ is used to delimit content a context.sh that defines this variable might break in unexpected ways compatible with posix shells such as dash and ash and any shell which supports `set -o posix` s_start_zYUser defined _start_ variable in context.sh, this may breakcloud-init in unexpected ways.z{ %s : } > /dev/null  Nshz-e)dataz_start_r`rrycs|] }|jdddVqdS=r`)maxsplitNrzr]variabler r r! } z%parse_shell_config..csrrrrr r r!rr)encoder;r<rrr0rstdoutrzdictshlexsetkeysunion EXCLUDED_VARSr/) contentr'bcmdcmdoutputretsectionsbeforeafterpre_envpost_envrcvaluer r r!parse_shell_configFsD  rc CsJi}tD]}tj||}tj|r|||<q|s"td|dfi}did}d|vr|durNzt|WntyM}z t dj |d|d}~wwztj|d} t | } t | |d}Wn*tjyv}zt d ||d}~wty}ztd ||d}~wwtd |s|S||d <d} d |vrd } nd|vrd} | r|| } dd| D|d d<dD]} | |vr|| |d d<nqd|vr|d|d<n d|vr|d|d<d|vr|d|d}|dkrz t|d|d<Wnty tdYnwdd|D}|r#t||}||d<|S)z read_context_disk_dir(source_dir): read source_dir and return a tuple with metadata dict and user-data string populated. If not a valid dir, raise a NonContextDiskDir z%s: %szno files foundN)r+r(rz'configured user '{user}' does not existrr&zError processing context.sh: %szError reading context.sh: %szMissing context.shr(SSH_KEYSSH_PUBLIC_KEYcSs"g|] }t|r|ds|qS)#)lenr4)r]liner r r!r_sz)read_context_disk_dir..z public-keys) SET_HOSTNAMEHOSTNAME PUBLIC_IP IP_PUBLICETH0_IPzlocal-hostname USER_DATAr+USERDATAUSERDATA_ENCODINGUSER_DATA_ENCODINGbase64z"Failed base64 decoding of userdatacSsg|] }td|r|qS)z ^ETH\d+_IP.*$)rlrmr\r r r!r_sr*)CONTEXT_DISK_FILESrrrisfiler8pwdgetpwnamKeyErrorr9formatrload_text_filerrProcessExecutionErrorIOErrorr/ splitlinesrb64d TypeErrorr;r<r[r) source_dirrr'foundaffnrdrCerr ssh_key_varlinesr^encoding ipaddr_keysonetr r r!r3s         r3cs"t}tfdd|DS)Ncs$g|]\}}j|r||fqSr ) networking is_physical)r]rrnrr r!r_s$z,get_physical_nics_by_mac..)rget_interfaces_by_macrri)rrr rr!resrecCs t|tSrL)rlist_from_depends datasources)dependsr r r!get_datasource_listrr rL)%rfr5loggingrrrlrr cloudinitrrrrr getLoggerrSr;r,r-rrrr Exceptionr8r9r[r1rrrr3reDataSourceOpenNebulaNetDEP_FILESYSTEMr r r r r r!s:  c G`