
    x[h3                         S SK r S SKJr  S SKJr  S SKJrJr  S SKJ	r	J
r
  S SKJr  \ R                  " \5      r " S S5      r " S	 S
\	R"                  5      rSS jrg)    N)OrderedDict)Optional)subputil)renderershould_add_gateway_onlink_flag)NetworkStatec                   ,    \ rS rSrS rS rS rS rSrg)	CfgParser   c           
      4    [        / / / / / / 0 S.5      U l        g )N)MatchLinkNetworkDHCPv4DHCPv6AddressRoute)r   	conf_dict)selfs    8/usr/lib/python3/dist-packages/cloudinit/net/networkd.py__init__CfgParser.__init__   s(    $

    c                 X   U R                   R                  5        H  nXA:X  d  M
  U R                   U   R                  US-   [        U5      -   5        [	        [
        R                  U R                   U   5      5      U R                   U'   U R                   U   R                  5         M     g )N=r   keysappendstrlistdictfromkeyssort)r   seckeyvalks        r   update_sectionCfgParser.update_section    s|    $$&Axq!((sSX)=>$(t~~a7H)I$Jq!q!&&( 'r   c                    U R                   R                  5        H  nXQ:X  d  M
  X R                   U   ;  a  / U R                   U   U'   U R                   U   U   R                  US-   [        U5      -   5        [	        [
        R                  U R                   U   U   5      5      U R                   U   U'   U R                   U   U   R                  5         M     g)zs
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_sectionCfgParser.update_route_section(   s    
 $$&AxnnQ//-/DNN1%c*q!#&--cCi#c(.BC)-MM$.."3C"89*q!#& q!#&++- 'r   c                    Sn[        U R                  R                  5       5       H  u  p#U(       d  M  US:X  a+  [        U5       H  nUSU-   S-   -  nXS-   -  nUS-  nM     M?  US:X  a?  [        U5       H.  nUSU-   S-   -  n[        X5   5       H
  nXS-   -  nM     US-  nM0     M  USU-   S-   -  n[        U5       H
  nXS-   -  nM     US-  nM     U$ )N r   [z]

r   )sortedr   items)r   contentsr(   vens         r   get_final_confCfgParser.get_final_conf8   s    4>>//12DAI~Aa%/HD(H$H # gAa%/H#AD\ H, *$H	 # C!GeO+AD(H #D % 3( r   )r   N)	__name__
__module____qualname____firstlineno__r   r)   r-   r9   __static_attributes__ r   r   r   r      s    
). r   r   c                       \ rS rSrSrSS jrS\4S jrS\4S jrS\4S jr	S\4S	 jr
S\4S
 jrS\S\4S jrS\4S jrS r  SS\S\\   SS4S jjrS\S\4S jrSrg)RendererQ   z
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                 r    U(       d  0 nUR                  SS5      U l        UR                  SS5      U l        g )Nresolve_conf_fnz/etc/systemd/resolved.confnetwork_conf_dirz/etc/systemd/network/)getrE   rF   )r   configs     r   r   Renderer.__init__Y   s:    F%zz; 
 !'

 7!
r   cfgc                     SnSSSS.nU(       d  g UR                  5        H+  u  pVXQ;   d  M  X   (       d  M  UR                  X6X   5        M-     US   $ )Nr   NameDriver
MACAddress)namedrivermac_addressrO   )r4   r)   )r   ifacerJ   r%   
match_dictr(   r6   s          r   generate_match_sectionRenderer.generate_match_sectionc   s]    '

 $$&DAzehh""3584 ' V}r   c                     SnU(       d  g SU;   a   US   (       a  UR                  USUS   5        SU;   a  US   (       a  UR                  USS5        g g g )Nr   mtuMTUBytesoptionalRequiredForOnlineno)r)   )r   rR   rJ   r%   s       r   generate_link_sectionRenderer.generate_link_sectiont   sZ    E>eElsJe=5#4s$7> $5r   c                     SnSSSS.nSnSU;   a  S[        US   5      -   nUR                  5        H+  u  pxXu;  a  M  US	:X  a  X-  nUR                  XAXW   U5        M-     g
)za
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metricr0   prefix/rc   N)r    r4   r-   )	r   r,   confrJ   r%   route_cfg_mapre   r(   r6   s	            r   parse_routesRenderer.parse_routes   sy    
  $
 t3tH~..FJJLDA%I~$$S}/?C !r   c           	         SnSnSnUR                  S/ 5       GHn  nUS   nUS:X  d  US:X  a  US:X  a  SnO US	:X  a  S
nOUS:X  a  US:X  a  S	nOUS:X  a  S
nSU;   a0  US   (       a&  US    H  nU R                  SU 3X5        US-   nM     SU;   d  M|  US   n	SU;   a  U	S[        US   5      -   -  n	SSSSS.n
UR                  5        H  u  pUS:X  a  UR	                  SX   U	5        M"  US:X  a^  UR                  SSU 3X   U5        [        X5      (       a.  [        R                  SUU	5        UR                  SSU 3SS
5        US-   nM  US:X  d  US:X  d  M  UR	                  XJU   SR                  U5      5        M     GMq     UR	                  USU5        [        UR                  S S!5      [        5      (       a  UR	                  US"US    5        U$ )#Nr[   r   r   subnetstypedhcp4dhcpipv4ipv6yesdhcp6routesr   addressre   rf   r   r_   DNSDomains)rw   rb   dns_nameservers
dns_searchrb   r   azGGateway %s is not contained within subnet %s, adding GatewayOnLink flagGatewayOnLinkrz   r{    DHCPz	accept-rar0   IPv6AcceptRA)rG   ri   r    r4   r)   r-   r   LOGdebugjoin
isinstancebool)r   rR   rJ   ro   r%   r,   r7   tiaddrsubnet_cfg_mapr(   r6   s                r   parse_subnetsRenderer.parse_subnets   s   9b)A&	AG|qF{4<!DV^ Dg4<!DV^ D1}88A %%#i8'C	 %
 A~|q=C#ak"222D((',"+	" GGIDAI~**9n6GNi 00#qY0A1 :!BBII!= ! $	  44 '1SEOU "Ag//13D**3q0A388A;O+ &9 *f 	3-eiiR0$77sNE+4FGr   c                 6   S He  nX1;  a  M
  [        X   5      R                  5       n [        R                  " U5      nU(       a  SOSnUS:X  a  SnOSnUR                  US	U5        Mg     g ! [         a!    US:w  a  [
        R                  SU5        Sn NMf = f)
N)dhcp4domaindhcp6domainrr   r[   routezInvalid dhcp4domain value - %sr   r   r   
UseDomains)r    casefoldr   translate_bool
ValueErrorr   warningr)   )r   drJ   itemretsections         r   dhcp_domainRenderer.dhcp_domain   s    2D}ag,'')C))#."e
 }$""wc: 3  '>KK @#FCs   !A--(BBnsc                    SnUR                  S5      nU(       d*  UR                  S:X  a  UR                  UR                  S.nOU(       d  UR                  S:X  a  g UR                  S5      (       a%  UR	                  USSR                  US   5      5        UR                  S	5      (       a&  UR	                  US
SR                  US	   5      5        g g )Nr   dnsrv   )searchnameservers   r   ry   r~   r   rx   )rG   versiondns_searchdomainsrz   r)   r   )r   rR   rJ   r   r%   r   s         r   	parse_dnsRenderer.parse_dns   s    iirzzQ..!11C q778sIsxxH/FG77=!!sE388C4F+GH "r   c                     SSSSS.nUS:X  a  UR                  SSS	S
SS.5        SU S3U;   aN  USSU 34;   aB  USU S3   nUR                  5        H$  u  pxX;   d  M  UR                  SU 3XvU   5        M&     g g g )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	UseRoutesro   
-overridesrr   ipvDHCPv)updater4   r)   )	r   rJ   devicero   r   dhcp_config_mapsdhcp_overridesr(   r6   s	            r   parse_dhcp_overridesRenderer.parse_dhcp_overrides   s    ')	
 c>##$3 *#1'!- '*%/D'O=
 5
 $d7):$>?N(..0&&&wi'8!A=NO 15
/r   c                     Sn[         R                  SU5        US-   U-   S-   n[        R                  " XR5        [        R                  " XTU5        g )Nzsystemd-networkz Setting Networking Config for %sz10-cloud-init-z.network)r   r   r   
write_filechownbyname)r   linkrg   nwk_dirnet_fn_ownernet_fns         r   create_network_fileRenderer.create_network_file  sG    (		4d;++d2Z?%|<r   network_state	templatesreturnc                     U R                   nU(       a  [        R                  " U5      U-   n[        R                  " U5        U R                  U5      nUR                  5        H  u  pgU R                  XgU5        M     g N)rF   r   target_pathr   
ensure_dir_render_contentr4   r   )r   r   r   targetnetwork_dirret_dictr(   r6   s           r   render_network_stateRenderer.render_network_state  sf     ++**62[@K$''6NN$DA$$Q;7 %r   c                 L   0 nUR                  5        GH  n[        5       nU R                  X45      nU R                  X45        U R	                  X45      nU R                  X4U5        SnUR                  5        H  nU R                  SU 3X5        US-   nM     UR                  S:X  a  US   n	UR                  S   R                  5        H&  u  pSU;   d  M  UR                  S5      U	:X  d  M$  U
n	  O   XR                  S   ;   ax  UR                  S   U	   nU R                  X5        S HO  nS	U S
3U;   a0  SUR                  S	U S30 5      ;   a  U	 SU SU S3n[        U5      eU R                  XLXm5        MQ     UR                  XTR!                  5       05        GM     U$ )Nr   crv   r   rO   	ethernetszset-name)r   6ro   domainr   r   z has both dhcpzdomain and dhcpz*-overrides.use-domains configured. Use one)iter_interfacesr   rT   r\   r   r   iter_routesri   r   rH   r4   rG   r   RuntimeErrorr   r   r9   )r   r   r   rR   rJ   r   ro   r,   r   rO   dev_namedev_cfgr   r   	exceptions                  r   r   Renderer._render_content/  s   '')E+C..u:D&&u2%%e1DNN5r*C) !!AcU)U8Ag	 * zzQ&+Fm *,;)?)E)E)G%H!W,";;z2d:#+D!	 *H
 99[11YY{3D9F $$V1#-"7)62f< -%zzD	*DbI!J $(&wi @,,39 57!8 &
 #/y"9911#tM $. OOT#5#5#789i *l r   )rF   rE   r   )NN)r;   r<   r=   r>   __doc__r   r   rT   r\   ri   r   r   r	   r   r   r   r   r"   r   r   r?   r@   r   r   rB   rB   Q   s    
 "
?	 
?D9 D0<	 <~;) ;$II I< I"P	 P8= %)	8#8 D>8
 
8 8, 84 8r   rB   c                 ^    SS/nSS/nU H  n[         R                  " X2U S9(       a  M    g   g)Nip	systemctlz	/usr/sbinz/bin)r   r   FT)r   which)r   expectedr   ps       r   	availabler   j  s9    k"H6"Fzz!6::  r   r   )loggingcollectionsr   typingr   	cloudinitr   r   cloudinit.netr   r   cloudinit.net.network_stater	   	getLoggerr;   r   r   rB   r   r@   r   r   <module>r      sN     #    B 4!< <~Vx   Vrr   