o x[h3@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)selfr8/usr/lib/python3/dist-packages/cloudinit/net/networkd.py__init__s zCfgParser.__init__cCs`|jD](}||kr-|j||dt|tt|j||j|<|j|qdS)N=rkeysappendstrlistdictfromkeyssort)rseckeyvalkrrrupdate_section szCfgParser.update_sectioncCs|jD]>}||krC||j|vrg|j||<|j|||dt|tt|j|||j||<|j||qdS)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]e\}}|sq |dkr.t|D]}|d|d7}||d7}|d7}qq |dkrUt|D]}|d|d7}t||D]}||d7}qF|d7}q6q |d|d7}t|D]}||d7}qa|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@seZdZdZdddZdefddZdefdd Zdefd d Zdefd d Z defddZ dede fddZ defddZ ddZ  dde deeddfddZde defddZdS) 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)rconfigrrrrYs zRenderer.__init__cfgcCsTd}dddd}|s dS|D]\}}||vr%||r%|||||q|dS)Nr NameDriver MACAddress)namedriver mac_addressr<)r*r#)rifacer8r match_dictr"r,rrrgenerate_match_sectioncszRenderer.generate_match_sectioncCsXd}|sdSd|vr|dr||d|dd|vr(|dr*||dddSdSdS)Nr mtuMTUBytesoptionalRequiredForOnlineno)r#)rr?r8rrrrgenerate_link_sectiontszRenderer.generate_link_sectionc Cspd}dddd}d}d|vrdt|d}|D]\}}||vr#q|d kr+||7}||||||qd S) zy Parse a route and use rid as a key in order to isolate the route from others in the route dict. rGateway DestinationMetric)gatewaynetworkmetricr&prefix/rLN)rr*r%) rr$confr8r route_cfg_maprNr"r,rrr parse_routesszRenderer.parse_routesc Csd}d}d}|dgD]}|d}|dks|dkr(|dkr!d}n|d kr'd }n|d kr9|dkr3d }n|dkr9d }d |vrV|d rV|d D]}|d ||||d}qEd|vr|d} d|vrl| dt|d7} ddddd} |D]S\} } | dkr|d| | | qw| dkr|dd|| | | t| | rtd| | |dd|dd |d}qw| dks| dkr||| | d | qwq ||d|t |d d!t r||d"|d |S)#NrFr rsubnetstypedhcp4dhcpipv4ipv6yesdhcp6routesraddressrNrOrrHDNSDomains)r^rKdns_nameservers dns_searchrKrazGGateway %s is not contained within subnet %s, adding GatewayOnLink flag GatewayOnLinkrarb DHCPz accept-rar& IPv6AcceptRA) r6rRrr*r#r%rLOGdebugjoin isinstancebool) rr?r8rVrr$r-tiaddrsubnet_cfg_mapr"r,rrr parse_subnetssj    zRenderer.parse_subnetsc CsdD]B}||vr qt||}z t|}|rdnd}Wnty3|dkr1td|d}Ynw|dkr;d}nd}||d |qdS) N) dhcp4domain dhcp6domainrYrFroutezInvalid dhcp4domain value - %srrr r UseDomains)rcasefoldrtranslate_bool ValueErrorrhwarningr#)rdr8itemretsectionrrr dhcp_domains$   zRenderer.dhcp_domainnscCsd}|d}|s|jdkr|j|jd}n |s|jdkrdS|dr0||dd|d|d rC||d d|d dSdS) Nr dnsr])search nameserversrr`rerr_)r6versiondns_searchdomainsrar#rj)rr?r8rrrrrr parse_dnss   zRenderer.parse_dnsc Csddddd}|dkr|ddd d d d d |d|vrH|dd|fvrJ|d |d}|D]\}}||vrG|d||||q3dSdSdS)Nzuse-dns use-domainsz use-hostnamezuse-ntp)UseDNSru UseHostnameUseNTP4z send-hostnamehostnamez route-metriczuse-mtuz use-routes) SendHostnameHostname RouteMetricUseMTU UseRoutesrV -overridesrYipvDHCPv)updater*r#) rr8devicerVrdhcp_config_mapsdhcp_overridesr"r,rrrparse_dhcp_overridess2 zRenderer.parse_dhcp_overridescCs>d}td||d|d}t||t|||dS)Nzsystemd-networkz Setting Networking Config for %sz10-cloud-init-z.network)rhrir write_file chownbyname)rlinkrPnwk_dir net_fn_ownernet_fnrrrcreate_network_files   zRenderer.create_network_file network_state templatesreturncCsP|j}|r t||}t|||}|D] \}}||||qdSN)r5r target_pathr ensure_dir_render_contentr*r)rrrtarget network_dirret_dictr"r,rrrrender_network_states  zRenderer.render_network_statecCs^i}|D]}t}|||}||||||}||||d}|D]}|d||||d}q*|jdkr|d} |j d D]\} } d| vr^| d| kr^| } nqK| |j dvr|j d| } | | |dD]-} d | d | vrd | d | d ivr| d | d| d}t |||| || qu|||iq|S)Nrcr]rr< ethernetszset-name)r6rVdomainrrz has both dhcpzdomain and dhcpz*-overrides.use-domains configured. Use one)iter_interfacesr rArGrqr iter_routesrRrr7r*r6r~ RuntimeErrorrrr/)rrrr?r8rrVr$rtr<dev_namedev_cfgrr exceptionrrrr/sF          zRenderer._render_contentr)NN)r0r1r2__doc__rr rArGrRrqr~rrrrrrrrrrrrr3Qs*   ?  r3cCs4ddg}ddg}|D] }tj|||dsdSq dS)Nip systemctlz /usr/sbinz/bin)rrFT)rwhich)rexpectedrprrr availablejsrr)logging collectionsrtypingr cloudinitrr cloudinit.netrrcloudinit.net.network_stater getLoggerr0rhr r3rrrrrs    ?