3 \me0@sddlZddlmZddlmZddlmZmZddlm Z ddl m Z ej e ZGdddZGd d d e jZd d d ZdS)N) OrderedDict)Optional)subputil)renderer) NetworkStatec@s,eZdZddZddZddZddZd S) CfgParserc Cstggggggid|_dS)N)MatchLinkNetworkDHCPv4DHCPv6AddressRoute)r conf_dict)selfr/usr/lib/python3.6/networkd.py__init__szCfgParser.__init__cCsdx^|jjD]P}||kr |j|j|dt|ttj|j||j|<|j|jq WdS)N=)rkeysappendstrlistdictfromkeyssort)rseckeyvalkrrrupdate_section s zCfgParser.update_sectioncCsx|jjD]|}||kr ||j|kr4g|j||<|j||j|dt|ttj|j|||j||<|j||jq WdS)z For each route section we use rid as a key, this allows us to isolate this route from others on subsequent calls. rN)rrrrrrrr)rrridrrr rrrupdate_route_section(s  zCfgParser.update_route_sectioncCsd}xt|jjD]\}}|s"q|dkrbxt|D](}|d|d7}||d7}|d7}q4Wq|dkrxt|D]>}|d|d7}x(t||D]}||d7}|d7}qWqtWq|d|d7}xt|D]}||d7}qW|d7}qW|S)Nr[z]  r)sortedritems)rcontentsr venrrrget_final_conf8s(   zCfgParser.get_final_confN)__name__ __module__ __qualname__rr!r#r-rrrrrs rc@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}|jdd|_|jdd|_dS)Nresolve_conf_fnz/etc/systemd/resolved.confnetwork_conf_dirz/etc/systemd/network/)getr2r3)rconfigrrrrYs  zRenderer.__init__)cfgcCsXd}dddd}|sdSx6|jD]*\}}||kr"||r"|j||||q"W|dS)Nr NameZDriverZ MACAddress)nameZdriverZ mac_addressr8)r(r!)rifacer6rZ match_dictr r*rrrgenerate_match_sectioncszRenderer.generate_match_sectioncCs2d}|s dSd|kr.|dr.|j|d|ddS)Nr ZmtuZMTUBytes)r!)rr9r6rrrrgenerate_link_sectionts zRenderer.generate_link_sectionc Cstd}dddd}d}d|kr,dt|d}xB|jD]6\}}||krHq6|d krX||7}|j|||||q6Wd 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/r>N)rr(r#) rr"confr6rZ route_cfg_mapr?r r*rrr parse_routes}szRenderer.parse_routesc Csd}d}d}xj|jdgD]X}|d}|dks:|dkrV|dkrHd}qx|d krxd }n"|d krx|dkrld }n |dkrxd }d |kr|d rx,|d D] }|jd ||||d}qWd|krddddd} x|jD]\} } | dkrd|kr| dt|d7} |jd| | | q| dkrH|jdd|| | | |d}q| dksZ| dkr|j|| | dj| qWqW|j|d||d!krt|jddtr|j|d |d|S)"Nnor rZsubnetstypeZdhcp4dhcpZipv4ipv6yesZdhcp6Zroutesraddressrr<DNSDomains)rJr=dns_nameservers dns_searchr?r@r=rarMrN ZDHCPz accept-rar$Z IPv6AcceptRA)rFrG) r4rBr(rr!r#join isinstancebool) rr9r6rErr"r+tiZsubnet_cfg_mapr r*rrr parse_subnetssP       zRenderer.parse_subnetsc Csxd D]}||krqt||j}ytj|}|r8dnd}Wn,tk rj|dkrftjd|d}YnX|dkrzd}nd}|j|d |qWdS) N dhcp4domain dhcp6domainrGrCroutezInvalid dhcp4domain value - %sr r UseDomains)rWrX)rcasefoldrZtranslate_bool ValueErrorLOGZwarningr!)rdr6itemretZsectionrrr dhcp_domains    zRenderer.dhcp_domain)r6nsc Csd}dddd}|jd}| r:|jdkr:|j|jd}n| rN|jdkrNdSx<|jD]0\}}||krX||rX|j||d j||qXWdS) Nr rLrK)search nameserversZ addressesdnsrI)rcrdrP)r4versionZdns_searchdomainsrMr(r!rQ) rr9r6rbrZ dns_cfg_maprer r*rrr parse_dnss  zRenderer.parse_dnsc Csddddd}|dkr,|jddd d d d d |d|kr|dd|gkr|d |d}x4|jD](\}}||krh|jd||||qhWdS)Nzuse-dnsz use-domainsz use-hostnamezuse-ntp)ZUseDNSrZZ UseHostnameZUseNTP4z send-hostnameZhostnamez route-metriczuse-mtuz use-routes)Z SendHostnameZHostnameZ RouteMetricZUseMTUZ UseRoutesrEz -overridesrGZipvZDHCPv)updater(r!) rr6devicerErgZdhcp_config_mapsZdhcp_overridesr r*rrrparse_dhcp_overridess$ zRenderer.parse_dhcp_overridescCs>d}tjd||d|d}tj||tj|||dS)Nzsystemd-networkz Setting Networking Config for %sz10-cloud-init-z.network)r]debugrZ write_fileZ chownbyname)rlinkrAZnwk_dirZ net_fn_ownerZnet_fnrrrcreate_network_files   zRenderer.create_network_file) network_state templatesreturncCsT|j}|rtj||}tj||j|}x"|jD]\}}|j|||q6WdS)N)r3rZ target_pathrZ ensure_dir_render_contentr(ro)rrprqtargetZ network_dirret_dictr r*rrrrender_network_states  zRenderer.render_network_state)rbrrcCszi}xn|jD]`}t}|j||}|j|||j||}|j|||d}x,|jD] }|jd||||d}q\W|jdkr`|d} x6|j dj D]$\} } d| kr| j d| kr| } PqW| |j dkr`|j d| } |j | |xhdD]`} d | d | krJd | j d | d ikrJ| d| d| d}t ||j|| || qW|j||jiqW|S)NrcrIrfr8Z ethernetszset-nameri6rEZdomainz use-domainsz -overridesz has both dhcpzdomain and dhcpz*-overrides.use-domains configured. Use one)rirx)Ziter_interfacesrr:r;rVrhZ iter_routesrBrgr5r(r4ra RuntimeErrorrlrjr-)rrbrur9r6rnrEr"rYr8Zdev_nameZdev_cfgrkrgZ exceptionrrrrs(s<        zRenderer._render_content)N)NN)r.r/r0__doc__rrr:r;rBrVrarrhrlrorrrvrsrrrrr1Qs  6   r1cCs6ddg}ddg}x |D]}tj|||dsdSqWdS)NZipZ systemctlz /usr/sbinz/bin)rcrtFT)rZwhich)rtZexpectedrcprrr availablecs  r|)N)Zlogging collectionsrZtypingrZ cloudinitrrZ cloudinit.netrZcloudinit.net.network_staterZ getLoggerr.r]rr1r|rrrrs     ?