
    f0                         d dl Z d dlmZ d dlmZ d dlmZmZ d dlm	Z	 d dl
mZ  e j                  e      Z G d d      Z G d	 d
e	j                         ZddZy)    N)OrderedDict)Optional)subputil)renderer)NetworkStatec                   $    e Zd Zd Zd Zd Zd Zy)	CfgParserc           
      4    t        g g g g g g i d      | _        y )N)MatchLinkNetworkDHCPv4DHCPv6AddressRoute)r   	conf_dict)selfs    8/usr/lib/python3/dist-packages/cloudinit/net/networkd.py__init__zCfgParser.__init__   s(    $

    c                 R   | j                   j                         D ]  }||k(  s	| j                   |   j                  |dz   t        |      z          t	        t
        j                  | j                   |               | j                   |<   | j                   |   j                           y )N=r   keysappendstrlistdictfromkeyssort)r   seckeyvalks        r   update_sectionzCfgParser.update_section    s    $$& 	)ACxq!((sSX)=>$(t~~a7H)I$Jq!q!&&(	)r   c                    | j                   j                         D ]  }||k(  s	|| j                   |   vrg | j                   |   |<   | j                   |   |   j                  |dz   t        |      z          t	        t
        j                  | j                   |   |               | j                   |   |<   | j                   |   |   j                           y)z
        For each route section we use rid as a key, this allows us to isolate
        this route from others on subsequent calls.
        r   Nr   )r   r"   ridr#   r$   r%   s         r   update_route_sectionzCfgParser.update_route_section(   s    
 $$& 		.ACxdnnQ//-/DNN1%c*q!#&--cCi#c(.BC)-MM$.."3C"89*q!#& q!#&++-		.r   c                    d}t        | j                  j                               D ]  \  }}|s	|dk(  r)t        |      D ]  }|d|z   dz   z  }||dz   z  }|dz  } 7|dk(  r<t        |      D ]-  }|d|z   dz   z  }t        ||         D ]  }||dz   z  }|dz  } / x|d|z   dz   z  }t        |      D ]
  }||dz   z  } |dz  } |S )N r   [z]

r   )sortedr   items)r   contentsr%   vens         r   get_final_confzCfgParser.get_final_conf8   s   4>>//12 	!DAqI~ %Aa%/HD(H$H% g )Aa%/H#AaD\ ) AH, D()) C!GeO+ )AD(H)D %	!( r   N)__name__
__module____qualname__r   r&   r)   r4    r   r   r
   r
      s    
). r   r
   c                       e Zd ZdZddZdefdZdefdZdefdZdefdZ	defd	Z
ded
efdZdefdZd Z	 	 ddedee   ddfdZd
edefdZy)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.
    Nc                 h    |si }|j                  dd      | _        |j                  dd      | _        y )Nresolve_conf_fnz/etc/systemd/resolved.confnetwork_conf_dirz/etc/systemd/network/)getr<   r=   )r   configs     r   r   zRenderer.__init__Y   s:    F%zz; 
 !'

 7!
r   cfgc                     d}dddd}|sy |j                         D ]&  \  }}||v s||   s|j                  ||||          ( |d   S )Nr   NameDriver
MACAddress)namedrivermac_addressrE   )r/   r&   )r   ifacer@   r"   
match_dictr%   r1   s          r   generate_match_sectionzRenderer.generate_match_sectionc   sj    '

 $$& 	5DAqEzeAh""3584	5 V}r   c                 P    d}|sy d|v r|d   r|j                  |d|d          y y y )Nr   mtuMTUBytes)r&   )r   rH   r@   r"   s       r   generate_link_sectionzRenderer.generate_link_sectiont   s7    E>eElsJe= +>r   c                     d}dddd}d}d|v rdt        |d         z   }|j                         D ]+  \  }}||vr|d	k(  r||z  }|j                  ||||   |       - y
)zy
        Parse a route and use rid as a key in order to isolate the route from
        others in the route dict.
        r   GatewayDestinationMetric)gatewaynetworkmetricr+   prefix/rT   N)r   r/   r)   )	r   r(   confr@   r"   route_cfg_maprV   r%   r1   s	            r   parse_routeszRenderer.parse_routes}   s    
  $
 t3tH~..FJJL 	DDAq%I~V$$S#}Q/?C	Dr   c           	         d}d}d}|j                  dg       D ]  }|d   }|dk(  s|dk(  r|dk(  rd}n|d	k(  rd
}n|dk(  r|dk(  rd	}n|dk(  rd
}d|v r*|d   r%|d   D ]  }| j                  d| ||       |dz   } d|v sjddddd}	|j                         D ]  \  }
}|
dk(  r/d|v r|dt        |d         z   z  }|j	                  d|	|
   |       :|
dk(  r |j                  dd| |	|
   |       |dz   }_|
dk(  s|
dk(  sj|j	                  ||	|
   dj                  |               |j	                  |d|       |dv r6t        |j                  dd       t              r|j	                  |d!|d          |S )"Nnor   r   subnetstypedhcp4dhcpipv4ipv6yesdhcp6routesr   addressr   rP   DNSDomains)rh   rS   dns_nameservers
dns_searchrV   rW   rS   r   ark   rl    DHCP)rb   rc   z	accept-rar+   IPv6AcceptRA)	r>   rZ   r/   r   r&   r)   join
isinstancebool)r   rH   r@   r`   r"   r(   r2   tisubnet_cfg_mapr%   r1   s               r   parse_subnetszRenderer.parse_subnets   s   9b) &	PA&	AG|qF{4<!DV^ Dg4<!DV^ D1}88 "A %%#iC8'C	"
 A~((',"+	" GGI PDAqI~#q=s1X;'7!77A**9nQ6GKi 00#qYq0A1 "Ag//13D**3q0A388A;OP3&	PP 	3-?"zIIk2&(
 sNE+4FGr   c                    dD ]\  }||vrt        ||         j                         }	 t        j                  |      }|rdnd}|dk(  rd}nd}|j                  |d	|       ^ y # t        $ r  |dk7  rt
        j                  d|       d}Y Hw xY w)
N)dhcp4domaindhcp6domainrc   r\   routezInvalid dhcp4domain value - %sry   r   r   
UseDomains)r   casefoldr   translate_bool
ValueErrorLOGwarningr&   )r   dr@   itemretsections         r   dhcp_domainzRenderer.dhcp_domain   s    2 	;D1}ag,'')C))#."e
 }$""wc:	;  '>KK @#FCs   A##&BBnsc                 ~   d}|j                  d      }|s)|j                  dk(  r|j                  |j                  d}n|s|j                  dk(  ry |j                  d      r%|j	                  |ddj                  |d                |j                  d	      r&|j	                  |d
dj                  |d	                y y )Nr   dnsrg   )searchnameservers   r   rj   rn   r   ri   )r>   versiondns_searchdomainsrk   r&   rq   )r   rH   r@   r   r"   r   s         r   	parse_dnszRenderer.parse_dns   s    iirzzQ..!11C q778sIsxxH/FG77=!sE388C4F+GH "r   c                     ddddd}|dk(  r|j                  ddd	d
dd       d| d|v rJ|dd| fv r@|d| d   }|j                         D ]#  \  }}||v s|j                  d| |||          % y y y )Nzuse-dnsuse-domainszuse-hostnamezuse-ntp)UseDNSr|   UseHostnameUseNTP4zsend-hostnamehostnamezroute-metriczuse-mtuz
use-routes)SendHostnameHostnameRouteMetricUseMTU	UseRoutesr`   
-overridesrc   ipvDHCPv)updater/   r&   )	r   r@   devicer`   r   dhcp_config_mapsdhcp_overridesr%   r1   s	            r   parse_dhcp_overrideszRenderer.parse_dhcp_overrides   s    ')	
 c>##$3 *#1'!- '*%/D'O=
 5
 $d7):$>?N(..0 P1&&&wi'8!^A=NOP5
/r   c                     d}t         j                  d|       |dz   |z   dz   }t        j                  ||       t        j                  |||       y )Nzsystemd-networkz Setting Networking Config for %sz10-cloud-init-z.network)r   debugr   
write_filechownbyname)r   linkrX   nwk_dirnet_fn_ownernet_fns         r   create_network_filezRenderer.create_network_file
  sK    (		4d;++d2Z?%|<r   network_state	templatesreturnc                     | j                   }|rt        j                  |      |z   }t        j                  |       | j                  |      }|j                         D ]  \  }}| j                  |||        y N)r=   r   target_pathr   
ensure_dir_render_contentr/   r   )r   r   r   targetnetwork_dirret_dictr%   r1   s           r   render_network_statezRenderer.render_network_state  so     ++**62[@K$''6NN$ 	8DAq$$Q;7	8r   c                 <   i }|j                         D ]  }t               }| j                  ||      }| j                  ||       | j	                  ||      }| j                  |||       d}|j                         D ]  }| j                  d| ||       |dz   } |j                  dk(  r|d   }	|j                  d   j                         D ]"  \  }
}d|v s|j                  d      |	k(  s |
}	 n |	|j                  d   v ru|j                  d   |	   }| j                  ||       dD ]L  }d	| d
|v r.d|j                  d	| di       v r|	 d| d| d}t        |      | j                  ||||       N |j                  ||j!                         i        |S )Nr   crg   r   rE   	ethernetszset-name)r   6r`   domainr   r   z has both dhcpzdomain and dhcpz*-overrides.use-domains configured. Use one)iter_interfacesr
   rJ   rN   rw   r   iter_routesrZ   r   r?   r/   r>   r   RuntimeErrorr   r   r4   )r   r   r   rH   r@   r   r`   r(   r{   rE   dev_namedev_cfgr   r   	exceptions                  r   r   zRenderer._render_content#  s   '') 4	:E+C..uc:D&&uc2%%eS1DNN5#r*C)  !!AcU)UC8Ag	 zzQ&+Fm *,;)?)E)E)G "%Hg!W,";;z2d:#+D!	"
 299[11YY{3D9F $$VS1#- N"7)62f< -%zzD	*DbI!J $(&wi @,,39 57!8 &
 #/y"9911#vtWMN OOT3#5#5#789i4	:l r   r   )NN)r5   r6   r7   __doc__r   r
   rJ   rN   rZ   rw   r   r   r   r   r   r   r   r   r   r8   r   r   r:   r:   Q   s    
 ">	 >D9 D03	 3l;) ;$II I< I"P	 P8= %)	8#8 D>8
 
8 8, 84 8r   r:   c                 V    ddg}ddg}|D ]  }t        j                  |||       r y y)Nip	systemctlz	/usr/sbinz/bin)r   r   FT)r   which)r   expectedr   ps       r   	availabler   ^  s=    k"H6"F zz!F6: r   r   )loggingcollectionsr   typingr   	cloudinitr   r   cloudinit.netr   cloudinit.net.network_stater   	getLoggerr5   r   r
   r:   r   r8   r   r   <module>r      sP     #    " 4g!< <~Jx   JZr   