a '¡Dg3ã@s„ddlZddlmZddlmZddlmZmZddlm Z m Z ddl m Z e  e¡ZGdd„dƒZGd d „d e jƒZd d d „ZdS)éN)Ú OrderedDict)ÚOptional)ÚsubpÚutil)ÚrendererÚshould_add_gateway_onlink_flag)Ú NetworkStatec@s,eZdZdd„Zdd„Zdd„Zdd„Zd S) Ú CfgParserc Cstggggggidœƒ|_dS)N)ÚMatchÚLinkÚNetworkÚDHCPv4ÚDHCPv6ÚAddressÚRoute)rÚ conf_dict)Úself©rú:/usr/lib/python3.9/site-packages/cloudinit/net/networkd.pyÚ__init__sùÿzCfgParser.__init__cCs`|j ¡D]P}||kr |j| |dt|ƒ¡tt |j|¡ƒ|j|<|j| ¡q dS)Nú=©rÚkeysÚappendÚstrÚlistÚdictÚfromkeysÚsort)rÚsecÚkeyÚvalÚkrrrÚupdate_section s zCfgParser.update_sectioncCsŒ|j ¡D]|}||kr ||j|vr2g|j||<|j|| |dt|ƒ¡tt |j||¡ƒ|j||<|j|| ¡q dS)z‹ For each route section we use rid as a key, this allows us to isolate this route from others on subsequent calls. rNr)rrÚridr r!r"rrrÚupdate_route_section(s ÿzCfgParser.update_route_sectioncCsâd}t|j ¡ƒD]Ê\}}|s q|dkr\t|ƒD](}|d|d7}||d7}|d7}q0q|dkrªt|ƒD]:}|d|d7}t||ƒD]}||d7}qŒ|d7}qlq|d|d7}t|ƒD]}||d7}qÂ|d7}q|S)NÚrú[z] Ú r)ÚsortedrÚitems)rÚcontentsr"ÚvÚeÚnrrrÚget_final_conf8s(       zCfgParser.get_final_confN)Ú__name__Ú __module__Ú __qualname__rr#r%r/rrrrr s r c@s®eZdZdZddd„Zedœdd„Zedœdd „Zedœd d „Zedœd d „Z edœdd„Z ee dœdd„Z edœdd„Z dd„Zde eeddœdd„Ze edœdd„ZdS)ÚRendererzº Renders network information in /etc/systemd/network This Renderer is currently experimental and doesn't support all the use cases supported by the other renderers yet. NcCs(|si}| dd¡|_| dd¡|_dS)NÚresolve_conf_fnz/etc/systemd/resolved.confÚnetwork_conf_dirz/etc/systemd/network/)Úgetr4r5)rÚconfigrrrrYsÿÿzRenderer.__init__)ÚcfgcCsTd}ddddœ}|sdS| ¡D]*\}}||vr ||r | ||||¡q |dS)Nr ÚNameZDriverZ MACAddress)ÚnameZdriverZ mac_addressr:)r*r#)rÚifacer8rZ match_dictr"r,rrrÚgenerate_match_sectioncsýzRenderer.generate_match_sectioncCsPd}|s dSd|vr.|dr.| |d|d¡d|vrL|drL| |dd¡dS)Nr ZmtuZMTUBytesZoptionalZRequiredForOnlineÚno)r#)rr;r8rrrrÚgenerate_link_sectiontszRenderer.generate_link_sectionc Cspd}ddddœ}d}d|vr,dt|dƒ}| ¡D]6\}}||vrFq4|d krV||7}| |||||¡q4d S) zy Parse a route and use rid as a key in order to isolate the route from others in the route dict. rÚGatewayZ DestinationZMetric)ÚgatewayÚnetworkZmetricr&Úprefixú/rAN)rr*r%) rr$Úconfr8rZ route_cfg_maprBr"r,rrrÚ parse_routes€sýzRenderer.parse_routesc CsÚd}d}d}| dg¡D�]†}|d}|dks6|dkrR|dkrDd}qt|d krtd }n"|d krt|dkrhd }n |dkrtd }d |vr®|d r®|d D] }| d |›�||¡|d}qŒd|vr|d} d|vrÚ| dt|dƒ7} dddddœ} | ¡D]®\} } | dk�r| d| | | ¡qð| dk�rt| dd|›�| | | ¡t| | ƒ�rjt d| | ¡| dd|›�dd ¡|d}qð| dk�s†| dkrð| || | d  | ¡¡qðq| |d|¡t | d d!¡t ƒ�rÖ| |d"|d ¡|S)#Nr=r rÚsubnetsÚtypeZdhcp4ÚdhcpZipv4Zipv6ÚyesZdhcp6ZroutesÚréÚaddressrBrCrr?ÚDNSÚDomains)rLr@Údns_nameserversÚ dns_searchr@rÚazGGateway %s is not contained within subnet %s, adding GatewayOnLink flagZ GatewayOnLinkrOrPú ZDHCPz accept-rar&Z IPv6AcceptRA) r6rErr*r#r%rÚLOGÚdebugÚjoinÚ isinstanceÚbool) rr;r8rHrr$r-ÚtÚiÚaddrZsubnet_cfg_mapr"r,rrrÚ parse_subnets˜sf  ü  ÿ üÿ zRenderer.parse_subnetsc CsŽdD]„}||vrqt||ƒ ¡}zt |¡}|r6dnd}Wn*tyf|dkrbt d|¡d}Yn0|dkrvd}nd}| |d |¡qdS) N)Ú dhcp4domainZ dhcp6domainrIr=ÚroutezInvalid dhcp4domain value - %sr\r rÚ UseDomains)rÚcasefoldrZtranslate_boolÚ ValueErrorrSZwarningr#)rÚdr8ÚitemÚretÚsectionrrrÚ dhcp_domain×s    zRenderer.dhcp_domain)r8ÚnscCs†d}| d¡}|s,|jdkr,|j|jdœ}n|s>|jdkr>dS| d¡r`| |dd |d¡¡| d ¡r‚| |d d |d ¡¡dS) Nr ÚdnsrK)ÚsearchÚ nameserversérhrNrRrirM)r6ÚversionZdns_searchdomainsrOr#rU)rr;r8rfrrgrrrÚ parse_dnsés þ  zRenderer.parse_dnsc Cs”dddddœ}|dkr,| ddd d d d œ¡d |›d�|vr�|dd|›�fvr�|d |›d�}| ¡D](\}}||vrf| d|›�|||¡qfdS)Nzuse-dnsú use-domainsz use-hostnamezuse-ntp)ZUseDNSr^Z UseHostnameZUseNTPÚ4z send-hostnameÚhostnamez route-metriczuse-mtuz use-routes)Z SendHostnameZHostnameZ RouteMetricZUseMTUZ UseRoutesrHú -overridesrIZipvZDHCPv)Úupdater*r#) rr8ÚdevicerHrkZdhcp_config_mapsZdhcp_overridesr"r,rrrÚparse_dhcp_overridesús,üûÿ þzRenderer.parse_dhcp_overridescCs>d}t d|¡|d|d}t ||¡t |||¡dS)Nzsystemd-networkz Setting Networking Config for %sz10-cloud-init-z.network)rSrTrZ write_fileZ chownbyname)rÚlinkrDZnwk_dirZ net_fn_ownerZnet_fnrrrÚcreate_network_files   zRenderer.create_network_file)Ú network_stateÚ templatesÚreturncCsP|j}|rt |¡|}t |¡| |¡}| ¡D]\}}| |||¡q4dS)N)r5rZ target_pathrZ ensure_dirÚ_render_contentr*ru)rrvrwÚtargetZ network_dirÚret_dictr"r,rrrÚrender_network_states  zRenderer.render_network_state)rfrxcCshi}| ¡D�]T}tƒ}| ||¡}| ||¡| ||¡}| |||¡d}| ¡D] }| d|›�||¡|d}qV|jdk�rP|d} |j d  ¡D]&\} } d| vrš|   d¡| krš| } qÂqš| |j dv�rP|j d| } |  | |¡dD]^} d | ›d �| v�r>d |   d | ›d �i¡v�r>| ›d | ›d| ›d�}t |ƒ‚| || || ¡qð| || ¡i¡q |S)NrÚcrKrjr:Z ethernetszset-name)rnÚ6rHÚdomainrmrpz has both dhcpzdomain and dhcpz*-overrides.use-domains configured. Use one)Ziter_interfacesr r<r>r[rlZ iter_routesrErkr7r*r6reÚ RuntimeErrorrsrqr/)rrfr{r;r8rtrHr$r]r:Zdev_nameZdev_cfgrrrkÚ exceptionrrrry/sH        ÿÿþ ÿÿzRenderer._render_content)N)NN)r0r1r2Ú__doc__rr r<r>rEr[rerrlrsrurrr|ryrrrrr3Qs$  ? üû r3cCs4ddg}ddg}|D]}tj|||d�sdSqdS)NÚipZ systemctlz /usr/sbinz/bin)rhrzFT)rÚwhich)rzZexpectedrhÚprrrÚ availablejs r†)N)ZloggingÚ collectionsrÚtypingrZ cloudinitrrZ cloudinit.netrrZcloudinit.net.network_staterZ getLoggerr0rSr r3r†rrrrÚs    ?