a 'Dg3@sddlZddlmZddlmZddlmZmZddlm Z m Z ddl m Z e eZGdddZGd d d e jZd d d ZdS)N) OrderedDict)Optional)subputil)renderershould_add_gateway_onlink_flag) NetworkStatec@s,eZdZddZddZddZddZd S) CfgParserc Cstggggggid|_dS)N)MatchLinkNetworkDHCPv4DHCPv6AddressRoute)r conf_dict)selfr:/usr/lib/python3.9/site-packages/cloudinit/net/networkd.py__init__szCfgParser.__init__cCs`|jD]P}||kr |j||dt|tt|j||j|<|j|q dS)N=rkeysappendstrlistdictfromkeyssort)rseckeyvalkrrrupdate_section s zCfgParser.update_sectioncCs|jD]|}||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)rrridr r!r"rrrupdate_route_section(s zCfgParser.update_route_sectioncCsd}t|jD]\}}|s q|dkr\t|D](}|d|d7}||d7}|d7}q0q|dkrt|D]:}|d|d7}t||D]}||d7}q|d7}qlq|d|d7}t|D]}||d7}q|d7}q|S)Nr[z]  r)sortedritems)rcontentsr"venrrrget_final_conf8s(       zCfgParser.get_final_confN)__name__ __module__ __qualname__rr#r%r/rrrrr s r c@seZdZdZdddZedddZeddd Zedd d Zedd d Z edddZ ee dddZ edddZ ddZde eeddddZe edddZdS)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)Nresolve_conf_fnz/etc/systemd/resolved.confnetwork_conf_dirz/etc/systemd/network/)getr4r5)rconfigrrrrYszRenderer.__init__)cfgcCsTd}dddd}|sdS|D]*\}}||vr ||r |||||q |dS)Nr NameZDriverZ MACAddress)nameZdriverZ mac_addressr:)r*r#)rifacer8rZ match_dictr"r,rrrgenerate_match_sectioncszRenderer.generate_match_sectioncCsPd}|s dSd|vr.|dr.||d|dd|vrL|drL||dddS)Nr ZmtuZMTUBytesZoptionalZRequiredForOnlineno)r#)rr;r8rrrrgenerate_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. rGatewayZ DestinationZMetric)gatewaynetworkZmetricr&prefix/rAN)rr*r%) rr$confr8rZ route_cfg_maprBr"r,rrr parse_routesszRenderer.parse_routesc Csd}d}d}|dgD]}|d}|dks6|dkrR|dkrDd}qt|d krtd }n"|d krt|dkrhd }n |dkrtd }d |vr|d r|d D] }|d ||||d}qd|vr|d} d|vr| dt|d7} ddddd} |D]\} } | dkr|d| | | q| dkrt|dd|| | | t| | rjtd| | |dd|dd |d}q| dks| dkr||| | d | qq||d|t |d d!t r||d"|d |S)#Nr=r rsubnetstypeZdhcp4dhcpZipv4Zipv6yesZdhcp6ZroutesraddressrBrCrr?DNSDomains)rLr@dns_nameservers dns_searchr@razGGateway %s is not contained within subnet %s, adding GatewayOnLink flagZ GatewayOnLinkrOrP ZDHCPz accept-rar&Z IPv6AcceptRA) r6rErr*r#r%rLOGdebugjoin isinstancebool) rr;r8rHrr$r-tiaddrZsubnet_cfg_mapr"r,rrr parse_subnetssf      zRenderer.parse_subnetsc CsdD]}||vrqt||}zt|}|r6dnd}Wn*tyf|dkrbtd|d}Yn0|dkrvd}nd}||d |qdS) N) dhcp4domainZ dhcp6domainrIr=routezInvalid dhcp4domain value - %sr\r r UseDomains)rcasefoldrZtranslate_bool ValueErrorrSZwarningr#)rdr8itemretsectionrrr dhcp_domains    zRenderer.dhcp_domain)r8nscCsd}|d}|s,|jdkr,|j|jd}n|s>|jdkr>dS|dr`||dd|d|d r||d d|d dS) Nr dnsrK)search nameserversrhrNrRrirM)r6versionZdns_searchdomainsrOr#rU)rr;r8rfrrgrrr parse_dnss   zRenderer.parse_dnsc Csddddd}|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 UseHostnameZUseNTP4z send-hostnamehostnamez route-metriczuse-mtuz use-routes)Z SendHostnameZHostnameZ RouteMetricZUseMTUZ UseRoutesrH -overridesrIZipvZDHCPv)updater*r#) rr8devicerHrkZdhcp_config_mapsZdhcp_overridesr"r,rrrparse_dhcp_overridess, zRenderer.parse_dhcp_overridescCs>d}td||d|d}t||t|||dS)Nzsystemd-networkz Setting Networking Config for %sz10-cloud-init-z.network)rSrTrZ write_fileZ chownbyname)rlinkrDZnwk_dirZ net_fn_ownerZnet_fnrrrcreate_network_files   zRenderer.create_network_file) network_state templatesreturncCsP|j}|rt||}t|||}|D]\}}||||q4dS)N)r5rZ target_pathrZ ensure_dir_render_contentr*ru)rrvrwtargetZ network_dirret_dictr"r,rrrrender_network_states  zRenderer.render_network_state)rfrxcCshi}|D]T}t}|||}||||||}||||d}|D] }|d||||d}qV|jdkrP|d} |j d D]&\} } d| vr| d| kr| } qq| |j dvrP|j d| } | | |dD]^} d | d | vr>d | d | d ivr>| d | d| d}t |||| || q|||iq |S)NrcrKrjr:Z ethernetszset-name)rn6rHdomainrmrpz 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|||dsdSqdS)NipZ systemctlz /usr/sbinz/bin)rhrzFT)rwhich)rzZexpectedrhprrr availablejs r)N)Zlogging collectionsrtypingrZ cloudinitrrZ cloudinit.netrrZcloudinit.net.network_staterZ getLoggerr0rSr r3rrrrrs    ?