3 \me?@sddlZddlZddlZddlZddlZddlZddlZddlmZm Z m Z m Z m Z ej eZdZdZdgZGddde jZGdd d eZGd d d eZGd d d ZddZddZdddZdddZddZeZee jffgZ ddZ!dS)N) atomic_helpernetsourcessubputilziid-dsopennebulaZnobodyz context.shc@sFeZdZdZddZddZddZdd Zed d Z dd dZ dS)DataSourceOpenNebulaZ OpenNebulacCs.tjj||||d|_tjj|jd|_dS)NZ opennebula)r DataSource__init__seedospathjoinseed_dir)selfZsys_cfgdistropathsr*/usr/lib/python3.6/DataSourceOpenNebula.pyr $szDataSourceOpenNebula.__init__cCstjj|}d||j|jfS)Nz%s [seed=%s][dsmode=%s])rr__str__r dsmode)rrootrrrr)s zDataSourceOpenNebula.__str__c Csdti}d}d}t}d|jkr*|jjd}|jg}|jtx|D]}yLtjj |jrjt ||j |d}n(|j drt jt ||j d}tj||}WnZtk rwDYnFtk r}z |WYdd}~Xn"tjk rtjd|YnX|rD|}tjd|PqDW|sdS|d } tj| |g} |j|jd |jjd g|_|jtjkrZdS||_|jd |_| |_|jd |_dS)Nz instance-id parseuser)asuserz/dev)rrz%s was not mountablezfound datasource in %sFmetadataZDSMODErznetwork-interfacesuserdataT) DEFAULT_IIDDEFAULT_PARSEUSERZds_cfggetrextendfind_candidate_devsr r isdirread_context_disk_dirr startswith functoolspartialrZmount_cbNonContextDiskDirBrokenContextDiskDirZMountFailedErrorLOGwarningdebugZ mergemanydictZ_determine_dsmoderrZDSMODE_DISABLEDr networkrZ userdata_raw) rZdefaultsresultsr rZ candidatesZcdevZpartially_applied_funcexcZmdrrr _get_data-sT         zDataSourceOpenNebula._get_datacCs$|j|jkrd}nd}d||jfS)z/Return the subplatform metadata source details.zseed-dirz config-diskz%s (%s))rr )rZsubplatform_typerrr_get_subplatformjs z%DataSourceOpenNebula._get_subplatformcCs|jdk r|jSdSdS)N)r*)rrrrnetwork_configrs z#DataSourceOpenNebula.network_configFcCs.|dkr|jtjkrd}nd}tjj|||S)NTF)rrZDSMODE_NETWORKr get_hostname)rZfqdnZ resolve_ipZ metadata_onlyrrrr0ys  z!DataSourceOpenNebula.get_hostnameN)FFF) __name__ __module__ __qualname__Zdsnamer rr-r.propertyr/r0rrrrr s= rc@s eZdZdS)r%N)r1r2r3rrrrr%sr%c@s eZdZdS)r&N)r1r2r3rrrrr&sr&c@speZdZdddZddZddZdd Zd d Zd d ZddZ ddZ ddZ ddZ dddZ ddZdS)OpenNebulaNetworkNcCs||_|dkrt|}tjddt|jdddD|_i|_x8|jD],\}}tj d|}|rL|j d|j|j <qLWdS)NcSsg|]}|qSrr).0krrr sz.OpenNebulaNetwork.__init__..cSstj|dS)N)rZnatural_sort_key)r7rrrsz,OpenNebulaNetwork.__init__..)keyz ^(.+)_MAC$r9) contextget_physical_nics_by_mac collections OrderedDictsorteditemsifacescontext_devnamerematchgrouplower)rr<rZsystem_nics_by_macr7vmrrrr s zOpenNebulaNetwork.__init__cCs"djdd|jdddDS)N.cSsg|]}tt|dqS))strint)r6crrrr8sz,OpenNebulaNetwork.mac2ip..:)r split)rmacrrrmac2ipszOpenNebulaNetwork.mac2ipcCs\i}|j|ddj}|j|jjddj|r:||d<|j|ddj}|rX||d<|S)NdnsZDNS addresses search_domainsearch) get_fieldrQrr<r)rdev nameserversrTrWrrrget_nameserverssz!OpenNebulaNetwork.get_nameserverscCs |j|dS)Nmtu)rY)rrZrrrget_mtuszOpenNebulaNetwork.get_mtucCs|j|d|j|S)NZip)rYrS)rrZrRrrrget_ipszOpenNebulaNetwork.get_ipcCs<g}|j|d}|r|j||j|d}|r8|j||S)Nip6ip6_ula)rYappend)rrZ addresses6r`rarrrget_ip6s    zOpenNebulaNetwork.get_ip6cCs|j|ddS)NZip6_prefix_lengthZ64)rY)rrZrrrget_ip6_prefixsz OpenNebulaNetwork.get_ip6_prefixcCs |j|dS)Ngateway)rY)rrZrrr get_gatewayszOpenNebulaNetwork.get_gatewaycCs|j|d|j|dS)NZ ip6_gatewaygateway6)rY)rrZrrr get_gateway6szOpenNebulaNetwork.get_gateway6cCs|j|ddS)Nmaskz 255.255.255.0)rY)rrZrrrget_maskszOpenNebulaNetwork.get_maskcCs*|jjdj||fj}|dkr&|S|S)zreturn the field name in context for device dev. context stores _ (example: eth0_DOMAIN). an empty string for value will return default._NrU)NrU)r<rr upper)rrZnamedefaultvalrrrrYs zOpenNebulaNetwork.get_fieldcs<i}d|d<i|d<i}x|jjD]\}}|j}|jj||}i}d|i|d<g|d<|j|}ttj|}|dj |j ||d||j |} | r|j ||dj fdd | D|j|} | r| |d <|j|} | r| |d <|j|} | r | |d <|j|} | r$| |d <|||<q&W||d<|S)NrPversion ethernetsZ macaddressrErV/csg|]}|dqS)rsr)r6i)prefix6rrr8sz.OpenNebulaNetwork.gen_conf..Zgateway4rhr[r])rBrArGrCrrkrLrZipv4_mask_to_net_prefixrbr_rdrerrgrir\r^)rZnetconfrrrRrZZc_devZdevconfrjprefixrcrfrhr[r]r)rurgen_confsB         zOpenNebulaNetwork.gen_conf)N)N)r1r2r3r rSr\r^r_rdrergrirkrYrwrrrrr5s    r5cCsHg}x>dD]6}tj|}|jx|D]}||kr&|j|q&Wq W|S)zE Return a list of devices that may contain the context disk. LABEL=CONTEXT LABEL=CDROM TYPE=iso9660)rxryrz)rZfind_devs_withsortrb)Zcombinedfdevsdrrrrs   rcCs dd|gS)NZsudoz-ur)userrrrswitch_user_cmd)src Cst|tr|g}n|dkr"ddg}|dkr.t}ddtjdD}|}|dkrV|}g}djd}d d }d |||d |d ||d} g} |dk r||} | j|tj| | d \} } d} i}i}d}| dd} x| jdD]}yT|jdd\}}||kr|||<n,|| kr>||ks6|j ||kr>|||<Wqt k r|dkr^|dkrn|}n||kr||}YqXqW|S)Nbashz-ecSsg|] }d|qS)z${!%s*}r)r6xrrrr8;sz&parse_shell_config..rl __v="";rUcSsdjdddj|dddfS)Nrzprintf "%s\0" _start_zfor __v in %s; do z% printf "%s=%s\0" "$__v" "${!__v}";donerU)r )Zvlistrrr varprinterIs  z&parse_shell_config..varprinterz unset IFS z{ %s : } > /dev/null )data EPOCHREALTIME EPOCHSECONDSRANDOMLINENOSECONDSSRANDOM__vrr9=Z_start_)rrU)rrrrrrlrr) isinstancerLrstringZ ascii_lettersr rrrQr ValueError)contentZkeylistrrZswitch_user_cbZallvarsZ keylist_inZsetuprZbcmdcmdoutputZ_errorZexcludedZpresetrettargetliner;rprrrparse_shell_config-sb (         rc'Csi}x.tD]&}tjj||}tjj|r |||<q W|sHtd|dfi}did}d|kr<|dk rytj|Wn4tk r}zt dj |d|WYdd}~XnXy(tjj|d} t j | } t | |d}Wndtjk r}zt d ||WYdd}~Xn2tk r8}ztd ||WYdd}~XnXntd |sN|S||d <d} d |krjd } nd|krxd} | r|j| j} dd| D|d d<x*d!D]"} | |kr|| |d d<PqWd|kr|d|d<nd|kr|d|d<d|krZ|jd|jd}|dkrZytj|d|d<Wn tk rXtjdYnXdd|D}|rt||}|j|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)rrz context.shz'configured user '{user}' does not exist)r)rzError processing context.sh: %szError reading context.sh: %szMissing context.shrZSSH_KEYZSSH_PUBLIC_KEYcSs$g|]}t|r|jd r|qS)#)lenr")r6rrrrr8sz)read_context_disk_dir..z public-keys SET_HOSTNAMEHOSTNAME PUBLIC_IP IP_PUBLICETH0_IPzlocal-hostnameZ USER_DATArZUSERDATAZUSERDATA_ENCODINGZUSER_DATA_ENCODINGbase64z"Failed base64 decoding of userdatacSsg|]}tjd|r|qS)z ^ETH\d+_IP.*$)rDrE)r6r7rrrr8sznetwork-interfaces)rrrrr)CONTEXT_DISK_FILESr r r isfiler%pwdgetpwnamKeyErrorr&formatrZ load_filerrZProcessExecutionErrorIOErrorr splitlinesrZb64d TypeErrorr'r(r5rw)Z source_dirrrfoundZaffnr<r+er rZ ssh_key_varlinesr7encodingZ ipaddr_keysZonetrrrr!s~                 r!cs"tj}tfdd|jDS)Ncs$g|]\}}jj|r||fqSr)Z networkingZ is_physical)r6rIn)rrrr8sz,get_physical_nics_by_mac..)rZget_interfaces_by_macdictrA)rr}r)rrr=sr=cCs tj|tS)N)rZlist_from_depends datasources)Zdependsrrrget_datasource_list sr)NNNN)N)"r>r#Zloggingr rrDrZ cloudinitrrrrrZ getLoggerr1r'rrrrr Exceptionr%r&r5rrrr!r=ZDataSourceOpenNebulaNetZDEP_FILESYSTEMrrrrrrs0 b j `